/ Hex Artifact Content
Login

Artifact f45ad45053a587ad1c005459b704b7ade8bd504e:


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 0a 2a   varint docid;.*
0950: 2a 20 20 20 61 72 72 61 79 20 7b 20 20 20 20 20  *   array {     
0960: 20 20 20 20 20 20 20 20 20 20 20 28 70 6f 73 69             (posi
0970: 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 63 6f  tion list for co
0980: 6c 75 6d 6e 20 30 29 0a 2a 2a 20 20 20 20 20 76  lumn 0).**     v
0990: 61 72 69 6e 74 20 70 6f 73 69 74 69 6f 6e 3b 20  arint position; 
09a0: 20 20 20 20 28 32 20 6d 6f 72 65 20 74 68 61 6e      (2 more than
09b0: 20 74 68 65 20 64 65 6c 74 61 20 66 72 6f 6d 20   the delta from 
09c0: 70 72 65 76 69 6f 75 73 20 70 6f 73 69 74 69 6f  previous positio
09d0: 6e 29 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 61  n).**   }.**   a
09e0: 72 72 61 79 20 7b 0a 2a 2a 20 20 20 20 20 76 61  rray {.**     va
09f0: 72 69 6e 74 20 50 4f 53 5f 43 4f 4c 55 4d 4e 3b  rint POS_COLUMN;
0a00: 20 20 20 28 6d 61 72 6b 73 20 73 74 61 72 74 20     (marks start 
0a10: 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
0a20: 20 66 6f 72 20 6e 65 77 20 63 6f 6c 75 6d 6e 29   for new column)
0a30: 0a 2a 2a 20 20 20 20 20 76 61 72 69 6e 74 20 63  .**     varint c
0a40: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 28 69 6e  olumn;       (in
0a50: 64 65 78 20 6f 66 20 6e 65 77 20 63 6f 6c 75 6d  dex of new colum
0a60: 6e 29 0a 2a 2a 20 20 20 20 20 61 72 72 61 79 20  n).**     array 
0a70: 7b 0a 2a 2a 20 20 20 20 20 20 20 76 61 72 69 6e  {.**       varin
0a80: 74 20 70 6f 73 69 74 69 6f 6e 3b 20 20 20 28 32  t position;   (2
0a90: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 64   more than the d
0aa0: 65 6c 74 61 20 66 72 6f 6d 20 70 72 65 76 69 6f  elta from previo
0ab0: 75 73 20 70 6f 73 69 74 69 6f 6e 29 0a 2a 2a 20  us position).** 
0ac0: 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20      }.**   }.** 
0ad0: 20 20 76 61 72 69 6e 74 20 50 4f 53 5f 45 4e 44    varint POS_END
0ae0: 3b 20 20 20 20 20 20 20 20 28 6d 61 72 6b 73 20  ;        (marks 
0af0: 65 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73  end of positions
0b00: 20 66 6f 72 20 74 68 69 73 20 64 6f 63 75 6d 65   for this docume
0b10: 6e 74 2e 0a 2a 2a 20 7d 0a 2a 2a 0a 2a 2a 20 48  nt..** }.**.** H
0b20: 65 72 65 2c 20 61 72 72 61 79 20 7b 20 58 20 7d  ere, array { X }
0b30: 20 6d 65 61 6e 73 20 7a 65 72 6f 20 6f 72 20 6d   means zero or m
0b40: 6f 72 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20  ore occurrences 
0b50: 6f 66 20 58 2c 20 61 64 6a 61 63 65 6e 74 20 69  of X, adjacent i
0b60: 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 20 20 41 20  n.** memory.  A 
0b70: 22 70 6f 73 69 74 69 6f 6e 22 20 69 73 20 61 6e  "position" is an
0b80: 20 69 6e 64 65 78 20 6f 66 20 61 20 74 6f 6b 65   index of a toke
0b90: 6e 20 69 6e 20 74 68 65 20 74 6f 6b 65 6e 20 73  n in the token s
0ba0: 74 72 65 61 6d 0a 2a 2a 20 67 65 6e 65 72 61 74  tream.** generat
0bb0: 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 69  ed by the tokeni
0bc0: 7a 65 72 2e 20 4e 6f 74 65 20 74 68 61 74 20 50  zer. Note that P
0bd0: 4f 53 5f 45 4e 44 20 61 6e 64 20 50 4f 53 5f 43  OS_END and POS_C
0be0: 4f 4c 55 4d 4e 20 6f 63 63 75 72 20 0a 2a 2a 20  OLUMN occur .** 
0bf0: 69 6e 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  in the same logi
0c00: 63 61 6c 20 70 6c 61 63 65 20 61 73 20 74 68 65  cal place as the
0c10: 20 70 6f 73 69 74 69 6f 6e 20 65 6c 65 6d 65 6e   position elemen
0c20: 74 2c 20 61 6e 64 20 61 63 74 20 61 73 20 73 65  t, and act as se
0c30: 6e 74 69 6e 61 6c 73 0a 2a 2a 20 65 6e 64 69 6e  ntinals.** endin
0c40: 67 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  g a position lis
0c50: 74 20 61 72 72 61 79 2e 20 20 50 4f 53 5f 45 4e  t array.  POS_EN
0c60: 44 20 69 73 20 30 2e 20 20 50 4f 53 5f 43 4f 4c  D is 0.  POS_COL
0c70: 55 4d 4e 20 69 73 20 31 2e 0a 2a 2a 20 54 68 65  UMN is 1..** The
0c80: 20 70 6f 73 69 74 69 6f 6e 73 20 6e 75 6d 62 65   positions numbe
0c90: 72 73 20 61 72 65 20 6e 6f 74 20 73 74 6f 72 65  rs are not store
0ca0: 64 20 6c 69 74 65 72 61 6c 6c 79 20 62 75 74 20  d literally but 
0cb0: 72 61 74 68 65 72 20 61 73 20 74 77 6f 20 6d 6f  rather as two mo
0cc0: 72 65 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 64  re.** than the d
0cd0: 69 66 66 65 72 65 6e 63 65 20 66 72 6f 6d 20 74  ifference from t
0ce0: 68 65 20 70 72 69 6f 72 20 70 6f 73 69 74 69 6f  he prior positio
0cf0: 6e 2c 20 6f 72 20 74 68 65 20 6a 75 73 74 20 74  n, or the just t
0d00: 68 65 20 70 6f 73 69 74 69 6f 6e 20 70 6c 75 73  he position plus
0d10: 0a 2a 2a 20 32 20 66 6f 72 20 74 68 65 20 66 69  .** 2 for the fi
0d20: 72 73 74 20 70 6f 73 69 74 69 6f 6e 2e 20 20 45  rst position.  E
0d30: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
0d40: 6c 61 62 65 6c 3a 20 20 20 20 20 20 20 41 20 42  label:       A B
0d50: 20 43 20 44 20 45 20 20 46 20 20 47 20 48 20 20   C D E  F  G H  
0d60: 20 49 20 20 4a 20 4b 0a 2a 2a 20 20 20 76 61 6c   I  J K.**   val
0d70: 75 65 3a 20 20 20 20 20 31 32 33 20 35 20 39 20  ue:     123 5 9 
0d80: 31 20 31 20 31 34 20 33 35 20 30 20 32 33 34 20  1 1 14 35 0 234 
0d90: 37 32 20 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 31  72 0.**.** The 1
0da0: 32 33 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  23 value is the 
0db0: 66 69 72 73 74 20 64 6f 63 69 64 2e 20 20 46 6f  first docid.  Fo
0dc0: 72 20 63 6f 6c 75 6d 6e 20 7a 65 72 6f 20 69 6e  r column zero in
0dd0: 20 74 68 69 73 20 64 6f 63 75 6d 65 6e 74 0a 2a   this document.*
0de0: 2a 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  * there are two 
0df0: 6d 61 74 63 68 65 73 20 61 74 20 70 6f 73 69 74  matches at posit
0e00: 69 6f 6e 73 20 33 20 61 6e 64 20 31 30 20 28 35  ions 3 and 10 (5
0e10: 2d 32 20 61 6e 64 20 39 2d 32 2b 33 29 2e 20 20  -2 and 9-2+3).  
0e20: 54 68 65 20 31 0a 2a 2a 20 61 74 20 44 20 73 69  The 1.** at D si
0e30: 67 6e 61 6c 73 20 74 68 65 20 73 74 61 72 74 20  gnals the start 
0e40: 6f 66 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 3b  of a new column;
0e50: 20 74 68 65 20 31 20 61 74 20 45 20 69 6e 64 69   the 1 at E indi
0e60: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 0a 2a  cates that the.*
0e70: 2a 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 69 73 20  * new column is 
0e80: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 31 2e  column number 1.
0e90: 20 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20    There are two 
0ea0: 70 6f 73 69 74 69 6f 6e 73 20 61 74 20 31 32 20  positions at 12 
0eb0: 61 6e 64 20 34 35 0a 2a 2a 20 28 31 34 2d 32 20  and 45.** (14-2 
0ec0: 61 6e 64 20 33 35 2d 32 2b 31 32 29 2e 20 20 54  and 35-2+12).  T
0ed0: 68 65 20 30 20 61 74 20 48 20 69 6e 64 69 63 61  he 0 at H indica
0ee0: 74 65 20 74 68 65 20 65 6e 64 2d 6f 66 2d 64 6f  te the end-of-do
0ef0: 63 75 6d 65 6e 74 2e 20 20 54 68 65 0a 2a 2a 20  cument.  The.** 
0f00: 32 33 34 20 61 74 20 49 20 69 73 20 74 68 65 20  234 at I is the 
0f10: 6e 65 78 74 20 64 6f 63 69 64 2e 20 20 49 74 20  next docid.  It 
0f20: 68 61 73 20 6f 6e 65 20 70 6f 73 69 74 69 6f 6e  has one position
0f30: 20 37 32 20 28 37 32 2d 32 29 20 61 6e 64 20 74   72 (72-2) and t
0f40: 68 65 6e 0a 2a 2a 20 74 65 72 6d 69 6e 61 74 65  hen.** terminate
0f50: 73 20 77 69 74 68 20 74 68 65 20 30 20 61 74 20  s with the 0 at 
0f60: 4b 2e 0a 2a 2a 0a 2a 2a 20 41 20 22 70 6f 73 69  K..**.** A "posi
0f70: 74 69 6f 6e 2d 6c 69 73 74 22 20 69 73 20 74 68  tion-list" is th
0f80: 65 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74 69  e list of positi
0f90: 6f 6e 73 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65  ons for multiple
0fa0: 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 0a 2a 2a 20   columns for.** 
0fb0: 61 20 73 69 6e 67 6c 65 20 64 6f 63 69 64 2e 20  a single docid. 
0fc0: 20 41 20 22 63 6f 6c 75 6d 6e 2d 6c 69 73 74 22   A "column-list"
0fd0: 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 70   is the set of p
0fe0: 6f 73 69 74 69 6f 6e 73 20 66 6f 72 20 61 20 73  ositions for a s
0ff0: 69 6e 67 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e  ingle.** column.
1000: 20 20 48 65 6e 63 65 2c 20 61 20 70 6f 73 69 74    Hence, a posit
1010: 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 73 69 73 74  ion-list consist
1020: 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  s of one or more
1030: 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 73 2c 0a 2a   column-lists,.*
1040: 2a 20 61 20 64 6f 63 75 6d 65 6e 74 20 72 65 63  * a document rec
1050: 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ord consists of 
1060: 61 20 64 6f 63 69 64 20 66 6f 6c 6c 6f 77 65 64  a docid followed
1070: 20 62 79 20 61 20 70 6f 73 69 74 69 6f 6e 2d 6c   by a position-l
1080: 69 73 74 20 61 6e 64 0a 2a 2a 20 61 20 64 6f 63  ist and.** a doc
1090: 6c 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  list consists of
10a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 6f 63   one or more doc
10b0: 75 6d 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a 2a  ument records..*
10c0: 2a 0a 2a 2a 20 41 20 62 61 72 65 20 64 6f 63 6c  *.** A bare docl
10d0: 69 73 74 20 6f 6d 69 74 73 20 74 68 65 20 70 6f  ist omits the po
10e0: 73 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  sition informati
10f0: 6f 6e 2c 20 62 65 63 6f 6d 69 6e 67 20 61 6e 20  on, becoming an 
1100: 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 76 61 72  .** array of var
1110: 69 6e 74 2d 65 6e 63 6f 64 65 64 20 64 6f 63 69  int-encoded doci
1120: 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 20 53 65 67 6d  ds..**.**** Segm
1130: 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a  ent leaf nodes *
1140: 2a 2a 2a 0a 2a 2a 20 53 65 67 6d 65 6e 74 20 6c  ***.** Segment l
1150: 65 61 66 20 6e 6f 64 65 73 20 73 74 6f 72 65 20  eaf nodes store 
1160: 74 65 72 6d 73 20 61 6e 64 20 64 6f 63 6c 69 73  terms and doclis
1170: 74 73 2c 20 6f 72 64 65 72 65 64 20 62 79 20 74  ts, ordered by t
1180: 65 72 6d 2e 20 20 4c 65 61 66 0a 2a 2a 20 6e 6f  erm.  Leaf.** no
1190: 64 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  des are written 
11a0: 75 73 69 6e 67 20 4c 65 61 66 57 72 69 74 65 72  using LeafWriter
11b0: 2c 20 61 6e 64 20 72 65 61 64 20 75 73 69 6e 67  , and read using
11c0: 20 4c 65 61 66 52 65 61 64 65 72 20 28 74 6f 0a   LeafReader (to.
11d0: 2a 2a 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  ** iterate throu
11e0: 67 68 20 61 20 73 69 6e 67 6c 65 20 6c 65 61 66  gh a single leaf
11f0: 20 6e 6f 64 65 27 73 20 64 61 74 61 29 20 61 6e   node's data) an
1200: 64 20 4c 65 61 76 65 73 52 65 61 64 65 72 20 28  d LeavesReader (
1210: 74 6f 0a 2a 2a 20 69 74 65 72 61 74 65 20 74 68  to.** iterate th
1220: 72 6f 75 67 68 20 61 20 73 65 67 6d 65 6e 74 27  rough a segment'
1230: 73 20 65 6e 74 69 72 65 20 6c 65 61 66 20 6c 61  s entire leaf la
1240: 79 65 72 29 2e 20 20 4c 65 61 66 20 6e 6f 64 65  yer).  Leaf node
1250: 73 20 68 61 76 65 0a 2a 2a 20 74 68 65 20 66 6f  s have.** the fo
1260: 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 76 61 72 69  rmat:.**.** vari
1270: 6e 74 20 69 48 65 69 67 68 74 3b 20 20 20 20 20  nt iHeight;     
1280: 20 20 20 20 20 20 20 20 28 68 65 69 67 68 74 20          (height 
1290: 66 72 6f 6d 20 6c 65 61 66 20 6c 65 76 65 6c 2c  from leaf level,
12a0: 20 61 6c 77 61 79 73 20 30 29 0a 2a 2a 20 76 61   always 0).** va
12b0: 72 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20  rint nTerm;     
12c0: 20 20 20 20 20 20 20 20 20 20 28 6c 65 6e 67 74            (lengt
12d0: 68 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 29  h of first term)
12e0: 0a 2a 2a 20 63 68 61 72 20 70 54 65 72 6d 5b 6e  .** char pTerm[n
12f0: 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 20 20  Term];          
1300: 28 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73  (content of firs
1310: 74 20 74 65 72 6d 29 0a 2a 2a 20 76 61 72 69 6e  t term).** varin
1320: 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  t nDoclist;     
1330: 20 20 20 20 20 20 20 28 6c 65 6e 67 74 68 20 6f         (length o
1340: 66 20 74 65 72 6d 27 73 20 61 73 73 6f 63 69 61  f term's associa
1350: 74 65 64 20 64 6f 63 6c 69 73 74 29 0a 2a 2a 20  ted doclist).** 
1360: 63 68 61 72 20 70 44 6f 63 6c 69 73 74 5b 6e 44  char pDoclist[nD
1370: 6f 63 6c 69 73 74 5d 3b 20 20 20 20 28 63 6f 6e  oclist];    (con
1380: 74 65 6e 74 20 6f 66 20 64 6f 63 6c 69 73 74 29  tent of doclist)
1390: 0a 2a 2a 20 61 72 72 61 79 20 7b 0a 2a 2a 20 20  .** array {.**  
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 20 20 28 66 75 72 74             (furt
13c0: 68 65 72 20 74 65 72 6d 73 20 61 72 65 20 64 65  her terms are de
13d0: 6c 74 61 2d 65 6e 63 6f 64 65 64 29 0a 2a 2a 20  lta-encoded).** 
13e0: 20 20 76 61 72 69 6e 74 20 6e 50 72 65 66 69 78    varint nPrefix
13f0: 3b 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 6e  ;           (len
1400: 67 74 68 20 6f 66 20 70 72 65 66 69 78 20 73 68  gth of prefix sh
1410: 61 72 65 64 20 77 69 74 68 20 70 72 65 76 69 6f  ared with previo
1420: 75 73 20 74 65 72 6d 29 0a 2a 2a 20 20 20 76 61  us term).**   va
1430: 72 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20  rint nSuffix;   
1440: 20 20 20 20 20 20 20 20 28 6c 65 6e 67 74 68 20          (length 
1450: 6f 66 20 75 6e 73 68 61 72 65 64 20 73 75 66 66  of unshared suff
1460: 69 78 29 0a 2a 2a 20 20 20 63 68 61 72 20 70 54  ix).**   char pT
1470: 65 72 6d 53 75 66 66 69 78 5b 6e 53 75 66 66 69  ermSuffix[nSuffi
1480: 78 5d 3b 28 75 6e 73 68 61 72 65 64 20 73 75 66  x];(unshared suf
1490: 66 69 78 20 6f 66 20 6e 65 78 74 20 74 65 72 6d  fix of next term
14a0: 29 0a 2a 2a 20 20 20 76 61 72 69 6e 74 20 6e 44  ).**   varint nD
14b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
14c0: 20 28 6c 65 6e 67 74 68 20 6f 66 20 74 65 72 6d   (length of term
14d0: 27 73 20 61 73 73 6f 63 69 61 74 65 64 20 64 6f  's associated do
14e0: 63 6c 69 73 74 29 0a 2a 2a 20 20 20 63 68 61 72  clist).**   char
14f0: 20 70 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69   pDoclist[nDocli
1500: 73 74 5d 3b 20 20 28 63 6f 6e 74 65 6e 74 20 6f  st];  (content o
1510: 66 20 64 6f 63 6c 69 73 74 29 0a 2a 2a 20 7d 0a  f doclist).** }.
1520: 2a 2a 0a 2a 2a 20 48 65 72 65 2c 20 61 72 72 61  **.** Here, arra
1530: 79 20 7b 20 58 20 7d 20 6d 65 61 6e 73 20 7a 65  y { X } means ze
1540: 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72  ro or more occur
1550: 72 65 6e 63 65 73 20 6f 66 20 58 2c 20 61 64 6a  rences of X, adj
1560: 61 63 65 6e 74 20 69 6e 0a 2a 2a 20 6d 65 6d 6f  acent in.** memo
1570: 72 79 2e 0a 2a 2a 0a 2a 2a 20 4c 65 61 66 20 6e  ry..**.** Leaf n
1580: 6f 64 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  odes are broken 
1590: 69 6e 74 6f 20 62 6c 6f 63 6b 73 20 77 68 69 63  into blocks whic
15a0: 68 20 61 72 65 20 73 74 6f 72 65 64 20 63 6f 6e  h are stored con
15b0: 74 69 67 75 6f 75 73 6c 79 20 69 6e 0a 2a 2a 20  tiguously in.** 
15c0: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
15d0: 61 62 6c 65 20 69 6e 20 73 6f 72 74 65 64 20 6f  able in sorted o
15e0: 72 64 65 72 2e 20 20 54 68 69 73 20 6d 65 61 6e  rder.  This mean
15f0: 73 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  s that when the 
1600: 65 6e 64 0a 2a 2a 20 6f 66 20 61 20 6e 6f 64 65  end.** of a node
1610: 20 69 73 20 72 65 61 63 68 65 64 2c 20 74 68 65   is reached, the
1620: 20 6e 65 78 74 20 74 65 72 6d 20 69 73 20 69 6e   next term is in
1630: 20 74 68 65 20 6e 6f 64 65 20 77 69 74 68 20 74   the node with t
1640: 68 65 20 6e 65 78 74 0a 2a 2a 20 67 72 65 61 74  he next.** great
1650: 65 72 20 6e 6f 64 65 20 69 64 2e 0a 2a 2a 0a 2a  er node id..**.*
1660: 2a 20 4e 65 77 20 64 61 74 61 20 69 73 20 73 70  * New data is sp
1670: 69 6c 6c 65 64 20 74 6f 20 61 20 6e 65 77 20 6c  illed to a new l
1680: 65 61 66 20 6e 6f 64 65 20 77 68 65 6e 20 74 68  eaf node when th
1690: 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 0a 2a  e current node.*
16a0: 2a 20 65 78 63 65 65 64 73 20 4c 45 41 46 5f 4d  * exceeds LEAF_M
16b0: 41 58 20 62 79 74 65 73 20 28 64 65 66 61 75 6c  AX bytes (defaul
16c0: 74 20 32 30 34 38 29 2e 20 20 4e 65 77 20 64 61  t 2048).  New da
16d0: 74 61 20 77 68 69 63 68 20 69 74 73 65 6c 66 20  ta which itself 
16e0: 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61  is.** larger tha
16f0: 6e 20 53 54 41 4e 44 41 4c 4f 4e 45 5f 4d 49 4e  n STANDALONE_MIN
1700: 20 28 64 65 66 61 75 6c 74 20 31 30 32 34 29 20   (default 1024) 
1710: 69 73 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  is placed in a s
1720: 74 61 6e 64 61 6c 6f 6e 65 0a 2a 2a 20 6e 6f 64  tandalone.** nod
1730: 65 20 28 61 20 6c 65 61 66 20 6e 6f 64 65 20 77  e (a leaf node w
1740: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 74 65 72  ith a single ter
1750: 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 29 2e 20  m and doclist). 
1760: 20 54 68 65 20 67 6f 61 6c 20 6f 66 0a 2a 2a 20   The goal of.** 
1770: 74 68 65 73 65 20 73 65 74 74 69 6e 67 73 20 69  these settings i
1780: 73 20 74 6f 20 70 61 63 6b 20 74 6f 67 65 74 68  s to pack togeth
1790: 65 72 20 67 72 6f 75 70 73 20 6f 66 20 73 6d 61  er groups of sma
17a0: 6c 6c 20 64 6f 63 6c 69 73 74 73 20 77 68 69 6c  ll doclists whil
17b0: 65 0a 2a 2a 20 6d 61 6b 69 6e 67 20 69 74 20 65  e.** making it e
17c0: 66 66 69 63 69 65 6e 74 20 74 6f 20 64 69 72 65  fficient to dire
17d0: 63 74 6c 79 20 61 63 63 65 73 73 20 6c 61 72 67  ctly access larg
17e0: 65 20 64 6f 63 6c 69 73 74 73 2e 20 20 54 68 65  e doclists.  The
17f0: 0a 2a 2a 20 61 73 73 75 6d 70 74 69 6f 6e 20 69  .** assumption i
1800: 73 20 74 68 61 74 20 6c 61 72 67 65 20 64 6f 63  s that large doc
1810: 6c 69 73 74 73 20 72 65 70 72 65 73 65 6e 74 20  lists represent 
1820: 74 65 72 6d 73 20 77 68 69 63 68 20 61 72 65 20  terms which are 
1830: 6d 6f 72 65 0a 2a 2a 20 6c 69 6b 65 6c 79 20 74  more.** likely t
1840: 6f 20 62 65 20 71 75 65 72 79 20 74 61 72 67 65  o be query targe
1850: 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 28 73  ts..**.** TODO(s
1860: 68 65 73 73 29 20 49 74 20 6d 61 79 20 62 65 20  hess) It may be 
1870: 75 73 65 66 75 6c 20 66 6f 72 20 62 6c 6f 63 6b  useful for block
1880: 69 6e 67 20 64 65 63 69 73 69 6f 6e 73 20 74 6f  ing decisions to
1890: 20 62 65 20 6d 6f 72 65 0a 2a 2a 20 64 79 6e 61   be more.** dyna
18a0: 6d 69 63 2e 20 20 46 6f 72 20 69 6e 73 74 61 6e  mic.  For instan
18b0: 63 65 2c 20 69 74 20 6d 61 79 20 6d 61 6b 65 20  ce, it may make 
18c0: 6d 6f 72 65 20 73 65 6e 73 65 20 74 6f 20 68 61  more sense to ha
18d0: 76 65 20 61 20 32 2e 35 6b 20 6c 65 61 66 0a 2a  ve a 2.5k leaf.*
18e0: 2a 20 6e 6f 64 65 20 72 61 74 68 65 72 20 74 68  * node rather th
18f0: 61 6e 20 73 70 6c 69 74 74 69 6e 67 20 69 6e 74  an splitting int
1900: 6f 20 32 6b 20 61 6e 64 20 2e 35 6b 20 6e 6f 64  o 2k and .5k nod
1910: 65 73 2e 20 20 4d 79 20 69 6e 74 75 69 74 69 6f  es.  My intuitio
1920: 6e 20 69 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  n is.** that thi
1930: 73 20 6d 69 67 68 74 20 65 78 74 65 6e 64 20 74  s might extend t
1940: 68 72 6f 75 67 68 20 32 78 20 6f 72 20 34 78 20  hrough 2x or 4x 
1950: 74 68 65 20 70 61 67 65 73 69 7a 65 2e 0a 2a 2a  the pagesize..**
1960: 0a 2a 2a 0a 2a 2a 2a 2a 20 53 65 67 6d 65 6e 74  .**.**** Segment
1970: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20   interior nodes 
1980: 2a 2a 2a 2a 0a 2a 2a 20 53 65 67 6d 65 6e 74 20  ****.** Segment 
1990: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 73  interior nodes s
19a0: 74 6f 72 65 20 62 6c 6f 63 6b 69 64 73 20 66 6f  tore blockids fo
19b0: 72 20 73 75 62 74 72 65 65 20 6e 6f 64 65 73 20  r subtree nodes 
19c0: 61 6e 64 20 74 65 72 6d 73 0a 2a 2a 20 74 6f 20  and terms.** to 
19d0: 64 65 73 63 72 69 62 65 20 77 68 61 74 20 64 61  describe what da
19e0: 74 61 20 69 73 20 73 74 6f 72 65 64 20 62 79 20  ta is stored by 
19f0: 74 68 65 20 65 61 63 68 20 73 75 62 74 72 65 65  the each subtree
1a00: 2e 20 20 49 6e 74 65 72 69 6f 72 0a 2a 2a 20 6e  .  Interior.** n
1a10: 6f 64 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  odes are written
1a20: 20 75 73 69 6e 67 20 49 6e 74 65 72 69 6f 72 57   using InteriorW
1a30: 72 69 74 65 72 2c 20 61 6e 64 20 72 65 61 64 20  riter, and read 
1a40: 75 73 69 6e 67 0a 2a 2a 20 49 6e 74 65 72 69 6f  using.** Interio
1a50: 72 52 65 61 64 65 72 2e 20 20 49 6e 74 65 72 69  rReader.  Interi
1a60: 6f 72 57 72 69 74 65 72 73 20 61 72 65 20 63 72  orWriters are cr
1a70: 65 61 74 65 64 20 61 73 20 6e 65 65 64 65 64 20  eated as needed 
1a80: 77 68 65 6e 0a 2a 2a 20 53 65 67 6d 65 6e 74 57  when.** SegmentW
1a90: 72 69 74 65 72 20 63 72 65 61 74 65 73 20 6e 65  riter creates ne
1aa0: 77 20 6c 65 61 66 20 6e 6f 64 65 73 2c 20 6f 72  w leaf nodes, or
1ab0: 20 77 68 65 6e 20 61 6e 20 69 6e 74 65 72 69 6f   when an interio
1ac0: 72 20 6e 6f 64 65 0a 2a 2a 20 69 74 73 65 6c 66  r node.** itself
1ad0: 20 67 72 6f 77 73 20 74 6f 6f 20 62 69 67 20 61   grows too big a
1ae0: 6e 64 20 6d 75 73 74 20 62 65 20 73 70 6c 69 74  nd must be split
1af0: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66  .  The format of
1b00: 20 69 6e 74 65 72 69 6f 72 0a 2a 2a 20 6e 6f 64   interior.** nod
1b10: 65 73 3a 0a 2a 2a 0a 2a 2a 20 76 61 72 69 6e 74  es:.**.** varint
1b20: 20 69 48 65 69 67 68 74 3b 20 20 20 20 20 20 20   iHeight;       
1b30: 20 20 20 20 28 68 65 69 67 68 74 20 66 72 6f 6d      (height from
1b40: 20 6c 65 61 66 20 6c 65 76 65 6c 2c 20 61 6c 77   leaf level, alw
1b50: 61 79 73 20 3e 30 29 0a 2a 2a 20 76 61 72 69 6e  ays >0).** varin
1b60: 74 20 69 42 6c 6f 63 6b 69 64 3b 20 20 20 20 20  t iBlockid;     
1b70: 20 20 20 20 20 28 62 6c 6f 63 6b 20 69 64 20 6f       (block id o
1b80: 66 20 6e 6f 64 65 27 73 20 6c 65 66 74 6d 6f 73  f node's leftmos
1b90: 74 20 73 75 62 74 72 65 65 29 0a 2a 2a 20 6f 70  t subtree).** op
1ba0: 74 69 6f 6e 61 6c 20 7b 0a 2a 2a 20 20 20 76 61  tional {.**   va
1bb0: 72 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20  rint nTerm;     
1bc0: 20 20 20 20 20 20 28 6c 65 6e 67 74 68 20 6f 66        (length of
1bd0: 20 66 69 72 73 74 20 74 65 72 6d 29 0a 2a 2a 20   first term).** 
1be0: 20 20 63 68 61 72 20 70 54 65 72 6d 5b 6e 54 65    char pTerm[nTe
1bf0: 72 6d 5d 3b 20 20 20 20 20 20 28 63 6f 6e 74 65  rm];      (conte
1c00: 6e 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  nt of first term
1c10: 29 0a 2a 2a 20 20 20 61 72 72 61 79 20 7b 0a 2a  ).**   array {.*
1c20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 28 66 75 72 74 68 65 72 20 74 65 72 6d 73 20   (further terms 
1c50: 61 72 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65  are delta-encode
1c60: 64 29 0a 2a 2a 20 20 20 20 20 76 61 72 69 6e 74  d).**     varint
1c70: 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
1c80: 20 20 20 20 20 28 6c 65 6e 67 74 68 20 6f 66 20       (length of 
1c90: 73 68 61 72 65 64 20 70 72 65 66 69 78 20 77 69  shared prefix wi
1ca0: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
1cb0: 29 0a 2a 2a 20 20 20 20 20 76 61 72 69 6e 74 20  ).**     varint 
1cc0: 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20  nSuffix;        
1cd0: 20 20 20 20 28 6c 65 6e 67 74 68 20 6f 66 20 75      (length of u
1ce0: 6e 73 68 61 72 65 64 20 73 75 66 66 69 78 29 0a  nshared suffix).
1cf0: 2a 2a 20 20 20 20 20 63 68 61 72 20 70 54 65 72  **     char pTer
1d00: 6d 53 75 66 66 69 78 5b 6e 53 75 66 66 69 78 5d  mSuffix[nSuffix]
1d10: 3b 20 28 75 6e 73 68 61 72 65 64 20 73 75 66 66  ; (unshared suff
1d20: 69 78 20 6f 66 20 6e 65 78 74 20 74 65 72 6d 29  ix of next term)
1d30: 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 7d 0a 2a 2a 0a  .**   }.** }.**.
1d40: 2a 2a 20 48 65 72 65 2c 20 6f 70 74 69 6f 6e 61  ** Here, optiona
1d50: 6c 20 7b 20 58 20 7d 20 6d 65 61 6e 73 20 61 6e  l { X } means an
1d60: 20 6f 70 74 69 6f 6e 61 6c 20 65 6c 65 6d 65 6e   optional elemen
1d70: 74 2c 20 77 68 69 6c 65 20 61 72 72 61 79 20 7b  t, while array {
1d80: 20 58 20 7d 0a 2a 2a 20 6d 65 61 6e 73 20 7a 65   X }.** means ze
1d90: 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72  ro or more occur
1da0: 72 65 6e 63 65 73 20 6f 66 20 58 2c 20 61 64 6a  rences of X, adj
1db0: 61 63 65 6e 74 20 69 6e 20 6d 65 6d 6f 72 79 2e  acent in memory.
1dc0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 72 69  .**.** An interi
1dd0: 6f 72 20 6e 6f 64 65 20 65 6e 63 6f 64 65 73 20  or node encodes 
1de0: 6e 20 74 65 72 6d 73 20 73 65 70 61 72 61 74 69  n terms separati
1df0: 6e 67 20 6e 2b 31 20 73 75 62 74 72 65 65 73 2e  ng n+1 subtrees.
1e00: 20 20 54 68 65 0a 2a 2a 20 73 75 62 74 72 65 65    The.** subtree
1e10: 20 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 6e 74   blocks are cont
1e20: 69 67 75 6f 75 73 2c 20 73 6f 20 6f 6e 6c 79 20  iguous, so only 
1e30: 74 68 65 20 66 69 72 73 74 20 73 75 62 74 72 65  the first subtre
1e40: 65 27 73 20 62 6c 6f 63 6b 69 64 0a 2a 2a 20 69  e's blockid.** i
1e50: 73 20 65 6e 63 6f 64 65 64 2e 20 20 54 68 65 20  s encoded.  The 
1e60: 73 75 62 74 72 65 65 20 61 74 20 69 42 6c 6f 63  subtree at iBloc
1e70: 6b 69 64 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  kid will contain
1e80: 20 61 6c 6c 20 74 65 72 6d 73 20 6c 65 73 73 0a   all terms less.
1e90: 2a 2a 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  ** than the firs
1ea0: 74 20 74 65 72 6d 20 65 6e 63 6f 64 65 64 20 28  t term encoded (
1eb0: 6f 72 20 61 6c 6c 20 74 65 72 6d 73 20 69 66 20  or all terms if 
1ec0: 6e 6f 20 74 65 72 6d 20 69 73 20 65 6e 63 6f 64  no term is encod
1ed0: 65 64 29 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed)..** Otherwis
1ee0: 65 2c 20 66 6f 72 20 74 65 72 6d 73 20 67 72 65  e, for terms gre
1ef0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1f00: 61 6c 20 74 6f 20 70 54 65 72 6d 5b 69 5d 20 62  al to pTerm[i] b
1f10: 75 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ut less.** than 
1f20: 70 54 65 72 6d 5b 69 2b 31 5d 2c 20 74 68 65 20  pTerm[i+1], the 
1f30: 73 75 62 74 72 65 65 20 66 6f 72 20 74 68 61 74  subtree for that
1f40: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 72 6f   term will be ro
1f50: 6f 74 65 64 20 61 74 0a 2a 2a 20 69 42 6c 6f 63  oted at.** iBloc
1f60: 6b 69 64 2b 69 2e 20 20 49 6e 74 65 72 69 6f 72  kid+i.  Interior
1f70: 20 6e 6f 64 65 73 20 6f 6e 6c 79 20 73 74 6f 72   nodes only stor
1f80: 65 20 65 6e 6f 75 67 68 20 74 65 72 6d 20 64 61  e enough term da
1f90: 74 61 20 74 6f 0a 2a 2a 20 64 69 73 74 69 6e 67  ta to.** disting
1fa0: 75 69 73 68 20 61 64 6a 61 63 65 6e 74 20 63 68  uish adjacent ch
1fb0: 69 6c 64 72 65 6e 20 28 69 66 20 74 68 65 20 72  ildren (if the r
1fc0: 69 67 68 74 6d 6f 73 74 20 74 65 72 6d 20 6f 66  ightmost term of
1fd0: 20 74 68 65 20 6c 65 66 74 0a 2a 2a 20 63 68 69   the left.** chi
1fe0: 6c 64 20 69 73 20 22 73 6f 6d 65 74 68 69 6e 67  ld is "something
1ff0: 22 2c 20 61 6e 64 20 74 68 65 20 6c 65 66 74 6d  ", and the leftm
2000: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
2010: 72 69 67 68 74 20 63 68 69 6c 64 20 69 73 0a 2a  right child is.*
2020: 2a 20 22 77 69 63 6b 65 64 22 2c 20 6f 6e 6c 79  * "wicked", only
2030: 20 22 77 22 20 69 73 20 73 74 6f 72 65 64 29 2e   "w" is stored).
2040: 0a 2a 2a 0a 2a 2a 20 4e 65 77 20 64 61 74 61 20  .**.** New data 
2050: 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 61 20  is spilled to a 
2060: 6e 65 77 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  new interior nod
2070: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 68 65  e at the same he
2080: 69 67 68 74 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ight when.** the
2090: 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 65 78   current node ex
20a0: 63 65 65 64 73 20 49 4e 54 45 52 49 4f 52 5f 4d  ceeds INTERIOR_M
20b0: 41 58 20 62 79 74 65 73 20 28 64 65 66 61 75 6c  AX bytes (defaul
20c0: 74 20 32 30 34 38 29 2e 0a 2a 2a 20 49 4e 54 45  t 2048)..** INTE
20d0: 52 49 4f 52 5f 4d 49 4e 5f 54 45 52 4d 53 20 28  RIOR_MIN_TERMS (
20e0: 64 65 66 61 75 6c 74 20 37 29 20 6b 65 65 70 73  default 7) keeps
20f0: 20 6c 61 72 67 65 20 74 65 72 6d 73 20 66 72 6f   large terms fro
2100: 6d 20 6d 6f 6e 6f 70 6f 6c 69 7a 69 6e 67 0a 2a  m monopolizing.*
2110: 2a 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73  * interior nodes
2120: 20 61 6e 64 20 6d 61 6b 69 6e 67 20 74 68 65 20   and making the 
2130: 74 72 65 65 20 74 6f 6f 20 73 6b 69 6e 6e 79 2e  tree too skinny.
2140: 20 20 54 68 65 20 69 6e 74 65 72 69 6f 72 20 6e    The interior n
2150: 6f 64 65 73 0a 2a 2a 20 61 74 20 61 20 67 69 76  odes.** at a giv
2160: 65 6e 20 68 65 69 67 68 74 20 61 72 65 20 6e 61  en height are na
2170: 74 75 72 61 6c 6c 79 20 74 72 61 63 6b 65 64 20  turally tracked 
2180: 62 79 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  by interior node
2190: 73 20 61 74 0a 2a 2a 20 68 65 69 67 68 74 2b 31  s at.** height+1
21a0: 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a  , and so on..**.
21b0: 2a 2a 0a 2a 2a 2a 2a 20 53 65 67 6d 65 6e 74 20  **.**** Segment 
21c0: 64 69 72 65 63 74 6f 72 79 20 2a 2a 2a 2a 0a 2a  directory ****.*
21d0: 2a 20 54 68 65 20 73 65 67 6d 65 6e 74 20 64 69  * The segment di
21e0: 72 65 63 74 6f 72 79 20 69 6e 20 74 61 62 6c 65  rectory in table
21f0: 20 25 5f 73 65 67 64 69 72 20 73 74 6f 72 65 73   %_segdir stores
2200: 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
2210: 6e 20 66 6f 72 0a 2a 2a 20 6d 65 72 67 69 6e 67  n for.** merging
2220: 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 20 73 65   and deleting se
2230: 67 6d 65 6e 74 73 2c 20 61 6e 64 20 61 6c 73 6f  gments, and also
2240: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f   the root node o
2250: 66 20 74 68 65 0a 2a 2a 20 73 65 67 6d 65 6e 74  f the.** segment
2260: 27 73 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54  's tree..**.** T
2270: 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 69 73 20  he root node is 
2280: 74 68 65 20 74 6f 70 20 6e 6f 64 65 20 6f 66 20  the top node of 
2290: 74 68 65 20 73 65 67 6d 65 6e 74 27 73 20 74 72  the segment's tr
22a0: 65 65 20 61 66 74 65 72 20 65 6e 63 6f 64 69 6e  ee after encodin
22b0: 67 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  g.** the entire 
22c0: 73 65 67 6d 65 6e 74 2c 20 72 65 73 74 72 69 63  segment, restric
22d0: 74 65 64 20 74 6f 20 52 4f 4f 54 5f 4d 41 58 20  ted to ROOT_MAX 
22e0: 62 79 74 65 73 20 28 64 65 66 61 75 6c 74 20 31  bytes (default 1
22f0: 30 32 34 29 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  024)..** This co
2300: 75 6c 64 20 62 65 20 65 69 74 68 65 72 20 61 20  uld be either a 
2310: 6c 65 61 66 20 6e 6f 64 65 20 6f 72 20 61 6e 20  leaf node or an 
2320: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
2330: 49 66 20 74 68 65 20 74 6f 70 0a 2a 2a 20 6e 6f  If the top.** no
2340: 64 65 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65  de requires more
2350: 20 74 68 61 6e 20 52 4f 4f 54 5f 4d 41 58 20 62   than ROOT_MAX b
2360: 79 74 65 73 2c 20 69 74 20 69 73 20 66 6c 75 73  ytes, it is flus
2370: 68 65 64 20 74 6f 20 25 5f 73 65 67 6d 65 6e 74  hed to %_segment
2380: 73 0a 2a 2a 20 61 6e 64 20 61 20 6e 65 77 20 72  s.** and a new r
2390: 6f 6f 74 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  oot interior nod
23a0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 28  e is generated (
23b0: 77 68 69 63 68 20 73 68 6f 75 6c 64 20 61 6c 77  which should alw
23c0: 61 79 73 20 66 69 74 0a 2a 2a 20 77 69 74 68 69  ays fit.** withi
23d0: 6e 20 52 4f 4f 54 5f 4d 41 58 20 62 65 63 61 75  n ROOT_MAX becau
23e0: 73 65 20 69 74 20 6f 6e 6c 79 20 6e 65 65 64 73  se it only needs
23f0: 20 73 70 61 63 65 20 66 6f 72 20 32 20 76 61 72   space for 2 var
2400: 69 6e 74 73 2c 20 74 68 65 0a 2a 2a 20 68 65 69  ints, the.** hei
2410: 67 68 74 20 61 6e 64 20 74 68 65 20 62 6c 6f 63  ght and the bloc
2420: 6b 69 64 20 6f 66 20 74 68 65 20 70 72 65 76 69  kid of the previ
2430: 6f 75 73 20 72 6f 6f 74 29 2e 0a 2a 2a 0a 2a 2a  ous root)..**.**
2440: 20 54 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   The meta-inform
2450: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 67  ation in the seg
2460: 6d 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 69  ment directory i
2470: 73 3a 0a 2a 2a 20 20 20 6c 65 76 65 6c 20 20 20  s:.**   level   
2480: 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 73 65              - se
2490: 67 6d 65 6e 74 20 6c 65 76 65 6c 20 28 73 65 65  gment level (see
24a0: 20 62 65 6c 6f 77 29 0a 2a 2a 20 20 20 69 64 78   below).**   idx
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 2d 20 69 6e 64 65 78 20 77 69 74 68 69 6e 20   - index within 
24d0: 6c 65 76 65 6c 0a 2a 2a 20 20 20 20 20 20 20 20  level.**        
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
24f0: 20 28 6c 65 76 65 6c 2c 69 64 78 20 75 6e 69 71   (level,idx uniq
2500: 75 65 6c 79 20 69 64 65 6e 74 69 66 79 20 61 20  uely identify a 
2510: 73 65 67 6d 65 6e 74 29 0a 2a 2a 20 20 20 73 74  segment).**   st
2520: 61 72 74 5f 62 6c 6f 63 6b 20 20 20 20 20 20 20  art_block       
2530: 20 20 2d 20 66 69 72 73 74 20 6c 65 61 66 20 6e    - first leaf n
2540: 6f 64 65 0a 2a 2a 20 20 20 6c 65 61 76 65 73 5f  ode.**   leaves_
2550: 65 6e 64 5f 62 6c 6f 63 6b 20 20 20 20 2d 20 6c  end_block    - l
2560: 61 73 74 20 6c 65 61 66 20 6e 6f 64 65 0a 2a 2a  ast leaf node.**
2570: 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 20 20 20 20     end_block    
2580: 20 20 20 20 20 20 20 2d 20 6c 61 73 74 20 62 6c         - last bl
2590: 6f 63 6b 20 28 69 6e 63 6c 75 64 69 6e 67 20 69  ock (including i
25a0: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 29 0a 2a  nterior nodes).*
25b0: 2a 20 20 20 72 6f 6f 74 20 20 20 20 20 20 20 20  *   root        
25c0: 20 20 20 20 20 20 20 20 2d 20 63 6f 6e 74 65 6e          - conten
25d0: 74 73 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65 0a  ts of root node.
25e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f  **.** If the roo
25f0: 74 20 6e 6f 64 65 20 69 73 20 61 20 6c 65 61 66  t node is a leaf
2600: 20 6e 6f 64 65 2c 20 74 68 65 6e 20 73 74 61 72   node, then star
2610: 74 5f 62 6c 6f 63 6b 2c 0a 2a 2a 20 6c 65 61 76  t_block,.** leav
2620: 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 61 6e  es_end_block, an
2630: 64 20 65 6e 64 5f 62 6c 6f 63 6b 20 61 72 65 20  d end_block are 
2640: 61 6c 6c 20 30 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 2a  all 0..**.**.***
2650: 2a 20 53 65 67 6d 65 6e 74 20 6d 65 72 67 69 6e  * Segment mergin
2660: 67 20 2a 2a 2a 2a 0a 2a 2a 20 54 6f 20 61 6d 6f  g ****.** To amo
2670: 72 74 69 7a 65 20 75 70 64 61 74 65 20 63 6f 73  rtize update cos
2680: 74 73 2c 20 73 65 67 6d 65 6e 74 73 20 61 72 65  ts, segments are
2690: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 6c 65   grouped into le
26a0: 76 65 6c 73 20 61 6e 64 0a 2a 2a 20 6d 65 72 67  vels and.** merg
26b0: 65 64 20 69 6e 20 62 61 74 63 68 65 73 2e 20 20  ed in batches.  
26c0: 45 61 63 68 20 69 6e 63 72 65 61 73 65 20 69 6e  Each increase in
26d0: 20 6c 65 76 65 6c 20 72 65 70 72 65 73 65 6e 74   level represent
26e0: 73 20 65 78 70 6f 6e 65 6e 74 69 61 6c 6c 79 0a  s exponentially.
26f0: 2a 2a 20 6d 6f 72 65 20 64 6f 63 75 6d 65 6e 74  ** more document
2700: 73 2e 0a 2a 2a 0a 2a 2a 20 4e 65 77 20 64 6f 63  s..**.** New doc
2710: 75 6d 65 6e 74 73 20 28 61 63 74 75 61 6c 6c 79  uments (actually
2720: 2c 20 64 6f 63 75 6d 65 6e 74 20 75 70 64 61 74  , document updat
2730: 65 73 29 20 61 72 65 20 74 6f 6b 65 6e 69 7a 65  es) are tokenize
2740: 64 20 61 6e 64 0a 2a 2a 20 77 72 69 74 74 65 6e  d and.** written
2750: 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 28 75   individually (u
2760: 73 69 6e 67 20 4c 65 61 66 57 72 69 74 65 72 29  sing LeafWriter)
2770: 20 74 6f 20 61 20 6c 65 76 65 6c 20 30 20 73 65   to a level 0 se
2780: 67 6d 65 6e 74 2c 20 77 69 74 68 0a 2a 2a 20 69  gment, with.** i
2790: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 69 64 78 2e  ncrementing idx.
27a0: 20 20 57 68 65 6e 20 69 64 78 20 72 65 61 63 68    When idx reach
27b0: 65 73 20 4d 45 52 47 45 5f 43 4f 55 4e 54 20 28  es MERGE_COUNT (
27c0: 64 65 66 61 75 6c 74 20 31 36 29 2c 20 61 6c 6c  default 16), all
27d0: 0a 2a 2a 20 6c 65 76 65 6c 20 30 20 73 65 67 6d  .** level 0 segm
27e0: 65 6e 74 73 20 61 72 65 20 6d 65 72 67 65 64 20  ents are merged 
27f0: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65  into a single le
2800: 76 65 6c 20 31 20 73 65 67 6d 65 6e 74 2e 20 20  vel 1 segment.  
2810: 4c 65 76 65 6c 20 31 0a 2a 2a 20 69 73 20 70 6f  Level 1.** is po
2820: 70 75 6c 61 74 65 64 20 6c 69 6b 65 20 6c 65 76  pulated like lev
2830: 65 6c 20 30 2c 20 61 6e 64 20 65 76 65 6e 74 75  el 0, and eventu
2840: 61 6c 6c 79 20 4d 45 52 47 45 5f 43 4f 55 4e 54  ally MERGE_COUNT
2850: 20 6c 65 76 65 6c 20 31 0a 2a 2a 20 73 65 67 6d   level 1.** segm
2860: 65 6e 74 73 20 61 72 65 20 6d 65 72 67 65 64 20  ents are merged 
2870: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  to a single leve
2880: 6c 20 32 20 73 65 67 6d 65 6e 74 20 28 72 65 70  l 2 segment (rep
2890: 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 4d 45 52  resenting.** MER
28a0: 47 45 5f 43 4f 55 4e 54 5e 32 20 75 70 64 61 74  GE_COUNT^2 updat
28b0: 65 73 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a  es), and so on..
28c0: 2a 2a 0a 2a 2a 20 41 20 73 65 67 6d 65 6e 74 20  **.** A segment 
28d0: 6d 65 72 67 65 20 74 72 61 76 65 72 73 65 73 20  merge traverses 
28e0: 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61 74 20  all segments at 
28f0: 61 20 67 69 76 65 6e 20 6c 65 76 65 6c 20 69 6e  a given level in
2900: 0a 2a 2a 20 70 61 72 61 6c 6c 65 6c 2c 20 70 65  .** parallel, pe
2910: 72 66 6f 72 6d 69 6e 67 20 61 20 73 74 72 61 69  rforming a strai
2920: 67 68 74 66 6f 72 77 61 72 64 20 73 6f 72 74 65  ghtforward sorte
2930: 64 20 6d 65 72 67 65 2e 20 20 53 69 6e 63 65 20  d merge.  Since 
2940: 73 65 67 6d 65 6e 74 0a 2a 2a 20 6c 65 61 66 20  segment.** leaf 
2950: 6e 6f 64 65 73 20 61 72 65 20 77 72 69 74 74 65  nodes are writte
2960: 6e 20 69 6e 20 74 6f 20 74 68 65 20 25 5f 73 65  n in to the %_se
2970: 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 69 6e 20  gments table in 
2980: 6f 72 64 65 72 2c 20 74 68 69 73 0a 2a 2a 20 6d  order, this.** m
2990: 65 72 67 65 20 74 72 61 76 65 72 73 65 73 20 74  erge traverses t
29a0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 71  he underlying sq
29b0: 6c 69 74 65 20 64 69 73 6b 20 73 74 72 75 63 74  lite disk struct
29c0: 75 72 65 73 20 65 66 66 69 63 69 65 6e 74 6c 79  ures efficiently
29d0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6d  ..** After the m
29e0: 65 72 67 65 2c 20 61 6c 6c 20 73 65 67 6d 65 6e  erge, all segmen
29f0: 74 20 62 6c 6f 63 6b 73 20 66 72 6f 6d 20 74 68  t blocks from th
2a00: 65 20 6d 65 72 67 65 64 20 6c 65 76 65 6c 20 61  e merged level a
2a10: 72 65 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a  re.** deleted..*
2a20: 2a 0a 2a 2a 20 4d 45 52 47 45 5f 43 4f 55 4e 54  *.** MERGE_COUNT
2a30: 20 63 6f 6e 74 72 6f 6c 73 20 68 6f 77 20 6f 66   controls how of
2a40: 74 65 6e 20 77 65 20 6d 65 72 67 65 20 73 65 67  ten we merge seg
2a50: 6d 65 6e 74 73 2e 20 20 31 36 20 73 65 65 6d 73  ments.  16 seems
2a60: 20 74 6f 20 62 65 0a 2a 2a 20 73 6f 6d 65 77 68   to be.** somewh
2a70: 61 74 20 6f 66 20 61 20 73 77 65 65 74 20 73 70  at of a sweet sp
2a80: 6f 74 20 66 6f 72 20 69 6e 73 65 72 74 69 6f 6e  ot for insertion
2a90: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 33   performance.  3
2aa0: 32 20 61 6e 64 20 36 34 20 73 68 6f 77 0a 2a 2a  2 and 64 show.**
2ab0: 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 70 65   very similar pe
2ac0: 72 66 6f 72 6d 61 6e 63 65 20 6e 75 6d 62 65 72  rformance number
2ad0: 73 20 74 6f 20 31 36 20 6f 6e 20 69 6e 73 65 72  s to 16 on inser
2ae0: 74 69 6f 6e 2c 20 74 68 6f 75 67 68 20 74 68 65  tion, though the
2af0: 79 27 72 65 0a 2a 2a 20 61 20 74 69 6e 79 20 62  y're.** a tiny b
2b00: 69 74 20 73 6c 6f 77 65 72 20 28 70 65 72 68 61  it slower (perha
2b10: 70 73 20 64 75 65 20 74 6f 20 6d 6f 72 65 20 6f  ps due to more o
2b20: 76 65 72 68 65 61 64 20 69 6e 20 6d 65 72 67 65  verhead in merge
2b30: 2d 74 69 6d 65 0a 2a 2a 20 73 6f 72 74 69 6e 67  -time.** sorting
2b40: 29 2e 20 20 38 20 69 73 20 61 62 6f 75 74 20 32  ).  8 is about 2
2b50: 30 25 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 31  0% slower than 1
2b60: 36 2c 20 34 20 61 62 6f 75 74 20 35 30 25 20 73  6, 4 about 50% s
2b70: 6c 6f 77 65 72 20 74 68 61 6e 0a 2a 2a 20 31 36  lower than.** 16
2b80: 2c 20 32 20 61 62 6f 75 74 20 36 36 25 20 73 6c  , 2 about 66% sl
2b90: 6f 77 65 72 20 74 68 61 6e 20 31 36 2e 0a 2a 2a  ower than 16..**
2ba0: 0a 2a 2a 20 41 74 20 71 75 65 72 79 20 74 69 6d  .** At query tim
2bb0: 65 2c 20 68 69 67 68 20 4d 45 52 47 45 5f 43 4f  e, high MERGE_CO
2bc0: 55 4e 54 20 69 6e 63 72 65 61 73 65 73 20 74 68  UNT increases th
2bd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  e number of segm
2be0: 65 6e 74 73 0a 2a 2a 20 77 68 69 63 68 20 6e 65  ents.** which ne
2bf0: 65 64 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  ed to be scanned
2c00: 20 61 6e 64 20 6d 65 72 67 65 64 2e 20 20 46 6f   and merged.  Fo
2c10: 72 20 69 6e 73 74 61 6e 63 65 2c 20 77 69 74 68  r instance, with
2c20: 20 31 30 30 6b 20 64 6f 63 73 0a 2a 2a 20 69 6e   100k docs.** in
2c30: 73 65 72 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  serted:.**.**   
2c40: 20 4d 45 52 47 45 5f 43 4f 55 4e 54 20 20 20 73   MERGE_COUNT   s
2c50: 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  egments.**      
2c60: 20 31 36 20 20 20 20 20 20 20 20 20 20 20 32 35   16           25
2c70: 0a 2a 2a 20 20 20 20 20 20 20 20 38 20 20 20 20  .**        8    
2c80: 20 20 20 20 20 20 20 31 32 0a 2a 2a 20 20 20 20         12.**    
2c90: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
2ca0: 31 30 0a 2a 2a 20 20 20 20 20 20 20 20 32 20 20  10.**        2  
2cb0: 20 20 20 20 20 20 20 20 20 20 36 0a 2a 2a 0a 2a            6.**.*
2cc0: 2a 20 54 68 69 73 20 61 70 70 65 61 72 73 20 74  * This appears t
2cd0: 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 6d 6f  o have only a mo
2ce0: 64 65 72 61 74 65 20 69 6d 70 61 63 74 20 6f 6e  derate impact on
2cf0: 20 71 75 65 72 69 65 73 20 66 6f 72 20 76 65 72   queries for ver
2d00: 79 0a 2a 2a 20 66 72 65 71 75 65 6e 74 20 74 65  y.** frequent te
2d10: 72 6d 73 20 28 77 68 69 63 68 20 61 72 65 20 73  rms (which are s
2d20: 6f 6d 65 77 68 61 74 20 64 6f 6d 69 6e 61 74 65  omewhat dominate
2d30: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6d 65 72  d by segment mer
2d40: 67 65 0a 2a 2a 20 63 6f 73 74 73 29 2c 20 61 6e  ge.** costs), an
2d50: 64 20 69 6e 66 72 65 71 75 65 6e 74 20 61 6e 64  d infrequent and
2d60: 20 6e 6f 6e 2d 65 78 69 73 74 65 6e 74 20 74 65   non-existent te
2d70: 72 6d 73 20 73 74 69 6c 6c 20 73 65 65 6d 20 74  rms still seem t
2d80: 6f 20 62 65 20 66 61 73 74 0a 2a 2a 20 65 76 65  o be fast.** eve
2d90: 6e 20 77 69 74 68 20 6d 61 6e 79 20 73 65 67 6d  n with many segm
2da0: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  ents..**.** TODO
2db0: 28 73 68 65 73 73 29 20 54 68 61 74 20 73 61 69  (shess) That sai
2dc0: 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 20 6e  d, it would be n
2dd0: 69 63 65 20 74 6f 20 68 61 76 65 20 61 20 62 65  ice to have a be
2de0: 74 74 65 72 20 71 75 65 72 79 2d 73 69 64 65 0a  tter query-side.
2df0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  ** argument for 
2e00: 4d 45 52 47 45 5f 43 4f 55 4e 54 20 6f 66 20 31  MERGE_COUNT of 1
2e10: 36 2e 20 20 41 6c 73 6f 2c 20 69 74 20 69 73 20  6.  Also, it is 
2e20: 70 6f 73 73 69 62 6c 65 2f 6c 69 6b 65 6c 79 20  possible/likely 
2e30: 74 68 61 74 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  that.** optimiza
2e40: 74 69 6f 6e 73 20 74 6f 20 74 68 69 6e 67 73 20  tions to things 
2e50: 6c 69 6b 65 20 64 6f 63 6c 69 73 74 20 6d 65 72  like doclist mer
2e60: 67 69 6e 67 20 77 69 6c 6c 20 73 77 69 6e 67 20  ging will swing 
2e70: 74 68 65 20 73 77 65 65 74 0a 2a 2a 20 73 70 6f  the sweet.** spo
2e80: 74 20 61 72 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 0a  t around..**.**.
2e90: 2a 2a 0a 2a 2a 2a 2a 20 48 61 6e 64 6c 69 6e 67  **.**** Handling
2ea0: 20 6f 66 20 64 65 6c 65 74 69 6f 6e 73 20 61 6e   of deletions an
2eb0: 64 20 75 70 64 61 74 65 73 20 2a 2a 2a 2a 0a 2a  d updates ****.*
2ec0: 2a 20 53 69 6e 63 65 20 77 65 27 72 65 20 75 73  * Since we're us
2ed0: 69 6e 67 20 61 20 73 65 67 6d 65 6e 74 65 64 20  ing a segmented 
2ee0: 73 74 72 75 63 74 75 72 65 2c 20 77 69 74 68 20  structure, with 
2ef0: 6e 6f 20 64 6f 63 69 64 2d 6f 72 69 65 6e 74 65  no docid-oriente
2f00: 64 0a 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20  d.** index into 
2f10: 74 68 65 20 74 65 72 6d 20 69 6e 64 65 78 2c 20  the term index, 
2f20: 77 65 20 63 6c 65 61 72 6c 79 20 63 61 6e 6e 6f  we clearly canno
2f30: 74 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20  t simply update 
2f40: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 6e 64 65  the term.** inde
2f50: 78 20 77 68 65 6e 20 61 20 64 6f 63 75 6d 65 6e  x when a documen
2f60: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20  t is deleted or 
2f70: 75 70 64 61 74 65 64 2e 20 20 46 6f 72 20 64 65  updated.  For de
2f80: 6c 65 74 69 6f 6e 73 2c 20 77 65 0a 2a 2a 20 77  letions, we.** w
2f90: 72 69 74 65 20 61 6e 20 65 6d 70 74 79 20 64 6f  rite an empty do
2fa0: 63 6c 69 73 74 20 28 76 61 72 69 6e 74 28 64 6f  clist (varint(do
2fb0: 63 69 64 29 20 76 61 72 69 6e 74 28 50 4f 53 5f  cid) varint(POS_
2fc0: 45 4e 44 29 29 2c 20 66 6f 72 20 75 70 64 61 74  END)), for updat
2fd0: 65 73 0a 2a 2a 20 77 65 20 73 69 6d 70 6c 79 20  es.** we simply 
2fe0: 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 64 6f  write the new do
2ff0: 63 6c 69 73 74 2e 20 20 53 65 67 6d 65 6e 74 20  clist.  Segment 
3000: 6d 65 72 67 65 73 20 6f 76 65 72 77 72 69 74 65  merges overwrite
3010: 20 6f 6c 64 65 72 0a 2a 2a 20 64 61 74 61 20 66   older.** data f
3020: 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
3030: 64 6f 63 69 64 20 77 69 74 68 20 6e 65 77 65 72  docid with newer
3040: 20 64 61 74 61 2c 20 73 6f 20 64 65 6c 65 74 65   data, so delete
3050: 73 20 6f 72 20 75 70 64 61 74 65 73 0a 2a 2a 20  s or updates.** 
3060: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
3070: 6f 76 65 72 74 61 6b 65 20 74 68 65 20 65 61 72  overtake the ear
3080: 6c 69 65 72 20 64 61 74 61 20 61 6e 64 20 6b 6e  lier data and kn
3090: 6f 63 6b 20 69 74 20 6f 75 74 2e 20 20 54 68 65  ock it out.  The
30a0: 0a 2a 2a 20 71 75 65 72 79 20 6c 6f 67 69 63 20  .** query logic 
30b0: 6c 69 6b 65 77 69 73 65 20 6d 65 72 67 65 73 20  likewise merges 
30c0: 64 6f 63 6c 69 73 74 73 20 73 6f 20 74 68 61 74  doclists so that
30d0: 20 6e 65 77 65 72 20 64 61 74 61 20 6b 6e 6f 63   newer data knoc
30e0: 6b 73 20 6f 75 74 0a 2a 2a 20 6f 6c 64 65 72 20  ks out.** older 
30f0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  data..**.** TODO
3100: 28 73 68 65 73 73 29 20 50 72 6f 76 69 64 65 20  (shess) Provide 
3110: 61 20 56 41 43 55 55 4d 20 74 79 70 65 20 6f 70  a VACUUM type op
3120: 65 72 61 74 69 6f 6e 20 74 6f 20 63 6c 65 61 72  eration to clear
3130: 20 6f 75 74 20 61 6c 6c 0a 2a 2a 20 64 65 6c 65   out all.** dele
3140: 74 69 6f 6e 73 20 61 6e 64 20 64 75 70 6c 69 63  tions and duplic
3150: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 77 6f  ations.  This wo
3160: 75 6c 64 20 62 61 73 69 63 61 6c 6c 79 20 62 65  uld basically be
3170: 20 61 20 66 6f 72 63 65 64 20 6d 65 72 67 65 0a   a forced merge.
3180: 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ** into a single
3190: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 0a 23 69   segment..*/..#i
31a0: 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e  nclude "fts3Int.
31b0: 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h".#if !defined(
31c0: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
31d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
31e0: 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 66  NABLE_FTS3)..#if
31f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3200: 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26 26 20  ENABLE_FTS3) && 
3210: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3220: 43 4f 52 45 29 0a 23 20 64 65 66 69 6e 65 20 53  CORE).# define S
3230: 51 4c 49 54 45 5f 43 4f 52 45 20 31 0a 23 65 6e  QLITE_CORE 1.#en
3240: 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 61  dif..#include <a
3250: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
3260: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
3270: 63 6c 75 64 65 20 3c 73 74 64 64 65 66 2e 68 3e  clude <stddef.h>
3280: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
3290: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
32a0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
32b0: 20 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 23 69 6e   <stdarg.h>..#in
32c0: 63 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23  clude "fts3.h".#
32d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43 4f  ifndef SQLITE_CO
32e0: 52 45 20 0a 23 20 69 6e 63 6c 75 64 65 20 22 73  RE .# include "s
32f0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 20 20 53  qlite3ext.h".  S
3300: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
3310: 49 4e 49 54 31 0a 23 65 6e 64 69 66 0a 0a 73 74  INIT1.#endif..st
3320: 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61  atic int fts3Eva
3330: 6c 4e 65 78 74 28 46 74 73 33 43 75 72 73 6f 72  lNext(Fts3Cursor
3340: 20 2a 70 43 73 72 29 3b 0a 73 74 61 74 69 63 20   *pCsr);.static 
3350: 69 6e 74 20 66 74 73 33 45 76 61 6c 53 74 61 72  int fts3EvalStar
3360: 74 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43  t(Fts3Cursor *pC
3370: 73 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  sr);.static int 
3380: 66 74 73 33 54 65 72 6d 53 65 67 52 65 61 64 65  fts3TermSegReade
3390: 72 43 75 72 73 6f 72 28 0a 20 20 20 20 46 74 73  rCursor(.    Fts
33a0: 33 43 75 72 73 6f 72 20 2a 2c 20 63 6f 6e 73 74  3Cursor *, const
33b0: 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 69 6e   char *, int, in
33c0: 74 2c 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  t, Fts3MultiSegR
33d0: 65 61 64 65 72 20 2a 2a 29 3b 0a 0a 2f 2a 20 0a  eader **);../* .
33e0: 2a 2a 20 57 72 69 74 65 20 61 20 36 34 2d 62 69  ** Write a 64-bi
33f0: 74 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74  t variable-lengt
3400: 68 20 69 6e 74 65 67 65 72 20 74 6f 20 6d 65 6d  h integer to mem
3410: 6f 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20  ory starting at 
3420: 70 5b 30 5d 2e 0a 2a 2a 20 54 68 65 20 6c 65 6e  p[0]..** The len
3430: 67 74 68 20 6f 66 20 64 61 74 61 20 77 72 69 74  gth of data writ
3440: 74 65 6e 20 77 69 6c 6c 20 62 65 20 62 65 74 77  ten will be betw
3450: 65 65 6e 20 31 20 61 6e 64 20 46 54 53 33 5f 56  een 1 and FTS3_V
3460: 41 52 49 4e 54 5f 4d 41 58 20 62 79 74 65 73 2e  ARINT_MAX bytes.
3470: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
3480: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
3490: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
34a0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 50  int sqlite3Fts3P
34b0: 75 74 56 61 72 69 6e 74 28 63 68 61 72 20 2a 70  utVarint(char *p
34c0: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76  , sqlite_int64 v
34d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
34e0: 61 72 20 2a 71 20 3d 20 28 75 6e 73 69 67 6e 65  ar *q = (unsigne
34f0: 64 20 63 68 61 72 20 2a 29 20 70 3b 0a 20 20 73  d char *) p;.  s
3500: 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 76 75 20  qlite_uint64 vu 
3510: 3d 20 76 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 2a  = v;.  do{.    *
3520: 71 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  q++ = (unsigned 
3530: 63 68 61 72 29 20 28 28 76 75 20 26 20 30 78 37  char) ((vu & 0x7
3540: 66 29 20 7c 20 30 78 38 30 29 3b 0a 20 20 20 20  f) | 0x80);.    
3550: 76 75 20 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69  vu >>= 7;.  }whi
3560: 6c 65 28 20 76 75 21 3d 30 20 29 3b 0a 20 20 71  le( vu!=0 );.  q
3570: 5b 2d 31 5d 20 26 3d 20 30 78 37 66 3b 20 20 2f  [-1] &= 0x7f;  /
3580: 2a 20 74 75 72 6e 20 6f 66 66 20 68 69 67 68 20  * turn off high 
3590: 62 69 74 20 69 6e 20 66 69 6e 61 6c 20 62 79 74  bit in final byt
35a0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 71  e */.  assert( q
35b0: 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   - (unsigned cha
35c0: 72 20 2a 29 70 20 3c 3d 20 46 54 53 33 5f 56 41  r *)p <= FTS3_VA
35d0: 52 49 4e 54 5f 4d 41 58 20 29 3b 0a 20 20 72 65  RINT_MAX );.  re
35e0: 74 75 72 6e 20 28 69 6e 74 29 20 28 71 20 2d 20  turn (int) (q - 
35f0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
3600: 29 70 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  )p);.}../* .** R
3610: 65 61 64 20 61 20 36 34 2d 62 69 74 20 76 61 72  ead a 64-bit var
3620: 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74  iable-length int
3630: 65 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79  eger from memory
3640: 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 5b 30   starting at p[0
3650: 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  ]..** Return the
3660: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
3670: 20 72 65 61 64 2c 20 6f 72 20 30 20 6f 6e 20 65   read, or 0 on e
3680: 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  rror..** The val
3690: 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ue is stored in 
36a0: 2a 76 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  *v..*/.int sqlit
36b0: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
36c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 73  const char *p, s
36d0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 76 29 7b  qlite_int64 *v){
36e0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
36f0: 64 20 63 68 61 72 20 2a 71 20 3d 20 28 63 6f 6e  d char *q = (con
3700: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3710: 20 2a 29 20 70 3b 0a 20 20 73 71 6c 69 74 65 5f   *) p;.  sqlite_
3720: 75 69 6e 74 36 34 20 78 20 3d 20 30 2c 20 79 20  uint64 x = 0, y 
3730: 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a  = 1;.  while( (*
3740: 71 26 30 78 38 30 29 3d 3d 30 78 38 30 20 26 26  q&0x80)==0x80 &&
3750: 20 71 2d 28 75 6e 73 69 67 6e 65 64 20 63 68 61   q-(unsigned cha
3760: 72 20 2a 29 70 3c 46 54 53 33 5f 56 41 52 49 4e  r *)p<FTS3_VARIN
3770: 54 5f 4d 41 58 20 29 7b 0a 20 20 20 20 78 20 2b  T_MAX ){.    x +
3780: 3d 20 79 20 2a 20 28 2a 71 2b 2b 20 26 20 30 78  = y * (*q++ & 0x
3790: 37 66 29 3b 0a 20 20 20 20 79 20 3c 3c 3d 20 37  7f);.    y <<= 7
37a0: 3b 0a 20 20 7d 0a 20 20 78 20 2b 3d 20 79 20 2a  ;.  }.  x += y *
37b0: 20 28 2a 71 2b 2b 29 3b 0a 20 20 2a 76 20 3d 20   (*q++);.  *v = 
37c0: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 20 78  (sqlite_int64) x
37d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
37e0: 20 28 71 20 2d 20 28 75 6e 73 69 67 6e 65 64 20   (q - (unsigned 
37f0: 63 68 61 72 20 2a 29 70 29 3b 0a 7d 0a 0a 2f 2a  char *)p);.}../*
3800: 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74 6f 20 73  .** Similar to s
3810: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
3820: 69 6e 74 28 29 2c 20 65 78 63 65 70 74 20 74 68  int(), except th
3830: 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  at the output is
3840: 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 0a   truncated to a.
3850: 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ** 32-bit intege
3860: 72 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 72  r before it is r
3870: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
3880: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
3890: 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 63 68 61  rint32(const cha
38a0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 29 7b 0a  r *p, int *pi){.
38b0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 3b   sqlite_int64 i;
38c0: 0a 20 69 6e 74 20 72 65 74 20 3d 20 73 71 6c 69  . int ret = sqli
38d0: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
38e0: 28 70 2c 20 26 69 29 3b 0a 20 2a 70 69 20 3d 20  (p, &i);. *pi = 
38f0: 28 69 6e 74 29 20 69 3b 0a 20 72 65 74 75 72 6e  (int) i;. return
3900: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   ret;.}../*.** R
3910: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3920: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
3930: 65 64 20 74 6f 20 65 6e 63 6f 64 65 20 76 20 61  ed to encode v a
3940: 73 20 61 20 76 61 72 69 6e 74 0a 2a 2f 0a 69 6e  s a varint.*/.in
3950: 74 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  t sqlite3Fts3Var
3960: 69 6e 74 4c 65 6e 28 73 71 6c 69 74 65 33 5f 75  intLen(sqlite3_u
3970: 69 6e 74 36 34 20 76 29 7b 0a 20 20 69 6e 74 20  int64 v){.  int 
3980: 69 20 3d 20 30 3b 0a 20 20 64 6f 7b 0a 20 20 20  i = 0;.  do{.   
3990: 20 69 2b 2b 3b 0a 20 20 20 20 76 20 3e 3e 3d 20   i++;.    v >>= 
39a0: 37 3b 0a 20 20 7d 77 68 69 6c 65 28 20 76 21 3d  7;.  }while( v!=
39b0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  0 );.  return i;
39c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
39d0: 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71  t an SQL-style q
39e0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74  uoted string int
39f0: 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e  o a normal strin
3a00: 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a  g by removing.**
3a10: 20 74 68 65 20 71 75 6f 74 65 20 63 68 61 72 61   the quote chara
3a20: 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e 76  cters.  The conv
3a30: 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69  ersion is done i
3a40: 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68 65  n-place.  If the
3a50: 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73 20 6e  .** input does n
3a60: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
3a70: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 2c  quote character,
3a80: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
3a90: 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  ne.** is a no-op
3aa0: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
3ab0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 61 62 63  :.**.**     "abc
3ac0: 22 20 20 20 62 65 63 6f 6d 65 73 20 20 20 61 62  "   becomes   ab
3ad0: 63 0a 2a 2a 20 20 20 20 20 27 78 79 7a 27 20 20  c.**     'xyz'  
3ae0: 20 62 65 63 6f 6d 65 73 20 20 20 78 79 7a 0a 2a   becomes   xyz.*
3af0: 2a 20 20 20 20 20 5b 70 71 72 5d 20 20 20 62 65  *     [pqr]   be
3b00: 63 6f 6d 65 73 20 20 20 70 71 72 0a 2a 2a 20 20  comes   pqr.**  
3b10: 20 20 20 60 6d 6e 6f 60 20 20 20 62 65 63 6f 6d     `mno`   becom
3b20: 65 73 20 20 20 6d 6e 6f 0a 2a 2a 0a 2a 2f 0a 76  es   mno.**.*/.v
3b30: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 44  oid sqlite3Fts3D
3b40: 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b  equote(char *z){
3b50: 0a 20 20 63 68 61 72 20 71 75 6f 74 65 3b 20 20  .  char quote;  
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 2f 2a 20 51 75 6f 74 65 20 63 68 61 72     /* Quote char
3b80: 61 63 74 65 72 20 28 69 66 20 61 6e 79 20 29 20  acter (if any ) 
3b90: 2a 2f 0a 0a 20 20 71 75 6f 74 65 20 3d 20 7a 5b  */..  quote = z[
3ba0: 30 5d 3b 0a 20 20 69 66 28 20 71 75 6f 74 65 3d  0];.  if( quote=
3bb0: 3d 27 5b 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27  ='[' || quote=='
3bc0: 5c 27 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 22  \'' || quote=='"
3bd0: 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 60 27 20  ' || quote=='`' 
3be0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 6e 20 3d  ){.    int iIn =
3bf0: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
3c00: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
3c10: 20 6e 65 78 74 20 62 79 74 65 20 74 6f 20 72 65   next byte to re
3c20: 61 64 20 66 72 6f 6d 20 69 6e 70 75 74 20 2a 2f  ad from input */
3c30: 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
3c40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
3c50: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
3c60: 65 78 74 20 62 79 74 65 20 74 6f 20 77 72 69 74  ext byte to writ
3c70: 65 20 74 6f 20 6f 75 74 70 75 74 20 2a 2f 0a 0a  e to output */..
3c80: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
3c90: 72 73 74 20 62 79 74 65 20 77 61 73 20 61 20 27  rst byte was a '
3ca0: 5b 27 2c 20 74 68 65 6e 20 74 68 65 20 63 6c 6f  [', then the clo
3cb0: 73 65 2d 71 75 6f 74 65 20 63 68 61 72 61 63 74  se-quote charact
3cc0: 65 72 20 69 73 20 61 20 27 5d 27 20 2a 2f 0a 20  er is a ']' */. 
3cd0: 20 20 20 69 66 28 20 71 75 6f 74 65 3d 3d 27 5b     if( quote=='[
3ce0: 27 20 29 20 71 75 6f 74 65 20 3d 20 27 5d 27 3b  ' ) quote = ']';
3cf0: 20 20 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 41    ..    while( A
3d00: 4c 57 41 59 53 28 7a 5b 69 49 6e 5d 29 20 29 7b  LWAYS(z[iIn]) ){
3d10: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 49 6e  .      if( z[iIn
3d20: 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20 20 20  ]==quote ){.    
3d30: 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 2b 31 5d      if( z[iIn+1]
3d40: 21 3d 71 75 6f 74 65 20 29 20 62 72 65 61 6b 3b  !=quote ) break;
3d50: 0a 20 20 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b  .        z[iOut+
3d60: 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20  +] = quote;.    
3d70: 20 20 20 20 69 49 6e 20 2b 3d 20 32 3b 0a 20 20      iIn += 2;.  
3d80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d90: 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20 7a     z[iOut++] = z
3da0: 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20 20 20 7d  [iIn++];.      }
3db0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 69 4f 75  .    }.    z[iOu
3dc0: 74 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 7d  t] = '\0';.  }.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
3de0: 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66 72 6f  ingle varint fro
3df0: 6d 20 74 68 65 20 64 6f 63 6c 69 73 74 20 61 74  m the doclist at
3e00: 20 2a 70 70 20 61 6e 64 20 61 64 76 61 6e 63 65   *pp and advance
3e10: 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a   *pp to point.**
3e20: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
3e30: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
3e40: 6f 66 20 74 68 65 20 76 61 72 69 6e 74 2e 20 20  of the varint.  
3e50: 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Add the value of
3e60: 20 74 68 65 20 76 61 72 69 6e 74 0a 2a 2a 20 74   the varint.** t
3e70: 6f 20 2a 70 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74  o *pVal..*/.stat
3e80: 69 63 20 76 6f 69 64 20 66 74 73 33 47 65 74 44  ic void fts3GetD
3e90: 65 6c 74 61 56 61 72 69 6e 74 28 63 68 61 72 20  eltaVarint(char 
3ea0: 2a 2a 70 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  **pp, sqlite3_in
3eb0: 74 36 34 20 2a 70 56 61 6c 29 7b 0a 20 20 73 71  t64 *pVal){.  sq
3ec0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61 6c  lite3_int64 iVal
3ed0: 3b 0a 20 20 2a 70 70 20 2b 3d 20 73 71 6c 69 74  ;.  *pp += sqlit
3ee0: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
3ef0: 2a 70 70 2c 20 26 69 56 61 6c 29 3b 0a 20 20 2a  *pp, &iVal);.  *
3f00: 70 56 61 6c 20 2b 3d 20 69 56 61 6c 3b 0a 7d 0a  pVal += iVal;.}.
3f10: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
3f20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3f30: 6c 65 64 2c 20 2a 70 70 20 70 6f 69 6e 74 73 20  led, *pp points 
3f40: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
3f50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 0a 2a 2a  e following a.**
3f60: 20 76 61 72 69 6e 74 20 74 68 61 74 20 69 73 20   varint that is 
3f70: 70 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  part of a doclis
3f80: 74 20 28 6f 72 20 70 6f 73 69 74 69 6f 6e 2d 6c  t (or position-l
3f90: 69 73 74 2c 20 6f 72 20 61 6e 79 20 6f 74 68 65  ist, or any othe
3fa0: 72 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 76 61 72  r list.** of var
3fb0: 69 6e 74 73 29 2e 20 54 68 69 73 20 66 75 6e 63  ints). This func
3fc0: 74 69 6f 6e 20 6d 6f 76 65 73 20 2a 70 70 20 74  tion moves *pp t
3fd0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  o point to the s
3fe0: 74 61 72 74 20 6f 66 20 74 68 61 74 20 76 61 72  tart of that var
3ff0: 69 6e 74 2c 0a 2a 2a 20 61 6e 64 20 73 65 74 73  int,.** and sets
4000: 20 2a 70 56 61 6c 20 62 79 20 74 68 65 20 76 61   *pVal by the va
4010: 72 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  rint value..**.*
4020: 2a 20 41 72 67 75 6d 65 6e 74 20 70 53 74 61 72  * Argument pStar
4030: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
4040: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
4050: 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 74  e doclist that t
4060: 68 65 0a 2a 2a 20 76 61 72 69 6e 74 20 69 73 20  he.** varint is 
4070: 70 61 72 74 20 6f 66 2e 0a 2a 2f 0a 73 74 61 74  part of..*/.stat
4080: 69 63 20 76 6f 69 64 20 66 74 73 33 47 65 74 52  ic void fts3GetR
4090: 65 76 65 72 73 65 56 61 72 69 6e 74 28 0a 20 20  everseVarint(.  
40a0: 63 68 61 72 20 2a 2a 70 70 2c 20 0a 20 20 63 68  char **pp, .  ch
40b0: 61 72 20 2a 70 53 74 61 72 74 2c 20 0a 20 20 73  ar *pStart, .  s
40c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 56  qlite3_int64 *pV
40d0: 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  al.){.  sqlite3_
40e0: 69 6e 74 36 34 20 69 56 61 6c 3b 0a 20 20 63 68  int64 iVal;.  ch
40f0: 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 0a 20 20  ar *p = *pp;..  
4100: 2f 2a 20 50 6f 69 6e 74 65 72 20 70 20 6e 6f 77  /* Pointer p now
4110: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 66   points at the f
4120: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
4130: 68 65 20 76 61 72 69 6e 74 20 77 65 20 61 72 65  he varint we are
4140: 20 0a 20 20 2a 2a 20 69 6e 74 65 72 65 73 74 65   .  ** intereste
4150: 64 20 69 6e 2e 20 53 6f 2c 20 75 6e 6c 65 73 73  d in. So, unless
4160: 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
4170: 63 6f 72 72 75 70 74 2c 20 74 68 65 20 30 78 38  corrupt, the 0x8
4180: 30 20 62 69 74 20 69 73 0a 20 20 2a 2a 20 63 6c  0 bit is.  ** cl
4190: 65 61 72 20 6f 6e 20 63 68 61 72 61 63 74 65 72  ear on character
41a0: 20 70 5b 2d 31 5d 2e 20 2a 2f 0a 20 20 66 6f 72   p[-1]. */.  for
41b0: 28 70 20 3d 20 28 2a 70 70 29 2d 32 3b 20 70 3e  (p = (*pp)-2; p>
41c0: 3d 70 53 74 61 72 74 20 26 26 20 2a 70 26 30 78  =pStart && *p&0x
41d0: 38 30 3b 20 70 2d 2d 29 3b 0a 20 20 70 2b 2b 3b  80; p--);.  p++;
41e0: 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 0a 20 20 73  .  *pp = p;..  s
41f0: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
4200: 69 6e 74 28 70 2c 20 26 69 56 61 6c 29 3b 0a 20  int(p, &iVal);. 
4210: 20 2a 70 56 61 6c 20 3d 20 69 56 61 6c 3b 0a 7d   *pVal = iVal;.}
4220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 44 69 73  ../*.** The xDis
4230: 63 6f 6e 6e 65 63 74 28 29 20 76 69 72 74 75 61  connect() virtua
4240: 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a  l table method..
4250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
4260: 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68  s3DisconnectMeth
4270: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
4280: 2a 70 56 74 61 62 29 7b 0a 20 20 46 74 73 33 54  *pVtab){.  Fts3T
4290: 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
42a0: 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20  able *)pVtab;.  
42b0: 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
42c0: 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
42d0: 61 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  a==0 );.  assert
42e0: 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d  ( p->pSegments==
42f0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  0 );..  /* Free 
4300: 61 6e 79 20 70 72 65 70 61 72 65 64 20 73 74 61  any prepared sta
4310: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 2a 2f 0a  tements held */.
4320: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 69 7a    for(i=0; i<Siz
4330: 65 6f 66 41 72 72 61 79 28 70 2d 3e 61 53 74 6d  eofArray(p->aStm
4340: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t); i++){.    sq
4350: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
4360: 2d 3e 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20 7d  ->aStmt[i]);.  }
4370: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4380: 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 29  p->zSegmentsTbl)
4390: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
43a0: 28 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73  (p->zReadExprlis
43b0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
43c0: 65 65 28 70 2d 3e 7a 57 72 69 74 65 45 78 70 72  ee(p->zWriteExpr
43d0: 6c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76  list);..  /* Inv
43e0: 6f 6b 65 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65  oke the tokenize
43f0: 72 20 64 65 73 74 72 75 63 74 6f 72 20 74 6f 20  r destructor to 
4400: 66 72 65 65 20 74 68 65 20 74 6f 6b 65 6e 69 7a  free the tokeniz
4410: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 70 54 6f 6b  er. */.  p->pTok
4420: 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 2d  enizer->pModule-
4430: 3e 78 44 65 73 74 72 6f 79 28 70 2d 3e 70 54 6f  >xDestroy(p->pTo
4440: 6b 65 6e 69 7a 65 72 29 3b 0a 0a 20 20 73 71 6c  kenizer);..  sql
4450: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
4460: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
4480: 72 75 63 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ruct one or more
4490: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
44a0: 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 20  from the format 
44b0: 73 74 72 69 6e 67 20 67 69 76 65 6e 0a 2a 2a 20  string given.** 
44c0: 61 6e 64 20 74 68 65 6e 20 65 76 61 6c 75 61 74  and then evaluat
44d0: 65 20 74 68 6f 73 65 20 73 74 61 74 65 6d 65 6e  e those statemen
44e0: 74 73 2e 20 54 68 65 20 73 75 63 63 65 73 73 20  ts. The success 
44f0: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a  code is written.
4500: 2a 2a 20 69 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a  ** into *pRc..**
4510: 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 69  .** If *pRc is i
4520: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
4530: 6f 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  o then this rout
4540: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
4550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4560: 74 73 33 44 62 45 78 65 63 28 0a 20 20 69 6e 74  ts3DbExec(.  int
4570: 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
4580: 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63      /* Success c
4590: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
45a0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
45b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77  /* Database in w
45c0: 68 69 63 68 20 74 6f 20 72 75 6e 20 53 51 4c 20  hich to run SQL 
45d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
45e0: 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a 20 46  *zFormat,   /* F
45f0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72  ormat string for
4600: 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20   SQL */.  ...   
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
4630: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
4640: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69  ng */.){.  va_li
4650: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
4660: 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52 63 20  Sql;.  if( *pRc 
4670: 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73  ) return;.  va_s
4680: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
4690: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
46a0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
46b0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
46c0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
46d0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Sql==0 ){.    *p
46e0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
46f0: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
4700: 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  *pRc = sqlite3_e
4710: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
4720: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4730: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
4740: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
4750: 20 78 44 65 73 74 72 6f 79 28 29 20 76 69 72 74   xDestroy() virt
4760: 75 61 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64  ual table method
4770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4780: 66 74 73 33 44 65 73 74 72 6f 79 4d 65 74 68 6f  fts3DestroyMetho
4790: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  d(sqlite3_vtab *
47a0: 70 56 74 61 62 29 7b 0a 20 20 69 6e 74 20 72 63  pVtab){.  int rc
47b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
47c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
47d0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
47e0: 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
47f0: 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62  ts3Table *)pVtab
4800: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
4810: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 44  = p->db;..  /* D
4820: 72 6f 70 20 74 68 65 20 73 68 61 64 6f 77 20 74  rop the shadow t
4830: 61 62 6c 65 73 20 2a 2f 0a 20 20 66 74 73 33 44  ables */.  fts3D
4840: 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 22  bExec(&rc, db, "
4850: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
4860: 49 53 54 53 20 25 51 2e 27 25 71 5f 63 6f 6e 74  ISTS %Q.'%q_cont
4870: 65 6e 74 27 22 2c 20 70 2d 3e 7a 44 62 2c 20 70  ent'", p->zDb, p
4880: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73 33  ->zName);.  fts3
4890: 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20  DbExec(&rc, db, 
48a0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
48b0: 58 49 53 54 53 20 25 51 2e 27 25 71 5f 73 65 67  XISTS %Q.'%q_seg
48c0: 6d 65 6e 74 73 27 22 2c 20 70 2d 3e 7a 44 62 2c  ments'", p->zDb,
48d0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73  p->zName);.  fts
48e0: 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  3DbExec(&rc, db,
48f0: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
4900: 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 73 65  EXISTS %Q.'%q_se
4910: 67 64 69 72 27 22 2c 20 70 2d 3e 7a 44 62 2c 20  gdir'", p->zDb, 
4920: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73  p->zName);.  fts
4930: 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  3DbExec(&rc, db,
4940: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
4950: 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 64 6f  EXISTS %Q.'%q_do
4960: 63 73 69 7a 65 27 22 2c 20 70 2d 3e 7a 44 62 2c  csize'", p->zDb,
4970: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74   p->zName);.  ft
4980: 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  s3DbExec(&rc, db
4990: 2c 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  , "DROP TABLE IF
49a0: 20 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 73   EXISTS %Q.'%q_s
49b0: 74 61 74 27 22 2c 20 70 2d 3e 7a 44 62 2c 20 70  tat'", p->zDb, p
49c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  ->zName);..  /* 
49d0: 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 68 61  If everything ha
49e0: 73 20 77 6f 72 6b 65 64 2c 20 69 6e 76 6f 6b 65  s worked, invoke
49f0: 20 66 74 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d   fts3DisconnectM
4a00: 65 74 68 6f 64 28 29 20 74 6f 20 66 72 65 65 20  ethod() to free 
4a10: 74 68 65 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  the.  ** memory 
4a20: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4a30: 74 68 65 20 46 74 73 33 54 61 62 6c 65 20 73 74  the Fts3Table st
4a40: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
4a50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
4a60: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
4a70: 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
4a80: 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  rror code..  */.
4a90: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
4aa0: 4c 49 54 45 5f 4f 4b 20 3f 20 66 74 73 33 44 69  LITE_OK ? fts3Di
4ab0: 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 70  sconnectMethod(p
4ac0: 56 74 61 62 29 20 3a 20 72 63 29 3b 0a 7d 0a 0a  Vtab) : rc);.}..
4ad0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71  ./*.** Invoke sq
4ae0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
4af0: 61 62 28 29 20 74 6f 20 64 65 63 6c 61 72 65 20  ab() to declare 
4b00: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
4b10: 68 65 20 46 54 53 33 20 74 61 62 6c 65 0a 2a 2a  he FTS3 table.**
4b20: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
4b30: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
4b40: 68 69 73 20 69 73 20 64 6f 6e 65 20 61 73 20 70  his is done as p
4b50: 61 72 74 20 6f 66 20 74 68 65 20 78 43 6f 6e 6e  art of the xConn
4b60: 65 63 74 28 29 0a 2a 2a 20 61 6e 64 20 78 43 72  ect().** and xCr
4b70: 65 61 74 65 28 29 20 6d 65 74 68 6f 64 73 2e 0a  eate() methods..
4b80: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
4b90: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
4ba0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4bb0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
4bc0: 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72  no-op. .** Other
4bd0: 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
4be0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
4bf0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
4c00: 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 52 63  s stored in *pRc
4c10: 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
4c20: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
4c30: 76 6f 69 64 20 66 74 73 33 44 65 63 6c 61 72 65  void fts3Declare
4c40: 56 74 61 62 28 69 6e 74 20 2a 70 52 63 2c 20 46  Vtab(int *pRc, F
4c50: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
4c60: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
4c70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
4c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
4ca0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
4cb0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
4ce0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
4cf0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
4d00: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
4d10: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 74  atement passed t
4d20: 6f 20 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  o declare_vtab()
4d30: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
4d40: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ols;            
4d50: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4d60: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f   user defined co
4d70: 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 20 20 73 71  lumns */..    sq
4d80: 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69  lite3_vtab_confi
4d90: 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  g(p->db, SQLITE_
4da0: 56 54 41 42 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  VTAB_CONSTRAINT_
4db0: 53 55 50 50 4f 52 54 2c 20 31 29 3b 0a 0a 20 20  SUPPORT, 1);..  
4dc0: 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 69    /* Create a li
4dd0: 73 74 20 6f 66 20 75 73 65 72 20 63 6f 6c 75 6d  st of user colum
4de0: 6e 73 20 66 6f 72 20 74 68 65 20 76 69 72 74 75  ns for the virtu
4df0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
4e00: 7a 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f  zCols = sqlite3_
4e10: 6d 70 72 69 6e 74 66 28 22 25 51 2c 20 22 2c 20  mprintf("%Q, ", 
4e20: 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 30 5d 29 3b  p->azColumn[0]);
4e30: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 7a 43  .    for(i=1; zC
4e40: 6f 6c 73 20 26 26 20 69 3c 70 2d 3e 6e 43 6f 6c  ols && i<p->nCol
4e50: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
4e60: 20 7a 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33   zCols = sqlite3
4e70: 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 51 2c 20  _mprintf("%z%Q, 
4e80: 22 2c 20 7a 43 6f 6c 73 2c 20 70 2d 3e 61 7a 43  ", zCols, p->azC
4e90: 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 7d  olumn[i]);.    }
4ea0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
4eb0: 74 68 65 20 77 68 6f 6c 65 20 22 43 52 45 41 54  the whole "CREAT
4ec0: 45 20 54 41 42 4c 45 22 20 73 74 61 74 65 6d 65  E TABLE" stateme
4ed0: 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 53 51  nt to pass to SQ
4ee0: 4c 69 74 65 20 2a 2f 0a 20 20 20 20 7a 53 71 6c  Lite */.    zSql
4ef0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4f00: 74 66 28 0a 20 20 20 20 20 20 20 20 22 43 52 45  tf(.        "CRE
4f10: 41 54 45 20 54 41 42 4c 45 20 78 28 25 73 20 25  ATE TABLE x(%s %
4f20: 51 20 48 49 44 44 45 4e 2c 20 64 6f 63 69 64 20  Q HIDDEN, docid 
4f30: 48 49 44 44 45 4e 29 22 2c 20 7a 43 6f 6c 73 2c  HIDDEN)", zCols,
4f40: 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b   p->zName.    );
4f50: 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 73 20  .    if( !zCols 
4f60: 7c 7c 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  || !zSql ){.    
4f70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4f80: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
4f90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4fa0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
4fb0: 70 2d 3e 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  p->db, zSql);.  
4fc0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
4fd0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
4fe0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
4ff0: 6f 6c 73 29 3b 0a 20 20 20 20 2a 70 52 63 20 3d  ols);.    *pRc =
5000: 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
5010: 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 61 63  * Create the bac
5020: 6b 69 6e 67 20 73 74 6f 72 65 20 74 61 62 6c 65  king store table
5030: 73 20 28 25 5f 63 6f 6e 74 65 6e 74 2c 20 25 5f  s (%_content, %_
5040: 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73  segments and %_s
5050: 65 67 64 69 72 29 0a 2a 2a 20 72 65 71 75 69 72  egdir).** requir
5060: 65 64 20 62 79 20 74 68 65 20 46 54 53 33 20 74  ed by the FTS3 t
5070: 61 62 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  able passed as t
5080: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5090: 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 0a 2a  . This is done.*
50a0: 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  * as part of the
50b0: 20 76 74 61 62 20 78 43 72 65 61 74 65 28 29 20   vtab xCreate() 
50c0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  method..**.** If
50d0: 20 74 68 65 20 70 2d 3e 62 48 61 73 44 6f 63 73   the p->bHasDocs
50e0: 69 7a 65 20 62 6f 6f 6c 65 61 6e 20 69 73 20 74  ize boolean is t
50f0: 72 75 65 20 28 69 6e 64 69 63 61 74 69 6e 67 20  rue (indicating 
5100: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6e 0a  that this is an.
5110: 2a 2a 20 46 54 53 34 20 74 61 62 6c 65 2c 20 6e  ** FTS4 table, n
5120: 6f 74 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65  ot an FTS3 table
5130: 29 20 74 68 65 6e 20 61 6c 73 6f 20 63 72 65 61  ) then also crea
5140: 74 65 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65  te the %_docsize
5150: 20 61 6e 64 0a 2a 2a 20 25 5f 73 74 61 74 20 74   and.** %_stat t
5160: 61 62 6c 65 73 20 72 65 71 75 69 72 65 64 20 62  ables required b
5170: 79 20 46 54 53 34 2e 0a 2a 2f 0a 73 74 61 74 69  y FTS4..*/.stati
5180: 63 20 69 6e 74 20 66 74 73 33 43 72 65 61 74 65  c int fts3Create
5190: 54 61 62 6c 65 73 28 46 74 73 33 54 61 62 6c 65  Tables(Fts3Table
51a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
51b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
51c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
51d0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
51e0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
5200: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
5210: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
5220: 74 65 6e 74 43 6f 6c 73 3b 20 20 20 20 20 20 20  tentCols;       
5230: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
5240: 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61   of %_content ta
5250: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
5260: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
5270: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5280: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5290: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
52a0: 61 74 65 20 61 20 6c 69 73 74 20 6f 66 20 75 73  ate a list of us
52b0: 65 72 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74  er columns for t
52c0: 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
52d0: 20 2a 2f 0a 20 20 7a 43 6f 6e 74 65 6e 74 43 6f   */.  zContentCo
52e0: 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ls = sqlite3_mpr
52f0: 69 6e 74 66 28 22 64 6f 63 69 64 20 49 4e 54 45  intf("docid INTE
5300: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
5310: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 43  );.  for(i=0; zC
5320: 6f 6e 74 65 6e 74 43 6f 6c 73 20 26 26 20 69 3c  ontentCols && i<
5330: 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  p->nColumn; i++)
5340: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
5350: 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  p->azColumn[i];.
5360: 20 20 20 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73      zContentCols
5370: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
5380: 74 66 28 22 25 7a 2c 20 27 63 25 64 25 71 27 22  tf("%z, 'c%d%q'"
5390: 2c 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 2c 20  , zContentCols, 
53a0: 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28  i, z);.  }.  if(
53b0: 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 3d 3d 30   zContentCols==0
53c0: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
53d0: 4f 4d 45 4d 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  OMEM;..  /* Crea
53e0: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  te the content t
53f0: 61 62 6c 65 20 2a 2f 0a 20 20 66 74 73 33 44 62  able */.  fts3Db
5400: 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a 20  Exec(&rc, db, . 
5410: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
5420: 45 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74  E %Q.'%q_content
5430: 27 28 25 73 29 22 2c 0a 20 20 20 20 20 70 2d 3e  '(%s)",.     p->
5440: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  zDb, p->zName, z
5450: 43 6f 6e 74 65 6e 74 43 6f 6c 73 0a 20 20 29 3b  ContentCols.  );
5460: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5470: 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 29 3b 0a 20  zContentCols);. 
5480: 20 2f 2a 20 43 72 65 61 74 65 20 6f 74 68 65 72   /* Create other
5490: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 66 74 73   tables */.  fts
54a0: 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  3DbExec(&rc, db,
54b0: 20 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20   .      "CREATE 
54c0: 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73 65 67  TABLE %Q.'%q_seg
54d0: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49  ments'(blockid I
54e0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
54f0: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
5500: 22 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c  ",.      p->zDb,
5510: 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20   p->zName.  );. 
5520: 20 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c   fts3DbExec(&rc,
5530: 20 64 62 2c 20 0a 20 20 20 20 20 20 22 43 52 45   db, .      "CRE
5540: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 27 25 71  ATE TABLE %Q.'%q
5550: 5f 73 65 67 64 69 72 27 28 22 0a 20 20 20 20 20  _segdir'(".     
5560: 20 20 20 22 6c 65 76 65 6c 20 49 4e 54 45 47 45     "level INTEGE
5570: 52 2c 22 0a 20 20 20 20 20 20 20 20 22 69 64 78  R,".        "idx
5580: 20 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20   INTEGER,".     
5590: 20 20 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 20     "start_block 
55a0: 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20  INTEGER,".      
55b0: 20 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c    "leaves_end_bl
55c0: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 22 0a 20 20  ock INTEGER,".  
55d0: 20 20 20 20 20 20 22 65 6e 64 5f 62 6c 6f 63 6b        "end_block
55e0: 20 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20   INTEGER,".     
55f0: 20 20 20 22 72 6f 6f 74 20 42 4c 4f 42 2c 22 0a     "root BLOB,".
5600: 20 20 20 20 20 20 20 20 22 50 52 49 4d 41 52 59          "PRIMARY
5610: 20 4b 45 59 28 6c 65 76 65 6c 2c 20 69 64 78 29   KEY(level, idx)
5620: 22 0a 20 20 20 20 20 20 22 29 3b 22 2c 0a 20 20  ".      ");",.  
5630: 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a      p->zDb, p->z
5640: 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28 20  Name.  );.  if( 
5650: 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29  p->bHasDocsize )
5660: 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78 65 63  {.    fts3DbExec
5670: 28 26 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20  (&rc, db, .     
5680: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
5690: 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27   %Q.'%q_docsize'
56a0: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50  (docid INTEGER P
56b0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65  RIMARY KEY, size
56c0: 20 42 4c 4f 42 29 3b 22 2c 0a 20 20 20 20 20 20   BLOB);",.      
56d0: 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
56e0: 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  me.    );.  }.  
56f0: 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20  if( p->bHasStat 
5700: 29 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78 65  ){.    fts3DbExe
5710: 63 28 26 72 63 2c 20 64 62 2c 20 0a 20 20 20 20  c(&rc, db, .    
5720: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
5730: 45 20 25 51 2e 27 25 71 5f 73 74 61 74 27 28 69  E %Q.'%q_stat'(i
5740: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
5750: 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 4c 4f  Y KEY, value BLO
5760: 42 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 70 2d  B);",.        p-
5770: 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20  >zDb, p->zName. 
5780: 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75     );.  }.  retu
5790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
57a0: 53 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  Store the curren
57b0: 74 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  t database page-
57c0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 69 6e  size in bytes in
57d0: 20 70 2d 3e 6e 50 67 73 7a 2e 0a 2a 2a 0a 2a 2a   p->nPgsz..**.**
57e0: 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 6e 2d   If *pRc is non-
57f0: 7a 65 72 6f 20 77 68 65 6e 20 74 68 69 73 20 66  zero when this f
5800: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
5810: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
5820: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
5830: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
5840: 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
5850: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f  rror code is sto
5860: 72 65 64 20 69 6e 20 2a 70 52 63 0a 2a 2a 20 62  red in *pRc.** b
5870: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
5880: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5890: 66 74 73 33 44 61 74 61 62 61 73 65 50 61 67 65  fts3DatabasePage
58a0: 53 69 7a 65 28 69 6e 74 20 2a 70 52 63 2c 20 46  Size(int *pRc, F
58b0: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
58c0: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
58d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
58e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
58f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
5900: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63  rn code */.    c
5910: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5930: 53 51 4c 20 74 65 78 74 20 22 50 52 41 47 4d 41  SQL text "PRAGMA
5940: 20 25 51 2e 70 61 67 65 5f 73 69 7a 65 22 20 2a   %Q.page_size" *
5950: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
5960: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
5970: 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20      /* Compiled 
5980: 22 50 52 41 47 4d 41 20 25 51 2e 70 61 67 65 5f  "PRAGMA %Q.page_
5990: 73 69 7a 65 22 20 73 74 61 74 65 6d 65 6e 74 20  size" statement 
59a0: 2a 2f 0a 20 20 0a 20 20 20 20 7a 53 71 6c 20 3d  */.  .    zSql =
59b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
59c0: 28 22 50 52 41 47 4d 41 20 25 51 2e 70 61 67 65  ("PRAGMA %Q.page
59d0: 5f 73 69 7a 65 22 2c 20 70 2d 3e 7a 44 62 29 3b  _size", p->zDb);
59e0: 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
59f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5a00: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
5a10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5a20: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
5a30: 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
5a40: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
5a50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5a60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
5a70: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
5a80: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  tmt);.        p-
5a90: 3e 6e 50 67 73 7a 20 3d 20 73 71 6c 69 74 65 33  >nPgsz = sqlite3
5aa0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
5ab0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  t, 0);.        r
5ac0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
5ad0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
5ae0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
5af0: 3d 53 51 4c 49 54 45 5f 41 55 54 48 20 29 7b 0a  =SQLITE_AUTH ){.
5b00: 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 67 73 7a          p->nPgsz
5b10: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 20   = 1024;.       
5b20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5b30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5b40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50     assert( p->nP
5b50: 67 73 7a 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c  gsz>0 || rc!=SQL
5b60: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71  ITE_OK );.    sq
5b70: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
5b80: 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  ;.    *pRc = rc;
5b90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 22 53  .  }.}../*.** "S
5ba0: 70 65 63 69 61 6c 22 20 46 54 53 34 20 61 72 67  pecial" FTS4 arg
5bb0: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6c 75 6d  uments are colum
5bc0: 6e 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 73  n specifications
5bd0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
5be0: 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
5bf0: 3c 6b 65 79 3e 20 3d 20 3c 76 61 6c 75 65 3e 0a  <key> = <value>.
5c00: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 61 79 20  **.** There may 
5c10: 6e 6f 74 20 62 65 20 77 68 69 74 65 73 70 61 63  not be whitespac
5c20: 65 20 73 75 72 72 6f 75 6e 64 69 6e 67 20 74 68  e surrounding th
5c30: 65 20 22 3d 22 20 63 68 61 72 61 63 74 65 72 2e  e "=" character.
5c40: 20 54 68 65 20 3c 76 61 6c 75 65 3e 20 0a 2a 2a   The <value> .**
5c50: 20 74 65 72 6d 20 6d 61 79 20 62 65 20 71 75 6f   term may be quo
5c60: 74 65 64 2c 20 62 75 74 20 74 68 65 20 3c 6b 65  ted, but the <ke
5c70: 79 3e 20 6d 61 79 20 6e 6f 74 2e 0a 2a 2f 0a 73  y> may not..*/.s
5c80: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 73  tatic int fts3Is
5c90: 53 70 65 63 69 61 6c 43 6f 6c 75 6d 6e 28 0a 20  SpecialColumn(. 
5ca0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
5cb0: 0a 20 20 69 6e 74 20 2a 70 6e 4b 65 79 2c 0a 20  .  int *pnKey,. 
5cc0: 20 63 68 61 72 20 2a 2a 70 7a 56 61 6c 75 65 0a   char **pzValue.
5cd0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 75  ){.  char *zValu
5ce0: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
5cf0: 2a 7a 43 73 72 20 3d 20 7a 3b 0a 0a 20 20 77 68  *zCsr = z;..  wh
5d00: 69 6c 65 28 20 2a 7a 43 73 72 21 3d 27 3d 27 20  ile( *zCsr!='=' 
5d10: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 43 73 72  ){.    if( *zCsr
5d20: 3d 3d 27 5c 30 27 20 29 20 72 65 74 75 72 6e 20  =='\0' ) return 
5d30: 30 3b 0a 20 20 20 20 7a 43 73 72 2b 2b 3b 0a 20  0;.    zCsr++;. 
5d40: 20 7d 0a 0a 20 20 2a 70 6e 4b 65 79 20 3d 20 28   }..  *pnKey = (
5d50: 69 6e 74 29 28 7a 43 73 72 2d 7a 29 3b 0a 20 20  int)(zCsr-z);.  
5d60: 7a 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  zValue = sqlite3
5d70: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 26  _mprintf("%s", &
5d80: 7a 43 73 72 5b 31 5d 29 3b 0a 20 20 69 66 28 20  zCsr[1]);.  if( 
5d90: 7a 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71  zValue ){.    sq
5da0: 6c 69 74 65 33 46 74 73 33 44 65 71 75 6f 74 65  lite3Fts3Dequote
5db0: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 20 20  (zValue);.  }.  
5dc0: 2a 70 7a 56 61 6c 75 65 20 3d 20 7a 56 61 6c 75  *pzValue = zValu
5dd0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  e;.  return 1;.}
5de0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
5df0: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 61 20 70  he output of a p
5e00: 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 66 6f  rintf() style fo
5e10: 72 6d 61 74 74 69 6e 67 20 74 6f 20 61 6e 20 65  rmatting to an e
5e20: 78 69 73 74 69 6e 67 20 73 74 72 69 6e 67 2e 0a  xisting string..
5e30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
5e40: 74 73 33 41 70 70 65 6e 64 66 28 0a 20 20 69 6e  ts3Appendf(.  in
5e50: 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5e70: 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
5e80: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ode */.  char **
5e90: 70 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pz,             
5ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
5eb0: 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT: Pointer to s
5ec0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 2a 2f 0a  tring buffer */.
5ed0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
5ee0: 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20  ormat,          
5ef0: 20 20 2f 2a 20 50 72 69 6e 74 66 20 66 6f 72 6d    /* Printf form
5f00: 61 74 20 73 74 72 69 6e 67 20 74 6f 20 61 70 70  at string to app
5f10: 65 6e 64 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20  end */.  ...    
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
5f40: 6d 65 6e 74 73 20 66 6f 72 20 70 72 69 6e 74 66  ments for printf
5f50: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a   format string *
5f60: 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  /.){.  if( *pRc=
5f70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5f80: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5f90: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76    char *z;.    v
5fa0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5fb0: 6d 61 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  mat);.    z = sq
5fc0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
5fd0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
5fe0: 20 69 66 28 20 7a 20 26 26 20 2a 70 7a 20 29 7b   if( z && *pz ){
5ff0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 32 20  .      char *z2 
6000: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6010: 66 28 22 25 73 25 73 22 2c 20 2a 70 7a 2c 20 7a  f("%s%s", *pz, z
6020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6030: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
6040: 7a 20 3d 20 7a 32 3b 0a 20 20 20 20 7d 0a 20 20  z = z2;.    }.  
6050: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 2a 70 52    if( z==0 ) *pR
6060: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
6080: 65 65 28 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  ee(*pz);.    *pz
6090: 20 3d 20 7a 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = z;.  }.}../*.
60a0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
60b0: 20 6f 66 20 69 6e 70 75 74 20 73 74 72 69 6e 67   of input string
60c0: 20 7a 49 6e 70 75 74 20 65 6e 63 6c 6f 73 65 64   zInput enclosed
60d0: 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65   in double-quote
60e0: 73 20 28 22 29 20 61 6e 64 0a 2a 2a 20 77 69 74  s (") and.** wit
60f0: 68 20 61 6c 6c 20 64 6f 75 62 6c 65 20 71 75 6f  h all double quo
6100: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 65 73  te characters es
6110: 63 61 70 65 64 2e 20 46 6f 72 20 65 78 61 6d 70  caped. For examp
6120: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 66 74  le:.**.**     ft
6130: 73 33 51 75 6f 74 65 49 64 28 22 75 6e 20 5c 22  s3QuoteId("un \"
6140: 7a 69 70 5c 22 22 29 20 20 20 2d 3e 20 20 20 20  zip\"")   ->    
6150: 22 75 6e 20 5c 22 5c 22 7a 69 70 5c 22 5c 22 22  "un \"\"zip\"\""
6160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
6170: 65 72 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  er returned poin
6180: 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  ts to memory obt
6190: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
61a0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 74 0a  e3_malloc(). It.
61b0: 2a 2a 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  ** is the caller
61c0: 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
61d0: 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
61e0: 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
61f0: 73 65 20 74 68 69 73 0a 2a 2a 20 6d 65 6d 6f 72  se this.** memor
6200: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  y..*/.static cha
6210: 72 20 2a 66 74 73 33 51 75 6f 74 65 49 64 28 63  r *fts3QuoteId(c
6220: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 70 75  har const *zInpu
6230: 74 29 7b 0a 20 20 69 6e 74 20 6e 52 65 74 3b 0a  t){.  int nRet;.
6240: 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20    char *zRet;.  
6250: 6e 52 65 74 20 3d 20 32 20 2b 20 73 74 72 6c 65  nRet = 2 + strle
6260: 6e 28 7a 49 6e 70 75 74 29 2a 32 20 2b 20 31 3b  n(zInput)*2 + 1;
6270: 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
6280: 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 74 29 3b 0a  3_malloc(nRet);.
6290: 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
62a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61    int i;.    cha
62b0: 72 20 2a 7a 20 3d 20 7a 52 65 74 3b 0a 20 20 20  r *z = zRet;.   
62c0: 20 2a 28 7a 2b 2b 29 20 3d 20 27 22 27 3b 0a 20   *(z++) = '"';. 
62d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 70     for(i=0; zInp
62e0: 75 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ut[i]; i++){.   
62f0: 20 20 20 69 66 28 20 7a 49 6e 70 75 74 5b 69 5d     if( zInput[i]
6300: 3d 3d 27 22 27 20 29 20 2a 28 7a 2b 2b 29 20 3d  =='"' ) *(z++) =
6310: 20 27 22 27 3b 0a 20 20 20 20 20 20 2a 28 7a 2b   '"';.      *(z+
6320: 2b 29 20 3d 20 7a 49 6e 70 75 74 5b 69 5d 3b 0a  +) = zInput[i];.
6330: 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a 2b 2b 29      }.    *(z++)
6340: 20 3d 20 27 22 27 3b 0a 20 20 20 20 2a 28 7a 2b   = '"';.    *(z+
6350: 2b 29 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  +) = '\0';.  }. 
6360: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
6370: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
6380: 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 20 73 65  list of comma se
6390: 70 61 72 61 74 65 64 20 53 51 4c 20 65 78 70 72  parated SQL expr
63a0: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63 6f 75  essions that cou
63b0: 6c 64 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e  ld be used.** in
63c0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
63d0: 65 6e 74 20 73 75 63 68 20 61 73 20 74 68 65 20  ent such as the 
63e0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
63f0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 6c 69 73       SELECT <lis
6400: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
6410: 3e 20 46 52 4f 4d 20 25 5f 63 6f 6e 74 65 6e 74  > FROM %_content
6420: 20 41 53 20 78 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   AS x ....**.** 
6430: 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 64 6f  to return the do
6440: 63 69 64 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  cid, followed by
6450: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
6460: 74 65 78 74 20 64 61 74 61 20 69 6e 20 6f 72 64  text data in ord
6470: 65 72 0a 2a 2a 20 66 72 6f 6d 20 6c 65 66 74 20  er.** from left 
6480: 74 6f 20 77 72 69 74 65 2e 20 49 66 20 70 61 72  to write. If par
6490: 61 6d 65 74 65 72 20 7a 46 75 6e 63 20 69 73 20  ameter zFunc is 
64a0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
64b0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
64c0: 6e 67 20 72 65 74 75 72 6e 65 64 20 64 69 72 65  ng returned dire
64d0: 63 74 6c 79 20 65 61 63 68 20 63 6f 6c 75 6d 6e  ctly each column
64e0: 20 6f 66 20 74 65 78 74 20 64 61 74 61 20 69 73   of text data is
64f0: 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 53 51   passed to an SQ
6500: 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61  L.** function na
6510: 6d 65 64 20 7a 46 75 6e 63 20 66 69 72 73 74 2e  med zFunc first.
6520: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
6530: 20 7a 46 75 6e 63 20 69 73 20 22 75 6e 7a 69 70   zFunc is "unzip
6540: 22 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 61 62  " and the.** tab
6550: 6c 65 20 68 61 73 20 74 68 65 20 74 68 72 65 65  le has the three
6560: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
6570: 6c 75 6d 6e 73 20 22 61 22 2c 20 22 62 22 2c 20  lumns "a", "b", 
6580: 61 6e 64 20 22 63 22 2c 20 74 68 65 20 66 6f 6c  and "c", the fol
6590: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 69 6e 67  lowing.** string
65a0: 20 69 73 20 72 65 74 75 72 6e 65 64 3a 0a 2a 2a   is returned:.**
65b0: 0a 2a 2a 20 20 20 20 20 22 64 6f 63 69 64 2c 20  .**     "docid, 
65c0: 75 6e 7a 69 70 28 78 2e 27 61 27 29 2c 20 75 6e  unzip(x.'a'), un
65d0: 7a 69 70 28 78 2e 27 62 27 29 2c 20 75 6e 7a 69  zip(x.'b'), unzi
65e0: 70 28 78 2e 27 63 27 29 22 0a 2a 2a 0a 2a 2a 20  p(x.'c')".**.** 
65f0: 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
6600: 72 6e 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  rned points to a
6610: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
6620: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6d 61 6c  d by sqlite3_mal
6630: 6c 6f 63 28 29 2e 20 49 74 0a 2a 2a 20 69 73 20  loc(). It.** is 
6640: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
6650: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
6660: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
6670: 72 65 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ree it..**.** If
6680: 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
6690: 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
66a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
66b0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
66c0: 6f 70 20 28 61 6e 64 0a 2a 2a 20 61 20 4e 55 4c  op (and.** a NUL
66d0: 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74  L pointer is ret
66e0: 75 72 6e 65 64 29 2e 20 4f 74 68 65 72 77 69 73  urned). Otherwis
66f0: 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  e, if an OOM err
6700: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
6710: 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 66 75 6e  d.** by this fun
6720: 63 74 69 6f 6e 2c 20 4e 55 4c 4c 20 69 73 20 72  ction, NULL is r
6730: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 52 63  eturned and *pRc
6740: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
6750: 45 5f 4e 4f 4d 45 4d 2e 20 49 66 0a 2a 2a 20 6e  E_NOMEM. If.** n
6760: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
6770: 2a 70 52 63 20 69 73 20 6c 65 66 74 20 75 6e 6d  *pRc is left unm
6780: 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  odified..*/.stat
6790: 69 63 20 63 68 61 72 20 2a 66 74 73 33 52 65 61  ic char *fts3Rea
67a0: 64 45 78 70 72 4c 69 73 74 28 46 74 73 33 54 61  dExprList(Fts3Ta
67b0: 62 6c 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ble *p, const ch
67c0: 61 72 20 2a 7a 46 75 6e 63 2c 20 69 6e 74 20 2a  ar *zFunc, int *
67d0: 70 52 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  pRc){.  char *zR
67e0: 65 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  et = 0;.  char *
67f0: 7a 46 72 65 65 20 3d 20 30 3b 0a 20 20 63 68 61  zFree = 0;.  cha
6800: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 3b 0a 20 20  r *zFunction;.  
6810: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 21 7a  int i;..  if( !z
6820: 46 75 6e 63 20 29 7b 0a 20 20 20 20 7a 46 75 6e  Func ){.    zFun
6830: 63 74 69 6f 6e 20 3d 20 22 22 3b 0a 20 20 7d 65  ction = "";.  }e
6840: 6c 73 65 7b 0a 20 20 20 20 7a 46 72 65 65 20 3d  lse{.    zFree =
6850: 20 7a 46 75 6e 63 74 69 6f 6e 20 3d 20 66 74 73   zFunction = fts
6860: 33 51 75 6f 74 65 49 64 28 7a 46 75 6e 63 29 3b  3QuoteId(zFunc);
6870: 0a 20 20 7d 0a 20 20 66 74 73 33 41 70 70 65 6e  .  }.  fts3Appen
6880: 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c 20 22  df(pRc, &zRet, "
6890: 64 6f 63 69 64 22 29 3b 0a 20 20 66 6f 72 28 69  docid");.  for(i
68a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e  =0; i<p->nColumn
68b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 33  ; i++){.    fts3
68c0: 41 70 70 65 6e 64 66 28 70 52 63 2c 20 26 7a 52  Appendf(pRc, &zR
68d0: 65 74 2c 20 22 2c 25 73 28 78 2e 27 63 25 64 25  et, ",%s(x.'c%d%
68e0: 71 27 29 22 2c 20 7a 46 75 6e 63 74 69 6f 6e 2c  q')", zFunction,
68f0: 20 69 2c 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b   i, p->azColumn[
6900: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
6910: 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a  e3_free(zFree);.
6920: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
6930: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6940: 20 6c 69 73 74 20 6f 66 20 4e 20 63 6f 6d 6d 61   list of N comma
6950: 20 73 65 70 61 72 61 74 65 64 20 71 75 65 73 74   separated quest
6960: 69 6f 6e 20 6d 61 72 6b 73 2c 20 77 68 65 72 65  ion marks, where
6970: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
6980: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  .** of columns i
6990: 6e 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  n the %_content 
69a0: 74 61 62 6c 65 20 28 6f 6e 65 20 66 6f 72 20 74  table (one for t
69b0: 68 65 20 64 6f 63 69 64 20 70 6c 75 73 20 6f 6e  he docid plus on
69c0: 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 73  e for each.** us
69d0: 65 72 2d 64 65 66 69 6e 65 64 20 74 65 78 74 20  er-defined text 
69e0: 63 6f 6c 75 6d 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  column)..**.** I
69f0: 66 20 61 72 67 75 6d 65 6e 74 20 7a 46 75 6e 63  f argument zFunc
6a00: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
6a10: 65 6e 20 61 6c 6c 20 62 75 74 20 74 68 65 20 66  en all but the f
6a20: 69 72 73 74 20 71 75 65 73 74 69 6f 6e 20 6d 61  irst question ma
6a30: 72 6b 0a 2a 2a 20 69 73 20 70 72 65 63 65 64 65  rk.** is precede
6a40: 64 20 62 79 20 7a 46 75 6e 63 20 61 6e 64 20 61  d by zFunc and a
6a50: 6e 20 6f 70 65 6e 20 62 72 61 63 6b 65 74 2c 20  n open bracket, 
6a60: 61 6e 64 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  and followed by 
6a70: 61 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 72 61 63  a closed.** brac
6a80: 6b 65 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ket. For example
6a90: 2c 20 69 66 20 7a 46 75 6e 63 20 69 73 20 22 7a  , if zFunc is "z
6aa0: 69 70 22 20 61 6e 64 20 74 68 65 20 46 54 53 33  ip" and the FTS3
6ab0: 20 74 61 62 6c 65 20 68 61 73 20 74 68 72 65 65   table has three
6ac0: 20 0a 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65   .** user-define
6ad0: 64 20 74 65 78 74 20 63 6f 6c 75 6d 6e 73 2c 20  d text columns, 
6ae0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
6af0: 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64  ring is returned
6b00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 3f 2c 20  :.**.**     "?, 
6b10: 7a 69 70 28 3f 29 2c 20 7a 69 70 28 3f 29 2c 20  zip(?), zip(?), 
6b20: 7a 69 70 28 3f 29 22 0a 2a 2a 0a 2a 2a 20 54 68  zip(?)".**.** Th
6b30: 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
6b40: 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ed points to a b
6b50: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
6b60: 62 79 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  by sqlite3_mallo
6b70: 63 28 29 2e 20 49 74 0a 2a 2a 20 69 73 20 74 68  c(). It.** is th
6b80: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6b90: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
6ba0: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
6bb0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  e it..**.** If *
6bc0: 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  pRc is not SQLIT
6bd0: 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66  E_OK when this f
6be0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6bf0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
6c00: 20 28 61 6e 64 0a 2a 2a 20 61 20 4e 55 4c 4c 20   (and.** a NULL 
6c10: 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75 72  pointer is retur
6c20: 6e 65 64 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ned). Otherwise,
6c30: 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
6c40: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
6c50: 2a 2a 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ** by this funct
6c60: 69 6f 6e 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  ion, NULL is ret
6c70: 75 72 6e 65 64 20 61 6e 64 20 2a 70 52 63 20 69  urned and *pRc i
6c80: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
6c90: 4e 4f 4d 45 4d 2e 20 49 66 0a 2a 2a 20 6e 6f 20  NOMEM. If.** no 
6ca0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
6cb0: 52 63 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  Rc is left unmod
6cc0: 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
6cd0: 20 63 68 61 72 20 2a 66 74 73 33 57 72 69 74 65   char *fts3Write
6ce0: 45 78 70 72 4c 69 73 74 28 46 74 73 33 54 61 62  ExprList(Fts3Tab
6cf0: 6c 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  le *p, const cha
6d00: 72 20 2a 7a 46 75 6e 63 2c 20 69 6e 74 20 2a 70  r *zFunc, int *p
6d10: 52 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65  Rc){.  char *zRe
6d20: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
6d30: 46 72 65 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Free = 0;.  char
6d40: 20 2a 7a 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 69   *zFunction;.  i
6d50: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 21 7a 46  nt i;..  if( !zF
6d60: 75 6e 63 20 29 7b 0a 20 20 20 20 7a 46 75 6e 63  unc ){.    zFunc
6d70: 74 69 6f 6e 20 3d 20 22 22 3b 0a 20 20 7d 65 6c  tion = "";.  }el
6d80: 73 65 7b 0a 20 20 20 20 7a 46 72 65 65 20 3d 20  se{.    zFree = 
6d90: 7a 46 75 6e 63 74 69 6f 6e 20 3d 20 66 74 73 33  zFunction = fts3
6da0: 51 75 6f 74 65 49 64 28 7a 46 75 6e 63 29 3b 0a  QuoteId(zFunc);.
6db0: 20 20 7d 0a 20 20 66 74 73 33 41 70 70 65 6e 64    }.  fts3Append
6dc0: 66 28 70 52 63 2c 20 26 7a 52 65 74 2c 20 22 3f  f(pRc, &zRet, "?
6dd0: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
6de0: 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  <p->nColumn; i++
6df0: 29 7b 0a 20 20 20 20 66 74 73 33 41 70 70 65 6e  ){.    fts3Appen
6e00: 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c 20 22  df(pRc, &zRet, "
6e10: 2c 25 73 28 3f 29 22 2c 20 7a 46 75 6e 63 74 69  ,%s(?)", zFuncti
6e20: 6f 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  on);.  }.  sqlit
6e30: 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a  e3_free(zFree);.
6e40: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
6e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
6e60: 63 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ction interprets
6e70: 20 74 68 65 20 73 74 72 69 6e 67 20 61 74 20 28   the string at (
6e80: 2a 70 70 29 20 61 73 20 61 20 6e 6f 6e 2d 6e 65  *pp) as a non-ne
6e90: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  gative integer.*
6ea0: 2a 20 76 61 6c 75 65 2e 20 49 74 20 72 65 61 64  * value. It read
6eb0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 61 6e  s the integer an
6ec0: 64 20 73 65 74 73 20 2a 70 6e 4f 75 74 20 74 6f  d sets *pnOut to
6ed0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 2c   the value read,
6ee0: 20 74 68 65 6e 20 0a 2a 2a 20 73 65 74 73 20 2a   then .** sets *
6ef0: 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  pp to point to t
6f00: 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
6f10: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
6f20: 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a  e last byte of.*
6f30: 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  * the integer va
6f40: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  lue..**.** Only 
6f50: 64 65 63 69 6d 61 6c 20 64 69 67 69 74 73 20 28  decimal digits (
6f60: 27 30 27 2e 2e 27 39 27 29 20 6d 61 79 20 62 65  '0'..'9') may be
6f70: 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 74 65   part of an inte
6f80: 67 65 72 20 76 61 6c 75 65 2e 20 0a 2a 2a 0a 2a  ger value. .**.*
6f90: 2a 20 49 66 20 2a 70 70 20 64 6f 65 73 20 6e 6f  * If *pp does no
6fa0: 74 20 62 65 69 6e 67 20 77 69 74 68 20 61 20 64  t being with a d
6fb0: 65 63 69 6d 61 6c 20 64 69 67 69 74 20 53 51 4c  ecimal digit SQL
6fc0: 49 54 45 5f 45 52 52 4f 52 20 69 73 20 72 65 74  ITE_ERROR is ret
6fd0: 75 72 6e 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  urned and.** the
6fe0: 20 6f 75 74 70 75 74 20 76 61 6c 75 65 20 75 6e   output value un
6ff0: 64 65 66 69 6e 65 64 2e 20 4f 74 68 65 72 77 69  defined. Otherwi
7000: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  se SQLITE_OK is 
7010: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
7020: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7030: 20 75 73 65 64 20 77 68 65 6e 20 70 61 72 73 69   used when parsi
7040: 6e 67 20 74 68 65 20 22 70 72 65 66 69 78 3d 22  ng the "prefix="
7050: 20 46 54 53 34 20 70 61 72 61 6d 65 74 65 72 2e   FTS4 parameter.
7060: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7070: 74 73 33 47 6f 62 62 6c 65 49 6e 74 28 63 6f 6e  ts3GobbleInt(con
7080: 73 74 20 63 68 61 72 20 2a 2a 70 70 2c 20 69 6e  st char **pp, in
7090: 74 20 2a 70 6e 4f 75 74 29 7b 0a 20 20 63 6f 6e  t *pnOut){.  con
70a0: 73 74 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70  st char *p = *pp
70b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
70c0: 49 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 65 72  Iterator pointer
70d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 74 20 3d   */.  int nInt =
70e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
70f0: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
7100: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  value */..  for(
7110: 70 3d 2a 70 70 3b 20 70 5b 30 5d 3e 3d 27 30 27  p=*pp; p[0]>='0'
7120: 20 26 26 20 70 5b 30 5d 3c 3d 27 39 27 3b 20 70   && p[0]<='9'; p
7130: 2b 2b 29 7b 0a 20 20 20 20 6e 49 6e 74 20 3d 20  ++){.    nInt = 
7140: 6e 49 6e 74 20 2a 20 31 30 20 2b 20 28 70 5b 30  nInt * 10 + (p[0
7150: 5d 20 2d 20 27 30 27 29 3b 0a 20 20 7d 0a 20 20  ] - '0');.  }.  
7160: 69 66 28 20 70 3d 3d 2a 70 70 20 29 20 72 65 74  if( p==*pp ) ret
7170: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
7180: 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20 6e 49 6e  ;.  *pnOut = nIn
7190: 74 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20  t;.  *pp = p;.  
71a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
71b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
71c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
71d0: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ed to allocate a
71e0: 6e 20 61 72 72 61 79 20 6f 66 20 46 74 73 33 49  n array of Fts3I
71f0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 73 0a  ndex structures.
7200: 2a 2a 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ** representing 
7210: 74 68 65 20 69 6e 64 65 78 65 73 20 6d 61 69 6e  the indexes main
7220: 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 63 75  tained by the cu
7230: 72 72 65 6e 74 20 46 54 53 20 74 61 62 6c 65 2e  rrent FTS table.
7240: 20 46 54 53 20 74 61 62 6c 65 73 0a 2a 2a 20 61   FTS tables.** a
7250: 6c 77 61 79 73 20 6d 61 69 6e 74 61 69 6e 20 74  lways maintain t
7260: 68 65 20 6d 61 69 6e 20 22 74 65 72 6d 73 22 20  he main "terms" 
7270: 69 6e 64 65 78 2c 20 62 75 74 20 6d 61 79 20 61  index, but may a
7280: 6c 73 6f 20 6d 61 69 6e 74 61 69 6e 20 6f 6e 65  lso maintain one
7290: 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 22 70 72 65   or.** more "pre
72a0: 66 69 78 22 20 69 6e 64 65 78 65 73 2c 20 64 65  fix" indexes, de
72b0: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
72c0: 61 6c 75 65 20 6f 66 20 74 68 65 20 22 70 72 65  alue of the "pre
72d0: 66 69 78 3d 22 20 70 61 72 61 6d 65 74 65 72 0a  fix=" parameter.
72e0: 2a 2a 20 28 69 66 20 61 6e 79 29 20 73 70 65 63  ** (if any) spec
72f0: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
7300: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54   the CREATE VIRT
7310: 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d  UAL TABLE statem
7320: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ent..**.** Argum
7330: 65 6e 74 20 7a 50 61 72 61 6d 20 69 73 20 70 61  ent zParam is pa
7340: 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 6f  ssed the value o
7350: 66 20 74 68 65 20 22 70 72 65 66 69 78 3d 22 20  f the "prefix=" 
7360: 6f 70 74 69 6f 6e 20 69 66 20 6f 6e 65 20 77 61  option if one wa
7370: 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 2c 20  s.** specified, 
7380: 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  or NULL otherwis
7390: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  e..**.** If no e
73a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
73b0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
73c0: 65 64 20 61 6e 64 20 2a 61 70 49 6e 64 65 78 20  ed and *apIndex 
73d0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
73e0: 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ** the allocated
73f0: 20 61 72 72 61 79 2e 20 2a 70 6e 49 6e 64 65 78   array. *pnIndex
7400: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
7410: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
7420: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  s in the.** arra
7430: 79 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  y. If an error d
7440: 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 53 51  oes occur, an SQ
7450: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
7460: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
7470: 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
7480: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
7490: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
74a0: 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
74b0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
74c0: 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * of the caller 
74d0: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
74e0: 66 72 65 65 28 29 20 6f 6e 20 74 68 65 20 6f 75  free() on the ou
74f0: 74 70 75 74 20 61 72 72 61 79 20 74 6f 20 66 72  tput array to fr
7500: 65 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ee it..*/.static
7510: 20 69 6e 74 20 66 74 73 33 50 72 65 66 69 78 50   int fts3PrefixP
7520: 61 72 61 6d 65 74 65 72 28 0a 20 20 63 6f 6e 73  arameter(.  cons
7530: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7550: 42 43 20 69 6e 20 70 72 65 66 69 78 3d 41 42 43  BC in prefix=ABC
7560: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 70 61   parameter to pa
7570: 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rse */.  int *pn
7580: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
7590: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
75a0: 20 73 69 7a 65 20 6f 66 20 2a 61 70 49 6e 64 65   size of *apInde
75b0: 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  x[] array */.  s
75c0: 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78 20  truct Fts3Index 
75d0: 2a 2a 61 70 49 6e 64 65 78 20 20 20 20 20 20 2f  **apIndex      /
75e0: 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20  * OUT: Array of 
75f0: 69 6e 64 65 78 65 73 20 66 6f 72 20 74 68 69 73  indexes for this
7600: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
7610: 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78 20  truct Fts3Index 
7620: 2a 61 49 6e 64 65 78 3b 20 20 20 20 20 20 20 2f  *aIndex;       /
7630: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 61 72 72 61  * Allocated arra
7640: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65  y */.  int nInde
7650: 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  x = 1;          
7660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7670: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
7680: 72 72 61 79 20 2a 2f 0a 0a 20 20 69 66 28 20 7a  rray */..  if( z
7690: 50 61 72 61 6d 20 26 26 20 7a 50 61 72 61 6d 5b  Param && zParam[
76a0: 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
76b0: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 6e 49 6e  char *p;.    nIn
76c0: 64 65 78 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 70  dex++;.    for(p
76d0: 3d 7a 50 61 72 61 6d 3b 20 2a 70 3b 20 70 2b 2b  =zParam; *p; p++
76e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d  ){.      if( *p=
76f0: 3d 27 2c 27 20 29 20 6e 49 6e 64 65 78 2b 2b 3b  =',' ) nIndex++;
7700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 49  .    }.  }..  aI
7710: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ndex = sqlite3_m
7720: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73 74 72  alloc(sizeof(str
7730: 75 63 74 20 46 74 73 33 49 6e 64 65 78 29 20 2a  uct Fts3Index) *
7740: 20 6e 49 6e 64 65 78 29 3b 0a 20 20 2a 61 70 49   nIndex);.  *apI
7750: 6e 64 65 78 20 3d 20 61 49 6e 64 65 78 3b 0a 20  ndex = aIndex;. 
7760: 20 2a 70 6e 49 6e 64 65 78 20 3d 20 6e 49 6e 64   *pnIndex = nInd
7770: 65 78 3b 0a 20 20 69 66 28 20 21 61 49 6e 64 65  ex;.  if( !aInde
7780: 78 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  x ){.    return 
7790: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
77a0: 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 61 49 6e 64  }..  memset(aInd
77b0: 65 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74  ex, 0, sizeof(st
77c0: 72 75 63 74 20 46 74 73 33 49 6e 64 65 78 29 20  ruct Fts3Index) 
77d0: 2a 20 6e 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  * nIndex);.  if(
77e0: 20 7a 50 61 72 61 6d 20 29 7b 0a 20 20 20 20 63   zParam ){.    c
77f0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 7a  onst char *p = z
7800: 50 61 72 61 6d 3b 0a 20 20 20 20 69 6e 74 20 69  Param;.    int i
7810: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
7820: 3c 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20  <nIndex; i++){. 
7830: 20 20 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78       int nPrefix
7840: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 33  ;.      if( fts3
7850: 47 6f 62 62 6c 65 49 6e 74 28 26 70 2c 20 26 6e  GobbleInt(&p, &n
7860: 50 72 65 66 69 78 29 20 29 20 72 65 74 75 72 6e  Prefix) ) return
7870: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
7880: 20 20 20 20 20 61 49 6e 64 65 78 5b 69 5d 2e 6e       aIndex[i].n
7890: 50 72 65 66 69 78 20 3d 20 6e 50 72 65 66 69 78  Prefix = nPrefix
78a0: 3b 0a 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20  ;.      p++;.   
78b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
78c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
78d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
78e0: 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  on is the implem
78f0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68  entation of both
7900: 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e   the xConnect an
7910: 64 20 78 43 72 65 61 74 65 0a 2a 2a 20 6d 65 74  d xCreate.** met
7920: 68 6f 64 73 20 6f 66 20 74 68 65 20 46 54 53 33  hods of the FTS3
7930: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
7940: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 76 5b 5d  **.** The argv[]
7950: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
7960: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
7970: 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20 20  *.**   argv[0]  
7980: 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20   -> module name 
7990: 20 28 22 66 74 73 33 22 20 6f 72 20 22 66 74 73   ("fts3" or "fts
79a0: 34 22 29 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d  4").**   argv[1]
79b0: 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65 20 6e     -> database n
79c0: 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d  ame.**   argv[2]
79d0: 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65     -> table name
79e0: 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e 5d 20  .**   argv[...] 
79f0: 2d 3e 20 22 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22  -> "column name"
7a00: 20 61 6e 64 20 6f 74 68 65 72 20 6d 6f 64 75 6c   and other modul
7a10: 65 20 61 72 67 75 6d 65 6e 74 20 66 69 65 6c 64  e argument field
7a20: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7a30: 20 66 74 73 33 49 6e 69 74 56 74 61 62 28 0a 20   fts3InitVtab(. 
7a40: 20 69 6e 74 20 69 73 43 72 65 61 74 65 2c 20 20   int isCreate,  
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 78 43 72   /* True for xCr
7a70: 65 61 74 65 2c 20 66 61 6c 73 65 20 66 6f 72 20  eate, false for 
7a80: 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 73 71  xConnect */.  sq
7a90: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ab0: 20 54 68 65 20 53 51 4c 69 74 65 20 64 61 74 61   The SQLite data
7ac0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
7ad0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  */.  void *pAux,
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
7b00: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f  le containing to
7b10: 6b 65 6e 69 7a 65 72 73 20 2a 2f 0a 20 20 69 6e  kenizers */.  in
7b20: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b40: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7b50: 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72 72 61  nts in argv arra
7b60: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
7b70: 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76 2c  r * const *argv,
7b80: 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
7b90: 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67 75 6d  e/xConnect argum
7ba0: 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
7bb0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
7bc0: 56 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  VTab,          /
7bd0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
7be0: 6c 74 69 6e 67 20 76 74 61 62 20 73 74 72 75 63  lting vtab struc
7bf0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
7c00: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c20: 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
7c30: 72 20 6d 65 73 73 61 67 65 20 68 65 72 65 20 2a  r message here *
7c40: 2f 0a 29 7b 0a 20 20 46 74 73 33 48 61 73 68 20  /.){.  Fts3Hash 
7c50: 2a 70 48 61 73 68 20 3d 20 28 46 74 73 33 48 61  *pHash = (Fts3Ha
7c60: 73 68 20 2a 29 70 41 75 78 3b 0a 20 20 46 74 73  sh *)pAux;.  Fts
7c70: 33 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 20 20  3Table *p = 0;  
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c90: 50 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 63  Pointer to alloc
7ca0: 61 74 65 64 20 76 74 61 62 20 2a 2f 0a 20 20 69  ated vtab */.  i
7cb0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7cc0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
7cd0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
7ce0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
7d10: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
7d20: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d40: 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69  Size of allocati
7d50: 6f 6e 20 75 73 65 64 20 66 6f 72 20 2a 70 20 2a  on used for *p *
7d60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
7d90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  dex */.  int nSt
7da0: 72 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ring = 0;       
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7dc0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 6f  s required to ho
7dd0: 6c 64 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ld all column na
7de0: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mes */.  int nCo
7df0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
7e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
7e20: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 2a   the FTS table *
7e30: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 73 72 3b 20  /.  char *zCsr; 
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
7e60: 20 68 6f 6c 64 69 6e 67 20 63 6f 6c 75 6d 6e 20   holding column 
7e70: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  names */.  int n
7e80: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
7e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7ea0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
7eb0: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 6e 61  hold database na
7ec0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
7ed0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7ee0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
7ef0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 6f 6c   required to hol
7f00: 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  d table name */.
7f10: 20 20 69 6e 74 20 69 73 46 74 73 34 20 3d 20 28    int isFts4 = (
7f20: 61 72 67 76 5b 30 5d 5b 33 5d 3d 3d 27 34 27 29  argv[0][3]=='4')
7f30: 3b 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 46 54  ; /* True for FT
7f40: 53 34 2c 20 66 61 6c 73 65 20 66 6f 72 20 46 54  S4, false for FT
7f50: 53 33 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  S3 */.  const ch
7f60: 61 72 20 2a 2a 61 43 6f 6c 3b 20 20 20 20 20 20  ar **aCol;      
7f70: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
7f80: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
7f90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f   */.  sqlite3_to
7fa0: 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69  kenizer *pTokeni
7fb0: 7a 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  zer = 0;        
7fc0: 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 66 6f 72  /* Tokenizer for
7fd0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 0a   this table */..
7fe0: 20 20 69 6e 74 20 6e 49 6e 64 65 78 3b 20 20 20    int nIndex;   
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8000: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 49 6e    /* Size of aIn
8010: 64 65 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  dex[] array */. 
8020: 20 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65   struct Fts3Inde
8030: 78 20 2a 61 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *aIndex = 0;  
8040: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64   /* Array of ind
8050: 65 78 65 73 20 66 6f 72 20 74 68 69 73 20 74 61  exes for this ta
8060: 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ble */..  /* The
8070: 20 72 65 73 75 6c 74 73 20 6f 66 20 70 61 72 73   results of pars
8080: 69 6e 67 20 73 75 70 70 6f 72 74 65 64 20 46 54  ing supported FT
8090: 53 34 20 6b 65 79 3d 76 61 6c 75 65 20 6f 70 74  S4 key=value opt
80a0: 69 6f 6e 73 3a 20 2a 2f 0a 20 20 69 6e 74 20 62  ions: */.  int b
80b0: 4e 6f 44 6f 63 73 69 7a 65 20 3d 20 30 3b 20 20  NoDocsize = 0;  
80c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
80d0: 75 65 20 74 6f 20 6f 6d 69 74 20 25 5f 64 6f 63  ue to omit %_doc
80e0: 73 69 7a 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  size table */.  
80f0: 69 6e 74 20 62 44 65 73 63 49 64 78 20 3d 20 30  int bDescIdx = 0
8100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8110: 2f 2a 20 54 72 75 65 20 74 6f 20 73 74 6f 72 65  /* True to store
8120: 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
8130: 78 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  xes */.  char *z
8140: 50 72 65 66 69 78 20 3d 20 30 3b 20 20 20 20 20  Prefix = 0;     
8150: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 66           /* Pref
8160: 69 78 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c  ix parameter val
8170: 75 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ue (or NULL) */.
8180: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 70 72 65 73    char *zCompres
8190: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
81a0: 20 20 2f 2a 20 63 6f 6d 70 72 65 73 73 3d 3f 20    /* compress=? 
81b0: 70 61 72 61 6d 65 74 65 72 20 28 6f 72 20 4e 55  parameter (or NU
81c0: 4c 4c 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  LL) */.  char *z
81d0: 55 6e 63 6f 6d 70 72 65 73 73 20 3d 20 30 3b 20  Uncompress = 0; 
81e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 63 6f           /* unco
81f0: 6d 70 72 65 73 73 3d 3f 20 70 61 72 61 6d 65 74  mpress=? paramet
8200: 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  er (or NULL) */.
8210: 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65  .  assert( strle
8220: 6e 28 61 72 67 76 5b 30 5d 29 3d 3d 34 20 29 3b  n(argv[0])==4 );
8230: 0a 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69  .  assert( (sqli
8240: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 72 67  te3_strnicmp(arg
8250: 76 5b 30 5d 2c 20 22 66 74 73 34 22 2c 20 34 29  v[0], "fts4", 4)
8260: 3d 3d 30 20 26 26 20 69 73 46 74 73 34 29 0a 20  ==0 && isFts4). 
8270: 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65        || (sqlite
8280: 33 5f 73 74 72 6e 69 63 6d 70 28 61 72 67 76 5b  3_strnicmp(argv[
8290: 30 5d 2c 20 22 66 74 73 33 22 2c 20 34 29 3d 3d  0], "fts3", 4)==
82a0: 30 20 26 26 20 21 69 73 46 74 73 34 29 0a 20 20  0 && !isFts4).  
82b0: 29 3b 0a 0a 20 20 6e 44 62 20 3d 20 28 69 6e 74  );..  nDb = (int
82c0: 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29  )strlen(argv[1])
82d0: 20 2b 20 31 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20   + 1;.  nName = 
82e0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67 76  (int)strlen(argv
82f0: 5b 32 5d 29 20 2b 20 31 3b 0a 0a 20 20 61 43 6f  [2]) + 1;..  aCo
8300: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  l = (const char 
8310: 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  **)sqlite3_mallo
8320: 63 28 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63  c(sizeof(const c
8330: 68 61 72 20 2a 29 20 2a 20 28 61 72 67 63 2d 32  har *) * (argc-2
8340: 29 20 29 3b 0a 20 20 69 66 28 20 21 61 43 6f 6c  ) );.  if( !aCol
8350: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
8360: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
8370: 28 28 76 6f 69 64 20 2a 29 61 43 6f 6c 2c 20 30  ((void *)aCol, 0
8380: 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63  , sizeof(const c
8390: 68 61 72 20 2a 29 20 2a 20 28 61 72 67 63 2d 32  har *) * (argc-2
83a0: 29 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74  ));..  /* Loop t
83b0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 66 20 74 68  hrough all of th
83c0: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
83d0: 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 74  ed by the user t
83e0: 6f 20 74 68 65 20 46 54 53 33 2f 34 0a 20 20 2a  o the FTS3/4.  *
83f0: 2a 20 6d 6f 64 75 6c 65 20 28 69 2e 65 2e 20 61  * module (i.e. a
8400: 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ll the column na
8410: 6d 65 73 20 61 6e 64 20 73 70 65 63 69 61 6c 20  mes and special 
8420: 61 72 67 75 6d 65 6e 74 73 29 2e 20 54 68 69 73  arguments). This
8430: 20 6c 6f 6f 70 0a 20 20 2a 2a 20 64 6f 65 73 20   loop.  ** does 
8440: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
8450: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 46 69 67   **.  **   + Fig
8460: 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e 75 6d  ures out the num
8470: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
8480: 68 65 20 46 54 53 58 20 74 61 62 6c 65 20 77 69  he FTSX table wi
8490: 6c 6c 20 68 61 76 65 2c 20 61 6e 64 0a 20 20 2a  ll have, and.  *
84a0: 2a 20 20 20 20 20 74 68 65 20 6e 75 6d 62 65 72  *     the number
84b0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
84c0: 63 65 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ce that must be 
84d0: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 73 74 6f  allocated to sto
84e0: 72 65 20 63 6f 70 69 65 73 0a 20 20 2a 2a 20 20  re copies.  **  
84f0: 20 20 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e     of the column
8500: 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a   names..  **.  *
8510: 2a 20 20 20 2b 20 49 66 20 74 68 65 72 65 20 69  *   + If there i
8520: 73 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 73 70  s a tokenizer sp
8530: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 63 6c  ecification incl
8540: 75 64 65 64 20 69 6e 20 74 68 65 20 61 72 67 75  uded in the argu
8550: 6d 65 6e 74 73 2c 0a 20 20 2a 2a 20 20 20 20 20  ments,.  **     
8560: 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
8570: 74 6f 6b 65 6e 69 7a 65 72 20 70 54 6f 6b 65 6e  tokenizer pToken
8580: 69 7a 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  izer..  */.  for
8590: 28 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=3; rc==SQLITE
85a0: 5f 4f 4b 20 26 26 20 69 3c 61 72 67 63 3b 20 69  _OK && i<argc; i
85b0: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  ++){.    char co
85c0: 6e 73 74 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d  nst *z = argv[i]
85d0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  ;.    int nKey;.
85e0: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a      char *zVal;.
85f0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
8600: 20 74 68 69 73 20 69 73 20 61 20 74 6f 6b 65 6e   this is a token
8610: 69 7a 65 72 20 73 70 65 63 69 66 69 63 61 74 69  izer specificati
8620: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  on */.    if( !p
8630: 54 6f 6b 65 6e 69 7a 65 72 20 0a 20 20 20 20 20  Tokenizer .     
8640: 26 26 20 73 74 72 6c 65 6e 28 7a 29 3e 38 0a 20  && strlen(z)>8. 
8650: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
8660: 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 74  3_strnicmp(z, "t
8670: 6f 6b 65 6e 69 7a 65 22 2c 20 38 29 20 0a 20 20  okenize", 8) .  
8680: 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
8690: 46 74 73 33 49 73 49 64 43 68 61 72 28 7a 5b 38  Fts3IsIdChar(z[8
86a0: 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ]).    ){.      
86b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
86c0: 49 6e 69 74 54 6f 6b 65 6e 69 7a 65 72 28 70 48  InitTokenizer(pH
86d0: 61 73 68 2c 20 26 7a 5b 39 5d 2c 20 26 70 54 6f  ash, &z[9], &pTo
86e0: 6b 65 6e 69 7a 65 72 2c 20 70 7a 45 72 72 29 3b  kenizer, pzErr);
86f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
8700: 68 65 63 6b 20 69 66 20 69 74 20 69 73 20 61 6e  heck if it is an
8710: 20 46 54 53 34 20 73 70 65 63 69 61 6c 20 61 72   FTS4 special ar
8720: 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 65  gument. */.    e
8730: 6c 73 65 20 69 66 28 20 69 73 46 74 73 34 20 26  lse if( isFts4 &
8740: 26 20 66 74 73 33 49 73 53 70 65 63 69 61 6c 43  & fts3IsSpecialC
8750: 6f 6c 75 6d 6e 28 7a 2c 20 26 6e 4b 65 79 2c 20  olumn(z, &nKey, 
8760: 26 7a 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  &zVal) ){.      
8770: 73 74 72 75 63 74 20 46 74 73 34 4f 70 74 69 6f  struct Fts4Optio
8780: 6e 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  n {.        cons
8790: 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20  t char *zOpt;.  
87a0: 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 3b 0a        int nOpt;.
87b0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 70          char **p
87c0: 7a 56 61 72 3b 0a 20 20 20 20 20 20 7d 20 61 46  zVar;.      } aF
87d0: 74 73 34 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20  ts4Opt[] = {.   
87e0: 20 20 20 20 20 7b 20 22 6d 61 74 63 68 69 6e 66       { "matchinf
87f0: 6f 22 2c 20 20 20 39 2c 20 30 20 7d 2c 20 20 20  o",   9, 0 },   
8800: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
8810: 20 4d 41 54 43 48 49 4e 46 4f 20 2a 2f 0a 20 20   MATCHINFO */.  
8820: 20 20 20 20 20 20 7b 20 22 70 72 65 66 69 78 22        { "prefix"
8830: 2c 20 20 20 20 20 20 36 2c 20 30 20 7d 2c 20 20  ,      6, 0 },  
8840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
8850: 3e 20 50 52 45 46 49 58 20 2a 2f 0a 20 20 20 20  > PREFIX */.    
8860: 20 20 20 20 7b 20 22 63 6f 6d 70 72 65 73 73 22      { "compress"
8870: 2c 20 20 20 20 38 2c 20 30 20 7d 2c 20 20 20 20  ,    8, 0 },    
8880: 20 20 20 20 20 20 20 20 2f 2a 20 32 20 2d 3e 20          /* 2 -> 
8890: 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20 20 20 20  COMPRESS */.    
88a0: 20 20 20 20 7b 20 22 75 6e 63 6f 6d 70 72 65 73      { "uncompres
88b0: 73 22 2c 20 31 30 2c 20 30 20 7d 2c 20 20 20 20  s", 10, 0 },    
88c0: 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2d 3e 20          /* 3 -> 
88d0: 55 4e 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20 20  UNCOMPRESS */.  
88e0: 20 20 20 20 20 20 7b 20 22 6f 72 64 65 72 22 2c        { "order",
88f0: 20 20 20 20 20 20 20 35 2c 20 30 20 7d 20 20 20         5, 0 }   
8900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 2d            /* 4 -
8910: 3e 20 4f 52 44 45 52 20 2a 2f 0a 20 20 20 20 20  > ORDER */.     
8920: 20 7d 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20 69   };..      int i
8930: 4f 70 74 3b 0a 20 20 20 20 20 20 69 66 28 20 21  Opt;.      if( !
8940: 7a 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zVal ){.        
8950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8960: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
8970: 20 20 20 20 20 20 20 20 66 6f 72 28 69 4f 70 74          for(iOpt
8980: 3d 30 3b 20 69 4f 70 74 3c 53 69 7a 65 6f 66 41  =0; iOpt<SizeofA
8990: 72 72 61 79 28 61 46 74 73 34 4f 70 74 29 3b 20  rray(aFts4Opt); 
89a0: 69 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iOpt++){.       
89b0: 20 20 20 73 74 72 75 63 74 20 46 74 73 34 4f 70     struct Fts4Op
89c0: 74 69 6f 6e 20 2a 70 4f 70 20 3d 20 26 61 46 74  tion *pOp = &aFt
89d0: 73 34 4f 70 74 5b 69 4f 70 74 5d 3b 0a 20 20 20  s4Opt[iOpt];.   
89e0: 20 20 20 20 20 20 20 69 66 28 20 6e 4b 65 79 3d         if( nKey=
89f0: 3d 70 4f 70 2d 3e 6e 4f 70 74 20 26 26 20 21 73  =pOp->nOpt && !s
8a00: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
8a10: 7a 2c 20 70 4f 70 2d 3e 7a 4f 70 74 2c 20 70 4f  z, pOp->zOpt, pO
8a20: 70 2d 3e 6e 4f 70 74 29 20 29 7b 0a 20 20 20 20  p->nOpt) ){.    
8a30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8a40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8a50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8a60: 20 69 4f 70 74 3d 3d 53 69 7a 65 6f 66 41 72 72   iOpt==SizeofArr
8a70: 61 79 28 61 46 74 73 34 4f 70 74 29 20 29 7b 0a  ay(aFts4Opt) ){.
8a80: 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
8a90: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8aa0: 74 66 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  tf("unrecognized
8ab0: 20 70 61 72 61 6d 65 74 65 72 3a 20 25 73 22 2c   parameter: %s",
8ac0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   z);.          r
8ad0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
8ae0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8af0: 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
8b00: 68 28 20 69 4f 70 74 20 29 7b 0a 20 20 20 20 20  h( iOpt ){.     
8b10: 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b30: 4d 41 54 43 48 49 4e 46 4f 20 2a 2f 0a 20 20 20  MATCHINFO */.   
8b40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
8b50: 74 72 6c 65 6e 28 7a 56 61 6c 29 21 3d 34 20 7c  trlen(zVal)!=4 |
8b60: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  | sqlite3_strnic
8b70: 6d 70 28 7a 56 61 6c 2c 20 22 66 74 73 33 22 2c  mp(zVal, "fts3",
8b80: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   4) ){.         
8b90: 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
8ba0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8bb0: 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6d 61  "unrecognized ma
8bc0: 74 63 68 69 6e 66 6f 3a 20 25 73 22 2c 20 7a 56  tchinfo: %s", zV
8bd0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
8be0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8bf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
8c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8c10: 20 20 20 20 20 20 62 4e 6f 44 6f 63 73 69 7a 65        bNoDocsize
8c20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
8c30: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
8c40: 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c60: 20 50 52 45 46 49 58 20 2a 2f 0a 20 20 20 20 20   PREFIX */.     
8c70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8c80: 5f 66 72 65 65 28 7a 50 72 65 66 69 78 29 3b 0a  _free(zPrefix);.
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 50                zP
8ca0: 72 65 66 69 78 20 3d 20 7a 56 61 6c 3b 0a 20 20  refix = zVal;.  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 56 61 6c              zVal
8cc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
8cd0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
8ce0: 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20          case 2: 
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8d00: 20 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20 20 20   COMPRESS */.   
8d10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8d20: 65 33 5f 66 72 65 65 28 7a 43 6f 6d 70 72 65 73  e3_free(zCompres
8d30: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
8d40: 20 20 7a 43 6f 6d 70 72 65 73 73 20 3d 20 7a 56    zCompress = zV
8d50: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
8d60: 20 20 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20    zVal = 0;.    
8d70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8d80: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
8d90: 73 65 20 33 3a 20 20 20 20 20 20 20 20 20 20 20  se 3:           
8da0: 20 20 20 20 2f 2a 20 55 4e 43 4f 4d 50 52 45 53      /* UNCOMPRES
8db0: 53 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  S */.           
8dc0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8dd0: 7a 55 6e 63 6f 6d 70 72 65 73 73 29 3b 0a 20 20  zUncompress);.  
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 55 6e 63              zUnc
8df0: 6f 6d 70 72 65 73 73 20 3d 20 7a 56 61 6c 3b 0a  ompress = zVal;.
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 56                zV
8e10: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
8e20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
8e30: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 34            case 4
8e40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
8e50: 2f 2a 20 4f 52 44 45 52 20 2a 2f 0a 20 20 20 20  /* ORDER */.    
8e60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 73            if( (s
8e70: 74 72 6c 65 6e 28 7a 56 61 6c 29 21 3d 33 20 7c  trlen(zVal)!=3 |
8e80: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  | sqlite3_strnic
8e90: 6d 70 28 7a 56 61 6c 2c 20 22 61 73 63 22 2c 20  mp(zVal, "asc", 
8ea0: 33 29 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  3)) .           
8eb0: 20 20 20 20 26 26 20 28 73 74 72 6c 65 6e 28 7a      && (strlen(z
8ec0: 56 61 6c 29 21 3d 34 20 7c 7c 20 73 71 6c 69 74  Val)!=4 || sqlit
8ed0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
8ee0: 2c 20 22 64 65 73 63 22 2c 20 33 29 29 20 0a 20  , "desc", 3)) . 
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
8f20: 5f 6d 70 72 69 6e 74 66 28 22 75 6e 72 65 63 6f  _mprintf("unreco
8f30: 67 6e 69 7a 65 64 20 6f 72 64 65 72 3a 20 25 73  gnized order: %s
8f40: 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  ", zVal);.      
8f50: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
8f60: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
8f70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8f80: 20 20 20 20 20 20 20 20 20 20 20 62 44 65 73 63             bDesc
8f90: 49 64 78 20 3d 20 28 7a 56 61 6c 5b 30 5d 3d 3d  Idx = (zVal[0]==
8fa0: 27 64 27 20 7c 7c 20 7a 56 61 6c 5b 30 5d 3d 3d  'd' || zVal[0]==
8fb0: 27 44 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  'D');.          
8fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8fe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8ff0: 5f 66 72 65 65 28 7a 56 61 6c 29 3b 0a 20 20 20  _free(zVal);.   
9000: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9010: 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  /* Otherwise, th
9020: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  e argument is a 
9030: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 20 2a 2f 0a  column name. */.
9040: 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
9050: 20 6e 53 74 72 69 6e 67 20 2b 3d 20 28 69 6e 74   nString += (int
9060: 29 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29  )(strlen(z) + 1)
9070: 3b 0a 20 20 20 20 20 20 61 43 6f 6c 5b 6e 43 6f  ;.      aCol[nCo
9080: 6c 2b 2b 5d 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a  l++] = z;.    }.
9090: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
90a0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
90b0: 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 0a 20  ts3_init_out;.. 
90c0: 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 7b 0a   if( nCol==0 ){.
90d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 74 72      assert( nStr
90e0: 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 61 43  ing==0 );.    aC
90f0: 6f 6c 5b 30 5d 20 3d 20 22 63 6f 6e 74 65 6e 74  ol[0] = "content
9100: 22 3b 0a 20 20 20 20 6e 53 74 72 69 6e 67 20 3d  ";.    nString =
9110: 20 38 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31   8;.    nCol = 1
9120: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 6f  ;.  }..  if( pTo
9130: 6b 65 6e 69 7a 65 72 3d 3d 30 20 29 7b 0a 20 20  kenizer==0 ){.  
9140: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
9150: 73 33 49 6e 69 74 54 6f 6b 65 6e 69 7a 65 72 28  s3InitTokenizer(
9160: 70 48 61 73 68 2c 20 22 73 69 6d 70 6c 65 22 2c  pHash, "simple",
9170: 20 26 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 70 7a   &pTokenizer, pz
9180: 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Err);.    if( rc
9190: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
91a0: 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74  to fts3_init_out
91b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
91c0: 70 54 6f 6b 65 6e 69 7a 65 72 20 29 3b 0a 0a 20  pTokenizer );.. 
91d0: 20 72 63 20 3d 20 66 74 73 33 50 72 65 66 69 78   rc = fts3Prefix
91e0: 50 61 72 61 6d 65 74 65 72 28 7a 50 72 65 66 69  Parameter(zPrefi
91f0: 78 2c 20 26 6e 49 6e 64 65 78 2c 20 26 61 49 6e  x, &nIndex, &aIn
9200: 64 65 78 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  dex);.  if( rc==
9210: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a  SQLITE_ERROR ){.
9220: 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 72 65      assert( zPre
9230: 66 69 78 20 29 3b 0a 20 20 20 20 2a 70 7a 45 72  fix );.    *pzEr
9240: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
9250: 6e 74 66 28 22 65 72 72 6f 72 20 70 61 72 73 69  ntf("error parsi
9260: 6e 67 20 70 72 65 66 69 78 20 70 61 72 61 6d 65  ng prefix parame
9270: 74 65 72 3a 20 25 73 22 2c 20 7a 50 72 65 66 69  ter: %s", zPrefi
9280: 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  x);.  }.  if( rc
9290: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
92a0: 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74  to fts3_init_out
92b0: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
92c0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68   and populate th
92d0: 65 20 46 74 73 33 54 61 62 6c 65 20 73 74 72 75  e Fts3Table stru
92e0: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 6e 42 79 74  cture. */.  nByt
92f0: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 54  e = sizeof(Fts3T
9300: 61 62 6c 65 29 20 2b 20 20 20 20 20 20 20 20 20  able) +         
9310: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33           /* Fts3
9320: 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  Table */.       
9330: 20 20 20 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66     nCol * sizeof
9340: 28 63 68 61 72 20 2a 29 20 2b 20 20 20 20 20 20  (char *) +      
9350: 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 43 6f 6c          /* azCol
9360: 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  umn */.         
9370: 20 6e 49 6e 64 65 78 20 2a 20 73 69 7a 65 6f 66   nIndex * sizeof
9380: 28 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65  (struct Fts3Inde
9390: 78 29 20 2b 20 20 2f 2a 20 61 49 6e 64 65 78 20  x) +  /* aIndex 
93a0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 61  */.          nNa
93b0: 6d 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  me +            
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
93e0: 20 20 20 20 20 20 20 20 6e 44 62 20 2b 20 20 20          nDb +   
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9410: 7a 44 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  zDb */.         
9420: 20 6e 53 74 72 69 6e 67 3b 20 20 20 20 20 20 20   nString;       
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
9450: 6f 72 20 61 7a 43 6f 6c 75 6d 6e 20 73 74 72 69  or azColumn stri
9460: 6e 67 73 20 2a 2f 0a 20 20 70 20 3d 20 28 46 74  ngs */.  p = (Ft
9470: 73 33 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 33  s3Table*)sqlite3
9480: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
9490: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
94a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
94b0: 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 74  MEM;.    goto ft
94c0: 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 20 20 7d  s3_init_out;.  }
94d0: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
94e0: 6e 42 79 74 65 29 3b 0a 20 20 70 2d 3e 64 62 20  nByte);.  p->db 
94f0: 3d 20 64 62 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 75  = db;.  p->nColu
9500: 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 70 2d 3e  mn = nCol;.  p->
9510: 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
9520: 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 20  ;.  p->azColumn 
9530: 3d 20 28 63 68 61 72 20 2a 2a 29 26 70 5b 31 5d  = (char **)&p[1]
9540: 3b 0a 20 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65  ;.  p->pTokenize
9550: 72 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a  r = pTokenizer;.
9560: 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67    p->nMaxPending
9570: 44 61 74 61 20 3d 20 46 54 53 33 5f 4d 41 58 5f  Data = FTS3_MAX_
9580: 50 45 4e 44 49 4e 47 5f 44 41 54 41 3b 0a 20 20  PENDING_DATA;.  
9590: 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 3d  p->bHasDocsize =
95a0: 20 28 69 73 46 74 73 34 20 26 26 20 62 4e 6f 44   (isFts4 && bNoD
95b0: 6f 63 73 69 7a 65 3d 3d 30 29 3b 0a 20 20 70 2d  ocsize==0);.  p-
95c0: 3e 62 48 61 73 53 74 61 74 20 3d 20 69 73 46 74  >bHasStat = isFt
95d0: 73 34 3b 0a 20 20 70 2d 3e 62 44 65 73 63 49 64  s4;.  p->bDescId
95e0: 78 20 3d 20 62 44 65 73 63 49 64 78 3b 0a 20 20  x = bDescIdx;.  
95f0: 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 69 6e 54  TESTONLY( p->inT
9600: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 2d 31 20  ransaction = -1 
9610: 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70  );.  TESTONLY( p
9620: 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20  ->mxSavepoint = 
9630: 2d 31 20 29 3b 0a 0a 20 20 70 2d 3e 61 49 6e 64  -1 );..  p->aInd
9640: 65 78 20 3d 20 28 73 74 72 75 63 74 20 46 74 73  ex = (struct Fts
9650: 33 49 6e 64 65 78 20 2a 29 26 70 2d 3e 61 7a 43  3Index *)&p->azC
9660: 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 3b 0a 20 20 6d  olumn[nCol];.  m
9670: 65 6d 63 70 79 28 70 2d 3e 61 49 6e 64 65 78 2c  emcpy(p->aIndex,
9680: 20 61 49 6e 64 65 78 2c 20 73 69 7a 65 6f 66 28   aIndex, sizeof(
9690: 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78  struct Fts3Index
96a0: 29 20 2a 20 6e 49 6e 64 65 78 29 3b 0a 20 20 70  ) * nIndex);.  p
96b0: 2d 3e 6e 49 6e 64 65 78 20 3d 20 6e 49 6e 64 65  ->nIndex = nInde
96c0: 78 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  x;.  for(i=0; i<
96d0: 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20  nIndex; i++){.  
96e0: 20 20 66 74 73 33 48 61 73 68 49 6e 69 74 28 26    fts3HashInit(&
96f0: 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 68 50 65  p->aIndex[i].hPe
9700: 6e 64 69 6e 67 2c 20 46 54 53 33 5f 48 41 53 48  nding, FTS3_HASH
9710: 5f 53 54 52 49 4e 47 2c 20 31 29 3b 0a 20 20 7d  _STRING, 1);.  }
9720: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
9730: 68 65 20 7a 4e 61 6d 65 20 61 6e 64 20 7a 44 62  he zName and zDb
9740: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 76   fields of the v
9750: 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 2a  tab structure. *
9760: 2f 0a 20 20 7a 43 73 72 20 3d 20 28 63 68 61 72  /.  zCsr = (char
9770: 20 2a 29 26 70 2d 3e 61 49 6e 64 65 78 5b 6e 49   *)&p->aIndex[nI
9780: 6e 64 65 78 5d 3b 0a 20 20 70 2d 3e 7a 4e 61 6d  ndex];.  p->zNam
9790: 65 20 3d 20 7a 43 73 72 3b 0a 20 20 6d 65 6d 63  e = zCsr;.  memc
97a0: 70 79 28 7a 43 73 72 2c 20 61 72 67 76 5b 32 5d  py(zCsr, argv[2]
97b0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 7a 43 73 72  , nName);.  zCsr
97c0: 20 2b 3d 20 6e 4e 61 6d 65 3b 0a 20 20 70 2d 3e   += nName;.  p->
97d0: 7a 44 62 20 3d 20 7a 43 73 72 3b 0a 20 20 6d 65  zDb = zCsr;.  me
97e0: 6d 63 70 79 28 7a 43 73 72 2c 20 61 72 67 76 5b  mcpy(zCsr, argv[
97f0: 31 5d 2c 20 6e 44 62 29 3b 0a 20 20 7a 43 73 72  1], nDb);.  zCsr
9800: 20 2b 3d 20 6e 44 62 3b 0a 0a 20 20 2f 2a 20 46   += nDb;..  /* F
9810: 69 6c 6c 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  ill in the azCol
9820: 75 6d 6e 20 61 72 72 61 79 20 2a 2f 0a 20 20 66  umn array */.  f
9830: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
9840: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
9850: 20 20 20 63 68 61 72 20 2a 7a 3b 20 0a 20 20 20     char *z; .   
9860: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
9870: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
9880: 74 65 33 46 74 73 33 4e 65 78 74 54 6f 6b 65 6e  te3Fts3NextToken
9890: 28 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 20 26 6e 29  (aCol[iCol], &n)
98a0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 73  ;.    memcpy(zCs
98b0: 72 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 43  r, z, n);.    zC
98c0: 73 72 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  sr[n] = '\0';.  
98d0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 71    sqlite3Fts3Deq
98e0: 75 6f 74 65 28 7a 43 73 72 29 3b 0a 20 20 20 20  uote(zCsr);.    
98f0: 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  p->azColumn[iCol
9900: 5d 20 3d 20 7a 43 73 72 3b 0a 20 20 20 20 7a 43  ] = zCsr;.    zC
9910: 73 72 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 61  sr += n+1;.    a
9920: 73 73 65 72 74 28 20 7a 43 73 72 20 3c 3d 20 26  ssert( zCsr <= &
9930: 28 28 63 68 61 72 20 2a 29 70 29 5b 6e 42 79 74  ((char *)p)[nByt
9940: 65 5d 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  e] );.  }..  if(
9950: 20 28 7a 43 6f 6d 70 72 65 73 73 3d 3d 30 29 21   (zCompress==0)!
9960: 3d 28 7a 55 6e 63 6f 6d 70 72 65 73 73 3d 3d 30  =(zUncompress==0
9970: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  ) ){.    char co
9980: 6e 73 74 20 2a 7a 4d 69 73 73 20 3d 20 28 7a 43  nst *zMiss = (zC
9990: 6f 6d 70 72 65 73 73 3d 3d 30 20 3f 20 22 63 6f  ompress==0 ? "co
99a0: 6d 70 72 65 73 73 22 20 3a 20 22 75 6e 63 6f 6d  mpress" : "uncom
99b0: 70 72 65 73 73 22 29 3b 0a 20 20 20 20 72 63 20  press");.    rc 
99c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
99d0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
99e0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 69  ite3_mprintf("mi
99f0: 73 73 69 6e 67 20 25 73 20 70 61 72 61 6d 65 74  ssing %s paramet
9a00: 65 72 20 69 6e 20 66 74 73 34 20 63 6f 6e 73 74  er in fts4 const
9a10: 72 75 63 74 6f 72 22 2c 20 7a 4d 69 73 73 29 3b  ructor", zMiss);
9a20: 0a 20 20 7d 0a 20 20 70 2d 3e 7a 52 65 61 64 45  .  }.  p->zReadE
9a30: 78 70 72 6c 69 73 74 20 3d 20 66 74 73 33 52 65  xprlist = fts3Re
9a40: 61 64 45 78 70 72 4c 69 73 74 28 70 2c 20 7a 55  adExprList(p, zU
9a50: 6e 63 6f 6d 70 72 65 73 73 2c 20 26 72 63 29 3b  ncompress, &rc);
9a60: 0a 20 20 70 2d 3e 7a 57 72 69 74 65 45 78 70 72  .  p->zWriteExpr
9a70: 6c 69 73 74 20 3d 20 66 74 73 33 57 72 69 74 65  list = fts3Write
9a80: 45 78 70 72 4c 69 73 74 28 70 2c 20 7a 43 6f 6d  ExprList(p, zCom
9a90: 70 72 65 73 73 2c 20 26 72 63 29 3b 0a 20 20 69  press, &rc);.  i
9aa0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9ab0: 20 29 20 67 6f 74 6f 20 66 74 73 33 5f 69 6e 69   ) goto fts3_ini
9ac0: 74 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_out;..  /* If 
9ad0: 74 68 69 73 20 69 73 20 61 6e 20 78 43 72 65 61  this is an xCrea
9ae0: 74 65 20 63 61 6c 6c 2c 20 63 72 65 61 74 65 20  te call, create 
9af0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 74  the underlying t
9b00: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 0a 20 20  ables in the .  
9b10: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 4f 44  ** database. TOD
9b20: 4f 3a 20 46 6f 72 20 78 43 6f 6e 6e 65 63 74 28  O: For xConnect(
9b30: 29 2c 20 69 74 20 63 6f 75 6c 64 20 76 65 72 69  ), it could veri
9b40: 66 79 20 74 68 61 74 20 73 61 69 64 20 74 61 62  fy that said tab
9b50: 6c 65 73 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a  les exist..  */.
9b60: 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
9b70: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 43  {.    rc = fts3C
9b80: 72 65 61 74 65 54 61 62 6c 65 73 28 70 29 3b 0a  reateTables(p);.
9b90: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
9ba0: 20 6f 75 74 20 74 68 65 20 70 61 67 65 2d 73 69   out the page-si
9bb0: 7a 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ze for the datab
9bc0: 61 73 65 2e 20 54 68 69 73 20 69 73 20 72 65 71  ase. This is req
9bd0: 75 69 72 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uired in order t
9be0: 6f 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  o.  ** estimate 
9bf0: 74 68 65 20 63 6f 73 74 20 6f 66 20 6c 6f 61 64  the cost of load
9c00: 69 6e 67 20 6c 61 72 67 65 20 64 6f 63 6c 69 73  ing large doclis
9c10: 74 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ts from the data
9c20: 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 74 73 33  base.  */.  fts3
9c30: 44 61 74 61 62 61 73 65 50 61 67 65 53 69 7a 65  DatabasePageSize
9c40: 28 26 72 63 2c 20 70 29 3b 0a 20 20 70 2d 3e 6e  (&rc, p);.  p->n
9c50: 4e 6f 64 65 53 69 7a 65 20 3d 20 70 2d 3e 6e 50  NodeSize = p->nP
9c60: 67 73 7a 2d 33 35 3b 0a 0a 20 20 2f 2a 20 44 65  gsz-35;..  /* De
9c70: 63 6c 61 72 65 20 74 68 65 20 74 61 62 6c 65 20  clare the table 
9c80: 73 63 68 65 6d 61 20 74 6f 20 53 51 4c 69 74 65  schema to SQLite
9c90: 2e 20 2a 2f 0a 20 20 66 74 73 33 44 65 63 6c 61  . */.  fts3Decla
9ca0: 72 65 56 74 61 62 28 26 72 63 2c 20 70 29 3b 0a  reVtab(&rc, p);.
9cb0: 0a 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3a 0a  .fts3_init_out:.
9cc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9cd0: 50 72 65 66 69 78 29 3b 0a 20 20 73 71 6c 69 74  Prefix);.  sqlit
9ce0: 65 33 5f 66 72 65 65 28 61 49 6e 64 65 78 29 3b  e3_free(aIndex);
9cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9d00: 7a 43 6f 6d 70 72 65 73 73 29 3b 0a 20 20 73 71  zCompress);.  sq
9d10: 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 6e 63 6f  lite3_free(zUnco
9d20: 6d 70 72 65 73 73 29 3b 0a 20 20 73 71 6c 69 74  mpress);.  sqlit
9d30: 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29  e3_free((void *)
9d40: 61 43 6f 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  aCol);.  if( rc!
9d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9d60: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
9d70: 20 66 74 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d   fts3DisconnectM
9d80: 65 74 68 6f 64 28 28 73 71 6c 69 74 65 33 5f 76  ethod((sqlite3_v
9d90: 74 61 62 20 2a 29 70 29 3b 0a 20 20 20 20 7d 65  tab *)p);.    }e
9da0: 6c 73 65 20 69 66 28 20 70 54 6f 6b 65 6e 69 7a  lse if( pTokeniz
9db0: 65 72 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 6b  er ){.      pTok
9dc0: 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 2d  enizer->pModule-
9dd0: 3e 78 44 65 73 74 72 6f 79 28 70 54 6f 6b 65 6e  >xDestroy(pToken
9de0: 69 7a 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  izer);.    }.  }
9df0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9e00: 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d  ( p->pSegments==
9e10: 30 20 29 3b 0a 20 20 20 20 2a 70 70 56 54 61 62  0 );.    *ppVTab
9e20: 20 3d 20 26 70 2d 3e 62 61 73 65 3b 0a 20 20 7d   = &p->base;.  }
9e30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9e40: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 43 6f 6e 6e  ./*.** The xConn
9e50: 65 63 74 28 29 20 61 6e 64 20 78 43 72 65 61 74  ect() and xCreat
9e60: 65 28 29 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  e() methods for 
9e70: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
9e80: 65 2e 20 41 6c 6c 20 74 68 65 0a 2a 2a 20 77 6f  e. All the.** wo
9e90: 72 6b 20 69 73 20 64 6f 6e 65 20 69 6e 20 66 75  rk is done in fu
9ea0: 6e 63 74 69 6f 6e 20 66 74 73 33 49 6e 69 74 56  nction fts3InitV
9eb0: 74 61 62 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tab()..*/.static
9ec0: 20 69 6e 74 20 66 74 73 33 43 6f 6e 6e 65 63 74   int fts3Connect
9ed0: 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
9ee0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
9f00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9f10: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78   */.  void *pAux
9f20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9f30: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9f40: 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61   to tokenizer ha
9f50: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  sh table */.  in
9f60: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9f80: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
9f90: 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72 72 61  nts in argv arra
9fa0: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
9fb0: 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76 2c  r * const *argv,
9fc0: 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
9fd0: 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67 75 6d  e/xConnect argum
9fe0: 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
9ff0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
a000: 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  Vtab,          /
a010: 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c 69 74  * OUT: New sqlit
a020: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20 2a  e3_vtab object *
a030: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69      /* OUT: sqli
a060: 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65 72 72  te3_malloc'd err
a070: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b  or message */.){
a080: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 49 6e  .  return fts3In
a090: 69 74 56 74 61 62 28 30 2c 20 64 62 2c 20 70 41  itVtab(0, db, pA
a0a0: 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
a0b0: 70 70 56 74 61 62 2c 20 70 7a 45 72 72 29 3b 0a  ppVtab, pzErr);.
a0c0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
a0d0: 33 43 72 65 61 74 65 4d 65 74 68 6f 64 28 0a 20  3CreateMethod(. 
a0e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
a110: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  nection */.  voi
a120: 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20  d *pAux,        
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a140: 50 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b 65 6e  Pointer to token
a150: 69 7a 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  izer hash table 
a160: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a190: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72  f elements in ar
a1a0: 67 76 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 6f  gv array */.  co
a1b0: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
a1c0: 20 2a 61 72 67 76 2c 20 20 20 20 20 20 20 2f 2a   *argv,       /*
a1d0: 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63   xCreate/xConnec
a1e0: 74 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79  t argument array
a1f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   */.  sqlite3_vt
a200: 61 62 20 2a 2a 70 70 56 74 61 62 2c 20 20 20 20  ab **ppVtab,    
a210: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
a220: 77 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  w sqlite3_vtab o
a230: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
a240: 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20 20  **pzErr         
a250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
a260: 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  T: sqlite3_mallo
a270: 63 27 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  c'd error messag
a280: 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
a290: 20 66 74 73 33 49 6e 69 74 56 74 61 62 28 31 2c   fts3InitVtab(1,
a2a0: 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c   db, pAux, argc,
a2b0: 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70   argv, ppVtab, p
a2c0: 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  zErr);.}../* .**
a2d0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
a2e0: 6f 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  of the xBestInde
a2f0: 78 20 6d 65 74 68 6f 64 20 66 6f 72 20 46 54 53  x method for FTS
a300: 33 20 74 61 62 6c 65 73 2e 20 54 68 65 72 65 0a  3 tables. There.
a310: 2a 2a 20 61 72 65 20 74 68 72 65 65 20 70 6f 73  ** are three pos
a320: 73 69 62 6c 65 20 73 74 72 61 74 65 67 69 65 73  sible strategies
a330: 2c 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 70 72  , in order of pr
a340: 65 66 65 72 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  eference:.**.** 
a350: 20 20 31 2e 20 44 69 72 65 63 74 20 6c 6f 6f 6b    1. Direct look
a360: 75 70 20 62 79 20 72 6f 77 69 64 20 6f 72 20 64  up by rowid or d
a370: 6f 63 69 64 2e 20 0a 2a 2a 20 20 20 32 2e 20 46  ocid. .**   2. F
a380: 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 20  ull-text search 
a390: 75 73 69 6e 67 20 61 20 4d 41 54 43 48 20 6f 70  using a MATCH op
a3a0: 65 72 61 74 6f 72 20 6f 6e 20 61 20 6e 6f 6e 2d  erator on a non-
a3b0: 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  docid column..**
a3c0: 20 20 20 33 2e 20 4c 69 6e 65 61 72 20 73 63 61     3. Linear sca
a3d0: 6e 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20 74  n of %_content t
a3e0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
a3f0: 69 6e 74 20 66 74 73 33 42 65 73 74 49 6e 64 65  int fts3BestInde
a400: 78 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  xMethod(sqlite3_
a410: 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c  vtab *pVTab, sql
a420: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a430: 2a 70 49 6e 66 6f 29 7b 0a 20 20 46 74 73 33 54  *pInfo){.  Fts3T
a440: 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
a450: 61 62 6c 65 20 2a 29 70 56 54 61 62 3b 0a 20 20  able *)pVTab;.  
a460: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
a490: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  able */.  int iC
a4a0: 6f 6e 73 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ons = -1;       
a4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
a4c0: 65 78 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ex of constraint
a4d0: 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   to use */..  /*
a4e0: 20 42 79 20 64 65 66 61 75 6c 74 20 75 73 65 20   By default use 
a4f0: 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
a500: 6e 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65 78  n. This is an ex
a510: 70 65 6e 73 69 76 65 20 6f 70 74 69 6f 6e 2c 0a  pensive option,.
a520: 20 20 2a 2a 20 73 6f 20 73 65 61 72 63 68 20 74    ** so search t
a530: 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 73 74  hrough the const
a540: 72 61 69 6e 74 73 20 74 6f 20 73 65 65 20 69 66  raints to see if
a550: 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e   a more efficien
a560: 74 20 0a 20 20 2a 2a 20 73 74 72 61 74 65 67 79  t .  ** strategy
a570: 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   is possible..  
a580: 2a 2f 0a 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e  */.  pInfo->idxN
a590: 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 53 43  um = FTS3_FULLSC
a5a0: 41 4e 5f 53 45 41 52 43 48 3b 0a 20 20 70 49 6e  AN_SEARCH;.  pIn
a5b0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
a5c0: 74 20 3d 20 35 30 30 30 30 30 3b 0a 20 20 66 6f  t = 500000;.  fo
a5d0: 72 28 69 3d 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e  r(i=0; i<pInfo->
a5e0: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
a5f0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  ){.    struct sq
a600: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
a610: 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 20 3d 20  traint *pCons = 
a620: 26 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  &pInfo->aConstra
a630: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
a640: 70 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30  pCons->usable==0
a650: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
a660: 20 20 2f 2a 20 41 20 64 69 72 65 63 74 20 6c 6f    /* A direct lo
a670: 6f 6b 75 70 20 6f 6e 20 74 68 65 20 72 6f 77 69  okup on the rowi
a680: 64 20 6f 72 20 64 6f 63 69 64 20 63 6f 6c 75 6d  d or docid colum
a690: 6e 2e 20 41 73 73 69 67 6e 20 61 20 63 6f 73 74  n. Assign a cost
a6a0: 20 6f 66 20 31 2e 30 2e 20 2a 2f 0a 20 20 20 20   of 1.0. */.    
a6b0: 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53  if( pCons->op==S
a6c0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
a6d0: 54 52 41 49 4e 54 5f 45 51 20 0a 20 20 20 20 20  TRAINT_EQ .     
a6e0: 26 26 20 28 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75  && (pCons->iColu
a6f0: 6d 6e 3c 30 20 7c 7c 20 70 43 6f 6e 73 2d 3e 69  mn<0 || pCons->i
a700: 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 6e 43 6f 6c 75  Column==p->nColu
a710: 6d 6e 2b 31 20 29 0a 20 20 20 20 29 7b 0a 20 20  mn+1 ).    ){.  
a720: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75      pInfo->idxNu
a730: 6d 20 3d 20 46 54 53 33 5f 44 4f 43 49 44 5f 53  m = FTS3_DOCID_S
a740: 45 41 52 43 48 3b 0a 20 20 20 20 20 20 70 49 6e  EARCH;.      pIn
a750: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
a760: 74 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 69  t = 1.0;.      i
a770: 43 6f 6e 73 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  Cons = i;.    }.
a780: 0a 20 20 20 20 2f 2a 20 41 20 4d 41 54 43 48 20  .    /* A MATCH 
a790: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 55 73 65 20  constraint. Use 
a7a0: 61 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72  a full-text sear
a7b0: 63 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ch..    **.    *
a7c0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
a7d0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 4d 41 54 43  re than one MATC
a7e0: 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 76 61  H constraint ava
a7f0: 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20  ilable, use the 
a800: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  first.    ** one
a810: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 49 66   encountered. If
a820: 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
a830: 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e   MATCH constrain
a840: 74 20 61 6e 64 20 61 20 64 69 72 65 63 74 0a 20  t and a direct. 
a850: 20 20 20 2a 2a 20 72 6f 77 69 64 2f 64 6f 63 69     ** rowid/doci
a860: 64 20 6c 6f 6f 6b 75 70 2c 20 70 72 65 66 65 72  d lookup, prefer
a870: 20 74 68 65 20 4d 41 54 43 48 20 73 74 72 61 74   the MATCH strat
a880: 65 67 79 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  egy. This is don
a890: 65 20 65 76 65 6e 20 0a 20 20 20 20 2a 2a 20 74  e even .    ** t
a8a0: 68 6f 75 67 68 20 74 68 65 20 72 6f 77 69 64 2f  hough the rowid/
a8b0: 64 6f 63 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20  docid lookup is 
a8c0: 66 61 73 74 65 72 20 74 68 61 6e 20 61 20 4d 41  faster than a MA
a8d0: 54 43 48 20 71 75 65 72 79 2c 20 73 65 6c 65 63  TCH query, selec
a8e0: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 20 77  ting.    ** it w
a8f0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 6e 20  ould lead to an 
a900: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66  "unable to use f
a910: 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e  unction MATCH in
a920: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 0a   the requested .
a930: 20 20 20 20 2a 2a 20 63 6f 6e 74 65 78 74 22 20      ** context" 
a940: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
a950: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d    if( pCons->op=
a960: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
a970: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 0a  NSTRAINT_MATCH .
a980: 20 20 20 20 20 26 26 20 70 43 6f 6e 73 2d 3e 69       && pCons->i
a990: 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 43 6f  Column>=0 && pCo
a9a0: 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3c 3d 70 2d 3e  ns->iColumn<=p->
a9b0: 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20  nColumn.    ){. 
a9c0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e       pInfo->idxN
a9d0: 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 54 45  um = FTS3_FULLTE
a9e0: 58 54 5f 53 45 41 52 43 48 20 2b 20 70 43 6f 6e  XT_SEARCH + pCon
a9f0: 73 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  s->iColumn;.    
aa00: 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74    pInfo->estimat
aa10: 65 64 43 6f 73 74 20 3d 20 32 2e 30 3b 0a 20 20  edCost = 2.0;.  
aa20: 20 20 20 20 69 43 6f 6e 73 20 3d 20 69 3b 0a 20      iCons = i;. 
aa30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa40: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 43 6f  }.  }..  if( iCo
aa50: 6e 73 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  ns>=0 ){.    pIn
aa60: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
aa70: 73 61 67 65 5b 69 43 6f 6e 73 5d 2e 61 72 67 76  sage[iCons].argv
aa80: 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70  Index = 1;.    p
aa90: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
aaa0: 74 55 73 61 67 65 5b 69 43 6f 6e 73 5d 2e 6f 6d  tUsage[iCons].om
aab0: 69 74 20 3d 20 31 3b 0a 20 20 7d 20 0a 0a 20 20  it = 1;.  } ..  
aac0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
aad0: 20 74 68 65 20 73 74 72 61 74 65 67 79 20 73 65   the strategy se
aae0: 6c 65 63 74 65 64 2c 20 46 54 53 20 63 61 6e 20  lected, FTS can 
aaf0: 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
ab00: 72 6f 77 69 64 20 28 6f 72 0a 20 20 2a 2a 20 64  rowid (or.  ** d
ab10: 6f 63 69 64 29 20 6f 72 64 65 72 2e 20 42 6f 74  ocid) order. Bot
ab20: 68 20 61 73 63 65 6e 64 69 6e 67 20 61 6e 64 20  h ascending and 
ab30: 64 65 73 63 65 6e 64 69 6e 67 20 61 72 65 20 70  descending are p
ab40: 6f 73 73 69 62 6c 65 2e 20 0a 20 20 2a 2f 0a 20  ossible. .  */. 
ab50: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4f 72 64   if( pInfo->nOrd
ab60: 65 72 42 79 3d 3d 31 20 29 7b 0a 20 20 20 20 73  erBy==1 ){.    s
ab70: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
ab80: 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 4f 72  dex_orderby *pOr
ab90: 64 65 72 20 3d 20 26 70 49 6e 66 6f 2d 3e 61 4f  der = &pInfo->aO
aba0: 72 64 65 72 42 79 5b 30 5d 3b 0a 20 20 20 20 69  rderBy[0];.    i
abb0: 66 28 20 70 4f 72 64 65 72 2d 3e 69 43 6f 6c 75  f( pOrder->iColu
abc0: 6d 6e 3c 30 20 7c 7c 20 70 4f 72 64 65 72 2d 3e  mn<0 || pOrder->
abd0: 69 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 6e 43 6f 6c  iColumn==p->nCol
abe0: 75 6d 6e 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  umn+1 ){.      i
abf0: 66 28 20 70 4f 72 64 65 72 2d 3e 64 65 73 63 20  f( pOrder->desc 
ac00: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 66 6f  ){.        pInfo
ac10: 2d 3e 69 64 78 53 74 72 20 3d 20 22 44 45 53 43  ->idxStr = "DESC
ac20: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
ac30: 20 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69          pInfo->i
ac40: 64 78 53 74 72 20 3d 20 22 41 53 43 22 3b 0a 20  dxStr = "ASC";. 
ac50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
ac60: 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
ac70: 6d 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  med = 1;.    }. 
ac80: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
ac90: 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
aca0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
acb0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
acc0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
acd0: 78 4f 70 65 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f  xOpen method..*/
ace0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
acf0: 4f 70 65 6e 4d 65 74 68 6f 64 28 73 71 6c 69 74  OpenMethod(sqlit
ad00: 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20  e3_vtab *pVTab, 
ad10: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
ad20: 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b 0a 20 20  sor **ppCsr){.  
ad30: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
ad40: 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20  sor *pCsr;      
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
ad60: 63 61 74 65 64 20 63 75 72 73 6f 72 20 2a 2f 0a  cated cursor */.
ad70: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ad80: 54 45 52 28 70 56 54 61 62 29 3b 0a 0a 20 20 2f  TER(pVTab);..  /
ad90: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * Allocate a buf
ada0: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
adb0: 20 66 6f 72 20 61 6e 20 46 74 73 33 43 75 72 73   for an Fts3Curs
adc0: 6f 72 20 73 74 72 75 63 74 75 72 65 2e 20 49 66  or structure. If
add0: 20 74 68 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61   the.  ** alloca
ade0: 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c 20 7a  tion succeeds, z
adf0: 65 72 6f 20 69 74 20 61 6e 64 20 72 65 74 75 72  ero it and retur
ae00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
ae10: 65 72 77 69 73 65 2c 20 0a 20 20 2a 2a 20 69 66  erwise, .  ** if
ae20: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
ae30: 66 61 69 6c 73 2c 20 72 65 74 75 72 6e 20 53 51  fails, return SQ
ae40: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f  LITE_NOMEM..  */
ae50: 0a 20 20 2a 70 70 43 73 72 20 3d 20 70 43 73 72  .  *ppCsr = pCsr
ae60: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
ae70: 5f 63 75 72 73 6f 72 20 2a 29 73 71 6c 69 74 65  _cursor *)sqlite
ae80: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
ae90: 46 74 73 33 43 75 72 73 6f 72 29 29 3b 0a 20 20  Fts3Cursor));.  
aea0: 69 66 28 20 21 70 43 73 72 20 29 7b 0a 20 20 20  if( !pCsr ){.   
aeb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
aec0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
aed0: 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
aee0: 6f 66 28 46 74 73 33 43 75 72 73 6f 72 29 29 3b  of(Fts3Cursor));
aef0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
af00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
af10: 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
af20: 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
af30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 65 65 20  information see 
af40: 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  the documentatio
af50: 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 78 43 6c 6f  n.** on the xClo
af60: 73 65 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  se method of the
af70: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
af80: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
af90: 74 69 63 20 69 6e 74 20 66 74 73 33 43 6c 6f 73  tic int fts3Clos
afa0: 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  eMethod(sqlite3_
afb0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
afc0: 72 73 6f 72 29 7b 0a 20 20 46 74 73 33 43 75 72  rsor){.  Fts3Cur
afd0: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
afe0: 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f  3Cursor *)pCurso
aff0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 46  r;.  assert( ((F
b000: 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d  ts3Table *)pCsr-
b010: 3e 62 61 73 65 2e 70 56 74 61 62 29 2d 3e 70 53  >base.pVtab)->pS
b020: 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20  egments==0 );.  
b030: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
b040: 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20  (pCsr->pStmt);. 
b050: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
b060: 46 72 65 65 28 70 43 73 72 2d 3e 70 45 78 70 72  Free(pCsr->pExpr
b070: 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
b080: 46 72 65 65 44 65 66 65 72 72 65 64 54 6f 6b 65  FreeDeferredToke
b090: 6e 73 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69  ns(pCsr);.  sqli
b0a0: 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
b0b0: 44 6f 63 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69  Doclist);.  sqli
b0c0: 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
b0d0: 4d 61 74 63 68 69 6e 66 6f 29 3b 0a 20 20 61 73  Matchinfo);.  as
b0e0: 73 65 72 74 28 20 28 28 46 74 73 33 54 61 62 6c  sert( ((Fts3Tabl
b0f0: 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  e *)pCsr->base.p
b100: 56 74 61 62 29 2d 3e 70 53 65 67 6d 65 6e 74 73  Vtab)->pSegments
b110: 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
b120: 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72  _free(pCsr);.  r
b130: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 73 69 74 69  .}../*.** Positi
b150: 6f 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 53 74  on the pCsr->pSt
b160: 6d 74 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20  mt statement so 
b170: 74 68 61 74 20 69 74 20 69 73 20 6f 6e 20 74 68  that it is on th
b180: 65 20 72 6f 77 0a 2a 2a 20 6f 66 20 74 68 65 20  e row.** of the 
b190: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  %_content table 
b1a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
b1b0: 65 20 6c 61 73 74 20 6d 61 74 63 68 2e 20 20 52  e last match.  R
b1c0: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
b1d0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b1e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b1f0: 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 73 71  ts3CursorSeek(sq
b200: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
b210: 43 6f 6e 74 65 78 74 2c 20 46 74 73 33 43 75 72  Context, Fts3Cur
b220: 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 66  sor *pCsr){.  if
b230: 28 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72  ( pCsr->isRequir
b240: 65 53 65 65 6b 20 29 7b 0a 20 20 20 20 73 71 6c  eSeek ){.    sql
b250: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
b260: 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c 20  pCsr->pStmt, 1, 
b270: 70 43 73 72 2d 3e 69 50 72 65 76 49 64 29 3b 0a  pCsr->iPrevId);.
b280: 20 20 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75      pCsr->isRequ
b290: 69 72 65 53 65 65 6b 20 3d 20 30 3b 0a 20 20 20  ireSeek = 0;.   
b2a0: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
b2b0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
b2c0: 73 72 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20  sr->pStmt) ){.  
b2d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b2e0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
b2f0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
b300: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
b310: 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  sr->pStmt);.    
b320: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b330: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
b340: 2a 20 49 66 20 6e 6f 20 72 6f 77 20 77 61 73 20  * If no row was 
b350: 66 6f 75 6e 64 20 61 6e 64 20 6e 6f 20 65 72 72  found and no err
b360: 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20  or has occured, 
b370: 74 68 65 6e 20 74 68 65 20 25 5f 63 6f 6e 74 65  then the %_conte
b380: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  nt.        ** ta
b390: 62 6c 65 20 69 73 20 6d 69 73 73 69 6e 67 20 61  ble is missing a
b3a0: 20 72 6f 77 20 74 68 61 74 20 69 73 20 70 72 65   row that is pre
b3b0: 73 65 6e 74 20 69 6e 20 74 68 65 20 66 75 6c 6c  sent in the full
b3c0: 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 20 20 20  -text index..   
b3d0: 20 20 20 20 20 2a 2a 20 54 68 65 20 64 61 74 61       ** The data
b3e0: 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65 20   structures are 
b3f0: 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 20 20 20  corrupt..       
b400: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
b410: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b420: 56 54 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VTAB;.      }.  
b430: 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20      pCsr->isEof 
b440: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
b450: 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20  Context ){.     
b460: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
b470: 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 6f  t_error_code(pCo
b480: 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20 20 20 20  ntext, rc);.    
b490: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
b4a0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
b4b0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
b4c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
b4d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b4e0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
b4f0: 70 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c 65  process a single
b500: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 77   interior node w
b510: 68 65 6e 20 73 65 61 72 63 68 69 6e 67 0a 2a 2a  hen searching.**
b520: 20 61 20 62 2d 74 72 65 65 20 66 6f 72 20 61 20   a b-tree for a 
b530: 74 65 72 6d 20 6f 72 20 74 65 72 6d 20 70 72 65  term or term pre
b540: 66 69 78 2e 20 54 68 65 20 6e 6f 64 65 20 64 61  fix. The node da
b550: 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
b560: 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
b570: 6e 20 76 69 61 20 74 68 65 20 7a 4e 6f 64 65 2f  n via the zNode/
b580: 6e 4e 6f 64 65 20 70 61 72 61 6d 65 74 65 72 73  nNode parameters
b590: 2e 20 54 68 65 20 74 65 72 6d 20 74 6f 20 73 65  . The term to se
b5a0: 61 72 63 68 20 66 6f 72 20 69 73 0a 2a 2a 20 70  arch for is.** p
b5b0: 61 73 73 65 64 20 69 6e 20 7a 54 65 72 6d 2f 6e  assed in zTerm/n
b5c0: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Term..**.** If p
b5d0: 69 46 69 72 73 74 20 69 73 20 6e 6f 74 20 4e 55  iFirst is not NU
b5e0: 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
b5f0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 69 46  nction sets *piF
b600: 69 72 73 74 20 74 6f 20 74 68 65 20 62 6c 6f 63  irst to the bloc
b610: 6b 69 64 0a 2a 2a 20 6f 66 20 74 68 65 20 63 68  kid.** of the ch
b620: 69 6c 64 20 6e 6f 64 65 20 74 68 61 74 20 68 65  ild node that he
b630: 61 64 73 20 74 68 65 20 73 75 62 2d 74 72 65 65  ads the sub-tree
b640: 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69   that may contai
b650: 6e 20 74 68 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a  n the term..**.*
b660: 2a 20 49 66 20 70 69 4c 61 73 74 20 69 73 20 6e  * If piLast is n
b670: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70  ot NULL, then *p
b680: 69 4c 61 73 74 20 69 73 20 73 65 74 20 74 6f 20  iLast is set to 
b690: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
b6a0: 68 69 6c 64 20 6e 6f 64 65 0a 2a 2a 20 74 68 61  hild node.** tha
b6b0: 74 20 68 65 61 64 73 20 61 20 73 75 62 2d 74 72  t heads a sub-tr
b6c0: 65 65 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74  ee that may cont
b6d0: 61 69 6e 20 61 20 74 65 72 6d 20 66 6f 72 20 77  ain a term for w
b6e0: 68 69 63 68 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  hich zTerm/nTerm
b6f0: 20 69 73 0a 2a 2a 20 61 20 70 72 65 66 69 78 2e   is.** a prefix.
b700: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
b710: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
b720: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
b730: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
b740: 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
b750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b760: 33 53 63 61 6e 49 6e 74 65 72 69 6f 72 4e 6f 64  3ScanInteriorNod
b770: 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
b780: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
b790: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
b7a0: 73 65 6c 65 63 74 20 6c 65 61 76 65 73 20 66 6f  select leaves fo
b7b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  r */.  int nTerm
b7c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b7d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b7e0: 66 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20  f term zTerm in 
b7f0: 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  bytes */.  const
b800: 20 63 68 61 72 20 2a 7a 4e 6f 64 65 2c 20 20 20   char *zNode,   
b810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
b820: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
b830: 73 65 67 6d 65 6e 74 20 69 6e 74 65 72 69 6f 72  segment interior
b840: 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   node */.  int n
b850: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
b860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b870: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
b880: 7a 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  zNode */.  sqlit
b890: 65 33 5f 69 6e 74 36 34 20 2a 70 69 46 69 72 73  e3_int64 *piFirs
b8a0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  t,         /* OU
b8b0: 54 3a 20 53 65 6c 65 63 74 65 64 20 63 68 69 6c  T: Selected chil
b8c0: 64 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  d node */.  sqli
b8d0: 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73  te3_int64 *piLas
b8e0: 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t           /* O
b8f0: 55 54 3a 20 53 65 6c 65 63 74 65 64 20 63 68 69  UT: Selected chi
b900: 6c 64 20 6e 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  ld node */.){.  
b910: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b920: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
b930: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
b940: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
b950: 7a 43 73 72 20 3d 20 7a 4e 6f 64 65 3b 20 20 20  zCsr = zNode;   
b960: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
b970: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
b980: 20 6e 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   node */.  const
b990: 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 7a   char *zEnd = &z
b9a0: 43 73 72 5b 6e 4e 6f 64 65 5d 3b 2f 2a 20 45 6e  Csr[nNode];/* En
b9b0: 64 20 6f 66 20 69 6e 74 65 72 69 6f 72 20 6e 6f  d of interior no
b9c0: 64 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 63  de buffer */.  c
b9d0: 68 61 72 20 2a 7a 42 75 66 66 65 72 20 3d 20 30  har *zBuffer = 0
b9e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b9f0: 2a 20 42 75 66 66 65 72 20 74 6f 20 6c 6f 61 64  * Buffer to load
ba00: 20 74 65 72 6d 73 20 69 6e 74 6f 20 2a 2f 0a 20   terms into */. 
ba10: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f   /* Size of allo
ba40: 63 61 74 65 64 20 62 75 66 66 65 72 20 2a 2f 0a  cated buffer */.
ba50: 20 20 69 6e 74 20 69 73 46 69 72 73 74 54 65 72    int isFirstTer
ba60: 6d 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  m = 1;          
ba70: 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 70    /* True when p
ba80: 72 6f 63 65 73 73 69 6e 67 20 66 69 72 73 74 20  rocessing first 
ba90: 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  term on page */.
baa0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
bab0: 69 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  iChild;         
bac0: 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66    /* Block id of
bad0: 20 63 68 69 6c 64 20 6e 6f 64 65 20 74 6f 20 64   child node to d
bae0: 65 73 63 65 6e 64 20 74 6f 20 2a 2f 0a 0a 20 20  escend to */..  
baf0: 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 74 68 65  /* Skip over the
bb00: 20 27 68 65 69 67 68 74 27 20 76 61 72 69 6e 74   'height' varint
bb10: 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
bb20: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
bb30: 72 79 20 0a 20 20 2a 2a 20 69 6e 74 65 72 69 6f  ry .  ** interio
bb40: 72 20 6e 6f 64 65 2e 20 54 68 65 6e 20 6c 6f 61  r node. Then loa
bb50: 64 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 6f 66  d the blockid of
bb60: 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
bb70: 6f 66 20 74 68 65 20 62 2d 74 72 65 65 0a 20 20  of the b-tree.  
bb80: 2a 2a 20 6e 6f 64 65 20 69 6e 74 6f 20 76 61 72  ** node into var
bb90: 69 61 62 6c 65 20 69 43 68 69 6c 64 2e 20 20 0a  iable iChild.  .
bba0: 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
bbb0: 66 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  f the data struc
bbc0: 74 75 72 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  ture on disk is 
bbd0: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 69 73 20  corrupted, this 
bbe0: 28 72 65 61 64 69 6e 67 20 74 77 6f 0a 20 20 2a  (reading two.  *
bbf0: 2a 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20 74  * varints from t
bc00: 68 65 20 62 75 66 66 65 72 29 20 64 6f 65 73 20  he buffer) does 
bc10: 6e 6f 74 20 72 69 73 6b 20 61 6e 20 6f 76 65 72  not risk an over
bc20: 72 65 61 64 2e 20 49 66 20 7a 4e 6f 64 65 20 69  read. If zNode i
bc30: 73 20 61 0a 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f  s a.  ** root no
bc40: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  de, then the buf
bc50: 66 65 72 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  fer comes from a
bc60: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bc70: 74 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 0a 20  t. SQLite does. 
bc80: 20 2a 2a 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   ** not make thi
bc90: 73 20 67 75 61 72 61 6e 74 65 65 20 65 78 70 6c  s guarantee expl
bca0: 69 63 69 74 6c 79 2c 20 62 75 74 20 69 6e 20 70  icitly, but in p
bcb0: 72 61 63 74 69 63 65 20 74 68 65 72 65 20 61 72  ractice there ar
bcc0: 65 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 65 69  e always.  ** ei
bcd0: 74 68 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 32  ther more than 2
bce0: 30 20 62 79 74 65 73 20 6f 66 20 61 6c 6c 6f 63  0 bytes of alloc
bcf0: 61 74 65 64 20 73 70 61 63 65 20 66 6f 6c 6c 6f  ated space follo
bd00: 77 69 6e 67 20 74 68 65 20 6e 4e 6f 64 65 20 62  wing the nNode b
bd10: 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 63 6f 6e  ytes of.  ** con
bd20: 74 65 6e 74 73 2c 20 6f 72 20 74 77 6f 20 7a 65  tents, or two ze
bd30: 72 6f 20 62 79 74 65 73 2e 20 4f 72 2c 20 69 66  ro bytes. Or, if
bd40: 20 74 68 65 20 6e 6f 64 65 20 69 73 20 72 65 61   the node is rea
bd50: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67  d from the %_seg
bd60: 6d 65 6e 74 73 0a 20 20 2a 2a 20 74 61 62 6c 65  ments.  ** table
bd70: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65  , then there are
bd80: 20 61 6c 77 61 79 73 20 32 30 20 62 79 74 65 73   always 20 bytes
bd90: 20 6f 66 20 7a 65 72 6f 65 64 20 70 61 64 64 69   of zeroed paddi
bda0: 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ng following the
bdb0: 0a 20 20 2a 2a 20 6e 4e 6f 64 65 20 62 79 74 65  .  ** nNode byte
bdc0: 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 28 73 65  s of content (se
bdd0: 65 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  e sqlite3Fts3Rea
bde0: 64 42 6c 6f 63 6b 28 29 20 66 6f 72 20 64 65 74  dBlock() for det
bdf0: 61 69 6c 73 29 2e 0a 20 20 2a 2f 0a 20 20 7a 43  ails)..  */.  zC
be00: 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  sr += sqlite3Fts
be10: 33 47 65 74 56 61 72 69 6e 74 28 7a 43 73 72 2c  3GetVarint(zCsr,
be20: 20 26 69 43 68 69 6c 64 29 3b 0a 20 20 7a 43 73   &iChild);.  zCs
be30: 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  r += sqlite3Fts3
be40: 47 65 74 56 61 72 69 6e 74 28 7a 43 73 72 2c 20  GetVarint(zCsr, 
be50: 26 69 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20  &iChild);.  if( 
be60: 7a 43 73 72 3e 7a 45 6e 64 20 29 7b 0a 20 20 20  zCsr>zEnd ){.   
be70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
be80: 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 7d  ORRUPT_VTAB;.  }
be90: 0a 20 20 0a 20 20 77 68 69 6c 65 28 20 7a 43 73  .  .  while( zCs
bea0: 72 3c 7a 45 6e 64 20 26 26 20 28 70 69 46 69 72  r<zEnd && (piFir
beb0: 73 74 20 7c 7c 20 70 69 4c 61 73 74 29 20 29 7b  st || piLast) ){
bec0: 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 20 20 20  .    int cmp;   
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bee0: 20 20 20 2f 2a 20 6d 65 6d 63 6d 70 28 29 20 72     /* memcmp() r
bef0: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 69 6e 74  esult */.    int
bf00: 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20   nSuffix;       
bf10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
bf20: 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69  ze of term suffi
bf30: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 72  x */.    int nPr
bf40: 65 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20 20  efix = 0;       
bf50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bf60: 66 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a 2f  f term prefix */
bf70: 0a 20 20 20 20 69 6e 74 20 6e 42 75 66 66 65 72  .    int nBuffer
bf80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf90: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 65 72 6d     /* Total term
bfa0: 20 73 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20   size */.  .    
bfb0: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74  /* Load the next
bfc0: 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 6f 64   term on the nod
bfd0: 65 20 69 6e 74 6f 20 7a 42 75 66 66 65 72 2e 20  e into zBuffer. 
bfe0: 55 73 65 20 72 65 61 6c 6c 6f 63 28 29 20 74 6f  Use realloc() to
bff0: 20 65 78 70 61 6e 64 0a 20 20 20 20 2a 2a 20 74   expand.    ** t
c000: 68 65 20 73 69 7a 65 20 6f 66 20 7a 42 75 66 66  he size of zBuff
c010: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  er if required. 
c020: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 46   */.    if( !isF
c030: 69 72 73 74 54 65 72 6d 20 29 7b 0a 20 20 20 20  irstTerm ){.    
c040: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
c050: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
c060: 28 7a 43 73 72 2c 20 26 6e 50 72 65 66 69 78 29  (zCsr, &nPrefix)
c070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 46 69  ;.    }.    isFi
c080: 72 73 74 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  rstTerm = 0;.   
c090: 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   zCsr += sqlite3
c0a0: 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  Fts3GetVarint32(
c0b0: 7a 43 73 72 2c 20 26 6e 53 75 66 66 69 78 29 3b  zCsr, &nSuffix);
c0c0: 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 6e 50  .    .    if( nP
c0d0: 72 65 66 69 78 3c 30 20 7c 7c 20 6e 53 75 66 66  refix<0 || nSuff
c0e0: 69 78 3c 30 20 7c 7c 20 26 7a 43 73 72 5b 6e 53  ix<0 || &zCsr[nS
c0f0: 75 66 66 69 78 5d 3e 7a 45 6e 64 20 29 7b 0a 20  uffix]>zEnd ){. 
c100: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c110: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
c120: 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68       goto finish
c130: 5f 73 63 61 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  _scan;.    }.   
c140: 20 69 66 28 20 6e 50 72 65 66 69 78 2b 6e 53 75   if( nPrefix+nSu
c150: 66 66 69 78 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ffix>nAlloc ){. 
c160: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b       char *zNew;
c170: 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20  .      nAlloc = 
c180: 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78  (nPrefix+nSuffix
c190: 29 20 2a 20 32 3b 0a 20 20 20 20 20 20 7a 4e 65  ) * 2;.      zNe
c1a0: 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
c1b0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 7a 42 75 66  te3_realloc(zBuf
c1c0: 66 65 72 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20  fer, nAlloc);.  
c1d0: 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b      if( !zNew ){
c1e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
c1f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
c200: 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 5f      goto finish_
c210: 73 63 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  scan;.      }.  
c220: 20 20 20 20 7a 42 75 66 66 65 72 20 3d 20 7a 4e      zBuffer = zN
c230: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ew;.    }.    me
c240: 6d 63 70 79 28 26 7a 42 75 66 66 65 72 5b 6e 50  mcpy(&zBuffer[nP
c250: 72 65 66 69 78 5d 2c 20 7a 43 73 72 2c 20 6e 53  refix], zCsr, nS
c260: 75 66 66 69 78 29 3b 0a 20 20 20 20 6e 42 75 66  uffix);.    nBuf
c270: 66 65 72 20 3d 20 6e 50 72 65 66 69 78 20 2b 20  fer = nPrefix + 
c280: 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 7a 43 73  nSuffix;.    zCs
c290: 72 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20  r += nSuffix;.. 
c2a0: 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 74 68     /* Compare th
c2b0: 65 20 74 65 72 6d 20 77 65 20 61 72 65 20 73 65  e term we are se
c2c0: 61 72 63 68 69 6e 67 20 66 6f 72 20 77 69 74 68  arching for with
c2d0: 20 74 68 65 20 74 65 72 6d 20 6a 75 73 74 20 6c   the term just l
c2e0: 6f 61 64 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  oaded from.    *
c2f0: 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  * the interior n
c300: 6f 64 65 2e 20 49 66 20 74 68 65 20 73 70 65 63  ode. If the spec
c310: 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 67 72  ified term is gr
c320: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
c330: 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ual.    ** to th
c340: 65 20 74 65 72 6d 20 66 72 6f 6d 20 74 68 65 20  e term from the 
c350: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2c 20 74  interior node, t
c360: 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 6e  hen all terms on
c370: 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 0a 20   the sub-tree . 
c380: 20 20 20 2a 2a 20 68 65 61 64 65 64 20 62 79 20     ** headed by 
c390: 6e 6f 64 65 20 69 43 68 69 6c 64 20 61 72 65 20  node iChild are 
c3a0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54 65  smaller than zTe
c3b0: 72 6d 2e 20 4e 6f 20 6e 65 65 64 20 74 6f 20 73  rm. No need to s
c3c0: 65 61 72 63 68 20 0a 20 20 20 20 2a 2a 20 69 43  earch .    ** iC
c3d0: 68 69 6c 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  hild..    **.   
c3e0: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 74 65 72   ** If the inter
c3f0: 69 6f 72 20 6e 6f 64 65 20 74 65 72 6d 20 69 73  ior node term is
c400: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
c410: 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c   specified term,
c420: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
c430: 20 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20   tree headed by 
c440: 69 43 68 69 6c 64 20 6d 61 79 20 63 6f 6e 74 61  iChild may conta
c450: 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
c460: 20 74 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20   term..    */.  
c470: 20 20 63 6d 70 20 3d 20 6d 65 6d 63 6d 70 28 7a    cmp = memcmp(z
c480: 54 65 72 6d 2c 20 7a 42 75 66 66 65 72 2c 20 28  Term, zBuffer, (
c490: 6e 42 75 66 66 65 72 3e 6e 54 65 72 6d 20 3f 20  nBuffer>nTerm ? 
c4a0: 6e 54 65 72 6d 20 3a 20 6e 42 75 66 66 65 72 29  nTerm : nBuffer)
c4b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 69 46 69 72  );.    if( piFir
c4c0: 73 74 20 26 26 20 28 63 6d 70 3c 30 20 7c 7c 20  st && (cmp<0 || 
c4d0: 28 63 6d 70 3d 3d 30 20 26 26 20 6e 42 75 66 66  (cmp==0 && nBuff
c4e0: 65 72 3e 6e 54 65 72 6d 29 29 20 29 7b 0a 20 20  er>nTerm)) ){.  
c4f0: 20 20 20 20 2a 70 69 46 69 72 73 74 20 3d 20 69      *piFirst = i
c500: 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 70 69 46  Child;.      piF
c510: 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irst = 0;.    }.
c520: 0a 20 20 20 20 69 66 28 20 70 69 4c 61 73 74 20  .    if( piLast 
c530: 26 26 20 63 6d 70 3c 30 20 29 7b 0a 20 20 20 20  && cmp<0 ){.    
c540: 20 20 2a 70 69 4c 61 73 74 20 3d 20 69 43 68 69    *piLast = iChi
c550: 6c 64 3b 0a 20 20 20 20 20 20 70 69 4c 61 73 74  ld;.      piLast
c560: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
c570: 20 69 43 68 69 6c 64 2b 2b 3b 0a 20 20 7d 3b 0a   iChild++;.  };.
c580: 0a 20 20 69 66 28 20 70 69 46 69 72 73 74 20 29  .  if( piFirst )
c590: 20 2a 70 69 46 69 72 73 74 20 3d 20 69 43 68 69   *piFirst = iChi
c5a0: 6c 64 3b 0a 20 20 69 66 28 20 70 69 4c 61 73 74  ld;.  if( piLast
c5b0: 20 29 20 2a 70 69 4c 61 73 74 20 3d 20 69 43 68   ) *piLast = iCh
c5c0: 69 6c 64 3b 0a 0a 20 66 69 6e 69 73 68 5f 73 63  ild;.. finish_sc
c5d0: 61 6e 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  an:.  sqlite3_fr
c5e0: 65 65 28 7a 42 75 66 66 65 72 29 3b 0a 20 20 72  ee(zBuffer);.  r
c5f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
c600: 0a 2a 2a 20 54 68 65 20 62 75 66 66 65 72 20 70  .** The buffer p
c610: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67  ointed to by arg
c620: 75 6d 65 6e 74 20 7a 4e 6f 64 65 20 28 73 69 7a  ument zNode (siz
c630: 65 20 6e 4e 6f 64 65 20 62 79 74 65 73 29 20 63  e nNode bytes) c
c640: 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20 69 6e  ontains an.** in
c650: 74 65 72 69 6f 72 20 6e 6f 64 65 20 6f 66 20 61  terior node of a
c660: 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 2e   b-tree segment.
c670: 20 54 68 65 20 7a 54 65 72 6d 20 62 75 66 66 65   The zTerm buffe
c680: 72 20 28 73 69 7a 65 20 6e 54 65 72 6d 20 62 79  r (size nTerm by
c690: 74 65 73 29 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tes).** contains
c6a0: 20 61 20 74 65 72 6d 2e 20 54 68 69 73 20 66 75   a term. This fu
c6b0: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
c6c0: 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61  the sub-tree hea
c6d0: 64 65 64 20 62 79 20 74 68 65 20 7a 4e 6f 64 65  ded by the zNode
c6e0: 0a 2a 2a 20 6e 6f 64 65 20 66 6f 72 20 74 68 65  .** node for the
c6f0: 20 72 61 6e 67 65 20 6f 66 20 6c 65 61 66 20 6e   range of leaf n
c700: 6f 64 65 73 20 74 68 61 74 20 6d 61 79 20 63 6f  odes that may co
c710: 6e 74 61 69 6e 20 74 68 65 20 73 70 65 63 69 66  ntain the specif
c720: 69 65 64 20 74 65 72 6d 0a 2a 2a 20 6f 72 20 74  ied term.** or t
c730: 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74  erms for which t
c740: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
c750: 6d 20 69 73 20 61 20 70 72 65 66 69 78 2e 0a 2a  m is a prefix..*
c760: 2a 0a 2a 2a 20 49 66 20 70 69 4c 65 61 66 20 69  *.** If piLeaf i
c770: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
c780: 20 2a 70 69 4c 65 61 66 20 69 73 20 73 65 74 20   *piLeaf is set 
c790: 74 6f 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 6f  to the blockid o
c7a0: 66 20 74 68 65 20 0a 2a 2a 20 6c 65 66 74 2d 6d  f the .** left-m
c7b0: 6f 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 69 6e  ost leaf node in
c7c0: 20 74 68 65 20 74 72 65 65 20 74 68 61 74 20 6d   the tree that m
c7d0: 61 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  ay contain the s
c7e0: 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 0a 2a  pecified term..*
c7f0: 2a 20 49 66 20 70 69 4c 65 61 66 32 20 69 73 20  * If piLeaf2 is 
c800: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a  not NULL, then *
c810: 70 69 4c 65 61 66 32 20 69 73 20 73 65 74 20 74  piLeaf2 is set t
c820: 6f 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 6f 66  o the blockid of
c830: 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
c840: 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 74 68 61  st leaf node tha
c850: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  t may contain a 
c860: 74 65 72 6d 20 66 6f 72 20 77 68 69 63 68 20 74  term for which t
c870: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
c880: 74 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78  term is a prefix
c890: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f  ..**.** It is po
c8a0: 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 20  ssible that the 
c8b0: 72 61 6e 67 65 20 6f 66 20 72 65 74 75 72 6e 65  range of returne
c8c0: 64 20 6c 65 61 66 20 6e 6f 64 65 73 20 64 6f 65  d leaf nodes doe
c8d0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 0a 2a  s not contain .*
c8e0: 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
c8f0: 74 65 72 6d 20 6f 72 20 61 6e 79 20 74 65 72 6d  term or any term
c900: 73 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  s for which it i
c910: 73 20 61 20 70 72 65 66 69 78 2e 20 48 6f 77 65  s a prefix. Howe
c920: 76 65 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20  ver, if the .** 
c930: 73 65 67 6d 65 6e 74 20 64 6f 65 73 20 63 6f 6e  segment does con
c940: 74 61 69 6e 20 61 6e 79 20 73 75 63 68 20 74 65  tain any such te
c950: 72 6d 73 2c 20 74 68 65 79 20 61 72 65 20 73 74  rms, they are st
c960: 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
c970: 69 64 65 6e 74 69 66 69 65 64 0a 2a 2a 20 72 61  identified.** ra
c980: 6e 67 65 2e 20 42 65 63 61 75 73 65 20 74 68 69  nge. Because thi
c990: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
c9a0: 69 6e 73 70 65 63 74 73 20 69 6e 74 65 72 69 6f  inspects interio
c9b0: 72 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 73 20  r segment nodes 
c9c0: 28 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 6c 6f  (and.** never lo
c9d0: 61 64 73 20 6c 65 61 66 20 6e 6f 64 65 73 20 69  ads leaf nodes i
c9e0: 6e 74 6f 20 6d 65 6d 6f 72 79 29 2c 20 69 74 20  nto memory), it 
c9f0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
ca00: 74 6f 20 62 65 20 73 75 72 65 2e 0a 2a 2a 0a 2a  to be sure..**.*
ca10: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
ca20: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
ca30: 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
ca40: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
ca50: 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  rned..*/ .static
ca60: 20 69 6e 74 20 66 74 73 33 53 65 6c 65 63 74 4c   int fts3SelectL
ca70: 65 61 66 28 0a 20 20 46 74 73 33 54 61 62 6c 65  eaf(.  Fts3Table
ca80: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
ca90: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
caa0: 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
cab0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
cac0: 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
cad0: 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
cae0: 65 6c 65 63 74 20 6c 65 61 76 65 73 20 66 6f 72  elect leaves for
caf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
cb20: 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20 62   term zTerm in b
cb30: 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ytes */.  const 
cb40: 63 68 61 72 20 2a 7a 4e 6f 64 65 2c 20 20 20 20  char *zNode,    
cb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
cb60: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  fer containing s
cb70: 65 67 6d 65 6e 74 20 69 6e 74 65 72 69 6f 72 20  egment interior 
cb80: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  node */.  int nN
cb90: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
cba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cbb0: 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 7a  e of buffer at z
cbc0: 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
cbd0: 33 5f 69 6e 74 36 34 20 2a 70 69 4c 65 61 66 2c  3_int64 *piLeaf,
cbe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
cbf0: 65 63 74 65 64 20 6c 65 61 66 20 6e 6f 64 65 20  ected leaf node 
cc00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
cc10: 36 34 20 2a 70 69 4c 65 61 66 32 20 20 20 20 20  64 *piLeaf2     
cc20: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 65 64       /* Selected
cc30: 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 29 7b   leaf node */.){
cc40: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
cc70: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65 69 67  e */.  int iHeig
cc80: 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
cc90: 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74         /* Height
cca0: 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20 69 6e   of this node in
ccb0: 20 74 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65   tree */..  asse
ccc0: 72 74 28 20 70 69 4c 65 61 66 20 7c 7c 20 70 69  rt( piLeaf || pi
ccd0: 4c 65 61 66 32 20 29 3b 0a 0a 20 20 73 71 6c 69  Leaf2 );..  sqli
cce0: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
ccf0: 33 32 28 7a 4e 6f 64 65 2c 20 26 69 48 65 69 67  32(zNode, &iHeig
cd00: 68 74 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  ht);.  rc = fts3
cd10: 53 63 61 6e 49 6e 74 65 72 69 6f 72 4e 6f 64 65  ScanInteriorNode
cd20: 28 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a  (zTerm, nTerm, z
cd30: 4e 6f 64 65 2c 20 6e 4e 6f 64 65 2c 20 70 69 4c  Node, nNode, piL
cd40: 65 61 66 2c 20 70 69 4c 65 61 66 32 29 3b 0a 20  eaf, piLeaf2);. 
cd50: 20 61 73 73 65 72 74 28 20 21 70 69 4c 65 61 66   assert( !piLeaf
cd60: 32 20 7c 7c 20 21 70 69 4c 65 61 66 20 7c 7c 20  2 || !piLeaf || 
cd70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
cd80: 20 28 2a 70 69 4c 65 61 66 3c 3d 2a 70 69 4c 65   (*piLeaf<=*piLe
cd90: 61 66 32 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  af2) );..  if( r
cda0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
cdb0: 69 48 65 69 67 68 74 3e 31 20 29 7b 0a 20 20 20  iHeight>1 ){.   
cdc0: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 30   char *zBlob = 0
cdd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
cde0: 2a 20 42 6c 6f 62 20 72 65 61 64 20 66 72 6f 6d  * Blob read from
cdf0: 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
ce00: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6c  e */.    int nBl
ce10: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
ce20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ce30: 66 20 7a 42 6c 6f 62 20 69 6e 20 62 79 74 65 73  f zBlob in bytes
ce40: 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 69 4c   */..    if( piL
ce50: 65 61 66 20 26 26 20 70 69 4c 65 61 66 32 20 26  eaf && piLeaf2 &
ce60: 26 20 28 2a 70 69 4c 65 61 66 21 3d 2a 70 69 4c  & (*piLeaf!=*piL
ce70: 65 61 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72  eaf2) ){.      r
ce80: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52  c = sqlite3Fts3R
ce90: 65 61 64 42 6c 6f 63 6b 28 70 2c 20 2a 70 69 4c  eadBlock(p, *piL
cea0: 65 61 66 2c 20 26 7a 42 6c 6f 62 2c 20 26 6e 42  eaf, &zBlob, &nB
ceb0: 6c 6f 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  lob, 0);.      i
cec0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ced0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
cee0: 20 66 74 73 33 53 65 6c 65 63 74 4c 65 61 66 28   fts3SelectLeaf(
cef0: 70 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  p, zTerm, nTerm,
cf00: 20 7a 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70   zBlob, nBlob, p
cf10: 69 4c 65 61 66 2c 20 30 29 3b 0a 20 20 20 20 20  iLeaf, 0);.     
cf20: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
cf30: 5f 66 72 65 65 28 7a 42 6c 6f 62 29 3b 0a 20 20  _free(zBlob);.  
cf40: 20 20 20 20 70 69 4c 65 61 66 20 3d 20 30 3b 0a      piLeaf = 0;.
cf50: 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 30 3b        zBlob = 0;
cf60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
cf70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
cf80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
cf90: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
cfa0: 28 70 2c 20 70 69 4c 65 61 66 3f 2a 70 69 4c 65  (p, piLeaf?*piLe
cfb0: 61 66 3a 2a 70 69 4c 65 61 66 32 2c 20 26 7a 42  af:*piLeaf2, &zB
cfc0: 6c 6f 62 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b  lob, &nBlob, 0);
cfd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
cfe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cff0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53        rc = fts3S
d000: 65 6c 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65  electLeaf(p, zTe
d010: 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a 42 6c 6f 62  rm, nTerm, zBlob
d020: 2c 20 6e 42 6c 6f 62 2c 20 70 69 4c 65 61 66 2c  , nBlob, piLeaf,
d030: 20 70 69 4c 65 61 66 32 29 3b 0a 20 20 20 20 7d   piLeaf2);.    }
d040: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d050: 65 28 7a 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20  e(zBlob);.  }.. 
d060: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d070: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d080: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 72  on is used to cr
d090: 65 61 74 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64  eate delta-encod
d0a0: 65 64 20 73 65 72 69 61 6c 69 7a 65 64 20 6c 69  ed serialized li
d0b0: 73 74 73 20 6f 66 20 46 54 53 33 20 0a 2a 2a 20  sts of FTS3 .** 
d0c0: 76 61 72 69 6e 74 73 2e 20 45 61 63 68 20 63 61  varints. Each ca
d0d0: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
d0e0: 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 73 69  ion appends a si
d0f0: 6e 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61  ngle varint to a
d100: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
d110: 20 76 6f 69 64 20 66 74 73 33 50 75 74 44 65 6c   void fts3PutDel
d120: 74 61 56 61 72 69 6e 74 28 0a 20 20 63 68 61 72  taVarint(.  char
d130: 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
d140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d150: 4e 2f 4f 55 54 3a 20 4f 75 74 70 75 74 20 70 6f  N/OUT: Output po
d160: 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  inter */.  sqlit
d170: 65 33 5f 69 6e 74 36 34 20 2a 70 69 50 72 65 76  e3_int64 *piPrev
d180: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  ,          /* IN
d190: 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 76  /OUT: Previous v
d1a0: 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20  alue written to 
d1b0: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
d1c0: 33 5f 69 6e 74 36 34 20 69 56 61 6c 20 20 20 20  3_int64 iVal    
d1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d1e0: 74 65 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  te this value to
d1f0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a   the list */.){.
d200: 20 20 61 73 73 65 72 74 28 20 69 56 61 6c 2d 2a    assert( iVal-*
d210: 70 69 50 72 65 76 20 3e 20 30 20 7c 7c 20 28 2a  piPrev > 0 || (*
d220: 70 69 50 72 65 76 3d 3d 30 20 26 26 20 69 56 61  piPrev==0 && iVa
d230: 6c 3d 3d 30 29 20 29 3b 0a 20 20 2a 70 70 20 2b  l==0) );.  *pp +
d240: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
d250: 56 61 72 69 6e 74 28 2a 70 70 2c 20 69 56 61 6c  Varint(*pp, iVal
d260: 2d 2a 70 69 50 72 65 76 29 3b 0a 20 20 2a 70 69  -*piPrev);.  *pi
d270: 50 72 65 76 20 3d 20 69 56 61 6c 3b 0a 7d 0a 0a  Prev = iVal;.}..
d280: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
d290: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d2a0: 65 64 2c 20 2a 70 70 50 6f 73 6c 69 73 74 20 69  ed, *ppPoslist i
d2b0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
d2c0: 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 74  nt to the .** st
d2d0: 61 72 74 20 6f 66 20 61 20 70 6f 73 69 74 69 6f  art of a positio
d2e0: 6e 2d 6c 69 73 74 2e 20 41 66 74 65 72 20 69 74  n-list. After it
d2f0: 20 72 65 74 75 72 6e 73 2c 20 2a 70 70 50 6f 73   returns, *ppPos
d300: 6c 69 73 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  list points to t
d310: 68 65 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65  he.** first byte
d320: 20 61 66 74 65 72 20 74 68 65 20 70 6f 73 69 74   after the posit
d330: 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion-list..**.** 
d340: 41 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  A position list 
d350: 69 73 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74  is list of posit
d360: 69 6f 6e 73 20 28 64 65 6c 74 61 20 65 6e 63 6f  ions (delta enco
d370: 64 65 64 29 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  ded) and columns
d380: 20 66 6f 72 20 0a 2a 2a 20 61 20 73 69 6e 67 6c   for .** a singl
d390: 65 20 64 6f 63 75 6d 65 6e 74 20 72 65 63 6f 72  e document recor
d3a0: 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20  d of a doclist. 
d3b0: 20 53 6f 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f   So, in other wo
d3c0: 72 64 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  rds, this.** rou
d3d0: 74 69 6e 65 20 61 64 76 61 6e 63 65 73 20 2a 70  tine advances *p
d3e0: 70 50 6f 73 6c 69 73 74 20 73 6f 20 74 68 61 74  pPoslist so that
d3f0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
d400: 65 20 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 0a  e next docid in.
d410: 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20  ** the doclist, 
d420: 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
d430: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
d440: 64 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  d of the doclist
d450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73  ..**.** If pp is
d460: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
d470: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
d480: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
d490: 74 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  t are copied.** 
d4a0: 74 6f 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 73  to *pp. *pp is s
d4b0: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
d4c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
d4d0: 73 74 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  st the last byte
d4e0: 20 63 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72   copied.** befor
d4f0: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
d500: 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74  returns..*/.stat
d510: 69 63 20 76 6f 69 64 20 66 74 73 33 50 6f 73 6c  ic void fts3Posl
d520: 69 73 74 43 6f 70 79 28 63 68 61 72 20 2a 2a 70  istCopy(char **p
d530: 70 2c 20 63 68 61 72 20 2a 2a 70 70 50 6f 73 6c  p, char **ppPosl
d540: 69 73 74 29 7b 0a 20 20 63 68 61 72 20 2a 70 45  ist){.  char *pE
d550: 6e 64 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74 3b  nd = *ppPoslist;
d560: 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a  .  char c = 0;..
d570: 20 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20    /* The end of 
d580: 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  a position list 
d590: 69 73 20 6d 61 72 6b 65 64 20 62 79 20 61 20 7a  is marked by a z
d5a0: 65 72 6f 20 65 6e 63 6f 64 65 64 20 61 73 20 61  ero encoded as a
d5b0: 6e 20 46 54 53 33 20 0a 20 20 2a 2a 20 76 61 72  n FTS3 .  ** var
d5c0: 69 6e 74 2e 20 41 20 73 69 6e 67 6c 65 20 50 4f  int. A single PO
d5d0: 53 5f 45 4e 44 20 28 30 29 20 62 79 74 65 2e 20  S_END (0) byte. 
d5e0: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 30  Except, if the 0
d5f0: 20 62 79 74 65 20 69 73 20 70 72 65 63 65 64 65   byte is precede
d600: 64 20 62 79 0a 20 20 2a 2a 20 61 20 62 79 74 65  d by.  ** a byte
d610: 20 77 69 74 68 20 74 68 65 20 30 78 38 30 20 62   with the 0x80 b
d620: 69 74 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20  it set, then it 
d630: 69 73 20 6e 6f 74 20 61 20 76 61 72 69 6e 74 20  is not a varint 
d640: 30 2c 20 62 75 74 20 74 68 65 20 74 61 69 6c 0a  0, but the tail.
d650: 20 20 2a 2a 20 6f 66 20 73 6f 6d 65 20 6f 74 68    ** of some oth
d660: 65 72 2c 20 6d 75 6c 74 69 2d 62 79 74 65 2c 20  er, multi-byte, 
d670: 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  value..  **.  **
d680: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   The following w
d690: 68 69 6c 65 2d 6c 6f 6f 70 20 6d 6f 76 65 73 20  hile-loop moves 
d6a0: 70 45 6e 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  pEnd to point to
d6b0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
d6c0: 74 68 61 74 20 69 73 20 6e 6f 74 20 0a 20 20 2a  that is not .  *
d6d0: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72  * immediately pr
d6e0: 65 63 65 64 65 64 20 62 79 20 61 20 62 79 74 65  eceded by a byte
d6f0: 20 77 69 74 68 20 74 68 65 20 30 78 38 30 20 62   with the 0x80 b
d700: 69 74 20 73 65 74 2e 20 54 68 65 6e 20 69 6e 63  it set. Then inc
d710: 72 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 70 45 6e  rements.  ** pEn
d720: 64 20 6f 6e 63 65 20 6d 6f 72 65 20 73 6f 20 74  d once more so t
d730: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
d740: 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69   the byte immedi
d750: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
d760: 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 62 79  the.  ** last by
d770: 74 65 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69  te in the positi
d780: 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  on-list..  */.  
d790: 77 68 69 6c 65 28 20 2a 70 45 6e 64 20 7c 20 63  while( *pEnd | c
d7a0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e   ){.    c = *pEn
d7b0: 64 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20  d++ & 0x80;.    
d7c0: 74 65 73 74 63 61 73 65 28 20 63 21 3d 30 20 26  testcase( c!=0 &
d7d0: 26 20 28 2a 70 45 6e 64 29 3d 3d 30 20 29 3b 0a  & (*pEnd)==0 );.
d7e0: 20 20 7d 0a 20 20 70 45 6e 64 2b 2b 3b 20 20 2f    }.  pEnd++;  /
d7f0: 2a 20 41 64 76 61 6e 63 65 20 70 61 73 74 20 74  * Advance past t
d800: 68 65 20 50 4f 53 5f 45 4e 44 20 74 65 72 6d 69  he POS_END termi
d810: 6e 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 0a 20  nator byte */.. 
d820: 20 69 66 28 20 70 70 20 29 7b 0a 20 20 20 20 69   if( pp ){.    i
d830: 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e  nt n = (int)(pEn
d840: 64 20 2d 20 2a 70 70 50 6f 73 6c 69 73 74 29 3b  d - *ppPoslist);
d850: 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 2a  .    char *p = *
d860: 70 70 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  pp;.    memcpy(p
d870: 2c 20 2a 70 70 50 6f 73 6c 69 73 74 2c 20 6e 29  , *ppPoslist, n)
d880: 3b 0a 20 20 20 20 70 20 2b 3d 20 6e 3b 0a 20 20  ;.    p += n;.  
d890: 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 7d 0a 20    *pp = p;.  }. 
d8a0: 20 2a 70 70 50 6f 73 6c 69 73 74 20 3d 20 70 45   *ppPoslist = pE
d8b0: 6e 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  nd;.}../*.** Whe
d8c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d8d0: 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 50 6f  is called, *ppPo
d8e0: 73 6c 69 73 74 20 69 73 20 61 73 73 75 6d 65 64  slist is assumed
d8f0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
d900: 20 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20 61 20   .** start of a 
d910: 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 20 41 66 74  column-list. Aft
d920: 65 72 20 69 74 20 72 65 74 75 72 6e 73 2c 20 2a  er it returns, *
d930: 70 70 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 73  ppPoslist points
d940: 20 74 6f 20 74 68 65 0a 2a 2a 20 74 6f 20 74 68   to the.** to th
d950: 65 20 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f  e terminator (PO
d960: 53 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f  S_COLUMN or POS_
d970: 45 4e 44 29 20 62 79 74 65 20 6f 66 20 74 68 65  END) byte of the
d980: 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 0a 2a 2a   column-list..**
d990: 0a 2a 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69 73  .** A column-lis
d9a0: 74 20 69 73 20 6c 69 73 74 20 6f 66 20 64 65 6c  t is list of del
d9b0: 74 61 2d 65 6e 63 6f 64 65 64 20 70 6f 73 69 74  ta-encoded posit
d9c0: 69 6f 6e 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ions for a singl
d9d0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 77 69 74 68  e column.** with
d9e0: 69 6e 20 61 20 73 69 6e 67 6c 65 20 64 6f 63 75  in a single docu
d9f0: 6d 65 6e 74 20 77 69 74 68 69 6e 20 61 20 64 6f  ment within a do
da00: 63 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  clist..**.** The
da10: 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20   column-list is 
da20: 74 65 72 6d 69 6e 61 74 65 64 20 65 69 74 68 65  terminated eithe
da30: 72 20 62 79 20 61 20 50 4f 53 5f 43 4f 4c 55 4d  r by a POS_COLUM
da40: 4e 20 76 61 72 69 6e 74 20 28 31 29 20 6f 72 0a  N varint (1) or.
da50: 2a 2a 20 61 20 50 4f 53 5f 45 4e 44 20 76 61 72  ** a POS_END var
da60: 69 6e 74 20 28 30 29 2e 20 20 54 68 69 73 20 72  int (0).  This r
da70: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 2a 70  outine leaves *p
da80: 70 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 69 6e  pPoslist pointin
da90: 67 20 74 6f 0a 2a 2a 20 74 68 65 20 50 4f 53 5f  g to.** the POS_
daa0: 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e  COLUMN or POS_EN
dab0: 44 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  D that terminate
dac0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73  s the column-lis
dad0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69  t..**.** If pp i
dae0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
daf0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
db00: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74   the column-list
db10: 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74   are copied.** t
db20: 6f 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65  o *pp. *pp is se
db30: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
db40: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
db50: 74 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  t the last byte 
db60: 63 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65  copied.** before
db70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
db80: 65 74 75 72 6e 73 2e 20 20 54 68 65 20 50 4f 53  eturns.  The POS
db90: 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45  _COLUMN or POS_E
dba0: 4e 44 20 74 65 72 6d 69 6e 61 74 6f 72 0a 2a 2a  ND terminator.**
dbb0: 20 69 73 20 6e 6f 74 20 63 6f 70 69 65 64 20 69   is not copied i
dbc0: 6e 74 6f 20 2a 70 70 2e 0a 2a 2f 0a 73 74 61 74  nto *pp..*/.stat
dbd0: 69 63 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75  ic void fts3Colu
dbe0: 6d 6e 6c 69 73 74 43 6f 70 79 28 63 68 61 72 20  mnlistCopy(char 
dbf0: 2a 2a 70 70 2c 20 63 68 61 72 20 2a 2a 70 70 50  **pp, char **ppP
dc00: 6f 73 6c 69 73 74 29 7b 0a 20 20 63 68 61 72 20  oslist){.  char 
dc10: 2a 70 45 6e 64 20 3d 20 2a 70 70 50 6f 73 6c 69  *pEnd = *ppPosli
dc20: 73 74 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30  st;.  char c = 0
dc30: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e  ;..  /* A column
dc40: 2d 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61  -list is termina
dc50: 74 65 64 20 62 79 20 65 69 74 68 65 72 20 61 20  ted by either a 
dc60: 30 78 30 31 20 6f 72 20 30 78 30 30 20 62 79 74  0x01 or 0x00 byt
dc70: 65 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e  e that is.  ** n
dc80: 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  ot part of a mul
dc90: 74 69 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a  ti-byte varint..
dca0: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 30 78    */.  while( 0x
dcb0: 46 45 20 26 20 28 2a 70 45 6e 64 20 7c 20 63 29  FE & (*pEnd | c)
dcc0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e   ){.    c = *pEn
dcd0: 64 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20  d++ & 0x80;.    
dce0: 74 65 73 74 63 61 73 65 28 20 63 21 3d 30 20 26  testcase( c!=0 &
dcf0: 26 20 28 28 2a 70 45 6e 64 29 26 30 78 66 65 29  & ((*pEnd)&0xfe)
dd00: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
dd10: 20 70 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   pp ){.    int n
dd20: 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 20 2d 20   = (int)(pEnd - 
dd30: 2a 70 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  *ppPoslist);.   
dd40: 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a   char *p = *pp;.
dd50: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 2a 70      memcpy(p, *p
dd60: 70 50 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a 20 20  pPoslist, n);.  
dd70: 20 20 70 20 2b 3d 20 6e 3b 0a 20 20 20 20 2a 70    p += n;.    *p
dd80: 70 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a 70 70  p = p;.  }.  *pp
dd90: 50 6f 73 6c 69 73 74 20 3d 20 70 45 6e 64 3b 0a  Poslist = pEnd;.
dda0: 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 75  }../*.** Value u
ddb0: 73 65 64 20 74 6f 20 73 69 67 6e 69 66 79 20 74  sed to signify t
ddc0: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 70 6f 73  he end of an pos
ddd0: 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 54 68 69 73  ition-list. This
dde0: 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
ddf0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  .** it is not po
de00: 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61  ssible to have a
de10: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 32   document with 2
de20: 5e 33 31 20 74 65 72 6d 73 2e 0a 2a 2f 0a 23 64  ^31 terms..*/.#d
de30: 65 66 69 6e 65 20 50 4f 53 49 54 49 4f 4e 5f 4c  efine POSITION_L
de40: 49 53 54 5f 45 4e 44 20 30 78 37 66 66 66 66 66  IST_END 0x7fffff
de50: 66 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ff../*.** This f
de60: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
de70: 74 6f 20 68 65 6c 70 20 70 61 72 73 65 20 70 6f  to help parse po
de80: 73 69 74 69 6f 6e 2d 6c 69 73 74 73 2e 20 57 68  sition-lists. Wh
de90: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
dea0: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 2a   is.** called, *
deb0: 70 70 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  pp may point to 
dec0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
ded0: 20 6e 65 78 74 20 76 61 72 69 6e 74 20 69 6e 20   next varint in 
dee0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
def0: 74 0a 2a 2a 20 62 65 69 6e 67 20 70 61 72 73 65  t.** being parse
df00: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69  d, or it may poi
df10: 6e 74 20 74 6f 20 31 20 62 79 74 65 20 70 61 73  nt to 1 byte pas
df20: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
df30: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a 2a   position-list.*
df40: 2a 20 28 69 6e 20 77 68 69 63 68 20 63 61 73 65  * (in which case
df50: 20 2a 2a 70 70 20 77 69 6c 6c 20 62 65 20 61 20   **pp will be a 
df60: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73  terminator bytes
df70: 20 50 4f 53 5f 45 4e 44 20 28 30 29 20 6f 72 0a   POS_END (0) or.
df80: 2a 2a 20 28 31 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  ** (1))..**.** I
df90: 66 20 2a 70 70 20 70 6f 69 6e 74 73 20 70 61 73  f *pp points pas
dfa0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
dfb0: 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
dfc0: 6e 2d 6c 69 73 74 2c 20 73 65 74 20 2a 70 69 20  n-list, set *pi 
dfd0: 74 6f 20 0a 2a 2a 20 50 4f 53 49 54 49 4f 4e 5f  to .** POSITION_
dfe0: 4c 49 53 54 5f 45 4e 44 20 61 6e 64 20 72 65 74  LIST_END and ret
dff0: 75 72 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  urn. Otherwise, 
e000: 72 65 61 64 20 74 68 65 20 6e 65 78 74 20 76 61  read the next va
e010: 72 69 6e 74 20 66 72 6f 6d 20 2a 70 70 2c 0a 2a  rint from *pp,.*
e020: 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * increment the 
e030: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
e040: 20 2a 70 69 20 62 79 20 74 68 65 20 76 61 6c 75   *pi by the valu
e050: 65 20 72 65 61 64 2c 20 61 6e 64 20 73 65 74 20  e read, and set 
e060: 2a 70 70 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  *pp to.** point 
e070: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75  to the next valu
e080: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
e090: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
e0a0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
e0b0: 75 74 69 6e 65 20 2a 70 69 20 6d 75 73 74 20 62  utine *pi must b
e0c0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
e0d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
e0e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f   the previous po
e0f0: 73 69 74 69 6f 6e 2c 20 6f 72 20 7a 65 72 6f 20  sition, or zero 
e100: 69 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  if we are readin
e110: 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69  g the first posi
e120: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 70  tion.** in the p
e130: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 20 42  osition-list.  B
e140: 65 63 61 75 73 65 20 70 6f 73 69 74 69 6f 6e 73  ecause positions
e150: 20 61 72 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64   are delta-encod
e160: 65 64 2c 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ed, the value.**
e170: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
e180: 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 6e 65 65   position is nee
e190: 64 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ded in order to 
e1a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75  compute the valu
e1b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 78 74  e of.** the next
e1c0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
e1d0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 52 65  atic void fts3Re
e1e0: 61 64 4e 65 78 74 50 6f 73 28 0a 20 20 63 68 61  adNextPos(.  cha
e1f0: 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20  r **pp,         
e200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
e210: 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 69 6e  /OUT: Pointer in
e220: 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  to position-list
e230: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 73 71 6c   buffer */.  sql
e240: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 20 20  ite3_int64 *pi  
e250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
e260: 2f 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64  /OUT: Value read
e270: 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 2d 6c   from position-l
e280: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ist */.){.  if( 
e290: 28 2a 2a 70 70 29 26 30 78 46 45 20 29 7b 0a 20  (**pp)&0xFE ){. 
e2a0: 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56     fts3GetDeltaV
e2b0: 61 72 69 6e 74 28 70 70 2c 20 70 69 29 3b 0a 20  arint(pp, pi);. 
e2c0: 20 20 20 2a 70 69 20 2d 3d 20 32 3b 0a 20 20 7d     *pi -= 2;.  }
e2d0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 20 3d 20  else{.    *pi = 
e2e0: 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e  POSITION_LIST_EN
e2f0: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
e300: 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 43 6f  If parameter iCo
e310: 6c 20 69 73 20 6e 6f 74 20 30 2c 20 77 72 69 74  l is not 0, writ
e320: 65 20 61 6e 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20  e an POS_COLUMN 
e330: 28 31 29 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65  (1) byte followe
e340: 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 61 6c 75  d by.** the valu
e350: 65 20 6f 66 20 69 43 6f 6c 20 65 6e 63 6f 64 65  e of iCol encode
e360: 64 20 61 73 20 61 20 76 61 72 69 6e 74 20 74 6f  d as a varint to
e370: 20 2a 70 70 2e 20 20 20 54 68 69 73 20 77 69 6c   *pp.   This wil
e380: 6c 20 73 74 61 72 74 20 61 20 6e 65 77 0a 2a 2a  l start a new.**
e390: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 2a 2a   column list..**
e3a0: 0a 2a 2a 20 53 65 74 20 2a 70 70 20 74 6f 20 70  .** Set *pp to p
e3b0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 79 74 65  oint to the byte
e3c0: 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20   just after the 
e3d0: 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65  last byte writte
e3e0: 6e 20 62 65 66 6f 72 65 20 0a 2a 2a 20 72 65 74  n before .** ret
e3f0: 75 72 6e 69 6e 67 20 28 64 6f 20 6e 6f 74 20 6d  urning (do not m
e400: 6f 64 69 66 79 20 69 74 20 69 66 20 69 43 6f 6c  odify it if iCol
e410: 3d 3d 30 29 2e 20 52 65 74 75 72 6e 20 74 68 65  ==0). Return the
e420: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
e430: 20 62 79 74 65 73 0a 2a 2a 20 77 72 69 74 74 65   bytes.** writte
e440: 6e 20 28 30 20 69 66 20 69 43 6f 6c 3d 3d 30 29  n (0 if iCol==0)
e450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e460: 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72  fts3PutColNumber
e470: 28 63 68 61 72 20 2a 2a 70 70 2c 20 69 6e 74 20  (char **pp, int 
e480: 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  iCol){.  int n =
e490: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e4a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e4b0: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
e4c0: 74 65 6e 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ten */.  if( iCo
e4d0: 6c 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  l ){.    char *p
e4e0: 20 3d 20 2a 70 70 3b 20 20 20 20 20 20 20 20 20   = *pp;         
e4f0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
e500: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
e510: 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46  n = 1 + sqlite3F
e520: 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 5b  ts3PutVarint(&p[
e530: 31 5d 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 2a  1], iCol);.    *
e540: 70 20 3d 20 30 78 30 31 3b 0a 20 20 20 20 2a 70  p = 0x01;.    *p
e550: 70 20 3d 20 26 70 5b 6e 5d 3b 0a 20 20 7d 0a 20  p = &p[n];.  }. 
e560: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
e570: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
e580: 75 6e 69 6f 6e 20 6f 66 20 74 77 6f 20 70 6f 73  union of two pos
e590: 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 20 54 68  ition lists.  Th
e5a0: 65 20 6f 75 74 70 75 74 20 77 72 69 74 74 65 6e  e output written
e5b0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 70 20 63 6f 6e  .** into *pp con
e5c0: 74 61 69 6e 73 20 61 6c 6c 20 70 6f 73 69 74 69  tains all positi
e5d0: 6f 6e 73 20 6f 66 20 62 6f 74 68 20 2a 70 70 31  ons of both *pp1
e5e0: 20 61 6e 64 20 2a 70 70 32 20 69 6e 20 73 6f 72   and *pp2 in sor
e5f0: 74 65 64 0a 2a 2a 20 6f 72 64 65 72 20 61 6e 64  ted.** order and
e600: 20 77 69 74 68 20 61 6e 79 20 64 75 70 6c 69 63   with any duplic
e610: 61 74 65 73 20 72 65 6d 6f 76 65 64 2e 20 20 41  ates removed.  A
e620: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ll pointers are.
e630: 2a 2a 20 75 70 64 61 74 65 64 20 61 70 70 72 6f  ** updated appro
e640: 70 72 69 61 74 65 6c 79 2e 20 20 20 54 68 65 20  priately.   The 
e650: 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
e660: 73 69 62 6c 65 20 66 6f 72 20 69 6e 73 75 72 69  sible for insuri
e670: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 72 65  ng.** that there
e680: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
e690: 20 69 6e 20 2a 70 70 20 74 6f 20 68 6f 6c 64 20   in *pp to hold 
e6a0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6f 75 74  the complete out
e6b0: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
e6c0: 6f 69 64 20 66 74 73 33 50 6f 73 6c 69 73 74 4d  oid fts3PoslistM
e6d0: 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a 2a 70  erge(.  char **p
e6e0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e6f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
e700: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68  t buffer */.  ch
e710: 61 72 20 2a 2a 70 70 31 2c 20 20 20 20 20 20 20  ar **pp1,       
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e730: 20 4c 65 66 74 20 69 6e 70 75 74 20 6c 69 73 74   Left input list
e740: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 32   */.  char **pp2
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 69        /* Right i
e770: 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a  nput list */.){.
e780: 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b    char *p = *pp;
e790: 0a 20 20 63 68 61 72 20 2a 70 31 20 3d 20 2a 70  .  char *p1 = *p
e7a0: 70 31 3b 0a 20 20 63 68 61 72 20 2a 70 32 20 3d  p1;.  char *p2 =
e7b0: 20 2a 70 70 32 3b 0a 0a 20 20 77 68 69 6c 65 28   *pp2;..  while(
e7c0: 20 2a 70 31 20 7c 7c 20 2a 70 32 20 29 7b 0a 20   *p1 || *p2 ){. 
e7d0: 20 20 20 69 6e 74 20 69 43 6f 6c 31 3b 20 20 20     int iCol1;   
e7e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
e7f0: 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  rent column inde
e800: 78 20 69 6e 20 70 70 31 20 2a 2f 0a 20 20 20 20  x in pp1 */.    
e810: 69 6e 74 20 69 43 6f 6c 32 3b 20 20 20 20 20 20  int iCol2;      
e820: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
e830: 74 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69  t column index i
e840: 6e 20 70 70 32 20 2a 2f 0a 0a 20 20 20 20 69 66  n pp2 */..    if
e850: 28 20 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c 55 4d  ( *p1==POS_COLUM
e860: 4e 20 29 20 73 71 6c 69 74 65 33 46 74 73 33 47  N ) sqlite3Fts3G
e870: 65 74 56 61 72 69 6e 74 33 32 28 26 70 31 5b 31  etVarint32(&p1[1
e880: 5d 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20 20  ], &iCol1);.    
e890: 65 6c 73 65 20 69 66 28 20 2a 70 31 3d 3d 50 4f  else if( *p1==PO
e8a0: 53 5f 45 4e 44 20 29 20 69 43 6f 6c 31 20 3d 20  S_END ) iCol1 = 
e8b0: 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e  POSITION_LIST_EN
e8c0: 44 3b 0a 20 20 20 20 65 6c 73 65 20 69 43 6f 6c  D;.    else iCol
e8d0: 31 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  1 = 0;..    if( 
e8e0: 2a 70 32 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20  *p2==POS_COLUMN 
e8f0: 29 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  ) sqlite3Fts3Get
e900: 56 61 72 69 6e 74 33 32 28 26 70 32 5b 31 5d 2c  Varint32(&p2[1],
e910: 20 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20 65 6c   &iCol2);.    el
e920: 73 65 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53 5f  se if( *p2==POS_
e930: 45 4e 44 20 29 20 69 43 6f 6c 32 20 3d 20 50 4f  END ) iCol2 = PO
e940: 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b  SITION_LIST_END;
e950: 0a 20 20 20 20 65 6c 73 65 20 69 43 6f 6c 32 20  .    else iCol2 
e960: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 43  = 0;..    if( iC
e970: 6f 6c 31 3d 3d 69 43 6f 6c 32 20 29 7b 0a 20 20  ol1==iCol2 ){.  
e980: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
e990: 34 20 69 31 20 3d 20 30 3b 20 20 20 20 20 20 20  4 i1 = 0;       
e9a0: 2f 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e  /* Last position
e9b0: 20 66 72 6f 6d 20 70 70 31 20 2a 2f 0a 20 20 20   from pp1 */.   
e9c0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
e9d0: 20 69 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   i2 = 0;       /
e9e0: 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e 20  * Last position 
e9f0: 66 72 6f 6d 20 70 70 32 20 2a 2f 0a 20 20 20 20  from pp2 */.    
ea00: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
ea10: 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  iPrev = 0;.     
ea20: 20 69 6e 74 20 6e 20 3d 20 66 74 73 33 50 75 74   int n = fts3Put
ea30: 43 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43  ColNumber(&p, iC
ea40: 6f 6c 31 29 3b 0a 20 20 20 20 20 20 70 31 20 2b  ol1);.      p1 +
ea50: 3d 20 6e 3b 0a 20 20 20 20 20 20 70 32 20 2b 3d  = n;.      p2 +=
ea60: 20 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74   n;..      /* At
ea70: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 6f 74   this point, bot
ea80: 68 20 70 31 20 61 6e 64 20 70 32 20 70 6f 69 6e  h p1 and p2 poin
ea90: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
eaa0: 66 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 73 0a 20  f column-lists. 
eab0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
eac0: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 74 68 65  same column (the
ead0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 69 6e 64   column with ind
eae0: 65 78 20 69 43 6f 6c 31 20 61 6e 64 20 69 43 6f  ex iCol1 and iCo
eaf0: 6c 32 29 2e 0a 20 20 20 20 20 20 2a 2a 20 41 20  l2)..      ** A 
eb00: 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 61  column-list is a
eb10: 20 6c 69 73 74 20 6f 66 20 6e 6f 6e 2d 6e 65 67   list of non-neg
eb20: 61 74 69 76 65 20 64 65 6c 74 61 2d 65 6e 63 6f  ative delta-enco
eb30: 64 65 64 20 76 61 72 69 6e 74 73 2c 20 65 61 63  ded varints, eac
eb40: 68 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  h .      ** incr
eb50: 65 6d 65 6e 74 65 64 20 62 79 20 32 20 62 65 66  emented by 2 bef
eb60: 6f 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  ore being stored
eb70: 2e 20 45 61 63 68 20 6c 69 73 74 20 69 73 20 74  . Each list is t
eb80: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 0a 20  erminated by a. 
eb90: 20 20 20 20 20 2a 2a 20 50 4f 53 5f 45 4e 44 20       ** POS_END 
eba0: 28 30 29 20 6f 72 20 50 4f 53 5f 43 4f 4c 55 4d  (0) or POS_COLUM
ebb0: 4e 20 28 31 29 2e 20 54 68 65 20 66 6f 6c 6c 6f  N (1). The follo
ebc0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 65 72 67 65  wing block merge
ebd0: 73 20 74 68 65 20 74 77 6f 20 6c 69 73 74 73 0a  s the two lists.
ebe0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77 72 69        ** and wri
ebf0: 74 65 73 20 74 68 65 20 72 65 73 75 6c 74 73 20  tes the results 
ec00: 74 6f 20 62 75 66 66 65 72 20 70 2e 20 70 20 69  to buffer p. p i
ec10: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
ec20: 74 6f 20 74 68 65 20 62 79 74 65 0a 20 20 20 20  to the byte.    
ec30: 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20 6c    ** after the l
ec40: 69 73 74 20 77 72 69 74 74 65 6e 2e 20 4e 6f 20  ist written. No 
ec50: 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53 5f  terminator (POS_
ec60: 45 4e 44 20 6f 72 20 50 4f 53 5f 43 4f 4c 55 4d  END or POS_COLUM
ec70: 4e 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 77  N) is.      ** w
ec80: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
ec90: 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tput..      */. 
eca0: 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
ecb0: 61 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 31  aVarint(&p1, &i1
ecc0: 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  );.      fts3Get
ecd0: 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c  DeltaVarint(&p2,
ece0: 20 26 69 32 29 3b 0a 20 20 20 20 20 20 64 6f 20   &i2);.      do 
ecf0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 50 75  {.        fts3Pu
ed00: 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
ed10: 20 26 69 50 72 65 76 2c 20 28 69 31 3c 69 32 29   &iPrev, (i1<i2)
ed20: 20 3f 20 69 31 20 3a 20 69 32 29 3b 20 0a 20 20   ? i1 : i2); .  
ed30: 20 20 20 20 20 20 69 50 72 65 76 20 2d 3d 20 32        iPrev -= 2
ed40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
ed50: 3d 3d 69 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==i2 ){.        
ed60: 20 20 66 74 73 33 52 65 61 64 4e 65 78 74 50 6f    fts3ReadNextPo
ed70: 73 28 26 70 31 2c 20 26 69 31 29 3b 0a 20 20 20  s(&p1, &i1);.   
ed80: 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e         fts3ReadN
ed90: 65 78 74 50 6f 73 28 26 70 32 2c 20 26 69 32 29  extPos(&p2, &i2)
eda0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
edb0: 69 66 28 20 69 31 3c 69 32 20 29 7b 0a 20 20 20  if( i1<i2 ){.   
edc0: 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e         fts3ReadN
edd0: 65 78 74 50 6f 73 28 26 70 31 2c 20 26 69 31 29  extPos(&p1, &i1)
ede0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
edf0: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 52  .          fts3R
ee00: 65 61 64 4e 65 78 74 50 6f 73 28 26 70 32 2c 20  eadNextPos(&p2, 
ee10: 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &i2);.        }.
ee20: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 69 31        }while( i1
ee30: 21 3d 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f  !=POSITION_LIST_
ee40: 45 4e 44 20 7c 7c 20 69 32 21 3d 50 4f 53 49 54  END || i2!=POSIT
ee50: 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 20 29 3b 0a  ION_LIST_END );.
ee60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
ee70: 6f 6c 31 3c 69 43 6f 6c 32 20 29 7b 0a 20 20 20  ol1<iCol2 ){.   
ee80: 20 20 20 70 31 20 2b 3d 20 66 74 73 33 50 75 74     p1 += fts3Put
ee90: 43 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43  ColNumber(&p, iC
eea0: 6f 6c 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33  ol1);.      fts3
eeb0: 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 26  ColumnlistCopy(&
eec0: 70 2c 20 26 70 31 29 3b 0a 20 20 20 20 7d 65 6c  p, &p1);.    }el
eed0: 73 65 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20  se{.      p2 += 
eee0: 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72  fts3PutColNumber
eef0: 28 26 70 2c 20 69 43 6f 6c 32 29 3b 0a 20 20 20  (&p, iCol2);.   
ef00: 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73     fts3Columnlis
ef10: 74 43 6f 70 79 28 26 70 2c 20 26 70 32 29 3b 0a  tCopy(&p, &p2);.
ef20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 2b      }.  }..  *p+
ef30: 2b 20 3d 20 50 4f 53 5f 45 4e 44 3b 0a 20 20 2a  + = POS_END;.  *
ef40: 70 70 20 3d 20 70 3b 0a 20 20 2a 70 70 31 20 3d  pp = p;.  *pp1 =
ef50: 20 70 31 20 2b 20 31 3b 0a 20 20 2a 70 70 32 20   p1 + 1;.  *pp2 
ef60: 3d 20 70 32 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  = p2 + 1;.}../*.
ef70: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ef80: 20 69 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67   is used to merg
ef90: 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  e two position l
efa0: 69 73 74 73 20 69 6e 74 6f 20 6f 6e 65 2e 20 57  ists into one. W
efb0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 61 6c  hen it is.** cal
efc0: 6c 65 64 2c 20 2a 70 70 31 20 61 6e 64 20 2a 70  led, *pp1 and *p
efd0: 70 32 20 6d 75 73 74 20 62 6f 74 68 20 70 6f 69  p2 must both poi
efe0: 6e 74 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  nt to position l
eff0: 69 73 74 73 2e 20 41 20 70 6f 73 69 74 69 6f 6e  ists. A position
f000: 2d 6c 69 73 74 20 69 73 0a 2a 2a 20 74 68 65 20  -list is.** the 
f010: 70 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  part of a doclis
f020: 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 65  t that follows e
f030: 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 64 2e  ach document id.
f040: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
f050: 20 61 20 72 6f 77 0a 2a 2a 20 63 6f 6e 74 61 69   a row.** contai
f060: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 27 61  ns:.**.**     'a
f070: 20 62 20 63 27 7c 27 78 20 79 20 7a 27 7c 27 61   b c'|'x y z'|'a
f080: 20 62 20 62 20 61 27 0a 2a 2a 0a 2a 2a 20 54 68   b b a'.**.** Th
f090: 65 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  en the position 
f0a0: 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 72 6f  list for this ro
f0b0: 77 20 66 6f 72 20 74 6f 6b 65 6e 20 27 62 27 20  w for token 'b' 
f0c0: 77 6f 75 6c 64 20 63 6f 6e 73 69 73 74 20 6f 66  would consist of
f0d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 78 30 32  :.**.**     0x02
f0e0: 20 30 78 30 31 20 30 78 30 32 20 30 78 30 33 20   0x01 0x02 0x03 
f0f0: 30 78 30 33 20 30 78 30 30 0a 2a 2a 0a 2a 2a 20  0x03 0x00.**.** 
f100: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
f110: 6f 6e 20 72 65 74 75 72 6e 73 2c 20 62 6f 74 68  on returns, both
f120: 20 2a 70 70 31 20 61 6e 64 20 2a 70 70 32 20 61   *pp1 and *pp2 a
f130: 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  re left pointing
f140: 20 74 6f 20 74 68 65 0a 2a 2a 20 62 79 74 65 20   to the.** byte 
f150: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 30 78  following the 0x
f160: 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 6f 66  00 terminator of
f170: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
f180: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  e position lists
f190: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 73 53 61 76  ..**.** If isSav
f1a0: 65 4c 65 66 74 20 69 73 20 30 2c 20 61 6e 20 65  eLeft is 0, an e
f1b0: 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f  ntry is added to
f1c0: 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 73 69   the output posi
f1d0: 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 0a 2a  tion list for .*
f1e0: 2a 20 65 61 63 68 20 70 6f 73 69 74 69 6f 6e 20  * each position 
f1f0: 69 6e 20 2a 70 70 32 20 66 6f 72 20 77 68 69 63  in *pp2 for whic
f200: 68 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  h there exists o
f210: 6e 65 20 6f 72 20 6d 6f 72 65 20 70 6f 73 69 74  ne or more posit
f220: 69 6f 6e 73 20 69 6e 0a 2a 2a 20 2a 70 70 31 20  ions in.** *pp1 
f230: 73 6f 20 74 68 61 74 20 28 70 6f 73 28 2a 70 70  so that (pos(*pp
f240: 32 29 3e 70 6f 73 28 2a 70 70 31 29 20 26 26 20  2)>pos(*pp1) && 
f250: 70 6f 73 28 2a 70 70 32 29 2d 70 6f 73 28 2a 70  pos(*pp2)-pos(*p
f260: 70 31 29 3c 3d 6e 54 6f 6b 65 6e 29 2e 20 69 2e  p1)<=nToken). i.
f270: 65 2e 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 2a  e..** when the *
f280: 70 70 31 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  pp1 token appear
f290: 73 20 62 65 66 6f 72 65 20 74 68 65 20 2a 70 70  s before the *pp
f2a0: 32 20 74 6f 6b 65 6e 2c 20 62 75 74 20 6e 6f 74  2 token, but not
f2b0: 20 6d 6f 72 65 20 74 68 61 6e 20 6e 54 6f 6b 65   more than nToke
f2c0: 6e 0a 2a 2a 20 73 6c 6f 74 73 20 62 65 66 6f 72  n.** slots befor
f2d0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 65 2e 67 2e  e it..**.** e.g.
f2e0: 20 6e 54 6f 6b 65 6e 3d 3d 31 20 73 65 61 72 63   nToken==1 searc
f2f0: 68 65 73 20 66 6f 72 20 61 64 6a 61 63 65 6e 74  hes for adjacent
f300: 20 70 6f 73 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   positions..*/.s
f310: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 6f  tatic int fts3Po
f320: 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65  slistPhraseMerge
f330: 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c 20 20  (.  char **pp,  
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
f360: 72 65 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 70  reallocated outp
f370: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  ut buffer */.  i
f380: 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3a0: 2a 20 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72  * Maximum differ
f3b0: 65 6e 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f  ence in token po
f3c0: 73 69 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  sitions */.  int
f3d0: 20 69 73 53 61 76 65 4c 65 66 74 2c 20 20 20 20   isSaveLeft,    
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f3f0: 53 61 76 65 20 74 68 65 20 6c 65 66 74 20 70 6f  Save the left po
f400: 73 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  sition */.  int 
f410: 69 73 45 78 61 63 74 2c 20 20 20 20 20 20 20 20  isExact,        
f420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f430: 66 20 2a 70 70 31 20 69 73 20 65 78 61 63 74 6c  f *pp1 is exactl
f440: 79 20 6e 54 6f 6b 65 6e 73 20 62 65 66 6f 72 65  y nTokens before
f450: 20 2a 70 70 32 20 2a 2f 0a 20 20 63 68 61 72 20   *pp2 */.  char 
f460: 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20 20  **pp1,          
f470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
f480: 2f 4f 55 54 3a 20 4c 65 66 74 20 69 6e 70 75 74  /OUT: Left input
f490: 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
f4a0: 2a 2a 70 70 32 20 20 20 20 20 20 20 20 20 20 20  **pp2           
f4b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
f4c0: 2f 4f 55 54 3a 20 52 69 67 68 74 20 69 6e 70 75  /OUT: Right inpu
f4d0: 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  t list */.){.  c
f4e0: 68 61 72 20 2a 70 20 3d 20 28 70 70 20 3f 20 2a  har *p = (pp ? *
f4f0: 70 70 20 3a 20 30 29 3b 0a 20 20 63 68 61 72 20  pp : 0);.  char 
f500: 2a 70 31 20 3d 20 2a 70 70 31 3b 0a 20 20 63 68  *p1 = *pp1;.  ch
f510: 61 72 20 2a 70 32 20 3d 20 2a 70 70 32 3b 0a 20  ar *p2 = *pp2;. 
f520: 20 69 6e 74 20 69 43 6f 6c 31 20 3d 20 30 3b 0a   int iCol1 = 0;.
f530: 20 20 69 6e 74 20 69 43 6f 6c 32 20 3d 20 30 3b    int iCol2 = 0;
f540: 0a 0a 20 20 2f 2a 20 4e 65 76 65 72 20 73 65 74  ..  /* Never set
f550: 20 62 6f 74 68 20 69 73 53 61 76 65 4c 65 66 74   both isSaveLeft
f560: 20 61 6e 64 20 69 73 45 78 61 63 74 20 66 6f 72   and isExact for
f570: 20 74 68 65 20 73 61 6d 65 20 69 6e 76 6f 63 61   the same invoca
f580: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
f590: 74 28 20 69 73 53 61 76 65 4c 65 66 74 3d 3d 30  t( isSaveLeft==0
f5a0: 20 7c 7c 20 69 73 45 78 61 63 74 3d 3d 30 20 29   || isExact==0 )
f5b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 31  ;..  assert( *p1
f5c0: 21 3d 30 20 26 26 20 2a 70 32 21 3d 30 20 29 3b  !=0 && *p2!=0 );
f5d0: 0a 20 20 69 66 28 20 2a 70 31 3d 3d 50 4f 53 5f  .  if( *p1==POS_
f5e0: 43 4f 4c 55 4d 4e 20 29 7b 20 0a 20 20 20 20 70  COLUMN ){ .    p
f5f0: 31 2b 2b 3b 0a 20 20 20 20 70 31 20 2b 3d 20 73  1++;.    p1 += s
f600: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
f610: 69 6e 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31  int32(p1, &iCol1
f620: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 70 32  );.  }.  if( *p2
f630: 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 7b 20  ==POS_COLUMN ){ 
f640: 0a 20 20 20 20 70 32 2b 2b 3b 0a 20 20 20 20 70  .    p2++;.    p
f650: 32 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  2 += sqlite3Fts3
f660: 47 65 74 56 61 72 69 6e 74 33 32 28 70 32 2c 20  GetVarint32(p2, 
f670: 26 69 43 6f 6c 32 29 3b 0a 20 20 7d 0a 0a 20 20  &iCol2);.  }..  
f680: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
f690: 69 66 28 20 69 43 6f 6c 31 3d 3d 69 43 6f 6c 32  if( iCol1==iCol2
f6a0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
f6b0: 70 53 61 76 65 20 3d 20 70 3b 0a 20 20 20 20 20  pSave = p;.     
f6c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
f6d0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
f6e0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50  sqlite3_int64 iP
f6f0: 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  os1 = 0;.      s
f700: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f  qlite3_int64 iPo
f710: 73 32 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  s2 = 0;..      i
f720: 66 28 20 70 70 20 26 26 20 69 43 6f 6c 31 20 29  f( pp && iCol1 )
f730: 7b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d  {.        *p++ =
f740: 20 50 4f 53 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20   POS_COLUMN;.   
f750: 20 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65       p += sqlite
f760: 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 70  3Fts3PutVarint(p
f770: 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20  , iCol1);.      
f780: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
f790: 20 2a 70 31 21 3d 50 4f 53 5f 45 4e 44 20 26 26   *p1!=POS_END &&
f7a0: 20 2a 70 31 21 3d 50 4f 53 5f 43 4f 4c 55 4d 4e   *p1!=POS_COLUMN
f7b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f7c0: 28 20 2a 70 32 21 3d 50 4f 53 5f 45 4e 44 20 26  ( *p2!=POS_END &
f7d0: 26 20 2a 70 32 21 3d 50 4f 53 5f 43 4f 4c 55 4d  & *p2!=POS_COLUM
f7e0: 4e 20 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47  N );.      fts3G
f7f0: 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70  etDeltaVarint(&p
f800: 31 2c 20 26 69 50 6f 73 31 29 3b 20 69 50 6f 73  1, &iPos1); iPos
f810: 31 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 66 74  1 -= 2;.      ft
f820: 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
f830: 28 26 70 32 2c 20 26 69 50 6f 73 32 29 3b 20 69  (&p2, &iPos2); i
f840: 50 6f 73 32 20 2d 3d 20 32 3b 0a 0a 20 20 20 20  Pos2 -= 2;..    
f850: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
f860: 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 32 3d        if( iPos2=
f870: 3d 69 50 6f 73 31 2b 6e 54 6f 6b 65 6e 20 0a 20  =iPos1+nToken . 
f880: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 45 78          || (isEx
f890: 61 63 74 3d 3d 30 20 26 26 20 69 50 6f 73 32 3e  act==0 && iPos2>
f8a0: 69 50 6f 73 31 20 26 26 20 69 50 6f 73 32 3c 3d  iPos1 && iPos2<=
f8b0: 69 50 6f 73 31 2b 6e 54 6f 6b 65 6e 29 20 0a 20  iPos1+nToken) . 
f8c0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
f8d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
f8e0: 34 20 69 53 61 76 65 3b 0a 20 20 20 20 20 20 20  4 iSave;.       
f8f0: 20 20 20 69 66 28 20 21 70 70 20 29 7b 0a 20 20     if( !pp ){.  
f900: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50 6f            fts3Po
f910: 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 32  slistCopy(0, &p2
f920: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
f930: 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 30  ts3PoslistCopy(0
f940: 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20 20  , &p1);.        
f950: 20 20 20 20 2a 70 70 31 20 3d 20 70 31 3b 0a 20      *pp1 = p1;. 
f960: 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 32 20             *pp2 
f970: 3d 20 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = p2;.          
f980: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
f990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f9a0: 20 20 69 53 61 76 65 20 3d 20 69 73 53 61 76 65    iSave = isSave
f9b0: 4c 65 66 74 20 3f 20 69 50 6f 73 31 20 3a 20 69  Left ? iPos1 : i
f9c0: 50 6f 73 32 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos2;.          
f9d0: 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69  fts3PutDeltaVari
f9e0: 6e 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20 69  nt(&p, &iPrev, i
f9f0: 53 61 76 65 2b 32 29 3b 20 69 50 72 65 76 20 2d  Save+2); iPrev -
fa00: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 2;.          p
fa10: 53 61 76 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Save = 0;.      
fa20: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
fa30: 28 21 69 73 53 61 76 65 4c 65 66 74 20 26 26 20  (!isSaveLeft && 
fa40: 69 50 6f 73 32 3c 3d 28 69 50 6f 73 31 2b 6e 54  iPos2<=(iPos1+nT
fa50: 6f 6b 65 6e 29 29 20 7c 7c 20 69 50 6f 73 32 3c  oken)) || iPos2<
fa60: 3d 69 50 6f 73 31 20 29 7b 0a 20 20 20 20 20 20  =iPos1 ){.      
fa70: 20 20 20 20 69 66 28 20 28 2a 70 32 26 30 78 46      if( (*p2&0xF
fa80: 45 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)==0 ) break;. 
fa90: 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74           fts3Get
faa0: 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c  DeltaVarint(&p2,
fab0: 20 26 69 50 6f 73 32 29 3b 20 69 50 6f 73 32 20   &iPos2); iPos2 
fac0: 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 65  -= 2;.        }e
fad0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
fae0: 66 28 20 28 2a 70 31 26 30 78 46 45 29 3d 3d 30  f( (*p1&0xFE)==0
faf0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
fb00: 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61      fts3GetDelta
fb10: 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 50 6f  Varint(&p1, &iPo
fb20: 73 31 29 3b 20 69 50 6f 73 31 20 2d 3d 20 32 3b  s1); iPos1 -= 2;
fb30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fb40: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53   }..      if( pS
fb50: 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ave ){.        a
fb60: 73 73 65 72 74 28 20 70 70 20 26 26 20 70 20 29  ssert( pp && p )
fb70: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 53  ;.        p = pS
fb80: 61 76 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ave;.      }..  
fb90: 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69      fts3Columnli
fba0: 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b 0a  stCopy(0, &p1);.
fbb0: 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e        fts3Column
fbc0: 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 32 29  listCopy(0, &p2)
fbd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fbe0: 28 2a 70 31 26 30 78 46 45 29 3d 3d 30 20 26 26  (*p1&0xFE)==0 &&
fbf0: 20 28 2a 70 32 26 30 78 46 45 29 3d 3d 30 20 29   (*p2&0xFE)==0 )
fc00: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
fc10: 70 31 20 7c 7c 20 30 3d 3d 2a 70 32 20 29 20 62  p1 || 0==*p2 ) b
fc20: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 31 2b  reak;..      p1+
fc30: 2b 3b 0a 20 20 20 20 20 20 70 31 20 2b 3d 20 73  +;.      p1 += s
fc40: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
fc50: 69 6e 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31  int32(p1, &iCol1
fc60: 29 3b 0a 20 20 20 20 20 20 70 32 2b 2b 3b 0a 20  );.      p2++;. 
fc70: 20 20 20 20 20 70 32 20 2b 3d 20 73 71 6c 69 74       p2 += sqlit
fc80: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33  e3Fts3GetVarint3
fc90: 32 28 70 32 2c 20 26 69 43 6f 6c 32 29 3b 0a 20  2(p2, &iCol2);. 
fca0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
fcb0: 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 31 20  ance pointer p1 
fcc0: 6f 72 20 70 32 20 28 77 68 69 63 68 65 76 65 72  or p2 (whichever
fcd0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
fce0: 74 68 65 20 73 6d 61 6c 6c 65 72 20 6f 66 0a 20  the smaller of. 
fcf0: 20 20 20 2a 2a 20 69 43 6f 6c 31 20 61 6e 64 20     ** iCol1 and 
fd00: 69 43 6f 6c 32 29 20 73 6f 20 74 68 61 74 20 69  iCol2) so that i
fd10: 74 20 70 6f 69 6e 74 73 20 74 6f 20 65 69 74 68  t points to eith
fd20: 65 72 20 74 68 65 20 30 78 30 30 20 74 68 61 74  er the 0x00 that
fd30: 20 6d 61 72 6b 73 20 74 68 65 0a 20 20 20 20 2a   marks the.    *
fd40: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * end of the pos
fd50: 69 74 69 6f 6e 20 6c 69 73 74 2c 20 6f 72 20 74  ition list, or t
fd60: 68 65 20 30 78 30 31 20 74 68 61 74 20 70 72 65  he 0x01 that pre
fd70: 63 65 64 65 73 20 74 68 65 20 6e 65 78 74 20 0a  cedes the next .
fd80: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2d 6e 75      ** column-nu
fd90: 6d 62 65 72 20 69 6e 20 74 68 65 20 70 6f 73 69  mber in the posi
fda0: 74 69 6f 6e 20 6c 69 73 74 2e 20 0a 20 20 20 20  tion list. .    
fdb0: 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
fdc0: 69 43 6f 6c 31 3c 69 43 6f 6c 32 20 29 7b 0a 20  iCol1<iCol2 ){. 
fdd0: 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c       fts3Columnl
fde0: 69 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b  istCopy(0, &p1);
fdf0: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 70  .      if( 0==*p
fe00: 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  1 ) break;.     
fe10: 20 70 31 2b 2b 3b 0a 20 20 20 20 20 20 70 31 20   p1++;.      p1 
fe20: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
fe30: 74 56 61 72 69 6e 74 33 32 28 70 31 2c 20 26 69  tVarint32(p1, &i
fe40: 43 6f 6c 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Col1);.    }else
fe50: 7b 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75  {.      fts3Colu
fe60: 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  mnlistCopy(0, &p
fe70: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  2);.      if( 0=
fe80: 3d 2a 70 32 20 29 20 62 72 65 61 6b 3b 0a 20 20  =*p2 ) break;.  
fe90: 20 20 20 20 70 32 2b 2b 3b 0a 20 20 20 20 20 20      p2++;.      
fea0: 70 32 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  p2 += sqlite3Fts
feb0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 32 2c  3GetVarint32(p2,
fec0: 20 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20 7d 0a   &iCol2);.    }.
fed0: 20 20 7d 0a 0a 20 20 66 74 73 33 50 6f 73 6c 69    }..  fts3Posli
fee0: 73 74 43 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a  stCopy(0, &p2);.
fef0: 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70    fts3PoslistCop
ff00: 79 28 30 2c 20 26 70 31 29 3b 0a 20 20 2a 70 70  y(0, &p1);.  *pp
ff10: 31 20 3d 20 70 31 3b 0a 20 20 2a 70 70 32 20 3d  1 = p1;.  *pp2 =
ff20: 20 70 32 3b 0a 20 20 69 66 28 20 21 70 70 20 7c   p2;.  if( !pp |
ff30: 7c 20 2a 70 70 3d 3d 70 20 29 7b 0a 20 20 20 20  | *pp==p ){.    
ff40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ff50: 2a 70 2b 2b 20 3d 20 30 78 30 30 3b 0a 20 20 2a  *p++ = 0x00;.  *
ff60: 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e  pp = p;.  return
ff70: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72   1;.}../*.** Mer
ff80: 67 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 2d  ge two position-
ff90: 6c 69 73 74 73 20 61 73 20 72 65 71 75 69 72 65  lists as require
ffa0: 64 20 62 79 20 74 68 65 20 4e 45 41 52 20 6f 70  d by the NEAR op
ffb0: 65 72 61 74 6f 72 2e 20 54 68 65 20 61 72 67 75  erator. The argu
ffc0: 6d 65 6e 74 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  ment.** position
ffd0: 20 6c 69 73 74 73 20 63 6f 72 72 65 73 70 6f 6e   lists correspon
ffe0: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  d to the left an
fff0: 64 20 72 69 67 68 74 20 70 68 72 61 73 65 73 20  d right phrases 
10000 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
10010 20 0a 2a 2a 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a   .** like:.**.**
10020 20 20 20 20 20 22 70 68 72 61 73 65 20 31 22 20       "phrase 1" 
10030 4e 45 41 52 20 22 70 68 72 61 73 65 20 6e 75 6d  NEAR "phrase num
10040 62 65 72 20 32 22 0a 2a 2a 0a 2a 2a 20 50 6f 73  ber 2".**.** Pos
10050 69 74 69 6f 6e 20 6c 69 73 74 20 2a 70 70 31 20  ition list *pp1 
10060 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
10070 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
10080 65 20 6f 66 20 74 68 65 20 4e 45 41 52 20 0a 2a  e of the NEAR .*
10090 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
100a0 20 2a 70 70 32 20 74 6f 20 74 68 65 20 72 69 67   *pp2 to the rig
100b0 68 74 2e 20 41 73 20 75 73 75 61 6c 2c 20 74 68  ht. As usual, th
100c0 65 20 69 6e 64 65 78 65 73 20 69 6e 20 74 68 65  e indexes in the
100d0 20 70 6f 73 69 74 69 6f 6e 20 0a 2a 2a 20 6c 69   position .** li
100e0 73 74 73 20 61 72 65 20 74 68 65 20 6f 66 66 73  sts are the offs
100f0 65 74 73 20 6f 66 20 74 68 65 20 6c 61 73 74 20  ets of the last 
10100 74 6f 6b 65 6e 20 69 6e 20 65 61 63 68 20 70 68  token in each ph
10110 72 61 73 65 20 28 74 6f 6b 65 6e 73 20 22 31 22  rase (tokens "1"
10120 20 61 6e 64 20 22 32 22 20 0a 2a 2a 20 69 6e 20   and "2" .** in 
10130 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
10140 65 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75  e)..**.** The ou
10150 74 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  tput position li
10160 73 74 20 2d 20 77 72 69 74 74 65 6e 20 74 6f 20  st - written to 
10170 2a 70 70 20 2d 20 69 73 20 61 20 63 6f 70 79 20  *pp - is a copy 
10180 6f 66 20 2a 70 70 32 20 77 69 74 68 20 74 68 6f  of *pp2 with tho
10190 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
101a0 61 74 20 61 72 65 20 6e 6f 74 20 73 75 66 66 69  at are not suffi
101b0 63 69 65 6e 74 6c 79 20 4e 45 41 52 20 65 6e 74  ciently NEAR ent
101c0 72 69 65 73 20 69 6e 20 2a 70 70 31 20 72 65 6d  ries in *pp1 rem
101d0 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oved..*/.static 
101e0 69 6e 74 20 66 74 73 33 50 6f 73 6c 69 73 74 4e  int fts3PoslistN
101f0 65 61 72 4d 65 72 67 65 28 0a 20 20 63 68 61 72  earMerge(.  char
10200 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
10210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10220 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
10230 20 20 63 68 61 72 20 2a 61 54 6d 70 2c 20 20 20    char *aTmp,   
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 62    /* Temporary b
10260 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 20  uffer space */. 
10270 20 69 6e 74 20 6e 52 69 67 68 74 2c 20 20 20 20   int nRight,    
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 64 69 66 66   /* Maximum diff
102a0 65 72 65 6e 63 65 20 69 6e 20 74 6f 6b 65 6e 20  erence in token 
102b0 70 6f 73 69 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  positions */.  i
102c0 6e 74 20 6e 4c 65 66 74 2c 20 20 20 20 20 20 20  nt nLeft,       
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
102e0 2a 20 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72  * Maximum differ
102f0 65 6e 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f  ence in token po
10300 73 69 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  sitions */.  cha
10310 72 20 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20  r **pp1,        
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10330 49 4e 2f 4f 55 54 3a 20 4c 65 66 74 20 69 6e 70  IN/OUT: Left inp
10340 75 74 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61  ut list */.  cha
10350 72 20 2a 2a 70 70 32 20 20 20 20 20 20 20 20 20  r **pp2         
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10370 49 4e 2f 4f 55 54 3a 20 52 69 67 68 74 20 69 6e  IN/OUT: Right in
10380 70 75 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  put list */.){. 
10390 20 63 68 61 72 20 2a 70 31 20 3d 20 2a 70 70 31   char *p1 = *pp1
103a0 3b 0a 20 20 63 68 61 72 20 2a 70 32 20 3d 20 2a  ;.  char *p2 = *
103b0 70 70 32 3b 0a 0a 20 20 63 68 61 72 20 2a 70 54  pp2;..  char *pT
103c0 6d 70 31 20 3d 20 61 54 6d 70 3b 0a 20 20 63 68  mp1 = aTmp;.  ch
103d0 61 72 20 2a 70 54 6d 70 32 3b 0a 20 20 63 68 61  ar *pTmp2;.  cha
103e0 72 20 2a 61 54 6d 70 32 3b 0a 20 20 69 6e 74 20  r *aTmp2;.  int 
103f0 72 65 73 20 3d 20 31 3b 0a 0a 20 20 66 74 73 33  res = 1;..  fts3
10400 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72  PoslistPhraseMer
10410 67 65 28 26 70 54 6d 70 31 2c 20 6e 52 69 67 68  ge(&pTmp1, nRigh
10420 74 2c 20 30 2c 20 30 2c 20 70 70 31 2c 20 70 70  t, 0, 0, pp1, pp
10430 32 29 3b 0a 20 20 61 54 6d 70 32 20 3d 20 70 54  2);.  aTmp2 = pT
10440 6d 70 32 20 3d 20 70 54 6d 70 31 3b 0a 20 20 2a  mp2 = pTmp1;.  *
10450 70 70 31 20 3d 20 70 31 3b 0a 20 20 2a 70 70 32  pp1 = p1;.  *pp2
10460 20 3d 20 70 32 3b 0a 20 20 66 74 73 33 50 6f 73   = p2;.  fts3Pos
10470 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65 28  listPhraseMerge(
10480 26 70 54 6d 70 32 2c 20 6e 4c 65 66 74 2c 20 31  &pTmp2, nLeft, 1
10490 2c 20 30 2c 20 70 70 32 2c 20 70 70 31 29 3b 0a  , 0, pp2, pp1);.
104a0 20 20 69 66 28 20 70 54 6d 70 31 21 3d 61 54 6d    if( pTmp1!=aTm
104b0 70 20 26 26 20 70 54 6d 70 32 21 3d 61 54 6d 70  p && pTmp2!=aTmp
104c0 32 20 29 7b 0a 20 20 20 20 66 74 73 33 50 6f 73  2 ){.    fts3Pos
104d0 6c 69 73 74 4d 65 72 67 65 28 70 70 2c 20 26 61  listMerge(pp, &a
104e0 54 6d 70 2c 20 26 61 54 6d 70 32 29 3b 0a 20 20  Tmp, &aTmp2);.  
104f0 7d 65 6c 73 65 20 69 66 28 20 70 54 6d 70 31 21  }else if( pTmp1!
10500 3d 61 54 6d 70 20 29 7b 0a 20 20 20 20 66 74 73  =aTmp ){.    fts
10510 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 70 70 2c  3PoslistCopy(pp,
10520 20 26 61 54 6d 70 29 3b 0a 20 20 7d 65 6c 73 65   &aTmp);.  }else
10530 20 69 66 28 20 70 54 6d 70 32 21 3d 61 54 6d 70   if( pTmp2!=aTmp
10540 32 20 29 7b 0a 20 20 20 20 66 74 73 33 50 6f 73  2 ){.    fts3Pos
10550 6c 69 73 74 43 6f 70 79 28 70 70 2c 20 26 61 54  listCopy(pp, &aT
10560 6d 70 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mp2);.  }else{. 
10570 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 7d 0a     res = 0;.  }.
10580 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
10590 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6e 73 74  ../* .** An inst
105a0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
105b0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
105c0 20 6d 65 72 67 65 20 74 6f 67 65 74 68 65 72 20   merge together 
105d0 74 68 65 20 28 70 6f 74 65 6e 74 69 61 6c 6c 79  the (potentially
105e0 0a 2a 2a 20 6c 61 72 67 65 20 6e 75 6d 62 65 72  .** large number
105f0 20 6f 66 29 20 64 6f 63 6c 69 73 74 73 20 66 6f   of) doclists fo
10600 72 20 65 61 63 68 20 74 65 72 6d 20 74 68 61 74  r each term that
10610 20 6d 61 74 63 68 65 73 20 61 20 70 72 65 66 69   matches a prefi
10620 78 20 71 75 65 72 79 2e 0a 2a 2a 20 53 65 65 20  x query..** See 
10630 66 75 6e 63 74 69 6f 6e 20 66 74 73 33 54 65 72  function fts3Ter
10640 6d 53 65 6c 65 63 74 4d 65 72 67 65 28 29 20 66  mSelectMerge() f
10650 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 74  or details..*/.t
10660 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 65  ypedef struct Te
10670 72 6d 53 65 6c 65 63 74 20 54 65 72 6d 53 65 6c  rmSelect TermSel
10680 65 63 74 3b 0a 73 74 72 75 63 74 20 54 65 72 6d  ect;.struct Term
10690 53 65 6c 65 63 74 20 7b 0a 20 20 63 68 61 72 20  Select {.  char 
106a0 2a 61 61 4f 75 74 70 75 74 5b 31 36 5d 3b 20 20  *aaOutput[16];  
106b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
106c0 6c 6c 6f 63 27 64 20 6f 75 74 70 75 74 20 62 75  lloc'd output bu
106d0 66 66 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 61  ffers */.  int a
106e0 6e 4f 75 74 70 75 74 5b 31 36 5d 3b 20 20 20 20  nOutput[16];    
106f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10700 7a 65 20 65 61 63 68 20 6f 75 74 70 75 74 20 62  ze each output b
10710 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
10720 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.};../*.** This
10730 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
10740 64 20 74 6f 20 72 65 61 64 20 61 20 73 69 6e 67  d to read a sing
10750 6c 65 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 61  le varint from a
10760 20 62 75 66 66 65 72 2e 20 50 61 72 61 6d 65 74   buffer. Paramet
10770 65 72 0a 2a 2a 20 70 45 6e 64 20 70 6f 69 6e 74  er.** pEnd point
10780 73 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68  s 1 byte past th
10790 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
107a0 66 65 72 2e 20 57 68 65 6e 20 74 68 69 73 20 66  fer. When this f
107b0 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
107c0 6c 6c 65 64 2c 20 69 66 20 2a 70 70 20 70 6f 69  lled, if *pp poi
107d0 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 67  nts to pEnd or g
107e0 72 65 61 74 65 72 2c 20 74 68 65 6e 20 74 68 65  reater, then the
107f0 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
10800 65 72 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  er.** has been r
10810 65 61 63 68 65 64 2e 20 49 6e 20 74 68 69 73 20  eached. In this 
10820 63 61 73 65 20 2a 70 70 20 69 73 20 73 65 74 20  case *pp is set 
10830 74 6f 20 30 20 61 6e 64 20 74 68 65 20 66 75 6e  to 0 and the fun
10840 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
10850 2a 0a 2a 2a 20 49 66 20 2a 70 70 20 64 6f 65 73  *.** If *pp does
10860 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 6f 72   not point to or
10870 20 70 61 73 74 20 70 45 6e 64 2c 20 74 68 65 6e   past pEnd, then
10880 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74   a single varint
10890 20 69 73 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d   is read.** from
108a0 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 74 68 65   *pp. *pp is the
108b0 6e 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 31  n set to point 1
108c0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
108d0 6e 64 20 6f 66 20 74 68 65 20 72 65 61 64 20 76  nd of the read v
108e0 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arint..**.** If 
108f0 62 44 65 73 63 49 64 78 20 69 73 20 66 61 6c 73  bDescIdx is fals
10900 65 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  e, the value rea
10910 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 2a 70  d is added to *p
10920 56 61 6c 20 62 65 66 6f 72 65 20 72 65 74 75 72  Val before retur
10930 6e 69 6e 67 2e 0a 2a 2a 20 49 66 20 69 74 20 69  ning..** If it i
10940 73 20 74 72 75 65 2c 20 74 68 65 20 76 61 6c 75  s true, the valu
10950 65 20 72 65 61 64 20 69 73 20 73 75 62 74 72 61  e read is subtra
10960 63 74 65 64 20 66 72 6f 6d 20 2a 70 56 61 6c 20  cted from *pVal 
10970 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  before this .** 
10980 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
10990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
109a0 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
109b0 69 6e 74 33 28 0a 20 20 63 68 61 72 20 2a 2a 70  int3(.  char **p
109c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
109d0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
109e0 54 3a 20 50 6f 69 6e 74 20 74 6f 20 72 65 61 64  T: Point to read
109f0 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 2a 2f 0a   varint from */.
10a00 20 20 63 68 61 72 20 2a 70 45 6e 64 2c 20 20 20    char *pEnd,   
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 62 75 66 66    /* End of buff
10a30 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  er */.  int bDes
10a40 63 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  cIdx,           
10a50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10a60 69 66 20 64 6f 63 69 64 73 20 61 72 65 20 64 65  if docids are de
10a70 73 63 65 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  scending */.  sq
10a80 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 56 61  lite3_int64 *pVa
10a90 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l             /*
10aa0 20 49 4e 2f 4f 55 54 3a 20 49 6e 74 65 67 65 72   IN/OUT: Integer
10ab0 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69   value */.){.  i
10ac0 66 28 20 2a 70 70 3e 3d 70 45 6e 64 20 29 7b 0a  f( *pp>=pEnd ){.
10ad0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
10ae0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
10af0 33 5f 69 6e 74 36 34 20 69 56 61 6c 3b 0a 20 20  3_int64 iVal;.  
10b00 20 20 2a 70 70 20 2b 3d 20 73 71 6c 69 74 65 33    *pp += sqlite3
10b10 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 2a 70  Fts3GetVarint(*p
10b20 70 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 69  p, &iVal);.    i
10b30 66 28 20 62 44 65 73 63 49 64 78 20 29 7b 0a 20  f( bDescIdx ){. 
10b40 20 20 20 20 20 2a 70 56 61 6c 20 2d 3d 20 69 56       *pVal -= iV
10b50 61 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  al;.    }else{. 
10b60 20 20 20 20 20 2a 70 56 61 6c 20 2b 3d 20 69 56       *pVal += iV
10b70 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  al;.    }.  }.}.
10b80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10b90 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
10ba0 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 76  write a single v
10bb0 61 72 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  arint to a buffe
10bc0 72 2e 20 54 68 65 20 76 61 72 69 6e 74 0a 2a 2a  r. The varint.**
10bd0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
10be0 70 70 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  pp. Before retur
10bf0 6e 69 6e 67 2c 20 2a 70 70 20 69 73 20 73 65 74  ning, *pp is set
10c00 20 74 6f 20 70 6f 69 6e 74 20 31 20 62 79 74 65   to point 1 byte
10c10 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 65 6e 64   past the.** end
10c20 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 77 72   of the value wr
10c30 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itten..**.** If 
10c40 2a 70 62 46 69 72 73 74 20 69 73 20 7a 65 72 6f  *pbFirst is zero
10c50 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
10c60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
10c70 68 65 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  he value written
10c80 20 74 6f 0a 2a 2a 20 74 68 65 20 62 75 66 66 65   to.** the buffe
10c90 72 20 69 73 20 74 68 61 74 20 6f 66 20 70 61 72  r is that of par
10ca0 61 6d 65 74 65 72 20 69 56 61 6c 2e 20 0a 2a 2a  ameter iVal. .**
10cb0 0a 2a 2a 20 49 66 20 2a 70 62 46 69 72 73 74 20  .** If *pbFirst 
10cc0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  is non-zero when
10cd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10ce0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
10cf0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 77 72 69  he value .** wri
10d00 74 74 65 6e 20 69 73 20 65 69 74 68 65 72 20 28  tten is either (
10d10 69 56 61 6c 2d 2a 70 69 50 72 65 76 29 20 28 69  iVal-*piPrev) (i
10d20 66 20 62 44 65 73 63 49 64 78 20 69 73 20 7a 65  f bDescIdx is ze
10d30 72 6f 29 20 6f 72 20 28 2a 70 69 50 72 65 76 2d  ro) or (*piPrev-
10d40 69 56 61 6c 29 0a 2a 2a 20 28 69 66 20 62 44 65  iVal).** (if bDe
10d50 73 63 49 64 78 20 69 73 20 6e 6f 6e 2d 7a 65 72  scIdx is non-zer
10d60 6f 29 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  o)..**.** Before
10d70 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 69 73   returning, this
10d80 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
10d90 20 73 65 74 73 20 2a 70 62 46 69 72 73 74 20 74   sets *pbFirst t
10da0 6f 20 31 20 61 6e 64 20 2a 70 69 50 72 65 76 0a  o 1 and *piPrev.
10db0 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ** to the value 
10dc0 6f 66 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  of parameter iVa
10dd0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
10de0 64 20 66 74 73 33 50 75 74 44 65 6c 74 61 56 61  d fts3PutDeltaVa
10df0 72 69 6e 74 33 28 0a 20 20 63 68 61 72 20 2a 2a  rint3(.  char **
10e00 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pp,             
10e10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
10e20 55 54 3a 20 4f 75 74 70 75 74 20 70 6f 69 6e 74  UT: Output point
10e30 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  er */.  int bDes
10e40 63 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  cIdx,           
10e50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10e60 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 64  for descending d
10e70 6f 63 69 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ocids */.  sqlit
10e80 65 33 5f 69 6e 74 36 34 20 2a 70 69 50 72 65 76  e3_int64 *piPrev
10e90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  ,          /* IN
10ea0 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 76  /OUT: Previous v
10eb0 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20  alue written to 
10ec0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  list */.  int *p
10ed0 62 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  bFirst,         
10ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
10ef0 4f 55 54 3a 20 54 72 75 65 20 61 66 74 65 72 20  OUT: True after 
10f00 66 69 72 73 74 20 69 6e 74 20 77 72 69 74 74 65  first int writte
10f10 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
10f20 6e 74 36 34 20 69 56 61 6c 20 20 20 20 20 20 20  nt64 iVal       
10f30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
10f40 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 74 68  this value to th
10f50 65 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 73  e list */.){.  s
10f60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 57 72  qlite3_int64 iWr
10f70 69 74 65 3b 0a 20 20 69 66 28 20 62 44 65 73 63  ite;.  if( bDesc
10f80 49 64 78 3d 3d 30 20 7c 7c 20 2a 70 62 46 69 72  Idx==0 || *pbFir
10f90 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 57 72  st==0 ){.    iWr
10fa0 69 74 65 20 3d 20 69 56 61 6c 20 2d 20 2a 70 69  ite = iVal - *pi
10fb0 50 72 65 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Prev;.  }else{. 
10fc0 20 20 20 69 57 72 69 74 65 20 3d 20 2a 70 69 50     iWrite = *piP
10fd0 72 65 76 20 2d 20 69 56 61 6c 3b 0a 20 20 7d 0a  rev - iVal;.  }.
10fe0 20 20 61 73 73 65 72 74 28 20 2a 70 62 46 69 72    assert( *pbFir
10ff0 73 74 20 7c 7c 20 2a 70 69 50 72 65 76 3d 3d 30  st || *piPrev==0
11000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
11010 62 46 69 72 73 74 3d 3d 30 20 7c 7c 20 69 57 72  bFirst==0 || iWr
11020 69 74 65 3e 30 20 29 3b 0a 20 20 2a 70 70 20 2b  ite>0 );.  *pp +
11030 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
11040 56 61 72 69 6e 74 28 2a 70 70 2c 20 69 57 72 69  Varint(*pp, iWri
11050 74 65 29 3b 0a 20 20 2a 70 69 50 72 65 76 20 3d  te);.  *piPrev =
11060 20 69 56 61 6c 3b 0a 20 20 2a 70 62 46 69 72 73   iVal;.  *pbFirs
11070 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
11080 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75   This macro is u
11090 73 65 64 20 62 79 20 76 61 72 69 6f 75 73 20 66  sed by various f
110a0 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65  unctions that me
110b0 72 67 65 20 64 6f 63 6c 69 73 74 73 2e 20 54 68  rge doclists. Th
110c0 65 20 74 77 6f 0a 2a 2a 20 61 72 67 75 6d 65 6e  e two.** argumen
110d0 74 73 20 61 72 65 20 36 34 2d 62 69 74 20 64 6f  ts are 64-bit do
110e0 63 69 64 20 76 61 6c 75 65 73 2e 20 49 66 20 74  cid values. If t
110f0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11100 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 0a 2a  stack variable.*
11110 2a 20 62 44 65 73 63 44 6f 63 6c 69 73 74 20 69  * bDescDoclist i
11120 73 20 30 20 77 68 65 6e 20 74 68 69 73 20 6d 61  s 0 when this ma
11130 63 72 6f 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  cro is invoked, 
11140 74 68 65 6e 20 69 74 20 72 65 74 75 72 6e 73 20  then it returns 
11150 28 69 31 2d 69 32 29 2e 20 0a 2a 2a 20 4f 74 68  (i1-i2). .** Oth
11160 65 72 77 69 73 65 2c 20 28 69 32 2d 69 31 29 2e  erwise, (i2-i1).
11170 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  .**.** Using thi
11180 73 20 6d 61 6b 65 73 20 69 74 20 65 61 73 69 65  s makes it easie
11190 72 20 74 6f 20 77 72 69 74 65 20 63 6f 64 65 20  r to write code 
111a0 74 68 61 74 20 63 61 6e 20 6d 65 72 67 65 20 64  that can merge d
111b0 6f 63 6c 69 73 74 73 20 74 68 61 74 20 61 72 65  oclists that are
111c0 0a 2a 2a 20 73 6f 72 74 65 64 20 69 6e 20 65 69  .** sorted in ei
111d0 74 68 65 72 20 61 73 63 65 6e 64 69 6e 67 20 6f  ther ascending o
111e0 72 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64  r descending ord
111f0 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  er..*/.#define D
11200 4f 43 49 44 5f 43 4d 50 28 69 31 2c 20 69 32 29  OCID_CMP(i1, i2)
11210 20 28 28 62 44 65 73 63 44 6f 63 6c 69 73 74 3f   ((bDescDoclist?
11220 2d 31 3a 31 29 20 2a 20 28 69 31 2d 69 32 29 29  -1:1) * (i1-i2))
11230 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11240 63 74 69 6f 6e 20 64 6f 65 73 20 61 6e 20 22 4f  ction does an "O
11250 52 22 20 6d 65 72 67 65 20 6f 66 20 74 77 6f 20  R" merge of two 
11260 64 6f 63 6c 69 73 74 73 20 28 6f 75 74 70 75 74  doclists (output
11270 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a   contains all.**
11280 20 70 6f 73 69 74 69 6f 6e 73 20 63 6f 6e 74 61   positions conta
11290 69 6e 65 64 20 69 6e 20 65 69 74 68 65 72 20 61  ined in either a
112a0 72 67 75 6d 65 6e 74 20 64 6f 63 6c 69 73 74 29  rgument doclist)
112b0 2e 20 49 66 20 74 68 65 20 64 6f 63 69 64 73 20  . If the docids 
112c0 69 6e 20 74 68 65 20 0a 2a 2a 20 69 6e 70 75 74  in the .** input
112d0 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20 73 6f   doclists are so
112e0 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e  rted in ascendin
112f0 67 20 6f 72 64 65 72 2c 20 70 61 72 61 6d 65 74  g order, paramet
11300 65 72 20 62 44 65 73 63 44 6f 63 6c 69 73 74 0a  er bDescDoclist.
11310 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 61 6c  ** should be fal
11320 73 65 2e 20 49 66 20 74 68 65 79 20 61 72 65 20  se. If they are 
11330 73 6f 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64  sorted in ascend
11340 69 6e 67 20 6f 72 64 65 72 2c 20 69 74 20 73 68  ing order, it sh
11350 6f 75 6c 64 20 62 65 0a 2a 2a 20 70 61 73 73 65  ould be.** passe
11360 64 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  d a non-zero val
11370 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  ue..**.** If no 
11380 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
11390 61 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70  aOut is set to p
113a0 6f 69 6e 74 20 61 74 20 61 6e 20 73 71 6c 69 74  oint at an sqlit
113b0 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66  e3_malloc'd buff
113c0 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  er.** containing
113d0 20 74 68 65 20 6f 75 74 70 75 74 20 64 6f 63 6c   the output docl
113e0 69 73 74 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ist and SQLITE_O
113f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
11400 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 2a  n this case.** *
11410 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  pnOut is set to 
11420 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
11430 74 65 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  tes in the outpu
11440 74 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  t doclist..**.**
11450 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11460 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
11470 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
11480 75 72 6e 65 64 2e 20 54 68 65 20 6f 75 74 70 75  urned. The outpu
11490 74 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  t values.** are 
114a0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
114b0 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
114c0 63 20 69 6e 74 20 66 74 73 33 44 6f 63 6c 69 73  c int fts3Doclis
114d0 74 4f 72 4d 65 72 67 65 28 0a 20 20 69 6e 74 20  tOrMerge(.  int 
114e0 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 20 20  bDescDoclist,   
114f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11500 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 73  rue if arguments
11510 20 61 72 65 20 64 65 73 63 20 2a 2f 0a 20 20 63   are desc */.  c
11520 68 61 72 20 2a 61 31 2c 20 69 6e 74 20 6e 31 2c  har *a1, int n1,
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11540 2a 20 46 69 72 73 74 20 64 6f 63 6c 69 73 74 20  * First doclist 
11550 2a 2f 0a 20 20 63 68 61 72 20 2a 61 32 2c 20 69  */.  char *a2, i
11560 6e 74 20 6e 32 2c 20 20 20 20 20 20 20 20 20 20  nt n2,          
11570 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 64       /* Second d
11580 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  oclist */.  char
11590 20 2a 2a 70 61 4f 75 74 2c 20 69 6e 74 20 2a 70   **paOut, int *p
115a0 6e 4f 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4f  nOut        /* O
115b0 55 54 3a 20 4d 61 6c 6c 6f 63 27 64 20 64 6f 63  UT: Malloc'd doc
115c0 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  list */.){.  sql
115d0 69 74 65 33 5f 69 6e 74 36 34 20 69 31 20 3d 20  ite3_int64 i1 = 
115e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
115f0 36 34 20 69 32 20 3d 20 30 3b 0a 20 20 73 71 6c  64 i2 = 0;.  sql
11600 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76  ite3_int64 iPrev
11610 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 70 45   = 0;.  char *pE
11620 6e 64 31 20 3d 20 26 61 31 5b 6e 31 5d 3b 0a 20  nd1 = &a1[n1];. 
11630 20 63 68 61 72 20 2a 70 45 6e 64 32 20 3d 20 26   char *pEnd2 = &
11640 61 32 5b 6e 32 5d 3b 0a 20 20 63 68 61 72 20 2a  a2[n2];.  char *
11650 70 31 20 3d 20 61 31 3b 0a 20 20 63 68 61 72 20  p1 = a1;.  char 
11660 2a 70 32 20 3d 20 61 32 3b 0a 20 20 63 68 61 72  *p2 = a2;.  char
11670 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75   *p;.  char *aOu
11680 74 3b 0a 20 20 69 6e 74 20 62 46 69 72 73 74 4f  t;.  int bFirstO
11690 75 74 20 3d 20 30 3b 0a 0a 20 20 2a 70 61 4f 75  ut = 0;..  *paOu
116a0 74 20 3d 20 30 3b 0a 20 20 2a 70 6e 4f 75 74 20  t = 0;.  *pnOut 
116b0 3d 20 30 3b 0a 20 20 61 4f 75 74 20 3d 20 73 71  = 0;.  aOut = sq
116c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 31 2b  lite3_malloc(n1+
116d0 6e 32 29 3b 0a 20 20 69 66 28 20 21 61 4f 75 74  n2);.  if( !aOut
116e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
116f0 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 70 20 3d 20 61  _NOMEM;..  p = a
11700 4f 75 74 3b 0a 20 20 66 74 73 33 47 65 74 44 65  Out;.  fts3GetDe
11710 6c 74 61 56 61 72 69 6e 74 33 28 26 70 31 2c 20  ltaVarint3(&p1, 
11720 70 45 6e 64 31 2c 20 30 2c 20 26 69 31 29 3b 0a  pEnd1, 0, &i1);.
11730 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61    fts3GetDeltaVa
11740 72 69 6e 74 33 28 26 70 32 2c 20 70 45 6e 64 32  rint3(&p2, pEnd2
11750 2c 20 30 2c 20 26 69 32 29 3b 0a 20 20 77 68 69  , 0, &i2);.  whi
11760 6c 65 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a  le( p1 || p2 ){.
11770 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
11780 34 20 69 44 69 66 66 20 3d 20 44 4f 43 49 44 5f  4 iDiff = DOCID_
11790 43 4d 50 28 69 31 2c 20 69 32 29 3b 0a 0a 20 20  CMP(i1, i2);..  
117a0 20 20 69 66 28 20 70 32 20 26 26 20 70 31 20 26    if( p2 && p1 &
117b0 26 20 69 44 69 66 66 3d 3d 30 20 29 7b 0a 20 20  & iDiff==0 ){.  
117c0 20 20 20 20 66 74 73 33 50 75 74 44 65 6c 74 61      fts3PutDelta
117d0 56 61 72 69 6e 74 33 28 26 70 2c 20 62 44 65 73  Varint3(&p, bDes
117e0 63 44 6f 63 6c 69 73 74 2c 20 26 69 50 72 65 76  cDoclist, &iPrev
117f0 2c 20 26 62 46 69 72 73 74 4f 75 74 2c 20 69 31  , &bFirstOut, i1
11800 29 3b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73  );.      fts3Pos
11810 6c 69 73 74 4d 65 72 67 65 28 26 70 2c 20 26 70  listMerge(&p, &p
11820 31 2c 20 26 70 32 29 3b 0a 20 20 20 20 20 20 66  1, &p2);.      f
11830 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
11840 74 33 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 62  t3(&p1, pEnd1, b
11850 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 31  DescDoclist, &i1
11860 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  );.      fts3Get
11870 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 32  DeltaVarint3(&p2
11880 2c 20 70 45 6e 64 32 2c 20 62 44 65 73 63 44 6f  , pEnd2, bDescDo
11890 63 6c 69 73 74 2c 20 26 69 32 29 3b 0a 20 20 20  clist, &i2);.   
118a0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 32 20 7c   }else if( !p2 |
118b0 7c 20 28 70 31 20 26 26 20 69 44 69 66 66 3c 30  | (p1 && iDiff<0
118c0 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 50  ) ){.      fts3P
118d0 75 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  utDeltaVarint3(&
118e0 70 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c  p, bDescDoclist,
118f0 20 26 69 50 72 65 76 2c 20 26 62 46 69 72 73 74   &iPrev, &bFirst
11900 4f 75 74 2c 20 69 31 29 3b 0a 20 20 20 20 20 20  Out, i1);.      
11910 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28  fts3PoslistCopy(
11920 26 70 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20  &p, &p1);.      
11930 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
11940 6e 74 33 28 26 70 31 2c 20 70 45 6e 64 31 2c 20  nt3(&p1, pEnd1, 
11950 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69  bDescDoclist, &i
11960 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
11970 20 20 20 20 20 66 74 73 33 50 75 74 44 65 6c 74       fts3PutDelt
11980 61 56 61 72 69 6e 74 33 28 26 70 2c 20 62 44 65  aVarint3(&p, bDe
11990 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 50 72 65  scDoclist, &iPre
119a0 76 2c 20 26 62 46 69 72 73 74 4f 75 74 2c 20 69  v, &bFirstOut, i
119b0 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33 50 6f  2);.      fts3Po
119c0 73 6c 69 73 74 43 6f 70 79 28 26 70 2c 20 26 70  slistCopy(&p, &p
119d0 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65  2);.      fts3Ge
119e0 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70  tDeltaVarint3(&p
119f0 32 2c 20 70 45 6e 64 32 2c 20 62 44 65 73 63 44  2, pEnd2, bDescD
11a00 6f 63 6c 69 73 74 2c 20 26 69 32 29 3b 0a 20 20  oclist, &i2);.  
11a10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 61 4f 75    }.  }..  *paOu
11a20 74 20 3d 20 61 4f 75 74 3b 0a 20 20 2a 70 6e 4f  t = aOut;.  *pnO
11a30 75 74 20 3d 20 28 70 2d 61 4f 75 74 29 3b 0a 20  ut = (p-aOut);. 
11a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11a50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
11a60 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 61   function does a
11a70 20 22 70 68 72 61 73 65 22 20 6d 65 72 67 65 20   "phrase" merge 
11a80 6f 66 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 2e  of two doclists.
11a90 20 49 6e 20 61 20 70 68 72 61 73 65 20 6d 65 72   In a phrase mer
11aa0 67 65 2c 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75  ge,.** the outpu
11ab0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70  t contains a cop
11ac0 79 20 6f 66 20 65 61 63 68 20 70 6f 73 69 74 69  y of each positi
11ad0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68  on from the righ
11ae0 74 2d 68 61 6e 64 20 69 6e 70 75 74 0a 2a 2a 20  t-hand input.** 
11af0 64 6f 63 6c 69 73 74 20 66 6f 72 20 77 68 69 63  doclist for whic
11b00 68 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 73  h there is a pos
11b10 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c 65 66  ition in the lef
11b20 74 2d 68 61 6e 64 20 69 6e 70 75 74 20 64 6f 63  t-hand input doc
11b30 6c 69 73 74 0a 2a 2a 20 65 78 61 63 74 6c 79 20  list.** exactly 
11b40 6e 44 69 73 74 20 74 6f 6b 65 6e 73 20 62 65 66  nDist tokens bef
11b50 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ore it..**.** If
11b60 20 74 68 65 20 64 6f 63 69 64 73 20 69 6e 20 74   the docids in t
11b70 68 65 20 69 6e 70 75 74 20 64 6f 63 6c 69 73 74  he input doclist
11b80 73 20 61 72 65 20 73 6f 72 74 65 64 20 69 6e 20  s are sorted in 
11b90 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c  ascending order,
11ba0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 62 44  .** parameter bD
11bb0 65 73 63 44 6f 63 6c 69 73 74 20 73 68 6f 75 6c  escDoclist shoul
11bc0 64 20 62 65 20 66 61 6c 73 65 2e 20 49 66 20 74  d be false. If t
11bd0 68 65 79 20 61 72 65 20 73 6f 72 74 65 64 20 69  hey are sorted i
11be0 6e 20 61 73 63 65 6e 64 69 6e 67 20 0a 2a 2a 20  n ascending .** 
11bf0 6f 72 64 65 72 2c 20 69 74 20 73 68 6f 75 6c 64  order, it should
11c00 20 62 65 20 70 61 73 73 65 64 20 61 20 6e 6f 6e   be passed a non
11c10 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  -zero value..**.
11c20 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  ** The right-han
11c30 64 20 69 6e 70 75 74 20 64 6f 63 6c 69 73 74 20  d input doclist 
11c40 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  is overwritten b
11c50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
11c60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11c70 66 74 73 33 44 6f 63 6c 69 73 74 50 68 72 61 73  fts3DoclistPhras
11c80 65 4d 65 72 67 65 28 0a 20 20 69 6e 74 20 62 44  eMerge(.  int bD
11c90 65 73 63 44 6f 63 6c 69 73 74 2c 20 20 20 20 20  escDoclist,     
11ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11cb0 65 20 69 66 20 61 72 67 75 6d 65 6e 74 73 20 61  e if arguments a
11cc0 72 65 20 64 65 73 63 20 2a 2f 0a 20 20 69 6e 74  re desc */.  int
11cd0 20 6e 44 69 73 74 2c 20 20 20 20 20 20 20 20 20   nDist,         
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11cf0 44 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 6c 65  Distance from le
11d00 66 74 20 74 6f 20 72 69 67 68 74 20 28 31 3d 61  ft to right (1=a
11d10 64 6a 61 63 65 6e 74 29 20 2a 2f 0a 20 20 63 68  djacent) */.  ch
11d20 61 72 20 2a 61 4c 65 66 74 2c 20 69 6e 74 20 6e  ar *aLeft, int n
11d30 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Left,         /*
11d40 20 4c 65 66 74 20 64 6f 63 6c 69 73 74 20 2a 2f   Left doclist */
11d50 0a 20 20 63 68 61 72 20 2a 61 52 69 67 68 74 2c  .  char *aRight,
11d60 20 69 6e 74 20 2a 70 6e 52 69 67 68 74 20 20 20   int *pnRight   
11d70 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 69     /* IN/OUT: Ri
11d80 67 68 74 2f 6f 75 74 70 75 74 20 64 6f 63 6c 69  ght/output docli
11d90 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  st */.){.  sqlit
11da0 65 33 5f 69 6e 74 36 34 20 69 31 20 3d 20 30 3b  e3_int64 i1 = 0;
11db0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
11dc0 20 69 32 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74   i2 = 0;.  sqlit
11dd0 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d  e3_int64 iPrev =
11de0 20 30 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64   0;.  char *pEnd
11df0 31 20 3d 20 26 61 4c 65 66 74 5b 6e 4c 65 66 74  1 = &aLeft[nLeft
11e00 5d 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 32  ];.  char *pEnd2
11e10 20 3d 20 26 61 52 69 67 68 74 5b 2a 70 6e 52 69   = &aRight[*pnRi
11e20 67 68 74 5d 3b 0a 20 20 63 68 61 72 20 2a 70 31  ght];.  char *p1
11e30 20 3d 20 61 4c 65 66 74 3b 0a 20 20 63 68 61 72   = aLeft;.  char
11e40 20 2a 70 32 20 3d 20 61 52 69 67 68 74 3b 0a 20   *p2 = aRight;. 
11e50 20 63 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20   char *p;.  int 
11e60 62 46 69 72 73 74 4f 75 74 20 3d 20 30 3b 0a 20  bFirstOut = 0;. 
11e70 20 63 68 61 72 20 2a 61 4f 75 74 20 3d 20 61 52   char *aOut = aR
11e80 69 67 68 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  ight;..  assert(
11e90 20 6e 44 69 73 74 3e 30 20 29 3b 0a 0a 20 20 70   nDist>0 );..  p
11ea0 20 3d 20 61 4f 75 74 3b 0a 20 20 66 74 73 33 47   = aOut;.  fts3G
11eb0 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
11ec0 70 31 2c 20 70 45 6e 64 31 2c 20 30 2c 20 26 69  p1, pEnd1, 0, &i
11ed0 31 29 3b 0a 20 20 66 74 73 33 47 65 74 44 65 6c  1);.  fts3GetDel
11ee0 74 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70  taVarint3(&p2, p
11ef0 45 6e 64 32 2c 20 30 2c 20 26 69 32 29 3b 0a 0a  End2, 0, &i2);..
11f00 20 20 77 68 69 6c 65 28 20 70 31 20 26 26 20 70    while( p1 && p
11f10 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  2 ){.    sqlite3
11f20 5f 69 6e 74 36 34 20 69 44 69 66 66 20 3d 20 44  _int64 iDiff = D
11f30 4f 43 49 44 5f 43 4d 50 28 69 31 2c 20 69 32 29  OCID_CMP(i1, i2)
11f40 3b 0a 20 20 20 20 69 66 28 20 69 44 69 66 66 3d  ;.    if( iDiff=
11f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
11f60 20 2a 70 53 61 76 65 20 3d 20 70 3b 0a 20 20 20   *pSave = p;.   
11f70 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
11f80 20 69 50 72 65 76 53 61 76 65 20 3d 20 69 50 72   iPrevSave = iPr
11f90 65 76 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 46  ev;.      int bF
11fa0 69 72 73 74 4f 75 74 53 61 76 65 20 3d 20 62 46  irstOutSave = bF
11fb0 69 72 73 74 4f 75 74 3b 0a 0a 20 20 20 20 20 20  irstOut;..      
11fc0 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69  fts3PutDeltaVari
11fd0 6e 74 33 28 26 70 2c 20 62 44 65 73 63 44 6f 63  nt3(&p, bDescDoc
11fe0 6c 69 73 74 2c 20 26 69 50 72 65 76 2c 20 26 62  list, &iPrev, &b
11ff0 46 69 72 73 74 4f 75 74 2c 20 69 31 29 3b 0a 20  FirstOut, i1);. 
12000 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 33       if( 0==fts3
12010 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72  PoslistPhraseMer
12020 67 65 28 26 70 2c 20 6e 44 69 73 74 2c 20 30 2c  ge(&p, nDist, 0,
12030 20 31 2c 20 26 70 31 2c 20 26 70 32 29 20 29 7b   1, &p1, &p2) ){
12040 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 53 61  .        p = pSa
12050 76 65 3b 0a 20 20 20 20 20 20 20 20 69 50 72 65  ve;.        iPre
12060 76 20 3d 20 69 50 72 65 76 53 61 76 65 3b 0a 20  v = iPrevSave;. 
12070 20 20 20 20 20 20 20 62 46 69 72 73 74 4f 75 74         bFirstOut
12080 20 3d 20 62 46 69 72 73 74 4f 75 74 53 61 76 65   = bFirstOutSave
12090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
120a0 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
120b0 6e 74 33 28 26 70 31 2c 20 70 45 6e 64 31 2c 20  nt3(&p1, pEnd1, 
120c0 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69  bDescDoclist, &i
120d0 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65  1);.      fts3Ge
120e0 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70  tDeltaVarint3(&p
120f0 32 2c 20 70 45 6e 64 32 2c 20 62 44 65 73 63 44  2, pEnd2, bDescD
12100 6f 63 6c 69 73 74 2c 20 26 69 32 29 3b 0a 20 20  oclist, &i2);.  
12110 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 69 66    }else if( iDif
12120 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  f<0 ){.      fts
12130 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20  3PoslistCopy(0, 
12140 26 70 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33  &p1);.      fts3
12150 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28  GetDeltaVarint3(
12160 26 70 31 2c 20 70 45 6e 64 31 2c 20 62 44 65 73  &p1, pEnd1, bDes
12170 63 44 6f 63 6c 69 73 74 2c 20 26 69 31 29 3b 0a  cDoclist, &i1);.
12180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12190 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79   fts3PoslistCopy
121a0 28 30 2c 20 26 70 32 29 3b 0a 20 20 20 20 20 20  (0, &p2);.      
121b0 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
121c0 6e 74 33 28 26 70 32 2c 20 70 45 6e 64 32 2c 20  nt3(&p2, pEnd2, 
121d0 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69  bDescDoclist, &i
121e0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  2);.    }.  }.. 
121f0 20 2a 70 6e 52 69 67 68 74 20 3d 20 70 20 2d 20   *pnRight = p - 
12200 61 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  aOut;.}.../*.** 
12210 4d 65 72 67 65 20 61 6c 6c 20 64 6f 63 6c 69 73  Merge all doclis
12220 74 73 20 69 6e 20 74 68 65 20 54 65 72 6d 53 65  ts in the TermSe
12230 6c 65 63 74 2e 61 61 4f 75 74 70 75 74 5b 5d 20  lect.aaOutput[] 
12240 61 72 72 61 79 20 69 6e 74 6f 20 61 20 73 69 6e  array into a sin
12250 67 6c 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 73  gle.** doclist s
12260 74 6f 72 65 64 20 69 6e 20 54 65 72 6d 53 65 6c  tored in TermSel
12270 65 63 74 2e 61 61 4f 75 74 70 75 74 5b 30 5d 2e  ect.aaOutput[0].
12280 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
12290 64 65 6c 65 74 65 20 61 6c 6c 0a 2a 2a 20 6f 74  delete all.** ot
122a0 68 65 72 20 64 6f 63 6c 69 73 74 73 20 28 65 78  her doclists (ex
122b0 63 65 70 74 20 74 68 65 20 61 61 4f 75 74 70 75  cept the aaOutpu
122c0 74 5b 30 5d 20 6f 6e 65 29 20 61 6e 64 20 72 65  t[0] one) and re
122d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
122e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
122f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
12300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12310 4d 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  M. In this case 
12320 69 74 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  it is.** the res
12330 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
12340 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65  he caller to fre
12350 65 20 61 6e 79 20 64 6f 63 6c 69 73 74 73 20 6c  e any doclists l
12360 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 54 65  eft in the.** Te
12370 72 6d 53 65 6c 65 63 74 2e 61 61 4f 75 74 70 75  rmSelect.aaOutpu
12380 74 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  t[] array..*/.st
12390 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 65 72  atic int fts3Ter
123a0 6d 53 65 6c 65 63 74 46 69 6e 69 73 68 4d 65 72  mSelectFinishMer
123b0 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ge(Fts3Table *p,
123c0 20 54 65 72 6d 53 65 6c 65 63 74 20 2a 70 54 53   TermSelect *pTS
123d0 29 7b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 20  ){.  char *aOut 
123e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20  = 0;.  int nOut 
123f0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
12400 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
12410 20 74 68 65 20 64 6f 63 6c 69 73 74 73 20 69 6e   the doclists in
12420 20 74 68 65 20 61 61 4f 75 74 70 75 74 5b 5d 20   the aaOutput[] 
12430 61 72 72 61 79 2e 20 4d 65 72 67 65 20 74 68 65  array. Merge the
12440 6d 20 61 6c 6c 0a 20 20 2a 2a 20 69 6e 74 6f 20  m all.  ** into 
12450 61 20 73 69 6e 67 6c 65 20 64 6f 63 6c 69 73 74  a single doclist
12460 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
12470 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72 61 79 28  ; i<SizeofArray(
12480 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 29 3b 20  pTS->aaOutput); 
12490 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  i++){.    if( pT
124a0 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 5d 20 29  S->aaOutput[i] )
124b0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4f 75  {.      if( !aOu
124c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f 75  t ){.        aOu
124d0 74 20 3d 20 70 54 53 2d 3e 61 61 4f 75 74 70 75  t = pTS->aaOutpu
124e0 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6e 4f  t[i];.        nO
124f0 75 74 20 3d 20 70 54 53 2d 3e 61 6e 4f 75 74 70  ut = pTS->anOutp
12500 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  ut[i];.        p
12510 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 5d 20  TS->aaOutput[i] 
12520 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
12530 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e  {.        int nN
12540 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ew;.        char
12550 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20 20 20 20   *aNew;..       
12560 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 44 6f   int rc = fts3Do
12570 63 6c 69 73 74 4f 72 4d 65 72 67 65 28 70 2d 3e  clistOrMerge(p->
12580 62 44 65 73 63 49 64 78 2c 20 0a 20 20 20 20 20  bDescIdx, .     
12590 20 20 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75         pTS->aaOu
125a0 74 70 75 74 5b 69 5d 2c 20 70 54 53 2d 3e 61 6e  tput[i], pTS->an
125b0 4f 75 74 70 75 74 5b 69 5d 2c 20 61 4f 75 74 2c  Output[i], aOut,
125c0 20 6e 4f 75 74 2c 20 26 61 4e 65 77 2c 20 26 6e   nOut, &aNew, &n
125d0 4e 65 77 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  New.        );. 
125e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
125f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
12610 65 65 28 61 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(aOut);.      
12620 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12630 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
12640 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12650 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 5d 29  TS->aaOutput[i])
12660 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12670 33 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20  3_free(aOut);.  
12680 20 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74        pTS->aaOut
12690 70 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  put[i] = 0;.    
126a0 20 20 20 20 61 4f 75 74 20 3d 20 61 4e 65 77 3b      aOut = aNew;
126b0 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
126c0 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
126d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 53 2d 3e    }.  }..  pTS->
126e0 61 61 4f 75 74 70 75 74 5b 30 5d 20 3d 20 61 4f  aaOutput[0] = aO
126f0 75 74 3b 0a 20 20 70 54 53 2d 3e 61 6e 4f 75 74  ut;.  pTS->anOut
12700 70 75 74 5b 30 5d 20 3d 20 6e 4f 75 74 3b 0a 20  put[0] = nOut;. 
12710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12720 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  K;.}../*.** Merg
12730 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20 61 44  e the doclist aD
12740 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 20  oclist/nDoclist 
12750 69 6e 74 6f 20 74 68 65 20 54 65 72 6d 53 65 6c  into the TermSel
12760 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ect object passe
12770 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
12780 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
12790 6d 65 72 67 65 20 69 73 20 61 6e 20 22 4f 52 22  merge is an "OR"
127a0 20 6d 65 72 67 65 20 28 73 65 65 20 66 75 6e 63   merge (see func
127b0 74 69 6f 6e 0a 2a 2a 20 66 74 73 33 44 6f 63 6c  tion.** fts3Docl
127c0 69 73 74 4f 72 4d 65 72 67 65 28 29 20 66 6f 72  istOrMerge() for
127d0 20 64 65 74 61 69 6c 73 29 2e 0a 2a 2a 0a 2a 2a   details)..**.**
127e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
127f0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
12800 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 65 61  e doclist for ea
12810 63 68 20 74 65 72 6d 20 74 68 61 74 20 6d 61 74  ch term that mat
12820 63 68 65 73 0a 2a 2a 20 61 20 71 75 65 72 69 65  ches.** a querie
12830 64 20 70 72 65 66 69 78 2e 20 49 74 20 6d 65 72  d prefix. It mer
12840 67 65 73 20 61 6c 6c 20 74 68 65 73 65 20 64 6f  ges all these do
12850 63 6c 69 73 74 73 20 69 6e 74 6f 20 6f 6e 65 2c  clists into one,
12860 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20   the doclist.** 
12870 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
12880 64 20 70 72 65 66 69 78 2e 20 53 69 6e 63 65 20  d prefix. Since 
12890 74 68 65 72 65 20 63 61 6e 20 62 65 20 61 20 76  there can be a v
128a0 65 72 79 20 6c 61 72 67 65 20 6e 75 6d 62 65 72  ery large number
128b0 20 6f 66 0a 2a 2a 20 64 6f 63 6c 69 73 74 73 20   of.** doclists 
128c0 74 6f 20 6d 65 72 67 65 2c 20 74 68 65 20 6d 65  to merge, the me
128d0 72 67 69 6e 67 20 69 73 20 64 6f 6e 65 20 70 61  rging is done pa
128e0 69 72 2d 77 69 73 65 20 75 73 69 6e 67 20 74 68  ir-wise using th
128f0 65 20 54 65 72 6d 53 65 6c 65 63 74 0a 2a 2a 20  e TermSelect.** 
12900 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
12910 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
12920 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
12930 20 74 68 65 20 6d 65 72 67 65 20 69 73 20 73 75   the merge is su
12940 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 0a  ccessful, or an.
12950 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
12960 63 6f 64 65 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  code (SQLITE_NOM
12970 45 4d 29 20 69 66 20 61 6e 20 65 72 72 6f 72 20  EM) if an error 
12980 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
12990 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65  c int fts3TermSe
129a0 6c 65 63 74 4d 65 72 67 65 28 0a 20 20 46 74 73  lectMerge(.  Fts
129b0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
129d0 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  FTS table handle
129e0 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c 65 63 74   */.  TermSelect
129f0 20 2a 70 54 53 2c 20 20 20 20 20 20 20 20 20 20   *pTS,          
12a00 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 53 65 6c        /* TermSel
12a10 65 63 74 20 6f 62 6a 65 63 74 20 74 6f 20 6d 65  ect object to me
12a20 72 67 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 68  rge into */.  ch
12a30 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20  ar *aDoclist,   
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a50 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
12a60 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f  ist */.  int nDo
12a70 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  clist           
12a80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12a90 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69 6e 20   of aDoclist in 
12aa0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  bytes */.){.  if
12ab0 28 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b  ( pTS->aaOutput[
12ac0 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  0]==0 ){.    /* 
12ad0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
12ae0 69 72 73 74 20 74 65 72 6d 20 73 65 6c 65 63 74  irst term select
12af0 65 64 2c 20 63 6f 70 79 20 74 68 65 20 64 6f 63  ed, copy the doc
12b00 6c 69 73 74 20 74 6f 20 74 68 65 20 6f 75 74 70  list to the outp
12b10 75 74 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72  ut.    ** buffer
12b20 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
12b30 20 2a 2f 0a 20 20 20 20 70 54 53 2d 3e 61 61 4f   */.    pTS->aaO
12b40 75 74 70 75 74 5b 30 5d 20 3d 20 73 71 6c 69 74  utput[0] = sqlit
12b50 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 6f 63 6c 69  e3_malloc(nDocli
12b60 73 74 29 3b 0a 20 20 20 20 70 54 53 2d 3e 61 6e  st);.    pTS->an
12b70 4f 75 74 70 75 74 5b 30 5d 20 3d 20 6e 44 6f 63  Output[0] = nDoc
12b80 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 54  list;.    if( pT
12b90 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20 29  S->aaOutput[0] )
12ba0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
12bb0 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 2c  TS->aaOutput[0],
12bc0 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c   aDoclist, nDocl
12bd0 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
12be0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
12bf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12c00 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
12c10 68 61 72 20 2a 61 4d 65 72 67 65 20 3d 20 61 44  har *aMerge = aD
12c20 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  oclist;.    int 
12c30 6e 4d 65 72 67 65 20 3d 20 6e 44 6f 63 6c 69 73  nMerge = nDoclis
12c40 74 3b 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 3b  t;.    int iOut;
12c50 0a 0a 20 20 20 20 66 6f 72 28 69 4f 75 74 3d 30  ..    for(iOut=0
12c60 3b 20 69 4f 75 74 3c 53 69 7a 65 6f 66 41 72 72  ; iOut<SizeofArr
12c70 61 79 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  ay(pTS->aaOutput
12c80 29 3b 20 69 4f 75 74 2b 2b 29 7b 0a 20 20 20 20  ); iOut++){.    
12c90 20 20 69 66 28 20 70 54 53 2d 3e 61 61 4f 75 74    if( pTS->aaOut
12ca0 70 75 74 5b 69 4f 75 74 5d 3d 3d 30 20 29 7b 0a  put[iOut]==0 ){.
12cb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12cc0 69 4f 75 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  iOut>0 );.      
12cd0 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
12ce0 69 4f 75 74 5d 20 3d 20 61 4d 65 72 67 65 3b 0a  iOut] = aMerge;.
12cf0 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61 6e 4f          pTS->anO
12d00 75 74 70 75 74 5b 69 4f 75 74 5d 20 3d 20 6e 4d  utput[iOut] = nM
12d10 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 62 72  erge;.        br
12d20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
12d30 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
12d40 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 69 6e  aNew;.        in
12d50 74 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 20 20 20  t nNew;..       
12d60 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 44 6f   int rc = fts3Do
12d70 63 6c 69 73 74 4f 72 4d 65 72 67 65 28 70 2d 3e  clistOrMerge(p->
12d80 62 44 65 73 63 49 64 78 2c 20 61 4d 65 72 67 65  bDescIdx, aMerge
12d90 2c 20 6e 4d 65 72 67 65 2c 20 0a 20 20 20 20 20  , nMerge, .     
12da0 20 20 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75         pTS->aaOu
12db0 74 70 75 74 5b 69 4f 75 74 5d 2c 20 70 54 53 2d  tput[iOut], pTS-
12dc0 3e 61 6e 4f 75 74 70 75 74 5b 69 4f 75 74 5d 2c  >anOutput[iOut],
12dd0 20 26 61 4e 65 77 2c 20 26 6e 4e 65 77 0a 20 20   &aNew, &nNew.  
12de0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
12df0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12e00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12e10 69 66 28 20 61 4d 65 72 67 65 21 3d 61 44 6f 63  if( aMerge!=aDoc
12e20 6c 69 73 74 20 29 20 73 71 6c 69 74 65 33 5f 66  list ) sqlite3_f
12e30 72 65 65 28 61 4d 65 72 67 65 29 3b 0a 20 20 20  ree(aMerge);.   
12e40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
12e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
12e60 20 20 20 20 20 69 66 28 20 61 4d 65 72 67 65 21       if( aMerge!
12e70 3d 61 44 6f 63 6c 69 73 74 20 29 20 73 71 6c 69  =aDoclist ) sqli
12e80 74 65 33 5f 66 72 65 65 28 61 4d 65 72 67 65 29  te3_free(aMerge)
12e90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12ea0 33 5f 66 72 65 65 28 70 54 53 2d 3e 61 61 4f 75  3_free(pTS->aaOu
12eb0 74 70 75 74 5b 69 4f 75 74 5d 29 3b 0a 20 20 20  tput[iOut]);.   
12ec0 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70       pTS->aaOutp
12ed0 75 74 5b 69 4f 75 74 5d 20 3d 20 30 3b 0a 20 20  ut[iOut] = 0;.  
12ee0 0a 20 20 20 20 20 20 20 20 61 4d 65 72 67 65 20  .        aMerge 
12ef0 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
12f00 6e 4d 65 72 67 65 20 3d 20 6e 4e 65 77 3b 0a 20  nMerge = nNew;. 
12f10 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 75 74         if( (iOut
12f20 2b 31 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79  +1)==SizeofArray
12f30 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 29 20  (pTS->aaOutput) 
12f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 53  ){.          pTS
12f50 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75 74 5d  ->aaOutput[iOut]
12f60 20 3d 20 61 4d 65 72 67 65 3b 0a 20 20 20 20 20   = aMerge;.     
12f70 20 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70       pTS->anOutp
12f80 75 74 5b 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67  ut[iOut] = nMerg
12f90 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
12fa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12fc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  K;.}../*.** Appe
12fd0 6e 64 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  nd SegReader obj
12fe0 65 63 74 20 70 4e 65 77 20 74 6f 20 74 68 65 20  ect pNew to the 
12ff0 65 6e 64 20 6f 66 20 74 68 65 20 70 43 73 72 2d  end of the pCsr-
13000 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72  >apSegment[] arr
13010 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
13020 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  t fts3SegReaderC
13030 75 72 73 6f 72 41 70 70 65 6e 64 28 0a 20 20 46  ursorAppend(.  F
13040 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
13050 72 20 2a 70 43 73 72 2c 20 0a 20 20 46 74 73 33  r *pCsr, .  Fts3
13060 53 65 67 52 65 61 64 65 72 20 2a 70 4e 65 77 0a  SegReader *pNew.
13070 29 7b 0a 20 20 69 66 28 20 28 70 43 73 72 2d 3e  ){.  if( (pCsr->
13080 6e 53 65 67 6d 65 6e 74 25 31 36 29 3d 3d 30 20  nSegment%16)==0 
13090 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52 65  ){.    Fts3SegRe
130a0 61 64 65 72 20 2a 2a 61 70 4e 65 77 3b 0a 20 20  ader **apNew;.  
130b0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
130c0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 2b 20  Csr->nSegment + 
130d0 31 36 29 2a 73 69 7a 65 6f 66 28 46 74 73 33 53  16)*sizeof(Fts3S
130e0 65 67 52 65 61 64 65 72 2a 29 3b 0a 20 20 20 20  egReader*);.    
130f0 61 70 4e 65 77 20 3d 20 28 46 74 73 33 53 65 67  apNew = (Fts3Seg
13100 52 65 61 64 65 72 20 2a 2a 29 73 71 6c 69 74 65  Reader **)sqlite
13110 33 5f 72 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e  3_realloc(pCsr->
13120 61 70 53 65 67 6d 65 6e 74 2c 20 6e 42 79 74 65  apSegment, nByte
13130 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
13140 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
13150 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46  e3Fts3SegReaderF
13160 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
13170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13180 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
13190 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20  pCsr->apSegment 
131a0 3d 20 61 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70  = apNew;.  }.  p
131b0 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 70  Csr->apSegment[p
131c0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 5d  Csr->nSegment++]
131d0 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
131e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
131f0 2f 2a 0a 2a 2a 20 41 64 64 20 73 65 67 2d 72 65  /*.** Add seg-re
13200 61 64 65 72 20 6f 62 6a 65 63 74 73 20 74 6f 20  ader objects to 
13210 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67  the Fts3MultiSeg
13220 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61  Reader object pa
13230 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 38  ssed as the.** 8
13240 74 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  th argument..**.
13250 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13260 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
13270 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
13280 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
13290 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f 74 68  rror code.** oth
132a0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
132b0 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
132c0 64 65 72 43 75 72 73 6f 72 28 0a 20 20 46 74 73  derCursor(.  Fts
132d0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
132f0 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
13300 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  e */.  int iInde
13310 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
13320 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
13330 74 6f 20 73 65 61 72 63 68 20 28 66 72 6f 6d 20  to search (from 
13340 30 20 74 6f 20 70 2d 3e 6e 49 6e 64 65 78 2d 31  0 to p->nIndex-1
13350 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  ) */.  int iLeve
13360 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
13370 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
13380 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 73  of segments to s
13390 63 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  can */.  const c
133a0 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
133b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
133c0 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
133d0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
13400 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
13410 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 2c 20    int isPrefix, 
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
13440 70 72 65 66 69 78 20 73 65 61 72 63 68 20 2a 2f  prefix search */
13450 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 2c 20 20  .  int isScan,  
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63     /* True to sc
13480 61 6e 20 66 72 6f 6d 20 7a 54 65 72 6d 20 74 6f  an from zTerm to
13490 20 45 4f 46 20 2a 2f 0a 20 20 46 74 73 33 4d 75   EOF */.  Fts3Mu
134a0 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
134b0 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr        /* Cur
134c0 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f  sor object to po
134d0 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  pulate */.){.  i
134e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
134f0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
13500 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  * Error code */.
13510 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
13520 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20  pStmt = 0;      
13530 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74    /* Statement t
13540 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
13550 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  h segments */.  
13560 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20 20  int rc2;        
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 73 71 6c  /* Result of sql
13590 69 74 65 33 5f 72 65 73 65 74 28 29 20 2a 2f 0a  ite3_reset() */.
135a0 0a 20 20 2f 2a 20 49 66 20 69 4c 65 76 65 6c 20  .  /* If iLevel 
135b0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 30 20 61  is less than 0 a
135c0 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  nd this is not a
135d0 20 73 63 61 6e 2c 20 69 6e 63 6c 75 64 65 20 61   scan, include a
135e0 20 73 65 67 2d 72 65 61 64 65 72 20 0a 20 20 2a   seg-reader .  *
135f0 2a 20 66 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  * for the pendin
13600 67 2d 74 65 72 6d 73 2e 20 49 66 20 74 68 69 73  g-terms. If this
13610 20 69 73 20 61 20 73 63 61 6e 2c 20 74 68 65 6e   is a scan, then
13620 20 74 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   this call must 
13630 62 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 6d 61  be being.  ** ma
13640 64 65 20 62 79 20 61 6e 20 66 74 73 34 61 75 78  de by an fts4aux
13650 20 6d 6f 64 75 6c 65 2c 20 6e 6f 74 20 61 6e 20   module, not an 
13660 46 54 53 20 74 61 62 6c 65 2e 20 49 6e 20 74 68  FTS table. In th
13670 69 73 20 63 61 73 65 20 63 61 6c 6c 69 6e 67 0a  is case calling.
13680 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61 64    ** Fts3SegRead
13690 65 72 50 65 6e 64 69 6e 67 20 6d 69 67 68 74 20  erPending might 
136a0 73 65 67 66 61 75 6c 74 2c 20 61 73 20 74 68 65  segfault, as the
136b0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
136c0 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 66   used by .  ** f
136d0 74 73 34 61 75 78 20 61 72 65 20 6e 6f 74 20 63  ts4aux are not c
136e0 6f 6d 70 6c 65 74 65 6c 79 20 70 6f 70 75 6c 61  ompletely popula
136f0 74 65 64 2e 20 53 6f 20 69 74 27 73 20 65 61 73  ted. So it's eas
13700 69 65 73 74 20 74 6f 20 66 69 6c 74 65 72 20 74  iest to filter t
13710 68 65 73 65 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  hese.  ** calls 
13720 6f 75 74 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  out here.  */.  
13730 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 26 26 20  if( iLevel<0 && 
13740 70 2d 3e 61 49 6e 64 65 78 20 29 7b 0a 20 20 20  p->aIndex ){.   
13750 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
13760 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 72 63  pSeg = 0;.    rc
13770 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65   = sqlite3Fts3Se
13780 67 52 65 61 64 65 72 50 65 6e 64 69 6e 67 28 70  gReaderPending(p
13790 2c 20 69 49 6e 64 65 78 2c 20 7a 54 65 72 6d 2c  , iIndex, zTerm,
137a0 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66 69 78   nTerm, isPrefix
137b0 2c 20 26 70 53 65 67 29 3b 0a 20 20 20 20 69 66  , &pSeg);.    if
137c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
137d0 26 26 20 70 53 65 67 20 29 7b 0a 20 20 20 20 20  && pSeg ){.     
137e0 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
137f0 64 65 72 43 75 72 73 6f 72 41 70 70 65 6e 64 28  derCursorAppend(
13800 70 43 73 72 2c 20 70 53 65 67 29 3b 0a 20 20 20  pCsr, pSeg);.   
13810 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4c   }.  }..  if( iL
13820 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55  evel!=FTS3_SEGCU
13830 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a  RSOR_PENDING ){.
13840 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13860 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 41  c = sqlite3Fts3A
13870 6c 6c 53 65 67 64 69 72 73 28 70 2c 20 69 49 6e  llSegdirs(p, iIn
13880 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20 26 70 53  dex, iLevel, &pS
13890 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tmt);.    }..   
138a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
138b0 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
138c0 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  ROW==(rc = sqlit
138d0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 29 20  e3_step(pStmt)) 
138e0 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67  ){.      Fts3Seg
138f0 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 30  Reader *pSeg = 0
13900 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64  ;..      /* Read
13910 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75   the values retu
13920 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
13930 43 54 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61  CT into local va
13940 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20  riables. */.    
13950 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
13960 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d 20 73 71  iStartBlock = sq
13970 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13980 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
13990 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
139a0 34 20 69 4c 65 61 76 65 73 45 6e 64 42 6c 6f 63  4 iLeavesEndBloc
139b0 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  k = sqlite3_colu
139c0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
139d0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
139e0 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63  3_int64 iEndBloc
139f0 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  k = sqlite3_colu
13a00 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
13a10 33 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52  3);.      int nR
13a20 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  oot = sqlite3_co
13a30 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
13a40 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 68 61 72  , 4);.      char
13a50 20 63 6f 6e 73 74 20 2a 7a 52 6f 6f 74 20 3d 20   const *zRoot = 
13a60 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
13a70 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 3b 0a 0a  lob(pStmt, 4);..
13a80 20 20 20 20 20 20 2f 2a 20 49 66 20 7a 54 65 72        /* If zTer
13a90 6d 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  m is not NULL, a
13aa0 6e 64 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20  nd this segment 
13ab0 69 73 20 6e 6f 74 20 73 74 6f 72 65 64 20 65 6e  is not stored en
13ac0 74 69 72 65 6c 79 20 6f 6e 20 69 74 73 0a 20 20  tirely on its.  
13ad0 20 20 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65      ** root node
13ae0 2c 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 6c  , the range of l
13af0 65 61 76 65 73 20 73 63 61 6e 6e 65 64 20 63 61  eaves scanned ca
13b00 6e 20 62 65 20 72 65 64 75 63 65 64 2e 20 44 6f  n be reduced. Do
13b10 20 74 68 69 73 2e 20 2a 2f 0a 20 20 20 20 20 20   this. */.      
13b20 69 66 28 20 69 53 74 61 72 74 42 6c 6f 63 6b 20  if( iStartBlock 
13b30 26 26 20 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20  && zTerm ){.    
13b40 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
13b50 34 20 2a 70 69 20 3d 20 28 69 73 50 72 65 66 69  4 *pi = (isPrefi
13b60 78 20 3f 20 26 69 4c 65 61 76 65 73 45 6e 64 42  x ? &iLeavesEndB
13b70 6c 6f 63 6b 20 3a 20 30 29 3b 0a 20 20 20 20 20  lock : 0);.     
13b80 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 6c 65     rc = fts3Sele
13b90 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72 6d 2c  ctLeaf(p, zTerm,
13ba0 20 6e 54 65 72 6d 2c 20 7a 52 6f 6f 74 2c 20 6e   nTerm, zRoot, n
13bb0 52 6f 6f 74 2c 20 26 69 53 74 61 72 74 42 6c 6f  Root, &iStartBlo
13bc0 63 6b 2c 20 70 69 29 3b 0a 20 20 20 20 20 20 20  ck, pi);.       
13bd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13be0 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
13bf0 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
13c00 69 73 50 72 65 66 69 78 3d 3d 30 20 26 26 20 69  isPrefix==0 && i
13c10 73 53 63 61 6e 3d 3d 30 20 29 20 69 4c 65 61 76  sScan==0 ) iLeav
13c20 65 73 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 53 74  esEndBlock = iSt
13c30 61 72 74 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  artBlock;.      
13c40 7d 0a 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73  }. .      rc = s
13c50 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
13c60 64 65 72 4e 65 77 28 70 43 73 72 2d 3e 6e 53 65  derNew(pCsr->nSe
13c70 67 6d 65 6e 74 2b 31 2c 20 0a 20 20 20 20 20 20  gment+1, .      
13c80 20 20 20 20 69 53 74 61 72 74 42 6c 6f 63 6b 2c      iStartBlock,
13c90 20 69 4c 65 61 76 65 73 45 6e 64 42 6c 6f 63 6b   iLeavesEndBlock
13ca0 2c 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 7a 52 6f  , iEndBlock, zRo
13cb0 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 70 53 65 67  ot, nRoot, &pSeg
13cc0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
13cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13ce0 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65  K ) goto finishe
13cf0 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  d;.      rc = ft
13d00 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
13d10 72 41 70 70 65 6e 64 28 70 43 73 72 2c 20 70 53  rAppend(pCsr, pS
13d20 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eg);.    }.  }..
13d30 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 72 63 32   finished:.  rc2
13d40 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
13d50 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
13d60 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
13d70 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 72 65   rc = rc2;..  re
13d80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13d90 2a 20 53 65 74 20 75 70 20 61 20 63 75 72 73 6f  * Set up a curso
13da0 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 69 74 65  r object for ite
13db0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
13dc0 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
13dd0 20 6f 72 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65   or a .** single
13de0 20 6c 65 76 65 6c 20 74 68 65 72 65 69 6e 2e 0a   level therein..
13df0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
13e00 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
13e10 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  r(.  Fts3Table *
13e20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13e30 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
13e40 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
13e50 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e70 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72 63  * Index to searc
13e80 68 20 28 66 72 6f 6d 20 30 20 74 6f 20 70 2d 3e  h (from 0 to p->
13e90 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69  nIndex-1) */.  i
13ea0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ec0 2a 20 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65  * Level of segme
13ed0 6e 74 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20  nts to scan */. 
13ee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
13ef0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
13f00 20 2f 2a 20 54 65 72 6d 20 74 6f 20 71 75 65 72   /* Term to quer
13f10 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  y for */.  int n
13f20 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
13f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
13f40 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
13f50 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ytes */.  int is
13f60 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20 20  Prefix,         
13f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13f80 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20 73  e for a prefix s
13f90 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
13fa0 73 53 63 61 6e 2c 20 20 20 20 20 20 20 20 20 20  sScan,          
13fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13fc0 75 65 20 74 6f 20 73 63 61 6e 20 66 72 6f 6d 20  ue to scan from 
13fd0 7a 54 65 72 6d 20 74 6f 20 45 4f 46 20 2a 2f 0a  zTerm to EOF */.
13fe0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
13ff0 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
14000 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63   /* Cursor objec
14010 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
14020 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  .){.  assert( iI
14030 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65  ndex>=0 && iInde
14040 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 20  x<p->nIndex );. 
14050 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d   assert( iLevel=
14060 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
14070 41 4c 4c 0a 20 20 20 20 20 20 7c 7c 20 20 69 4c  ALL.      ||  iL
14080 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
14090 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 0a 20 20  RSOR_PENDING .  
140a0 20 20 20 20 7c 7c 20 20 69 4c 65 76 65 6c 3e 3d      ||  iLevel>=
140b0 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  0.  );.  assert(
140c0 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 47   iLevel<FTS3_SEG
140d0 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a  DIR_MAXLEVEL );.
140e0 20 20 61 73 73 65 72 74 28 20 46 54 53 33 5f 53    assert( FTS3_S
140f0 45 47 43 55 52 53 4f 52 5f 41 4c 4c 3c 30 20 26  EGCURSOR_ALL<0 &
14100 26 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  & FTS3_SEGCURSOR
14110 5f 50 45 4e 44 49 4e 47 3c 30 20 29 3b 0a 20 20  _PENDING<0 );.  
14120 61 73 73 65 72 74 28 20 69 73 50 72 65 66 69 78  assert( isPrefix
14130 3d 3d 30 20 7c 7c 20 69 73 53 63 61 6e 3d 3d 30  ==0 || isScan==0
14140 20 29 3b 0a 0a 20 20 2f 2a 20 22 69 73 53 63 61   );..  /* "isSca
14150 6e 22 20 69 73 20 6f 6e 6c 79 20 73 65 74 20 74  n" is only set t
14160 6f 20 74 72 75 65 20 62 79 20 74 68 65 20 66 74  o true by the ft
14170 34 61 75 78 20 6d 6f 64 75 6c 65 2c 20 61 6e 20  4aux module, an 
14180 6f 72 64 69 6e 61 72 79 0a 20 20 2a 2a 20 66 75  ordinary.  ** fu
14190 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 73 2e 20  ll-text tables. 
141a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
141b0 63 61 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 61 49 6e  can==0 || p->aIn
141c0 64 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 6d 65 6d  dex==0 );..  mem
141d0 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a  set(pCsr, 0, siz
141e0 65 6f 66 28 46 74 73 33 4d 75 6c 74 69 53 65 67  eof(Fts3MultiSeg
141f0 52 65 61 64 65 72 29 29 3b 0a 0a 20 20 72 65 74  Reader));..  ret
14200 75 72 6e 20 66 74 73 33 53 65 67 52 65 61 64 65  urn fts3SegReade
14210 72 43 75 72 73 6f 72 28 0a 20 20 20 20 20 20 70  rCursor(.      p
14220 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
14230 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
14240 69 73 50 72 65 66 69 78 2c 20 69 73 53 63 61 6e  isPrefix, isScan
14250 2c 20 70 43 73 72 0a 20 20 29 3b 0a 7d 0a 0a 2f  , pCsr.  );.}../
14260 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e  *.** In addition
14270 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
14280 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 20 68  configuration, h
14290 61 76 65 20 74 68 65 20 46 74 73 33 4d 75 6c 74  ave the Fts3Mult
142a0 69 53 65 67 52 65 61 64 65 72 0a 2a 2a 20 70 61  iSegReader.** pa
142b0 73 73 65 64 20 61 73 20 74 68 65 20 34 74 68 20  ssed as the 4th 
142c0 61 72 67 75 6d 65 6e 74 20 61 6c 73 6f 20 73 63  argument also sc
142d0 61 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66  an the doclist f
142e0 6f 72 20 74 65 72 6d 20 7a 54 65 72 6d 2f 6e 54  or term zTerm/nT
142f0 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  erm..**.** SQLIT
14300 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14310 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
14320 75 72 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  urs, otherwise a
14330 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
14340 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
14350 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
14360 43 75 72 73 6f 72 41 64 64 5a 65 72 6f 28 0a 20  CursorAddZero(. 
14370 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 2f 2a 20 46 54 53 20 76 69 72 74 75 61 6c 20   /* FTS virtual 
143a0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
143b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
143c0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
143d0 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 63 61    /* Term to sca
143e0 6e 20 64 6f 63 6c 69 73 74 20 6f 66 20 2a 2f 0a  n doclist of */.
143f0 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14420 79 74 65 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f  ytes in zTerm */
14430 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
14440 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
14450 20 20 20 2f 2a 20 46 74 73 33 4d 75 6c 74 69 53     /* Fts3MultiS
14460 65 67 52 65 61 64 65 72 20 74 6f 20 6d 6f 64 69  egReader to modi
14470 66 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  fy */.){.  retur
14480 6e 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  n fts3SegReaderC
14490 75 72 73 6f 72 28 70 2c 20 30 2c 20 46 54 53 33  ursor(p, 0, FTS3
144a0 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 20  _SEGCURSOR_ALL, 
144b0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 30 2c  zTerm, nTerm, 0,
144c0 20 30 2c 70 43 73 72 29 3b 0a 7d 0a 0a 2f 2a 0a   0,pCsr);.}../*.
144d0 2a 2a 20 4f 70 65 6e 20 61 6e 20 46 74 73 33 4d  ** Open an Fts3M
144e0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 74 6f  ultiSegReader to
144f0 20 73 63 61 6e 20 74 68 65 20 64 6f 63 6c 69 73   scan the doclis
14500 74 20 66 6f 72 20 74 65 72 6d 20 7a 54 65 72 6d  t for term zTerm
14510 2f 6e 54 65 72 6d 2e 20 4f 72 2c 0a 2a 2a 20 69  /nTerm. Or,.** i
14520 66 20 69 73 50 72 65 66 69 78 20 69 73 20 74 72  f isPrefix is tr
14530 75 65 2c 20 74 6f 20 73 63 61 6e 20 74 68 65 20  ue, to scan the 
14540 64 6f 63 6c 69 73 74 20 66 6f 72 20 61 6c 6c 20  doclist for all 
14550 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20  terms for which 
14560 0a 2a 2a 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20  .** zTerm/nTerm 
14570 69 73 20 61 20 70 72 65 66 69 78 2e 20 49 66 20  is a prefix. If 
14580 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
14590 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
145a0 20 77 72 69 74 65 0a 2a 2a 20 61 20 70 6f 69 6e   write.** a poin
145b0 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 46  ter to the new F
145c0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
145d0 72 20 74 6f 20 2a 70 70 53 65 67 63 73 72 2e 20  r to *ppSegcsr. 
145e0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
145f0 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65  n.** an SQLite e
14600 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
14610 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
14620 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
14630 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
14640 74 68 69 73 20 6f 62 6a 65 63 74 20 62 79 20 65  this object by e
14650 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 70 61 73  ventually.** pas
14660 73 69 6e 67 20 69 74 20 74 6f 20 66 74 73 33 53  sing it to fts3S
14670 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 46 72  egReaderCursorFr
14680 65 65 28 29 20 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ee() .**.** SQLI
14690 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
146a0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
146b0 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73 65 20  curs, otherwise 
146c0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
146d0 63 6f 64 65 2e 0a 2a 2a 20 4f 75 74 70 75 74 20  code..** Output 
146e0 70 61 72 61 6d 65 74 65 72 20 2a 70 70 53 65 67  parameter *ppSeg
146f0 63 73 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  csr is set to 0 
14700 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
14710 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
14720 74 20 66 74 73 33 54 65 72 6d 53 65 67 52 65 61  t fts3TermSegRea
14730 64 65 72 43 75 72 73 6f 72 28 0a 20 20 46 74 73  derCursor(.  Fts
14740 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  3Cursor *pCsr,  
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14760 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  Virtual table cu
14770 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  rsor handle */. 
14780 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
14790 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
147a0 20 2f 2a 20 54 65 72 6d 20 74 6f 20 71 75 65 72   /* Term to quer
147b0 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  y for */.  int n
147c0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
147d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
147e0 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
147f0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ytes */.  int is
14800 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20 20  Prefix,         
14810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14820 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20 73  e for a prefix s
14830 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 33 4d  earch */.  Fts3M
14840 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 2a  ultiSegReader **
14850 70 70 53 65 67 63 73 72 20 20 20 2f 2a 20 4f 55  ppSegcsr   /* OU
14860 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20 73 65 67  T: Allocated seg
14870 2d 72 65 61 64 65 72 20 63 75 72 73 6f 72 20 2a  -reader cursor *
14880 2f 0a 29 7b 0a 20 20 46 74 73 33 4d 75 6c 74 69  /.){.  Fts3Multi
14890 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 63  SegReader *pSegc
148a0 73 72 3b 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74  sr;    /* Object
148b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
148c0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
148d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
148e0 45 4d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  EM;          /* 
148f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
14900 20 20 70 53 65 67 63 73 72 20 3d 20 73 71 6c 69    pSegcsr = sqli
14910 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
14920 66 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  f(Fts3MultiSegRe
14930 61 64 65 72 29 29 3b 0a 20 20 69 66 28 20 70 53  ader));.  if( pS
14940 65 67 63 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  egcsr ){.    int
14950 20 69 3b 0a 20 20 20 20 69 6e 74 20 62 46 6f 75   i;.    int bFou
14960 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nd = 0;         
14970 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 6f 6e        /* True on
14980 63 65 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  ce an index has 
14990 62 65 65 6e 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  been found */.  
149a0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
149b0 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
149c0 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
149d0 0a 20 20 20 20 69 66 28 20 69 73 50 72 65 66 69  .    if( isPrefi
149e0 78 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  x ){.      for(i
149f0 3d 31 3b 20 62 46 6f 75 6e 64 3d 3d 30 20 26 26  =1; bFound==0 &&
14a00 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b   i<p->nIndex; i+
14a10 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
14a20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 6e 50 72  p->aIndex[i].nPr
14a30 65 66 69 78 3d 3d 6e 54 65 72 6d 20 29 7b 0a 20  efix==nTerm ){. 
14a40 20 20 20 20 20 20 20 20 20 62 46 6f 75 6e 64 20           bFound 
14a50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 1;.          r
14a60 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
14a70 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a  egReaderCursor(.
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
14a90 20 69 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53   i, FTS3_SEGCURS
14aa0 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72 6d 2c 20 6e  OR_ALL, zTerm, n
14ab0 54 65 72 6d 2c 20 30 2c 20 30 2c 20 70 53 65 67  Term, 0, 0, pSeg
14ac0 63 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  csr);.          
14ad0 70 53 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70  pSegcsr->bLookup
14ae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
14af0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
14b00 6f 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d 3d  or(i=1; bFound==
14b10 30 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78  0 && i<p->nIndex
14b20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14b30 69 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d  if( p->aIndex[i]
14b40 2e 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d 2b  .nPrefix==nTerm+
14b50 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  1 ){.          b
14b60 46 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20  Found = 1;.     
14b70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b80 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
14b90 72 73 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20  rsor(.          
14ba0 20 20 20 20 70 2c 20 69 2c 20 46 54 53 33 5f 53      p, i, FTS3_S
14bb0 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54  EGCURSOR_ALL, zT
14bc0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 31 2c 20 30  erm, nTerm, 1, 0
14bd0 2c 20 70 53 65 67 63 73 72 0a 20 20 20 20 20 20  , pSegcsr.      
14be0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
14bf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14c00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
14c10 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
14c20 61 64 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72  aderCursorAddZer
14c30 6f 28 70 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  o(p, zTerm, nTer
14c40 6d 2c 20 70 53 65 67 63 73 72 29 3b 0a 20 20 20  m, pSegcsr);.   
14c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14c60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14c70 0a 0a 20 20 20 20 69 66 28 20 62 46 6f 75 6e 64  ..    if( bFound
14c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
14c90 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
14ca0 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a 20 20  ReaderCursor(.  
14cb0 20 20 20 20 20 20 20 20 70 2c 20 30 2c 20 46 54          p, 0, FT
14cc0 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
14cd0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
14ce0 69 73 50 72 65 66 69 78 2c 20 30 2c 20 70 53 65  isPrefix, 0, pSe
14cf0 67 63 73 72 0a 20 20 20 20 20 20 29 3b 0a 20 20  gcsr.      );.  
14d00 20 20 20 20 70 53 65 67 63 73 72 2d 3e 62 4c 6f      pSegcsr->bLo
14d10 6f 6b 75 70 20 3d 20 21 69 73 50 72 65 66 69 78  okup = !isPrefix
14d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
14d30 70 70 53 65 67 63 73 72 20 3d 20 70 53 65 67 63  ppSegcsr = pSegc
14d40 73 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sr;.  return rc;
14d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
14d60 6e 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  n Fts3MultiSegRe
14d70 61 64 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ader allocated b
14d80 79 20 66 74 73 33 54 65 72 6d 53 65 67 52 65 61  y fts3TermSegRea
14d90 64 65 72 43 75 72 73 6f 72 28 29 2e 0a 2a 2f 0a  derCursor()..*/.
14da0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
14db0 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 46  SegReaderCursorF
14dc0 72 65 65 28 46 74 73 33 4d 75 6c 74 69 53 65 67  ree(Fts3MultiSeg
14dd0 52 65 61 64 65 72 20 2a 70 53 65 67 63 73 72 29  Reader *pSegcsr)
14de0 7b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  {.  sqlite3Fts3S
14df0 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 70  egReaderFinish(p
14e00 53 65 67 63 73 72 29 3b 0a 20 20 73 71 6c 69 74  Segcsr);.  sqlit
14e10 65 33 5f 66 72 65 65 28 70 53 65 67 63 73 72 29  e3_free(pSegcsr)
14e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
14e30 66 75 6e 63 74 69 6f 6e 20 72 65 74 72 65 69 76  function retreiv
14e40 65 73 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66  es the doclist f
14e50 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
14e60 20 74 65 72 6d 20 28 6f 72 20 74 65 72 6d 0a 2a   term (or term.*
14e70 2a 20 70 72 65 66 69 78 29 20 66 72 6f 6d 20 74  * prefix) from t
14e80 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
14e90 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54  static int fts3T
14ea0 65 72 6d 53 65 6c 65 63 74 28 0a 20 20 46 74 73  ermSelect(.  Fts
14eb0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ed0 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
14ee0 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 50 68  ndle */.  Fts3Ph
14ef0 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 2c  raseToken *pTok,
14f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b            /* Tok
14f10 65 6e 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  en to query for 
14f20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
14f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14f40 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
14f50 6f 20 71 75 65 72 79 20 28 6f 72 20 2d 76 65 20  o query (or -ve 
14f60 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 29  for all columns)
14f70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74   */.  int *pnOut
14f80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14f90 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
14fa0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
14fb0 2a 70 70 4f 75 74 20 2a 2f 0a 20 20 63 68 61 72  *ppOut */.  char
14fc0 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14fe0 55 54 3a 20 4d 61 6c 6c 6f 63 65 64 20 72 65 73  UT: Malloced res
14ff0 75 6c 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  ult buffer */.){
15000 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
15030 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  e */.  Fts3Multi
15040 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 63  SegReader *pSegc
15050 73 72 3b 20 20 20 20 2f 2a 20 53 65 67 2d 72 65  sr;    /* Seg-re
15060 61 64 65 72 20 63 75 72 73 6f 72 20 66 6f 72 20  ader cursor for 
15070 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 54  this term */.  T
15080 65 72 6d 53 65 6c 65 63 74 20 74 73 63 3b 20 20  ermSelect tsc;  
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
150a0 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 70 61 69  * Object for pai
150b0 72 2d 77 69 73 65 20 64 6f 63 6c 69 73 74 20 6d  r-wise doclist m
150c0 65 72 67 69 6e 67 20 2a 2f 0a 20 20 46 74 73 33  erging */.  Fts3
150d0 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72  SegFilter filter
150e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
150f0 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74  egment term filt
15100 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
15110 20 2a 2f 0a 0a 20 20 70 53 65 67 63 73 72 20 3d   */..  pSegcsr =
15120 20 70 54 6f 6b 2d 3e 70 53 65 67 63 73 72 3b 0a   pTok->pSegcsr;.
15130 20 20 6d 65 6d 73 65 74 28 26 74 73 63 2c 20 30    memset(&tsc, 0
15140 2c 20 73 69 7a 65 6f 66 28 54 65 72 6d 53 65 6c  , sizeof(TermSel
15150 65 63 74 29 29 3b 0a 0a 20 20 66 69 6c 74 65 72  ect));..  filter
15160 2e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45  .flags = FTS3_SE
15170 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50  GMENT_IGNORE_EMP
15180 54 59 20 7c 20 46 54 53 33 5f 53 45 47 4d 45 4e  TY | FTS3_SEGMEN
15190 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 0a 20 20  T_REQUIRE_POS.  
151a0 20 20 20 20 20 20 7c 20 28 70 54 6f 6b 2d 3e 69        | (pTok->i
151b0 73 50 72 65 66 69 78 20 3f 20 46 54 53 33 5f 53  sPrefix ? FTS3_S
151c0 45 47 4d 45 4e 54 5f 50 52 45 46 49 58 20 3a 20  EGMENT_PREFIX : 
151d0 30 29 0a 20 20 20 20 20 20 20 20 7c 20 28 69 43  0).        | (iC
151e0 6f 6c 75 6d 6e 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e  olumn<p->nColumn
151f0 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   ? FTS3_SEGMENT_
15200 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 20 3a 20  COLUMN_FILTER : 
15210 30 29 3b 0a 20 20 66 69 6c 74 65 72 2e 69 43 6f  0);.  filter.iCo
15220 6c 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 66  l = iColumn;.  f
15230 69 6c 74 65 72 2e 7a 54 65 72 6d 20 3d 20 70 54  ilter.zTerm = pT
15240 6f 6b 2d 3e 7a 3b 0a 20 20 66 69 6c 74 65 72 2e  ok->z;.  filter.
15250 6e 54 65 72 6d 20 3d 20 70 54 6f 6b 2d 3e 6e 3b  nTerm = pTok->n;
15260 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
15270 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  Fts3SegReaderSta
15280 72 74 28 70 2c 20 70 53 65 67 63 73 72 2c 20 26  rt(p, pSegcsr, &
15290 66 69 6c 74 65 72 29 3b 0a 20 20 77 68 69 6c 65  filter);.  while
152a0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a  ( SQLITE_OK==rc.
152b0 20 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f        && SQLITE_
152c0 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  ROW==(rc = sqlit
152d0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
152e0 74 65 70 28 70 2c 20 70 53 65 67 63 73 72 29 29  tep(p, pSegcsr))
152f0 20 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   .  ){.    rc = 
15300 66 74 73 33 54 65 72 6d 53 65 6c 65 63 74 4d 65  fts3TermSelectMe
15310 72 67 65 28 70 2c 20 26 74 73 63 2c 20 70 53 65  rge(p, &tsc, pSe
15320 67 63 73 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20  gcsr->aDoclist, 
15330 70 53 65 67 63 73 72 2d 3e 6e 44 6f 63 6c 69 73  pSegcsr->nDoclis
15340 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
15350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15360 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 65 72      rc = fts3Ter
15370 6d 53 65 6c 65 63 74 46 69 6e 69 73 68 4d 65 72  mSelectFinishMer
15380 67 65 28 70 2c 20 26 74 73 63 29 3b 0a 20 20 7d  ge(p, &tsc);.  }
15390 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
153a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 4f  E_OK ){.    *ppO
153b0 75 74 20 3d 20 74 73 63 2e 61 61 4f 75 74 70 75  ut = tsc.aaOutpu
153c0 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 4f 75 74  t[0];.    *pnOut
153d0 20 3d 20 74 73 63 2e 61 6e 4f 75 74 70 75 74 5b   = tsc.anOutput[
153e0 30 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0];.  }else{.   
153f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
15400 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72  i=0; i<SizeofArr
15410 61 79 28 74 73 63 2e 61 61 4f 75 74 70 75 74 29  ay(tsc.aaOutput)
15420 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
15430 6c 69 74 65 33 5f 66 72 65 65 28 74 73 63 2e 61  lite3_free(tsc.a
15440 61 4f 75 74 70 75 74 5b 69 5d 29 3b 0a 20 20 20  aOutput[i]);.   
15450 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 33 53 65   }.  }..  fts3Se
15460 67 52 65 61 64 65 72 43 75 72 73 6f 72 46 72 65  gReaderCursorFre
15470 65 28 70 53 65 67 63 73 72 29 3b 0a 20 20 70 54  e(pSegcsr);.  pT
15480 6f 6b 2d 3e 70 53 65 67 63 73 72 20 3d 20 30 3b  ok->pSegcsr = 0;
15490 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
154a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
154b0 74 69 6f 6e 20 63 6f 75 6e 74 73 20 74 68 65 20  tion counts the 
154c0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
154d0 64 6f 63 69 64 73 20 69 6e 20 74 68 65 20 64 6f  docids in the do
154e0 63 6c 69 73 74 20 73 74 6f 72 65 64 0a 2a 2a 20  clist stored.** 
154f0 69 6e 20 62 75 66 66 65 72 20 61 4c 69 73 74 5b  in buffer aList[
15500 5d 2c 20 73 69 7a 65 20 6e 4c 69 73 74 20 62 79  ], size nList by
15510 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  tes..**.** If th
15520 65 20 69 73 50 6f 73 6c 69 73 74 20 61 72 67 75  e isPoslist argu
15530 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  ment is true, th
15540 65 6e 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  en it is assumed
15550 20 74 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73   that the doclis
15560 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  t.** contains a 
15570 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f  position-list fo
15580 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 64 6f 63  llowing each doc
15590 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  id. Otherwise, i
155a0 74 20 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20  t is assumed.** 
155b0 74 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73 74  that the doclist
155c0 20 69 73 20 73 69 6d 70 6c 79 20 61 20 6c 69 73   is simply a lis
155d0 74 20 6f 66 20 64 6f 63 69 64 73 20 73 74 6f 72  t of docids stor
155e0 65 64 20 61 73 20 64 65 6c 74 61 20 65 6e 63 6f  ed as delta enco
155f0 64 65 64 20 0a 2a 2a 20 76 61 72 69 6e 74 73 2e  ded .** varints.
15600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
15610 74 73 33 44 6f 63 6c 69 73 74 43 6f 75 6e 74 44  ts3DoclistCountD
15620 6f 63 69 64 73 28 63 68 61 72 20 2a 61 4c 69 73  ocids(char *aLis
15630 74 2c 20 69 6e 74 20 6e 4c 69 73 74 29 7b 0a 20  t, int nList){. 
15640 20 69 6e 74 20 6e 44 6f 63 20 3d 20 30 3b 20 20   int nDoc = 0;  
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
15670 20 2a 2f 0a 20 20 69 66 28 20 61 4c 69 73 74 20   */.  if( aList 
15680 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61 45 6e  ){.    char *aEn
15690 64 20 3d 20 26 61 4c 69 73 74 5b 6e 4c 69 73 74  d = &aList[nList
156a0 5d 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ];   /* Pointer 
156b0 74 6f 20 6f 6e 65 20 62 79 74 65 20 61 66 74 65  to one byte afte
156c0 72 20 45 4f 46 20 2a 2f 0a 20 20 20 20 63 68 61  r EOF */.    cha
156d0 72 20 2a 70 20 3d 20 61 4c 69 73 74 3b 20 20 20  r *p = aList;   
156e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
156f0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 77 68 69 6c  rsor */.    whil
15700 65 28 20 70 3c 61 45 6e 64 20 29 7b 0a 20 20 20  e( p<aEnd ){.   
15710 20 20 20 6e 44 6f 63 2b 2b 3b 0a 20 20 20 20 20     nDoc++;.     
15720 20 77 68 69 6c 65 28 20 28 2a 70 2b 2b 29 26 30   while( (*p++)&0
15730 78 38 30 20 29 3b 20 20 20 20 20 2f 2a 20 53 6b  x80 );     /* Sk
15740 69 70 20 64 6f 63 69 64 20 76 61 72 69 6e 74 20  ip docid varint 
15750 2a 2f 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73  */.      fts3Pos
15760 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 29 3b  listCopy(0, &p);
15770 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
15780 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
15790 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
157a0 74 75 72 6e 20 6e 44 6f 63 3b 0a 7d 0a 0a 2f 2a  turn nDoc;.}../*
157b0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
157c0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
157d0 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 25 5f  xt row in the %_
157e0 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 74 68  content table th
157f0 61 74 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  at.** matches th
15800 65 20 73 65 61 72 63 68 20 63 72 69 74 65 72 69  e search criteri
15810 61 2e 20 20 46 6f 72 20 61 20 4d 41 54 43 48 20  a.  For a MATCH 
15820 73 65 61 72 63 68 2c 20 74 68 69 73 20 77 69 6c  search, this wil
15830 6c 20 62 65 0a 2a 2a 20 74 68 65 20 6e 65 78 74  l be.** the next
15840 20 72 6f 77 20 74 68 61 74 20 6d 61 74 63 68 65   row that matche
15850 73 2e 20 46 6f 72 20 61 20 66 75 6c 6c 2d 74 61  s. For a full-ta
15860 62 6c 65 20 73 63 61 6e 2c 20 74 68 69 73 20 77  ble scan, this w
15870 69 6c 6c 20 62 65 0a 2a 2a 20 73 69 6d 70 6c 79  ill be.** simply
15880 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
15890 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
158a0 61 62 6c 65 2e 20 20 46 6f 72 20 61 20 64 6f 63  able.  For a doc
158b0 69 64 20 6c 6f 6f 6b 75 70 2c 0a 2a 2a 20 74 68  id lookup,.** th
158c0 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c  is routine simpl
158d0 79 20 73 65 74 73 20 74 68 65 20 45 4f 46 20 66  y sets the EOF f
158e0 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lag..**.** Retur
158f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 6e  n SQLITE_OK if n
15900 6f 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  othing goes wron
15910 67 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  g.  SQLITE_OK is
15920 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 65 76 65   returned.** eve
15930 6e 20 69 66 20 77 65 20 72 65 61 63 68 20 65 6e  n if we reach en
15940 64 2d 6f 66 2d 66 69 6c 65 2e 20 20 54 68 65 20  d-of-file.  The 
15950 66 74 73 33 45 6f 66 4d 65 74 68 6f 64 28 29 20  fts3EofMethod() 
15960 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 0a 2a  will be called.*
15970 2a 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 74  * subsequently t
15980 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
15990 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 45 4f  her or not an EO
159a0 46 20 77 61 73 20 68 69 74 2e 0a 2a 2f 0a 73 74  F was hit..*/.st
159b0 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 65 78  atic int fts3Nex
159c0 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  tMethod(sqlite3_
159d0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
159e0 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rsor){.  int rc;
159f0 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
15a00 43 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f  Csr = (Fts3Curso
15a10 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69  r *)pCursor;.  i
15a20 66 28 20 70 43 73 72 2d 3e 65 53 65 61 72 63 68  f( pCsr->eSearch
15a30 3d 3d 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41  ==FTS3_DOCID_SEA
15a40 52 43 48 20 7c 7c 20 70 43 73 72 2d 3e 65 53 65  RCH || pCsr->eSe
15a50 61 72 63 68 3d 3d 46 54 53 33 5f 46 55 4c 4c 53  arch==FTS3_FULLS
15a60 43 41 4e 5f 53 45 41 52 43 48 20 29 7b 0a 20 20  CAN_SEARCH ){.  
15a70 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
15a80 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  !=sqlite3_step(p
15a90 43 73 72 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20  Csr->pStmt) ){. 
15aa0 20 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66       pCsr->isEof
15ab0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
15ac0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
15ad0 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  Csr->pStmt);.   
15ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
15af0 73 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 73 71  sr->iPrevId = sq
15b00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
15b10 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  64(pCsr->pStmt, 
15b20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  0);.      rc = S
15b30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
15b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
15b50 3d 20 66 74 73 33 45 76 61 6c 4e 65 78 74 28 28  = fts3EvalNext((
15b60 46 74 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75  Fts3Cursor *)pCu
15b70 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  rsor);.  }.  ass
15b80 65 72 74 28 20 28 28 46 74 73 33 54 61 62 6c 65  ert( ((Fts3Table
15b90 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
15ba0 74 61 62 29 2d 3e 70 53 65 67 6d 65 6e 74 73 3d  tab)->pSegments=
15bb0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
15bc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
15bd0 20 69 73 20 74 68 65 20 78 46 69 6c 74 65 72 20   is the xFilter 
15be0 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 74 68  interface for th
15bf0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
15c00 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 76 69 72    See.** the vir
15c10 74 75 61 6c 20 74 61 62 6c 65 20 78 46 69 6c 74  tual table xFilt
15c20 65 72 20 6d 65 74 68 6f 64 20 64 6f 63 75 6d 65  er method docume
15c30 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  ntation for addi
15c40 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  tional.** inform
15c50 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
15c60 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 46 55 4c  idxNum==FTS3_FUL
15c70 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 74 68 65  LSCAN_SEARCH the
15c80 6e 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c  n do a full tabl
15c90 65 20 73 63 61 6e 20 61 67 61 69 6e 73 74 0a 2a  e scan against.*
15ca0 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  * the %_content 
15cb0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
15cc0 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 44 4f 43  idxNum==FTS3_DOC
15cd0 49 44 5f 53 45 41 52 43 48 20 74 68 65 6e 20 64  ID_SEARCH then d
15ce0 6f 20 61 20 64 6f 63 69 64 20 6c 6f 6f 6b 75 70  o a docid lookup
15cf0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 6e   for a single en
15d00 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 25 5f  try.** in the %_
15d10 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a  content table..*
15d20 2a 0a 2a 2a 20 49 66 20 69 64 78 4e 75 6d 3e 3d  *.** If idxNum>=
15d30 46 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45  FTS3_FULLTEXT_SE
15d40 41 52 43 48 20 74 68 65 6e 20 75 73 65 20 74 68  ARCH then use th
15d50 65 20 66 75 6c 6c 20 74 65 78 74 20 69 6e 64 65  e full text inde
15d60 78 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 6c 75 6d  x.  The.** colum
15d70 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61  n on the left-ha
15d80 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4d  nd side of the M
15d90 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 69 73  ATCH operator is
15da0 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 75 6d 62 65   column.** numbe
15db0 72 20 69 64 78 4e 75 6d 2d 46 54 53 33 5f 46 55  r idxNum-FTS3_FU
15dc0 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 2c 20 30  LLTEXT_SEARCH, 0
15dd0 20 69 6e 64 65 78 65 64 2e 20 20 61 72 67 76 5b   indexed.  argv[
15de0 30 5d 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  0] is the right-
15df0 68 61 6e 64 0a 2a 2a 20 73 69 64 65 20 6f 66 20  hand.** side of 
15e00 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
15e10 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
15e20 74 20 66 74 73 33 46 69 6c 74 65 72 4d 65 74 68  t fts3FilterMeth
15e30 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
15e40 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
15e50 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75 72  or,   /* The cur
15e60 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74 68 69  sor used for thi
15e70 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
15e80 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20 20 20   idxNum,        
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ea0 53 74 72 61 74 65 67 79 20 69 6e 64 65 78 20 2a  Strategy index *
15eb0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15ec0 69 64 78 53 74 72 2c 20 20 20 20 20 20 20 20 20  idxStr,         
15ed0 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f      /* Unused */
15ee0 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20  .  int nVal,    
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15f10 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70 56 61  elements in apVa
15f20 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  l */.  sqlite3_v
15f30 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
15f40 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
15f50 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e 64 65  nts for the inde
15f60 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f 0a 29  xing scheme */.)
15f70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
15f80 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15fa0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 75   SQL statement u
15fb0 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 25 5f  sed to access %_
15fc0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 46 74 73  content */.  Fts
15fd0 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73  3Table *p = (Fts
15fe0 33 54 61 62 6c 65 20 2a 29 70 43 75 72 73 6f 72  3Table *)pCursor
15ff0 2d 3e 70 56 74 61 62 3b 0a 20 20 46 74 73 33 43  ->pVtab;.  Fts3C
16000 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
16010 74 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72  ts3Cursor *)pCur
16020 73 6f 72 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  sor;..  UNUSED_P
16030 41 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29  ARAMETER(idxStr)
16040 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16050 45 54 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61  ETER(nVal);..  a
16060 73 73 65 72 74 28 20 69 64 78 4e 75 6d 3e 3d 30  ssert( idxNum>=0
16070 20 26 26 20 69 64 78 4e 75 6d 3c 3d 28 46 54 53   && idxNum<=(FTS
16080 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43  3_FULLTEXT_SEARC
16090 48 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 3b  H+p->nColumn) );
160a0 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d  .  assert( nVal=
160b0 3d 30 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b  =0 || nVal==1 );
160c0 0a 20 20 61 73 73 65 72 74 28 20 28 6e 56 61 6c  .  assert( (nVal
160d0 3d 3d 30 29 3d 3d 28 69 64 78 4e 75 6d 3d 3d 46  ==0)==(idxNum==F
160e0 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45 41  TS3_FULLSCAN_SEA
160f0 52 43 48 29 20 29 3b 0a 20 20 61 73 73 65 72 74  RCH) );.  assert
16100 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d  ( p->pSegments==
16110 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61  0 );..  /* In ca
16120 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  se the cursor ha
16130 73 20 62 65 65 6e 20 75 73 65 64 20 62 65 66 6f  s been used befo
16140 72 65 2c 20 63 6c 65 61 72 20 69 74 20 6e 6f 77  re, clear it now
16150 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  . */.  sqlite3_f
16160 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 53  inalize(pCsr->pS
16170 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tmt);.  sqlite3_
16180 66 72 65 65 28 70 43 73 72 2d 3e 61 44 6f 63 6c  free(pCsr->aDocl
16190 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ist);.  sqlite3F
161a0 74 73 33 45 78 70 72 46 72 65 65 28 70 43 73 72  ts3ExprFree(pCsr
161b0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 6d 65 6d 73  ->pExpr);.  mems
161c0 65 74 28 26 70 43 75 72 73 6f 72 5b 31 5d 2c 20  et(&pCursor[1], 
161d0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 43 75  0, sizeof(Fts3Cu
161e0 72 73 6f 72 29 2d 73 69 7a 65 6f 66 28 73 71 6c  rsor)-sizeof(sql
161f0 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
16200 29 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 53 74  ));..  if( idxSt
16210 72 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 62  r ){.    pCsr->b
16220 44 65 73 63 20 3d 20 28 69 64 78 53 74 72 5b 30  Desc = (idxStr[0
16230 5d 3d 3d 27 44 27 29 3b 0a 20 20 7d 65 6c 73 65  ]=='D');.  }else
16240 7b 0a 20 20 20 20 70 43 73 72 2d 3e 62 44 65 73  {.    pCsr->bDes
16250 63 20 3d 20 70 2d 3e 62 44 65 73 63 49 64 78 3b  c = p->bDescIdx;
16260 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 65 53 65  .  }.  pCsr->eSe
16270 61 72 63 68 20 3d 20 28 69 31 36 29 69 64 78 4e  arch = (i16)idxN
16280 75 6d 3b 0a 0a 20 20 69 66 28 20 69 64 78 4e 75  um;..  if( idxNu
16290 6d 21 3d 46 54 53 33 5f 44 4f 43 49 44 5f 53 45  m!=FTS3_DOCID_SE
162a0 41 52 43 48 20 26 26 20 69 64 78 4e 75 6d 21 3d  ARCH && idxNum!=
162b0 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45  FTS3_FULLSCAN_SE
162c0 41 52 43 48 20 29 7b 0a 20 20 20 20 69 6e 74 20  ARCH ){.    int 
162d0 69 43 6f 6c 20 3d 20 69 64 78 4e 75 6d 2d 46 54  iCol = idxNum-FT
162e0 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52  S3_FULLTEXT_SEAR
162f0 43 48 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  CH;.    const ch
16300 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 28 63 6f  ar *zQuery = (co
16310 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
16320 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
16330 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 20 20 69 66  Val[0]);..    if
16340 28 20 7a 51 75 65 72 79 3d 3d 30 20 26 26 20 73  ( zQuery==0 && s
16350 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
16360 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53 51 4c  e(apVal[0])!=SQL
16370 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
16380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16390 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
163a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
163b0 73 33 45 78 70 72 50 61 72 73 65 28 70 2d 3e 70  s3ExprParse(p->p
163c0 54 6f 6b 65 6e 69 7a 65 72 2c 20 70 2d 3e 61 7a  Tokenizer, p->az
163d0 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 6e 43 6f 6c 75  Column, p->nColu
163e0 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 69 43 6f  mn, .        iCo
163f0 6c 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  l, zQuery, -1, &
16400 70 43 73 72 2d 3e 70 45 78 70 72 0a 20 20 20 20  pCsr->pExpr.    
16410 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16420 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16440 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
16450 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
16460 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 61 6c  har *zErr = "mal
16470 66 6f 72 6d 65 64 20 4d 41 54 43 48 20 65 78 70  formed MATCH exp
16480 72 65 73 73 69 6f 6e 3a 20 5b 25 73 5d 22 3b 0a  ression: [%s]";.
16490 20 20 20 20 20 20 20 20 70 2d 3e 62 61 73 65 2e          p->base.
164a0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
164b0 33 5f 6d 70 72 69 6e 74 66 28 7a 45 72 72 2c 20  3_mprintf(zErr, 
164c0 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 7d  zQuery);.      }
164d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
164e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
164f0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
16500 64 4c 6f 63 6b 28 70 29 3b 0a 20 20 20 20 69 66  dLock(p);.    if
16510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16520 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
16530 20 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c 53    rc = fts3EvalS
16540 74 61 72 74 28 70 43 73 72 29 3b 0a 0a 20 20 20  tart(pCsr);..   
16550 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
16560 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20  entsClose(p);.  
16570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16580 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16590 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 65 78 74  .    pCsr->pNext
165a0 49 64 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c  Id = pCsr->aDocl
165b0 69 73 74 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69  ist;.    pCsr->i
165c0 50 72 65 76 49 64 20 3d 20 30 3b 0a 20 20 7d 0a  PrevId = 0;.  }.
165d0 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 20 61 20  .  /* Compile a 
165e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
165f0 20 66 6f 72 20 74 68 69 73 20 63 75 72 73 6f 72   for this cursor
16600 2e 20 46 6f 72 20 61 20 66 75 6c 6c 2d 74 61 62  . For a full-tab
16610 6c 65 2d 73 63 61 6e 2c 20 74 68 65 0a 20 20 2a  le-scan, the.  *
16620 2a 20 73 74 61 74 65 6d 65 6e 74 20 6c 6f 6f 70  * statement loop
16630 73 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  s through all ro
16640 77 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74  ws of the %_cont
16650 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20 61  ent table. For a
16660 0a 20 20 2a 2a 20 66 75 6c 6c 2d 74 65 78 74 20  .  ** full-text 
16670 71 75 65 72 79 20 6f 72 20 64 6f 63 69 64 20 6c  query or docid l
16680 6f 6f 6b 75 70 2c 20 74 68 65 20 73 74 61 74 65  ookup, the state
16690 6d 65 6e 74 20 72 65 74 72 69 65 76 65 73 20 61  ment retrieves a
166a0 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 72 6f 77   single.  ** row
166b0 20 62 79 20 64 6f 63 69 64 2e 0a 20 20 2a 2f 0a   by docid..  */.
166c0 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d 46 54    if( idxNum==FT
166d0 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45 41 52  S3_FULLSCAN_SEAR
166e0 43 48 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  CH ){.    const 
166f0 63 68 61 72 20 2a 7a 53 6f 72 74 20 3d 20 28 70  char *zSort = (p
16700 43 73 72 2d 3e 62 44 65 73 63 20 3f 20 22 44 45  Csr->bDesc ? "DE
16710 53 43 22 20 3a 20 22 41 53 43 22 29 3b 0a 20 20  SC" : "ASC");.  
16720 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
16730 6d 70 6c 20 3d 20 22 53 45 4c 45 43 54 20 25 73  mpl = "SELECT %s
16740 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e   FROM %Q.'%q_con
16750 74 65 6e 74 27 20 41 53 20 78 20 4f 52 44 45 52  tent' AS x ORDER
16760 20 42 59 20 64 6f 63 69 64 20 25 73 22 3b 0a 20   BY docid %s";. 
16770 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
16780 33 5f 6d 70 72 69 6e 74 66 28 7a 54 6d 70 6c 2c  3_mprintf(zTmpl,
16790 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73   p->zReadExprlis
167a0 74 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e  t, p->zDb, p->zN
167b0 61 6d 65 2c 20 7a 53 6f 72 74 29 3b 0a 20 20 7d  ame, zSort);.  }
167c0 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
167d0 63 68 61 72 20 2a 7a 54 6d 70 6c 20 3d 20 22 53  char *zTmpl = "S
167e0 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 51  ELECT %s FROM %Q
167f0 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 41 53  .'%q_content' AS
16800 20 78 20 57 48 45 52 45 20 64 6f 63 69 64 20 3d   x WHERE docid =
16810 20 3f 22 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20   ?";.    zSql = 
16820 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16830 7a 54 6d 70 6c 2c 20 70 2d 3e 7a 52 65 61 64 45  zTmpl, p->zReadE
16840 78 70 72 6c 69 73 74 2c 20 70 2d 3e 7a 44 62 2c  xprlist, p->zDb,
16850 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a   p->zName);.  }.
16860 20 20 69 66 28 20 21 7a 53 71 6c 20 29 20 72 65    if( !zSql ) re
16870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
16880 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  M;.  rc = sqlite
16890 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
168a0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
168b0 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  Csr->pStmt, 0);.
168c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
168d0 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Sql);.  if( rc!=
168e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
168f0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 69 64  rn rc;..  if( id
16900 78 4e 75 6d 3d 3d 46 54 53 33 5f 44 4f 43 49 44  xNum==FTS3_DOCID
16910 5f 53 45 41 52 43 48 20 29 7b 0a 20 20 20 20 72  _SEARCH ){.    r
16920 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
16930 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 53 74  _value(pCsr->pSt
16940 6d 74 2c 20 31 2c 20 61 70 56 61 6c 5b 30 5d 29  mt, 1, apVal[0])
16950 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16960 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16970 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   rc;.  }..  retu
16980 72 6e 20 66 74 73 33 4e 65 78 74 4d 65 74 68 6f  rn fts3NextMetho
16990 64 28 70 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f  d(pCursor);.}../
169a0 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  * .** This is th
169b0 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 20 6f 66  e xEof method of
169c0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
169d0 6c 65 2e 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  le. SQLite calls
169e0 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e   this .** routin
169f0 65 20 74 6f 20 66 69 6e 64 20 6f 75 74 20 69 66  e to find out if
16a00 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
16a10 74 68 65 20 65 6e 64 20 6f 66 20 61 20 72 65 73  the end of a res
16a20 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
16a30 69 63 20 69 6e 74 20 66 74 73 33 45 6f 66 4d 65  ic int fts3EofMe
16a40 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
16a50 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  b_cursor *pCurso
16a60 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 46  r){.  return ((F
16a70 74 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72  ts3Cursor *)pCur
16a80 73 6f 72 29 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a  sor)->isEof;.}..
16a90 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  /* .** This is t
16aa0 68 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64  he xRowid method
16ab0 2e 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  . The SQLite cor
16ac0 65 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  e calls this rou
16ad0 74 69 6e 65 20 74 6f 0a 2a 2a 20 72 65 74 72 69  tine to.** retri
16ae0 65 76 65 20 74 68 65 20 72 6f 77 69 64 20 66 6f  eve the rowid fo
16af0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
16b00 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  w of the result 
16b10 73 65 74 2e 20 66 74 73 33 0a 2a 2a 20 65 78 70  set. fts3.** exp
16b20 6f 73 65 73 20 25 5f 63 6f 6e 74 65 6e 74 2e 64  oses %_content.d
16b30 6f 63 69 64 20 61 73 20 74 68 65 20 72 6f 77 69  ocid as the rowi
16b40 64 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61  d for the virtua
16b50 6c 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20  l table. The.** 
16b60 72 6f 77 69 64 20 73 68 6f 75 6c 64 20 62 65 20  rowid should be 
16b70 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 6f 77  written to *pRow
16b80 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
16b90 74 20 66 74 73 33 52 6f 77 69 64 4d 65 74 68 6f  t fts3RowidMetho
16ba0 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  d(sqlite3_vtab_c
16bb0 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
16bc0 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
16bd0 6f 77 69 64 29 7b 0a 20 20 46 74 73 33 43 75 72  owid){.  Fts3Cur
16be0 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
16bf0 33 43 75 72 73 6f 72 20 2a 29 20 70 43 75 72 73  3Cursor *) pCurs
16c00 6f 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20  or;.  *pRowid = 
16c10 70 43 73 72 2d 3e 69 50 72 65 76 49 64 3b 0a 20  pCsr->iPrevId;. 
16c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16c30 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  K;.}../* .** Thi
16c40 73 20 69 73 20 74 68 65 20 78 43 6f 6c 75 6d 6e  s is the xColumn
16c50 20 6d 65 74 68 6f 64 2c 20 63 61 6c 6c 65 64 20   method, called 
16c60 62 79 20 53 51 4c 69 74 65 20 74 6f 20 72 65 71  by SQLite to req
16c70 75 65 73 74 20 61 20 76 61 6c 75 65 20 66 72 6f  uest a value fro
16c80 6d 0a 2a 2a 20 74 68 65 20 72 6f 77 20 74 68 61  m.** the row tha
16c90 74 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  t the supplied c
16ca0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
16cb0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74  points to..*/.st
16cc0 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f 6c  atic int fts3Col
16cd0 75 6d 6e 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c  umnMethod(.  sql
16ce0 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
16cf0 20 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20   *pCursor,   /* 
16d00 43 75 72 73 6f 72 20 74 6f 20 72 65 74 72 69 65  Cursor to retrie
16d10 76 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f  ve value from */
16d20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
16d30 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20  xt *pContext,   
16d40 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f     /* Context fo
16d50 72 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  r sqlite3_result
16d60 5f 78 78 78 28 29 20 63 61 6c 6c 73 20 2a 2f 0a  _xxx() calls */.
16d70 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20    int iCol      
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
16da0 6c 75 6d 6e 20 74 6f 20 72 65 61 64 20 76 61 6c  lumn to read val
16db0 75 65 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20  ue from */.){.  
16dc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16dd0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
16de0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
16df0 2f 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  /.  Fts3Cursor *
16e00 70 43 73 72 20 3d 20 28 46 74 73 33 43 75 72 73  pCsr = (Fts3Curs
16e10 6f 72 20 2a 29 20 70 43 75 72 73 6f 72 3b 0a 20  or *) pCursor;. 
16e20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20   Fts3Table *p = 
16e30 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 75  (Fts3Table *)pCu
16e40 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 0a 20 20  rsor->pVtab;..  
16e50 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61  /* The column va
16e60 6c 75 65 20 73 75 70 70 6c 69 65 64 20 62 79 20  lue supplied by 
16e70 53 51 4c 69 74 65 20 6d 75 73 74 20 62 65 20 69  SQLite must be i
16e80 6e 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 61 73  n range. */.  as
16e90 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
16ea0 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d   iCol<=p->nColum
16eb0 6e 2b 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 43  n+1 );..  if( iC
16ec0 6f 6c 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ol==p->nColumn+1
16ed0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
16ee0 63 61 6c 6c 20 69 73 20 61 20 72 65 71 75 65 73  call is a reques
16ef0 74 20 66 6f 72 20 74 68 65 20 22 64 6f 63 69 64  t for the "docid
16f00 22 20 63 6f 6c 75 6d 6e 2e 20 53 69 6e 63 65 20  " column. Since 
16f10 22 64 6f 63 69 64 22 20 69 73 20 61 6e 20 0a 20  "docid" is an . 
16f20 20 20 20 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20     ** alias for 
16f30 22 72 6f 77 69 64 22 2c 20 75 73 65 20 74 68 65  "rowid", use the
16f40 20 78 52 6f 77 69 64 28 29 20 6d 65 74 68 6f 64   xRowid() method
16f50 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
16f60 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
16f70 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16f80 69 6e 74 36 34 28 70 43 6f 6e 74 65 78 74 2c 20  int64(pContext, 
16f90 70 43 73 72 2d 3e 69 50 72 65 76 49 64 29 3b 0a  pCsr->iPrevId);.
16fa0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
16fb0 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  ==p->nColumn ){.
16fc0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 74 72 61      /* The extra
16fd0 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 6e 61   column whose na
16fe0 6d 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  me is the same a
16ff0 73 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  s the table..   
17000 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6c 6f   ** Return a blo
17010 62 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69  b which is a poi
17020 6e 74 65 72 20 74 6f 20 74 68 65 20 63 75 72 73  nter to the curs
17030 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  or..    */.    s
17040 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
17050 6f 62 28 70 43 6f 6e 74 65 78 74 2c 20 26 70 43  ob(pContext, &pC
17060 73 72 2c 20 73 69 7a 65 6f 66 28 70 43 73 72 29  sr, sizeof(pCsr)
17070 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
17080 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
17090 20 20 72 63 20 3d 20 66 74 73 33 43 75 72 73 6f    rc = fts3Curso
170a0 72 53 65 65 6b 28 30 2c 20 70 43 73 72 29 3b 0a  rSeek(0, pCsr);.
170b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
170c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
170d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
170e0 6c 75 65 28 70 43 6f 6e 74 65 78 74 2c 20 73 71  lue(pContext, sq
170f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
17100 75 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  ue(pCsr->pStmt, 
17110 69 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20 7d 0a  iCol+1));.    }.
17120 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28    }..  assert( (
17130 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73  (Fts3Table *)pCs
17140 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 2d 3e  r->base.pVtab)->
17150 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a  pSegments==0 );.
17160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17170 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
17180 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
17190 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
171a0 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 62 61  e xUpdate callba
171b0 63 6b 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 46  ck used by .** F
171c0 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS3 virtual tabl
171d0 65 73 2e 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  es. It is invoke
171e0 64 20 62 79 20 53 51 4c 69 74 65 20 65 61 63 68  d by SQLite each
171f0 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 74   time a row is t
17200 6f 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  o be.** inserted
17210 2c 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c  , updated or del
17220 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
17230 69 6e 74 20 66 74 73 33 55 70 64 61 74 65 4d 65  int fts3UpdateMe
17240 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
17250 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20  vtab *pVtab,    
17260 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
17270 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
17280 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
172b0 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
172c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
172d0 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20  e **apVal,      
172e0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
172f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73  arguments */.  s
17300 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
17310 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 2f  wid            /
17320 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66 65 63  * OUT: The affec
17330 74 65 64 20 28 6f 72 20 65 66 66 65 63 74 65 64  ted (or effected
17340 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  ) rowid */.){.  
17350 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
17360 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28 70  s3UpdateMethod(p
17370 56 74 61 62 2c 20 6e 41 72 67 2c 20 61 70 56 61  Vtab, nArg, apVa
17380 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f  l, pRowid);.}../
17390 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
173a0 69 6f 6e 20 6f 66 20 78 53 79 6e 63 28 29 20 6d  ion of xSync() m
173b0 65 74 68 6f 64 2e 20 46 6c 75 73 68 20 74 68 65  ethod. Flush the
173c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
173d0 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 0a 2a   pending-terms.*
173e0 2a 20 68 61 73 68 2d 74 61 62 6c 65 20 74 6f 20  * hash-table to 
173f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
17400 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
17410 53 79 6e 63 4d 65 74 68 6f 64 28 73 71 6c 69 74  SyncMethod(sqlit
17420 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
17430 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
17440 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
17450 72 6d 73 46 6c 75 73 68 28 28 46 74 73 33 54 61  rmsFlush((Fts3Ta
17460 62 6c 65 20 2a 29 70 56 74 61 62 29 3b 0a 20 20  ble *)pVtab);.  
17470 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
17480 6e 74 73 43 6c 6f 73 65 28 28 46 74 73 33 54 61  ntsClose((Fts3Ta
17490 62 6c 65 20 2a 29 70 56 74 61 62 29 3b 0a 20 20  ble *)pVtab);.  
174a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
174b0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
174c0 6f 6e 20 6f 66 20 78 42 65 67 69 6e 28 29 20 6d  on of xBegin() m
174d0 65 74 68 6f 64 2e 20 54 68 69 73 20 69 73 20 61  ethod. This is a
174e0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
174f0 63 20 69 6e 74 20 66 74 73 33 42 65 67 69 6e 4d  c int fts3BeginM
17500 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
17510 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 54 45  ab *pVtab){.  TE
17520 53 54 4f 4e 4c 59 28 20 46 74 73 33 54 61 62 6c  STONLY( Fts3Tabl
17530 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
17540 65 2a 29 70 56 74 61 62 20 29 3b 0a 20 20 55 4e  e*)pVtab );.  UN
17550 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
17560 56 74 61 62 29 3b 0a 20 20 61 73 73 65 72 74 28  Vtab);.  assert(
17570 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30   p->pSegments==0
17580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
17590 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30  >nPendingData==0
175a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
175b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
175c0 31 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  1 );.  TESTONLY(
175d0 20 70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f   p->inTransactio
175e0 6e 20 3d 20 31 20 29 3b 0a 20 20 54 45 53 54 4f  n = 1 );.  TESTO
175f0 4e 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f  NLY( p->mxSavepo
17600 69 6e 74 20 3d 20 2d 31 3b 20 29 3b 0a 20 20 72  int = -1; );.  r
17610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
17630 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 43 6f 6d  entation of xCom
17640 6d 69 74 28 29 20 6d 65 74 68 6f 64 2e 20 54 68  mit() method. Th
17650 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  is is a no-op. T
17660 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a  he contents of.*
17670 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  * the pending-te
17680 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65 20 68  rms hash-table h
17690 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
176a0 20 66 6c 75 73 68 65 64 20 69 6e 74 6f 20 74 68   flushed into th
176b0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 62 79  e database.** by
176c0 20 66 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 28   fts3SyncMethod(
176d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
176e0 20 66 74 73 33 43 6f 6d 6d 69 74 4d 65 74 68 6f   fts3CommitMetho
176f0 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  d(sqlite3_vtab *
17700 70 56 74 61 62 29 7b 0a 20 20 54 45 53 54 4f 4e  pVtab){.  TESTON
17710 4c 59 28 20 46 74 73 33 54 61 62 6c 65 20 2a 70  LY( Fts3Table *p
17720 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70   = (Fts3Table*)p
17730 56 74 61 62 20 29 3b 0a 20 20 55 4e 55 53 45 44  Vtab );.  UNUSED
17740 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61 62  _PARAMETER(pVtab
17750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17760 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
17770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17780 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30  inTransaction!=0
17790 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
177a0 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
177b0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e  .  TESTONLY( p->
177c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
177d0 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
177e0 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20   p->mxSavepoint 
177f0 3d 20 2d 31 3b 20 29 3b 0a 20 20 72 65 74 75 72  = -1; );.  retur
17800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17810 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
17820 74 69 6f 6e 20 6f 66 20 78 52 6f 6c 6c 62 61 63  tion of xRollbac
17830 6b 28 29 2e 20 44 69 73 63 61 72 64 20 74 68 65  k(). Discard the
17840 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
17850 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 0a 2a   pending-terms.*
17860 2a 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 41 6e  * hash-table. An
17870 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
17880 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
17890 72 65 20 72 65 76 65 72 74 65 64 20 62 79 20 53  re reverted by S
178a0 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  QLite..*/.static
178b0 20 69 6e 74 20 66 74 73 33 52 6f 6c 6c 62 61 63   int fts3Rollbac
178c0 6b 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  kMethod(sqlite3_
178d0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
178e0 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28  Fts3Table *p = (
178f0 46 74 73 33 54 61 62 6c 65 2a 29 70 56 74 61 62  Fts3Table*)pVtab
17900 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50  ;.  sqlite3Fts3P
17910 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72  endingTermsClear
17920 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
17930 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
17940 3d 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  =0 );.  TESTONLY
17950 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  ( p->inTransacti
17960 6f 6e 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54  on = 0 );.  TEST
17970 4f 4e 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70  ONLY( p->mxSavep
17980 6f 69 6e 74 20 3d 20 2d 31 3b 20 29 3b 0a 20 20  oint = -1; );.  
17990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
179a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
179b0 63 61 6c 6c 65 64 2c 20 2a 70 70 50 6f 73 6c 69  called, *ppPosli
179c0 73 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  st must point to
179d0 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69   the byte immedi
179e0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
179f0 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
17a00 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 69  position-list. i
17a10 2e 65 2e 20 28 20 28 2a 70 70 50 6f 73 6c 69 73  .e. ( (*ppPoslis
17a20 74 29 5b 2d 31 5d 3d 3d 50 4f 53 5f 45 4e 44 20  t)[-1]==POS_END 
17a30 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
17a40 0a 2a 2a 20 6d 6f 76 65 73 20 2a 70 70 50 6f 73  .** moves *ppPos
17a50 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69 74 20  list so that it 
17a60 69 6e 73 74 65 61 64 20 70 6f 69 6e 74 73 20 74  instead points t
17a70 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
17a80 20 6f 66 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   of the.** same 
17a90 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 0a 2a  position list..*
17aa0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17ab0 73 33 52 65 76 65 72 73 65 50 6f 73 6c 69 73 74  s3ReversePoslist
17ac0 28 63 68 61 72 20 2a 70 53 74 61 72 74 2c 20 63  (char *pStart, c
17ad0 68 61 72 20 2a 2a 70 70 50 6f 73 6c 69 73 74 29  har **ppPoslist)
17ae0 7b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 26 28  {.  char *p = &(
17af0 2a 70 70 50 6f 73 6c 69 73 74 29 5b 2d 32 5d 3b  *ppPoslist)[-2];
17b00 0a 20 20 63 68 61 72 20 63 3b 0a 0a 20 20 77 68  .  char c;..  wh
17b10 69 6c 65 28 20 70 3e 70 53 74 61 72 74 20 26 26  ile( p>pStart &&
17b20 20 28 63 3d 2a 70 2d 2d 29 3d 3d 30 20 29 3b 0a   (c=*p--)==0 );.
17b30 20 20 77 68 69 6c 65 28 20 70 3e 70 53 74 61 72    while( p>pStar
17b40 74 20 26 26 20 28 2a 70 20 26 20 30 78 38 30 29  t && (*p & 0x80)
17b50 20 7c 20 63 20 29 7b 20 0a 20 20 20 20 63 20 3d   | c ){ .    c =
17b60 20 2a 70 2d 2d 3b 20 0a 20 20 7d 0a 20 20 69 66   *p--; .  }.  if
17b70 28 20 70 3e 70 53 74 61 72 74 20 29 7b 20 70 20  ( p>pStart ){ p 
17b80 3d 20 26 70 5b 32 5d 3b 20 7d 0a 20 20 77 68 69  = &p[2]; }.  whi
17b90 6c 65 28 20 2a 70 2b 2b 26 30 78 38 30 20 29 3b  le( *p++&0x80 );
17ba0 0a 20 20 2a 70 70 50 6f 73 6c 69 73 74 20 3d 20  .  *ppPoslist = 
17bb0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  p;.}../*.** Help
17bc0 65 72 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64  er function used
17bd0 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
17be0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 76  tation of the ov
17bf0 65 72 6c 6f 61 64 65 64 20 73 6e 69 70 70 65 74  erloaded snippet
17c00 28 29 2c 0a 2a 2a 20 6f 66 66 73 65 74 73 28 29  (),.** offsets()
17c10 20 61 6e 64 20 6f 70 74 69 6d 69 7a 65 28 29 20   and optimize() 
17c20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  SQL functions..*
17c30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75  *.** If the valu
17c40 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
17c50 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
17c60 73 20 61 20 62 6c 6f 62 20 6f 66 20 73 69 7a 65  s a blob of size
17c70 0a 2a 2a 20 73 69 7a 65 6f 66 28 46 74 73 33 43  .** sizeof(Fts3C
17c80 75 72 73 6f 72 2a 29 2c 20 74 68 65 6e 20 74 68  ursor*), then th
17c90 65 20 62 6c 6f 62 20 63 6f 6e 74 65 6e 74 73 20  e blob contents 
17ca0 61 72 65 20 63 6f 70 69 65 64 20 74 6f 20 74 68  are copied to th
17cb0 65 20 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  e .** output var
17cc0 69 61 62 6c 65 20 2a 70 70 43 73 72 20 61 6e 64  iable *ppCsr and
17cd0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17ce0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
17cf0 65 2c 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d  e, an error.** m
17d00 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
17d10 6e 20 74 6f 20 63 6f 6e 74 65 78 74 20 70 43 6f  n to context pCo
17d20 6e 74 65 78 74 20 61 6e 64 20 53 51 4c 49 54 45  ntext and SQLITE
17d30 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e  _ERROR returned.
17d40 20 54 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 70   The.** string p
17d50 61 73 73 65 64 20 76 69 61 20 7a 46 75 6e 63 20  assed via zFunc 
17d60 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
17d70 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
17d80 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
17d90 69 6e 74 20 66 74 73 33 46 75 6e 63 74 69 6f 6e  int fts3Function
17da0 41 72 67 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  Arg(.  sqlite3_c
17db0 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78 74  ontext *pContext
17dc0 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75  ,      /* SQL fu
17dd0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
17de0 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
17df0 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
17e00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
17e10 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73  tion name */.  s
17e20 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
17e30 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  al,            /
17e40 2a 20 61 72 67 76 5b 30 5d 20 70 61 73 73 65 64  * argv[0] passed
17e50 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a   to function */.
17e60 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 2a 70    Fts3Cursor **p
17e70 70 43 73 72 20 20 20 20 20 20 20 20 20 20 20 20  pCsr            
17e80 20 20 2f 2a 20 4f 55 54 3a 20 53 74 6f 72 65 20    /* OUT: Store 
17e90 63 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 68 65  cursor handle he
17ea0 72 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43  re */.){.  Fts3C
17eb0 75 72 73 6f 72 20 2a 70 52 65 74 3b 0a 20 20 69  ursor *pRet;.  i
17ec0 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
17ed0 5f 74 79 70 65 28 70 56 61 6c 29 21 3d 53 51 4c  _type(pVal)!=SQL
17ee0 49 54 45 5f 42 4c 4f 42 20 0a 20 20 20 7c 7c 20  ITE_BLOB .   || 
17ef0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
17f00 74 65 73 28 70 56 61 6c 29 21 3d 73 69 7a 65 6f  tes(pVal)!=sizeo
17f10 66 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29 0a  f(Fts3Cursor *).
17f20 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a    ){.    char *z
17f30 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
17f40 72 69 6e 74 66 28 22 69 6c 6c 65 67 61 6c 20 66  rintf("illegal f
17f50 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
17f60 20 25 73 22 2c 20 7a 46 75 6e 63 29 3b 0a 20 20   %s", zFunc);.  
17f70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
17f80 5f 65 72 72 6f 72 28 70 43 6f 6e 74 65 78 74 2c  _error(pContext,
17f90 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 20 20   zErr, -1);.    
17fa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
17fb0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r);.    return S
17fc0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
17fd0 0a 20 20 6d 65 6d 63 70 79 28 26 70 52 65 74 2c  .  memcpy(&pRet,
17fe0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
17ff0 6c 6f 62 28 70 56 61 6c 29 2c 20 73 69 7a 65 6f  lob(pVal), sizeo
18000 66 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29 29  f(Fts3Cursor *))
18010 3b 0a 20 20 2a 70 70 43 73 72 20 3d 20 70 52 65  ;.  *ppCsr = pRe
18020 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
18030 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18040 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
18050 66 20 74 68 65 20 73 6e 69 70 70 65 74 28 29 20  f the snippet() 
18060 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54 53  function for FTS
18070 33 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  3.*/.static void
18080 20 66 74 73 33 53 6e 69 70 70 65 74 46 75 6e 63   fts3SnippetFunc
18090 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
180a0 65 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  ext *pContext,  
180b0 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 66 75      /* SQLite fu
180c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
180d0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ext */.  int nVa
180e0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
180f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
18100 20 6f 66 20 61 70 56 61 6c 5b 5d 20 61 72 72 61   of apVal[] arra
18110 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  y */.  sqlite3_v
18120 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
18130 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
18140 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
18150 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  ){.  Fts3Cursor 
18160 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *pCsr;          
18170 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68       /* Cursor h
18180 61 6e 64 6c 65 20 70 61 73 73 65 64 20 74 68 72  andle passed thr
18190 6f 75 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f  ough apVal[0] */
181a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
181b0 53 74 61 72 74 20 3d 20 22 3c 62 3e 22 3b 0a 20  Start = "<b>";. 
181c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
181d0 64 20 3d 20 22 3c 2f 62 3e 22 3b 0a 20 20 63 6f  d = "</b>";.  co
181e0 6e 73 74 20 63 68 61 72 20 2a 7a 45 6c 6c 69 70  nst char *zEllip
181f0 73 69 73 20 3d 20 22 3c 62 3e 2e 2e 2e 3c 2f 62  sis = "<b>...</b
18200 3e 22 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  >";.  int iCol =
18210 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65   -1;.  int nToke
18220 6e 20 3d 20 31 35 3b 20 20 20 20 20 20 20 20 20  n = 15;         
18230 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
18240 74 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  t number of toke
18250 6e 73 20 69 6e 20 73 6e 69 70 70 65 74 20 2a 2f  ns in snippet */
18260 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73  ..  /* There mus
18270 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
18280 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  e argument passe
18290 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
182a0 6f 6e 20 28 6f 74 68 65 72 77 69 73 65 0a 20 20  on (otherwise.  
182b0 2a 2a 20 74 68 65 20 6e 6f 6e 2d 6f 76 65 72 6c  ** the non-overl
182c0 6f 61 64 65 64 20 76 65 72 73 69 6f 6e 20 77 6f  oaded version wo
182d0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 63 61  uld have been ca
182e0 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  lled instead of 
182f0 74 68 69 73 20 6f 6e 65 29 2e 0a 20 20 2a 2f 0a  this one)..  */.
18300 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3e 3d    assert( nVal>=
18310 31 20 29 3b 0a 0a 20 20 69 66 28 20 6e 56 61 6c  1 );..  if( nVal
18320 3e 36 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >6 ){.    sqlite
18330 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
18340 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
18350 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20    "wrong number 
18360 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
18370 66 75 6e 63 74 69 6f 6e 20 73 6e 69 70 70 65 74  function snippet
18380 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ()", -1);.    re
18390 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
183a0 66 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28  fts3FunctionArg(
183b0 70 43 6f 6e 74 65 78 74 2c 20 22 73 6e 69 70 70  pContext, "snipp
183c0 65 74 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26  et", apVal[0], &
183d0 70 43 73 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  pCsr) ) return;.
183e0 0a 20 20 73 77 69 74 63 68 28 20 6e 56 61 6c 20  .  switch( nVal 
183f0 29 7b 0a 20 20 20 20 63 61 73 65 20 36 3a 20 6e  ){.    case 6: n
18400 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f  Token = sqlite3_
18410 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
18420 35 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 35 3a  5]);.    case 5:
18430 20 69 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iCol = sqlite3_
18440 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
18450 34 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  4]);.    case 4:
18460 20 7a 45 6c 6c 69 70 73 69 73 20 3d 20 28 63 6f   zEllipsis = (co
18470 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
18480 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
18490 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 63 61 73 65  al[3]);.    case
184a0 20 33 3a 20 7a 45 6e 64 20 3d 20 28 63 6f 6e 73   3: zEnd = (cons
184b0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
184c0 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
184d0 5b 32 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 32  [2]);.    case 2
184e0 3a 20 7a 53 74 61 72 74 20 3d 20 28 63 6f 6e 73  : zStart = (cons
184f0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
18500 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
18510 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [1]);.  }.  if( 
18520 21 7a 45 6c 6c 69 70 73 69 73 20 7c 7c 20 21 7a  !zEllipsis || !z
18530 45 6e 64 20 7c 7c 20 21 7a 53 74 61 72 74 20 29  End || !zStart )
18540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
18550 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
18560 28 70 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  (pContext);.  }e
18570 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  lse if( SQLITE_O
18580 4b 3d 3d 66 74 73 33 43 75 72 73 6f 72 53 65 65  K==fts3CursorSee
18590 6b 28 70 43 6f 6e 74 65 78 74 2c 20 70 43 73 72  k(pContext, pCsr
185a0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
185b0 46 74 73 33 53 6e 69 70 70 65 74 28 70 43 6f 6e  Fts3Snippet(pCon
185c0 74 65 78 74 2c 20 70 43 73 72 2c 20 7a 53 74 61  text, pCsr, zSta
185d0 72 74 2c 20 7a 45 6e 64 2c 20 7a 45 6c 6c 69 70  rt, zEnd, zEllip
185e0 73 69 73 2c 20 69 43 6f 6c 2c 20 6e 54 6f 6b 65  sis, iCol, nToke
185f0 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
18600 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
18610 6f 66 20 74 68 65 20 6f 66 66 73 65 74 73 28 29  of the offsets()
18620 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54   function for FT
18630 53 33 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  S3.*/.static voi
18640 64 20 66 74 73 33 4f 66 66 73 65 74 73 46 75 6e  d fts3OffsetsFun
18650 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
18660 74 65 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20  text *pContext, 
18670 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 66       /* SQLite f
18680 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
18690 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  text */.  int nV
186a0 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
186b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
186c0 65 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72  e of argument ar
186d0 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ray */.  sqlite3
186e0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
186f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
18700 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  y of arguments *
18710 2f 0a 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f  /.){.  Fts3Curso
18720 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20  r *pCsr;        
18730 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
18740 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 74   handle passed t
18750 68 72 6f 75 67 68 20 61 70 56 61 6c 5b 30 5d 20  hrough apVal[0] 
18760 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  */..  UNUSED_PAR
18770 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 0a 20  AMETER(nVal);.. 
18780 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31   assert( nVal==1
18790 20 29 3b 0a 20 20 69 66 28 20 66 74 73 33 46 75   );.  if( fts3Fu
187a0 6e 63 74 69 6f 6e 41 72 67 28 70 43 6f 6e 74 65  nctionArg(pConte
187b0 78 74 2c 20 22 6f 66 66 73 65 74 73 22 2c 20 61  xt, "offsets", a
187c0 70 56 61 6c 5b 30 5d 2c 20 26 70 43 73 72 29 20  pVal[0], &pCsr) 
187d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
187e0 72 74 28 20 70 43 73 72 20 29 3b 0a 20 20 69 66  rt( pCsr );.  if
187f0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 66 74 73  ( SQLITE_OK==fts
18800 33 43 75 72 73 6f 72 53 65 65 6b 28 70 43 6f 6e  3CursorSeek(pCon
18810 74 65 78 74 2c 20 70 43 73 72 29 20 29 7b 0a 20  text, pCsr) ){. 
18820 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 4f 66     sqlite3Fts3Of
18830 66 73 65 74 73 28 70 43 6f 6e 74 65 78 74 2c 20  fsets(pContext, 
18840 70 43 73 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCsr);.  }.}../*
18850 20 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74   .** Implementat
18860 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69  ion of the speci
18870 61 6c 20 6f 70 74 69 6d 69 7a 65 28 29 20 66 75  al optimize() fu
18880 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54 53 33 2e  nction for FTS3.
18890 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
188a0 6f 6e 20 6d 65 72 67 65 73 20 61 6c 6c 20 73 65  on merges all se
188b0 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  gments in the da
188c0 74 61 62 61 73 65 20 74 6f 20 61 20 73 69 6e 67  tabase to a sing
188d0 6c 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 20 45  le segment..** E
188e0 78 61 6d 70 6c 65 20 75 73 61 67 65 20 69 73 3a  xample usage is:
188f0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
18900 6f 70 74 69 6d 69 7a 65 28 74 29 20 46 52 4f 4d  optimize(t) FROM
18910 20 74 20 4c 49 4d 49 54 20 31 3b 0a 2a 2a 0a 2a   t LIMIT 1;.**.*
18920 2a 20 77 68 65 72 65 20 27 74 27 20 69 73 20 74  * where 't' is t
18930 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 46 54  he name of an FT
18940 53 33 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  S3 table..*/.sta
18950 74 69 63 20 76 6f 69 64 20 66 74 73 33 4f 70 74  tic void fts3Opt
18960 69 6d 69 7a 65 46 75 6e 63 28 0a 20 20 73 71 6c  imizeFunc(.  sql
18970 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
18980 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 2f 2a 20  ontext,      /* 
18990 53 51 4c 69 74 65 20 66 75 6e 63 74 69 6f 6e 20  SQLite function 
189a0 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
189b0 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20    int nVal,     
189c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67    /* Size of arg
189e0 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
189f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
18a00 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
18a10 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
18a20 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
18a30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18a60 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 3b  .  Fts3Table *p;
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a80 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
18a90 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
18aa0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 75 72  Fts3Cursor *pCur
18ab0 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
18ac0 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65  /* Cursor handle
18ad0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
18ae0 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 0a 20 20 55  apVal[0] */..  U
18af0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18b00 6e 56 61 6c 29 3b 0a 0a 20 20 61 73 73 65 72 74  nVal);..  assert
18b10 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20 20 69  ( nVal==1 );.  i
18b20 66 28 20 66 74 73 33 46 75 6e 63 74 69 6f 6e 41  f( fts3FunctionA
18b30 72 67 28 70 43 6f 6e 74 65 78 74 2c 20 22 6f 70  rg(pContext, "op
18b40 74 69 6d 69 7a 65 22 2c 20 61 70 56 61 6c 5b 30  timize", apVal[0
18b50 5d 2c 20 26 70 43 75 72 73 6f 72 29 20 29 20 72  ], &pCursor) ) r
18b60 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 28 46 74  eturn;.  p = (Ft
18b70 73 33 54 61 62 6c 65 20 2a 29 70 43 75 72 73 6f  s3Table *)pCurso
18b80 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
18b90 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 0a 20   assert( p );.. 
18ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
18bb0 33 4f 70 74 69 6d 69 7a 65 28 70 29 3b 0a 0a 20  3Optimize(p);.. 
18bc0 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
18bd0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
18be0 4b 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  K:.      sqlite3
18bf0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 6f  _result_text(pCo
18c00 6e 74 65 78 74 2c 20 22 49 6e 64 65 78 20 6f 70  ntext, "Index op
18c10 74 69 6d 69 7a 65 64 22 2c 20 2d 31 2c 20 53 51  timized", -1, SQ
18c20 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
18c30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
18c40 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a  ase SQLITE_DONE:
18c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
18c60 65 73 75 6c 74 5f 74 65 78 74 28 70 43 6f 6e 74  esult_text(pCont
18c70 65 78 74 2c 20 22 49 6e 64 65 78 20 61 6c 72 65  ext, "Index alre
18c80 61 64 79 20 6f 70 74 69 6d 61 6c 22 2c 20 2d 31  ady optimal", -1
18c90 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
18ca0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18cb0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
18cc0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
18cd0 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 6f 6e  _error_code(pCon
18ce0 74 65 78 74 2c 20 72 63 29 3b 0a 20 20 20 20 20  text, rc);.     
18cf0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f   break;.  }.}../
18d00 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
18d10 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 74 63 68  ion of the match
18d20 69 6e 66 6f 28 29 20 66 75 6e 63 74 69 6f 6e 20  info() function 
18d30 66 6f 72 20 46 54 53 33 0a 2a 2f 0a 73 74 61 74  for FTS3.*/.stat
18d40 69 63 20 76 6f 69 64 20 66 74 73 33 4d 61 74 63  ic void fts3Matc
18d50 68 69 6e 66 6f 46 75 6e 63 28 0a 20 20 73 71 6c  hinfoFunc(.  sql
18d60 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
18d70 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 2f 2a 20  ontext,      /* 
18d80 53 51 4c 69 74 65 20 66 75 6e 63 74 69 6f 6e 20  SQLite function 
18d90 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
18da0 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20    int nVal,     
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67    /* Size of arg
18dd0 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
18de0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
18df0 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
18e00 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
18e10 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 46  uments */.){.  F
18e20 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 3b  ts3Cursor *pCsr;
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18e40 2a 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20  * Cursor handle 
18e50 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 61  passed through a
18e60 70 56 61 6c 5b 30 5d 20 2a 2f 0a 20 20 61 73 73  pVal[0] */.  ass
18e70 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 7c 7c 20  ert( nVal==1 || 
18e80 6e 56 61 6c 3d 3d 32 20 29 3b 0a 20 20 69 66 28  nVal==2 );.  if(
18e90 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 66 74 73 33   SQLITE_OK==fts3
18ea0 46 75 6e 63 74 69 6f 6e 41 72 67 28 70 43 6f 6e  FunctionArg(pCon
18eb0 74 65 78 74 2c 20 22 6d 61 74 63 68 69 6e 66 6f  text, "matchinfo
18ec0 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26 70 43  ", apVal[0], &pC
18ed0 73 72 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  sr) ){.    const
18ee0 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
18ef0 0a 20 20 20 20 69 66 28 20 6e 56 61 6c 3e 31 20  .    if( nVal>1 
18f00 29 7b 0a 20 20 20 20 20 20 7a 41 72 67 20 3d 20  ){.      zArg = 
18f10 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
18f20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
18f30 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20  (apVal[1]);.    
18f40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
18f50 33 4d 61 74 63 68 69 6e 66 6f 28 70 43 6f 6e 74  3Matchinfo(pCont
18f60 65 78 74 2c 20 70 43 73 72 2c 20 7a 41 72 67 29  ext, pCsr, zArg)
18f70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
18f80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
18f90 65 6d 65 6e 74 73 20 74 68 65 20 78 46 69 6e 64  ements the xFind
18fa0 46 75 6e 63 74 69 6f 6e 20 6d 65 74 68 6f 64 20  Function method 
18fb0 66 6f 72 20 74 68 65 20 46 54 53 33 0a 2a 2a 20  for the FTS3.** 
18fc0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
18fd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
18fe0 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 4d 65 74  3FindFunctionMet
18ff0 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  hod(.  sqlite3_v
19000 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20  tab *pVtab,     
19010 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
19020 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
19030 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19050 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19060 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
19070 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
19080 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
190a0 4e 61 6d 65 20 6f 66 20 53 51 4c 20 66 75 6e 63  Name of SQL func
190b0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
190c0 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c 69 74 65  **pxFunc)(sqlite
190d0 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
190e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
190f0 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
19100 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 41 72  */.  void **ppAr
19110 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
19120 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a       /* Unused *
19130 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4f 76  /.){.  struct Ov
19140 65 72 6c 6f 61 64 65 64 20 7b 0a 20 20 20 20 63  erloaded {.    c
19150 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
19160 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75  ;.    void (*xFu
19170 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
19180 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
19190 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20 61  _value**);.  } a
191a0 4f 76 65 72 6c 6f 61 64 5b 5d 20 3d 20 7b 0a 20  Overload[] = {. 
191b0 20 20 20 7b 20 22 73 6e 69 70 70 65 74 22 2c 20     { "snippet", 
191c0 66 74 73 33 53 6e 69 70 70 65 74 46 75 6e 63 20  fts3SnippetFunc 
191d0 7d 2c 0a 20 20 20 20 7b 20 22 6f 66 66 73 65 74  },.    { "offset
191e0 73 22 2c 20 66 74 73 33 4f 66 66 73 65 74 73 46  s", fts3OffsetsF
191f0 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 70  unc },.    { "op
19200 74 69 6d 69 7a 65 22 2c 20 66 74 73 33 4f 70 74  timize", fts3Opt
19210 69 6d 69 7a 65 46 75 6e 63 20 7d 2c 0a 20 20 20  imizeFunc },.   
19220 20 7b 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20   { "matchinfo", 
19230 66 74 73 33 4d 61 74 63 68 69 6e 66 6f 46 75 6e  fts3MatchinfoFun
19240 63 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  c },.  };.  int 
19250 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
19260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19270 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
19280 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   */..  UNUSED_PA
19290 52 41 4d 45 54 45 52 28 70 56 74 61 62 29 3b 0a  RAMETER(pVtab);.
192a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
192b0 45 52 28 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53  ER(nArg);.  UNUS
192c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 70 41  ED_PARAMETER(ppA
192d0 72 67 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  rg);..  for(i=0;
192e0 20 69 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 61   i<SizeofArray(a
192f0 4f 76 65 72 6c 6f 61 64 29 3b 20 69 2b 2b 29 7b  Overload); i++){
19300 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
19310 7a 4e 61 6d 65 2c 20 61 4f 76 65 72 6c 6f 61 64  zName, aOverload
19320 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
19330 0a 20 20 20 20 20 20 2a 70 78 46 75 6e 63 20 3d  .      *pxFunc =
19340 20 61 4f 76 65 72 6c 6f 61 64 5b 69 5d 2e 78 46   aOverload[i].xF
19350 75 6e 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72  unc;.      retur
19360 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
19370 20 20 2f 2a 20 4e 6f 20 66 75 6e 63 74 69 6f 6e    /* No function
19380 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
19390 64 20 6e 61 6d 65 20 77 61 73 20 66 6f 75 6e 64  d name was found
193a0 2e 20 52 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20  . Return 0. */. 
193b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
193c0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
193d0 6f 6e 20 6f 66 20 46 54 53 33 20 78 52 65 6e 61  on of FTS3 xRena
193e0 6d 65 20 6d 65 74 68 6f 64 2e 20 52 65 6e 61 6d  me method. Renam
193f0 65 20 61 6e 20 66 74 73 33 20 74 61 62 6c 65 2e  e an fts3 table.
19400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
19410 74 73 33 52 65 6e 61 6d 65 4d 65 74 68 6f 64 28  ts3RenameMethod(
19420 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
19430 2a 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20  *pVtab,         
19440 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
19450 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
19460 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
19470 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
19480 2f 2a 20 4e 65 77 20 6e 61 6d 65 20 6f 66 20 74  /* New name of t
19490 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  able */.){.  Fts
194a0 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73  3Table *p = (Fts
194b0 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a  3Table *)pVtab;.
194c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
194d0 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
194e0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
194f0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
19500 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19520 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
19530 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
19540 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46  ts3PendingTermsF
19550 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20 72  lush(p);.  if( r
19560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19570 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19580 20 7d 0a 0a 20 20 66 74 73 33 44 62 45 78 65 63   }..  fts3DbExec
19590 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 22 41  (&rc, db,.    "A
195a0 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25  LTER TABLE %Q.'%
195b0 71 5f 63 6f 6e 74 65 6e 74 27 20 20 52 45 4e 41  q_content'  RENA
195c0 4d 45 20 54 4f 20 27 25 71 5f 63 6f 6e 74 65 6e  ME TO '%q_conten
195d0 74 27 3b 22 2c 0a 20 20 20 20 70 2d 3e 7a 44 62  t';",.    p->zDb
195e0 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  , p->zName, zNam
195f0 65 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  e.  );.  if( p->
19600 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
19610 20 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72     fts3DbExec(&r
19620 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 22 41 4c  c, db,.      "AL
19630 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25 71  TER TABLE %Q.'%q
19640 5f 64 6f 63 73 69 7a 65 27 20 20 52 45 4e 41 4d  _docsize'  RENAM
19650 45 20 54 4f 20 27 25 71 5f 64 6f 63 73 69 7a 65  E TO '%q_docsize
19660 27 3b 22 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44  ';",.      p->zD
19670 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  b, p->zName, zNa
19680 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  me.    );.  }.  
19690 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20  if( p->bHasStat 
196a0 29 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78 65  ){.    fts3DbExe
196b0 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20  c(&rc, db,.     
196c0 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51   "ALTER TABLE %Q
196d0 2e 27 25 71 5f 73 74 61 74 27 20 20 52 45 4e 41  .'%q_stat'  RENA
196e0 4d 45 20 54 4f 20 27 25 71 5f 73 74 61 74 27 3b  ME TO '%q_stat';
196f0 22 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c  ",.      p->zDb,
19700 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65   p->zName, zName
19710 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 66 74  .    );.  }.  ft
19720 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  s3DbExec(&rc, db
19730 2c 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41 42  ,.    "ALTER TAB
19740 4c 45 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  LE %Q.'%q_segmen
19750 74 73 27 20 52 45 4e 41 4d 45 20 54 4f 20 27 25  ts' RENAME TO '%
19760 71 5f 73 65 67 6d 65 6e 74 73 27 3b 22 2c 0a 20  q_segments';",. 
19770 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e     p->zDb, p->zN
19780 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 29 3b 0a  ame, zName.  );.
19790 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72 63    fts3DbExec(&rc
197a0 2c 20 64 62 2c 0a 20 20 20 20 22 41 4c 54 45 52  , db,.    "ALTER
197b0 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73 65   TABLE %Q.'%q_se
197c0 67 64 69 72 27 20 20 20 52 45 4e 41 4d 45 20 54  gdir'   RENAME T
197d0 4f 20 27 25 71 5f 73 65 67 64 69 72 27 3b 22 2c  O '%q_segdir';",
197e0 0a 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e  .    p->zDb, p->
197f0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 29  zName, zName.  )
19800 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19810 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 53 61 76  ../*.** The xSav
19820 65 70 6f 69 6e 74 28 29 20 6d 65 74 68 6f 64 2e  epoint() method.
19830 0a 2a 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  .**.** Flush the
19840 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
19850 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
19860 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  able to disk..*/
19870 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
19880 53 61 76 65 70 6f 69 6e 74 4d 65 74 68 6f 64 28  SavepointMethod(
19890 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
198a0 74 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f  tab, int iSavepo
198b0 69 6e 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  int){.  UNUSED_P
198c0 41 52 41 4d 45 54 45 52 28 69 53 61 76 65 70 6f  ARAMETER(iSavepo
198d0 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  int);.  assert( 
198e0 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56  ((Fts3Table *)pV
198f0 74 61 62 29 2d 3e 69 6e 54 72 61 6e 73 61 63 74  tab)->inTransact
19900 69 6f 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ion );.  assert(
19910 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70   ((Fts3Table *)p
19920 56 74 61 62 29 2d 3e 6d 78 53 61 76 65 70 6f 69  Vtab)->mxSavepoi
19930 6e 74 20 3c 20 69 53 61 76 65 70 6f 69 6e 74 20  nt < iSavepoint 
19940 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 28  );.  TESTONLY( (
19950 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74  (Fts3Table *)pVt
19960 61 62 29 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74  ab)->mxSavepoint
19970 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 29 3b   = iSavepoint );
19980 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 79  .  return fts3Sy
19990 6e 63 4d 65 74 68 6f 64 28 70 56 74 61 62 29 3b  ncMethod(pVtab);
199a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 52  .}../*.** The xR
199b0 65 6c 65 61 73 65 28 29 20 6d 65 74 68 6f 64 2e  elease() method.
199c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
199d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
199e0 63 20 69 6e 74 20 66 74 73 33 52 65 6c 65 61 73  c int fts3Releas
199f0 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  eMethod(sqlite3_
19a00 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74  vtab *pVtab, int
19a10 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
19a20 54 45 53 54 4f 4e 4c 59 28 20 46 74 73 33 54 61  TESTONLY( Fts3Ta
19a30 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
19a40 62 6c 65 2a 29 70 56 74 61 62 20 29 3b 0a 20 20  ble*)pVtab );.  
19a50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19a60 28 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  (iSavepoint);.  
19a70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19a80 28 70 56 74 61 62 29 3b 0a 20 20 61 73 73 65 72  (pVtab);.  asser
19a90 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61 63 74  t( p->inTransact
19aa0 69 6f 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ion );.  assert(
19ab0 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20   p->mxSavepoint 
19ac0 3e 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 29 3b  >= iSavepoint );
19ad0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e  .  TESTONLY( p->
19ae0 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53  mxSavepoint = iS
19af0 61 76 65 70 6f 69 6e 74 2d 31 20 29 3b 0a 20 20  avepoint-1 );.  
19b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  ;.}../*.** The x
19b20 52 6f 6c 6c 62 61 63 6b 54 6f 28 29 20 6d 65 74  RollbackTo() met
19b30 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 63 61  hod..**.** Disca
19b40 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
19b50 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74  of the pending t
19b60 65 72 6d 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  erms table..*/.s
19b70 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 52 6f  tatic int fts3Ro
19b80 6c 6c 62 61 63 6b 54 6f 4d 65 74 68 6f 64 28 73  llbackToMethod(s
19b90 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
19ba0 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  ab, int iSavepoi
19bb0 6e 74 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  nt){.  Fts3Table
19bc0 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
19bd0 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e 55 53 45  *)pVtab;.  UNUSE
19be0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 53 61 76  D_PARAMETER(iSav
19bf0 65 70 6f 69 6e 74 29 3b 0a 20 20 61 73 73 65 72  epoint);.  asser
19c00 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61 63 74  t( p->inTransact
19c10 69 6f 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ion );.  assert(
19c20 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20   p->mxSavepoint 
19c30 3e 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 29 3b  >= iSavepoint );
19c40 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e  .  TESTONLY( p->
19c50 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53  mxSavepoint = iS
19c60 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 73 71  avepoint );.  sq
19c70 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
19c80 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20  TermsClear(p);. 
19c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19ca0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  K;.}..static con
19cb0 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
19cc0 65 20 66 74 73 33 4d 6f 64 75 6c 65 20 3d 20 7b  e fts3Module = {
19cd0 0a 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 20  .  /* iVersion  
19ce0 20 20 20 20 2a 2f 20 32 2c 0a 20 20 2f 2a 20 78      */ 2,.  /* x
19cf0 43 72 65 61 74 65 20 20 20 20 20 20 20 2a 2f 20  Create       */ 
19d00 66 74 73 33 43 72 65 61 74 65 4d 65 74 68 6f 64  fts3CreateMethod
19d10 2c 0a 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20  ,.  /* xConnect 
19d20 20 20 20 20 20 2a 2f 20 66 74 73 33 43 6f 6e 6e       */ fts3Conn
19d30 65 63 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  ectMethod,.  /* 
19d40 78 42 65 73 74 49 6e 64 65 78 20 20 20 20 2a 2f  xBestIndex    */
19d50 20 66 74 73 33 42 65 73 74 49 6e 64 65 78 4d 65   fts3BestIndexMe
19d60 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 44 69 73 63  thod,.  /* xDisc
19d70 6f 6e 6e 65 63 74 20 20 20 2a 2f 20 66 74 73 33  onnect   */ fts3
19d80 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64  DisconnectMethod
19d90 2c 0a 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20  ,.  /* xDestroy 
19da0 20 20 20 20 20 2a 2f 20 66 74 73 33 44 65 73 74       */ fts3Dest
19db0 72 6f 79 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  royMethod,.  /* 
19dc0 78 4f 70 65 6e 20 20 20 20 20 20 20 20 20 2a 2f  xOpen         */
19dd0 20 66 74 73 33 4f 70 65 6e 4d 65 74 68 6f 64 2c   fts3OpenMethod,
19de0 0a 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20 20  .  /* xClose    
19df0 20 20 20 20 2a 2f 20 66 74 73 33 43 6c 6f 73 65      */ fts3Close
19e00 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 46 69  Method,.  /* xFi
19e10 6c 74 65 72 20 20 20 20 20 20 20 2a 2f 20 66 74  lter       */ ft
19e20 73 33 46 69 6c 74 65 72 4d 65 74 68 6f 64 2c 0a  s3FilterMethod,.
19e30 20 20 2f 2a 20 78 4e 65 78 74 20 20 20 20 20 20    /* xNext      
19e40 20 20 20 2a 2f 20 66 74 73 33 4e 65 78 74 4d 65     */ fts3NextMe
19e50 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 45 6f 66 20  thod,.  /* xEof 
19e60 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33           */ fts3
19e70 45 6f 66 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  EofMethod,.  /* 
19e80 78 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f  xColumn       */
19e90 20 66 74 73 33 43 6f 6c 75 6d 6e 4d 65 74 68 6f   fts3ColumnMetho
19ea0 64 2c 0a 20 20 2f 2a 20 78 52 6f 77 69 64 20 20  d,.  /* xRowid  
19eb0 20 20 20 20 20 20 2a 2f 20 66 74 73 33 52 6f 77        */ fts3Row
19ec0 69 64 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  idMethod,.  /* x
19ed0 55 70 64 61 74 65 20 20 20 20 20 20 20 2a 2f 20  Update       */ 
19ee0 66 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64  fts3UpdateMethod
19ef0 2c 0a 20 20 2f 2a 20 78 42 65 67 69 6e 20 20 20  ,.  /* xBegin   
19f00 20 20 20 20 20 2a 2f 20 66 74 73 33 42 65 67 69       */ fts3Begi
19f10 6e 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 53  nMethod,.  /* xS
19f20 79 6e 63 20 20 20 20 20 20 20 20 20 2a 2f 20 66  ync         */ f
19f30 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 2c 0a 20  ts3SyncMethod,. 
19f40 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 20 20 20 20   /* xCommit     
19f50 20 20 2a 2f 20 66 74 73 33 43 6f 6d 6d 69 74 4d    */ fts3CommitM
19f60 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52 6f 6c  ethod,.  /* xRol
19f70 6c 62 61 63 6b 20 20 20 20 20 2a 2f 20 66 74 73  lback     */ fts
19f80 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 2c  3RollbackMethod,
19f90 0a 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74  .  /* xFindFunct
19fa0 69 6f 6e 20 2a 2f 20 66 74 73 33 46 69 6e 64 46  ion */ fts3FindF
19fb0 75 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 2c 0a 20  unctionMethod,. 
19fc0 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 20 20   /* xRename */  
19fd0 20 20 20 20 20 66 74 73 33 52 65 6e 61 6d 65 4d       fts3RenameM
19fe0 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 53 61 76  ethod,.  /* xSav
19ff0 65 70 6f 69 6e 74 20 20 20 20 2a 2f 20 66 74 73  epoint    */ fts
1a000 33 53 61 76 65 70 6f 69 6e 74 4d 65 74 68 6f 64  3SavepointMethod
1a010 2c 0a 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20  ,.  /* xRelease 
1a020 20 20 20 20 20 2a 2f 20 66 74 73 33 52 65 6c 65       */ fts3Rele
1a030 61 73 65 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  aseMethod,.  /* 
1a040 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 20 20 2a 2f  xRollbackTo   */
1a050 20 66 74 73 33 52 6f 6c 6c 62 61 63 6b 54 6f 4d   fts3RollbackToM
1a060 65 74 68 6f 64 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ethod,.};../*.**
1a070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1a080 73 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20  s registered as 
1a090 74 68 65 20 6d 6f 64 75 6c 65 20 64 65 73 74 72  the module destr
1a0a0 75 63 74 6f 72 20 28 63 61 6c 6c 65 64 20 77 68  uctor (called wh
1a0b0 65 6e 20 61 6e 0a 2a 2a 20 46 54 53 33 20 65 6e  en an.** FTS3 en
1a0c0 61 62 6c 65 64 20 64 61 74 61 62 61 73 65 20 63  abled database c
1a0d0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f  onnection is clo
1a0e0 73 65 64 29 2e 20 49 74 20 66 72 65 65 73 20 74  sed). It frees t
1a0f0 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c  he memory.** all
1a100 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 74  ocated for the t
1a110 6f 6b 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61  okenizer hash ta
1a120 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1a130 6f 69 64 20 68 61 73 68 44 65 73 74 72 6f 79 28  oid hashDestroy(
1a140 76 6f 69 64 20 2a 70 29 7b 0a 20 20 46 74 73 33  void *p){.  Fts3
1a150 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 28 46  Hash *pHash = (F
1a160 74 73 33 48 61 73 68 20 2a 29 70 3b 0a 20 20 73  ts3Hash *)p;.  s
1a170 71 6c 69 74 65 33 46 74 73 33 48 61 73 68 43 6c  qlite3Fts3HashCl
1a180 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 73 71  ear(pHash);.  sq
1a190 6c 69 74 65 33 5f 66 72 65 65 28 70 48 61 73 68  lite3_free(pHash
1a1a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
1a1b0 66 74 73 33 20 62 75 69 6c 74 2d 69 6e 20 74 6f  fts3 built-in to
1a1c0 6b 65 6e 69 7a 65 72 73 20 2d 20 22 73 69 6d 70  kenizers - "simp
1a1d0 6c 65 22 2c 20 22 70 6f 72 74 65 72 22 20 61 6e  le", "porter" an
1a1e0 64 20 22 69 63 75 22 2d 20 61 72 65 20 0a 2a 2a  d "icu"- are .**
1a1f0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20   implemented in 
1a200 66 69 6c 65 73 20 66 74 73 33 5f 74 6f 6b 65 6e  files fts3_token
1a210 69 7a 65 72 31 2e 63 2c 20 66 74 73 33 5f 70 6f  izer1.c, fts3_po
1a220 72 74 65 72 2e 63 20 61 6e 64 20 66 74 73 33 5f  rter.c and fts3_
1a230 69 63 75 2e 63 0a 2a 2a 20 72 65 73 70 65 63 74  icu.c.** respect
1a240 69 76 65 6c 79 2e 20 54 68 65 20 66 6f 6c 6c 6f  ively. The follo
1a250 77 69 6e 67 20 74 68 72 65 65 20 66 6f 72 77 61  wing three forwa
1a260 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd declarations 
1a270 61 72 65 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  are for function
1a280 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64 20 69 6e  s.** declared in
1a290 20 74 68 65 73 65 20 66 69 6c 65 73 20 75 73 65   these files use
1a2a0 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
1a2b0 65 20 72 65 73 70 65 63 74 69 76 65 20 69 6d 70  e respective imp
1a2c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2a  lementations..**
1a2d0 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69  .** Calling sqli
1a2e0 74 65 33 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b  te3Fts3SimpleTok
1a2f0 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 29 20 73  enizerModule() s
1a300 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 70 6f  ets the value po
1a310 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 74  inted.** to by t
1a320 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  he argument to p
1a330 6f 69 6e 74 20 74 6f 20 74 68 65 20 22 73 69 6d  oint to the "sim
1a340 70 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72 20 69  ple" tokenizer i
1a350 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
1a360 2a 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2f 0a  * And so on..*/.
1a370 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
1a380 53 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d  SimpleTokenizerM
1a390 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74 6f  odule(sqlite3_to
1a3a0 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63  kenizer_module c
1a3b0 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b  onst**ppModule);
1a3c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1a3d0 33 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72  3PorterTokenizer
1a3e0 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74  Module(sqlite3_t
1a3f0 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
1a400 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29  const**ppModule)
1a410 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a420 45 4e 41 42 4c 45 5f 49 43 55 0a 76 6f 69 64 20  ENABLE_ICU.void 
1a430 73 71 6c 69 74 65 33 46 74 73 33 49 63 75 54 6f  sqlite3Fts3IcuTo
1a440 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73 71  kenizerModule(sq
1a450 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
1a460 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70  module const**pp
1a470 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
1a480 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 73  ./*.** Initialis
1a490 65 20 74 68 65 20 66 74 73 33 20 65 78 74 65 6e  e the fts3 exten
1a4a0 73 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 65 78  sion. If this ex
1a4b0 74 65 6e 73 69 6f 6e 20 69 73 20 62 75 69 6c 74  tension is built
1a4c0 20 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74   as part.** of t
1a4d0 68 65 20 73 71 6c 69 74 65 20 6c 69 62 72 61 72  he sqlite librar
1a4e0 79 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  y, then this fun
1a4f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1a500 64 69 72 65 63 74 6c 79 20 62 79 0a 2a 2a 20 53  directly by.** S
1a510 51 4c 69 74 65 2e 20 49 66 20 66 74 73 33 20 69  QLite. If fts3 i
1a520 73 20 62 75 69 6c 74 20 61 73 20 61 20 64 79 6e  s built as a dyn
1a530 61 6d 69 63 61 6c 6c 79 20 6c 6f 61 64 61 62 6c  amically loadabl
1a540 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 69  e extension, thi
1a550 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
1a560 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 73   called by the s
1a570 71 6c 69 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e  qlite3_extension
1a580 5f 69 6e 69 74 28 29 20 65 6e 74 72 79 20 70 6f  _init() entry po
1a590 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  int..*/.int sqli
1a5a0 74 65 33 46 74 73 33 49 6e 69 74 28 73 71 6c 69  te3Fts3Init(sqli
1a5b0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
1a5c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a5d0 20 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73    Fts3Hash *pHas
1a5e0 68 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73  h = 0;.  const s
1a5f0 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
1a600 5f 6d 6f 64 75 6c 65 20 2a 70 53 69 6d 70 6c 65  _module *pSimple
1a610 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71   = 0;.  const sq
1a620 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
1a630 6d 6f 64 75 6c 65 20 2a 70 50 6f 72 74 65 72 20  module *pPorter 
1a640 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
1a650 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20  ITE_ENABLE_ICU. 
1a660 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74   const sqlite3_t
1a670 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
1a680 2a 70 49 63 75 20 3d 20 30 3b 0a 20 20 73 71 6c  *pIcu = 0;.  sql
1a690 69 74 65 33 46 74 73 33 49 63 75 54 6f 6b 65 6e  ite3Fts3IcuToken
1a6a0 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70 49 63 75  izerModule(&pIcu
1a6b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
1a6c0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1a6d0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1a6e0 49 6e 69 74 54 65 72 6d 28 64 62 29 3b 0a 20 20  InitTerm(db);.  
1a6f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a700 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  K ) return rc;.#
1a710 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d 20 73 71  endif..  rc = sq
1a720 6c 69 74 65 33 46 74 73 33 49 6e 69 74 41 75 78  lite3Fts3InitAux
1a730 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  (db);.  if( rc!=
1a740 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1a750 72 6e 20 72 63 3b 0a 0a 20 20 73 71 6c 69 74 65  rn rc;..  sqlite
1a760 33 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b 65 6e  3Fts3SimpleToken
1a770 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70 53 69 6d  izerModule(&pSim
1a780 70 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ple);.  sqlite3F
1a790 74 73 33 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  ts3PorterTokeniz
1a7a0 65 72 4d 6f 64 75 6c 65 28 26 70 50 6f 72 74 65  erModule(&pPorte
1a7b0 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  r);..  /* Alloca
1a7c0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 73  te and initialis
1a7d0 65 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  e the hash-table
1a7e0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1a7f0 6f 6b 65 6e 69 7a 65 72 73 2e 20 2a 2f 0a 20 20  okenizers. */.  
1a800 70 48 61 73 68 20 3d 20 73 71 6c 69 74 65 33 5f  pHash = sqlite3_
1a810 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74  malloc(sizeof(Ft
1a820 73 33 48 61 73 68 29 29 3b 0a 20 20 69 66 28 20  s3Hash));.  if( 
1a830 21 70 48 61 73 68 20 29 7b 0a 20 20 20 20 72 63  !pHash ){.    rc
1a840 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1a850 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1a860 6c 69 74 65 33 46 74 73 33 48 61 73 68 49 6e 69  lite3Fts3HashIni
1a870 74 28 70 48 61 73 68 2c 20 46 54 53 33 5f 48 41  t(pHash, FTS3_HA
1a880 53 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b 0a 20  SH_STRING, 1);. 
1a890 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   }..  /* Load th
1a8a0 65 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b 65 6e  e built-in token
1a8b0 69 7a 65 72 73 20 69 6e 74 6f 20 74 68 65 20 68  izers into the h
1a8c0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ash table */.  i
1a8d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a8e0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1a8f0 74 65 33 46 74 73 33 48 61 73 68 49 6e 73 65 72  te3Fts3HashInser
1a900 74 28 70 48 61 73 68 2c 20 22 73 69 6d 70 6c 65  t(pHash, "simple
1a910 22 2c 20 37 2c 20 28 76 6f 69 64 20 2a 29 70 53  ", 7, (void *)pS
1a920 69 6d 70 6c 65 29 0a 20 20 20 20 20 7c 7c 20 73  imple).     || s
1a930 71 6c 69 74 65 33 46 74 73 33 48 61 73 68 49 6e  qlite3Fts3HashIn
1a940 73 65 72 74 28 70 48 61 73 68 2c 20 22 70 6f 72  sert(pHash, "por
1a950 74 65 72 22 2c 20 37 2c 20 28 76 6f 69 64 20 2a  ter", 7, (void *
1a960 29 70 50 6f 72 74 65 72 29 20 0a 23 69 66 64 65  )pPorter) .#ifde
1a970 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a980 49 43 55 0a 20 20 20 20 20 7c 7c 20 28 70 49 63  ICU.     || (pIc
1a990 75 20 26 26 20 73 71 6c 69 74 65 33 46 74 73 33  u && sqlite3Fts3
1a9a0 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
1a9b0 2c 20 22 69 63 75 22 2c 20 34 2c 20 28 76 6f 69  , "icu", 4, (voi
1a9c0 64 20 2a 29 70 49 63 75 29 29 0a 23 65 6e 64 69  d *)pIcu)).#endi
1a9d0 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  f.    ){.      r
1a9e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a9f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1aa00 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1aa10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aa20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1aa30 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 49  sqlite3Fts3ExprI
1aa40 6e 69 74 54 65 73 74 49 6e 74 65 72 66 61 63 65  nitTestInterface
1aa50 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1aa60 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
1aa70 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1aa80 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
1aa90 68 65 20 68 61 73 68 2d 74 61 62 6c 65 20 61 6e  he hash-table an
1aaa0 64 20 6f 76 65 72 6c 6f 61 64 20 0a 20 20 2a 2a  d overload .  **
1aab0 20 74 68 65 20 74 77 6f 20 73 63 61 6c 61 72 20   the two scalar 
1aac0 66 75 6e 63 74 69 6f 6e 73 2e 20 49 66 20 74 68  functions. If th
1aad0 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  is is successful
1aae0 2c 20 72 65 67 69 73 74 65 72 20 74 68 65 0a 20  , register the. 
1aaf0 20 2a 2a 20 6d 6f 64 75 6c 65 20 77 69 74 68 20   ** module with 
1ab00 73 71 6c 69 74 65 2e 0a 20 20 2a 2f 0a 20 20 69  sqlite..  */.  i
1ab10 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
1ab20 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f   .   && SQLITE_O
1ab30 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
1ab40 46 74 73 33 49 6e 69 74 48 61 73 68 54 61 62 6c  Fts3InitHashTabl
1ab50 65 28 64 62 2c 20 70 48 61 73 68 2c 20 22 66 74  e(db, pHash, "ft
1ab60 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 29 29 0a  s3_tokenizer")).
1ab70 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d     && SQLITE_OK=
1ab80 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f  =(rc = sqlite3_o
1ab90 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
1aba0 28 64 62 2c 20 22 73 6e 69 70 70 65 74 22 2c 20  (db, "snippet", 
1abb0 2d 31 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54  -1)).   && SQLIT
1abc0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
1abd0 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
1abe0 63 74 69 6f 6e 28 64 62 2c 20 22 6f 66 66 73 65  ction(db, "offse
1abf0 74 73 22 2c 20 31 29 29 0a 20 20 20 26 26 20 53  ts", 1)).   && S
1ac00 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1ac10 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
1ac20 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d  _function(db, "m
1ac30 61 74 63 68 69 6e 66 6f 22 2c 20 31 29 29 0a 20  atchinfo", 1)). 
1ac40 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d    && SQLITE_OK==
1ac50 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76  (rc = sqlite3_ov
1ac60 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
1ac70 64 62 2c 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c  db, "matchinfo",
1ac80 20 32 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54   2)).   && SQLIT
1ac90 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
1aca0 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
1acb0 63 74 69 6f 6e 28 64 62 2c 20 22 6f 70 74 69 6d  ction(db, "optim
1acc0 69 7a 65 22 2c 20 31 29 29 0a 20 20 29 7b 0a 20  ize", 1)).  ){. 
1acd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1ace0 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32  create_module_v2
1acf0 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66  (.        db, "f
1ad00 74 73 33 22 2c 20 26 66 74 73 33 4d 6f 64 75 6c  ts3", &fts3Modul
1ad10 65 2c 20 28 76 6f 69 64 20 2a 29 70 48 61 73 68  e, (void *)pHash
1ad20 2c 20 68 61 73 68 44 65 73 74 72 6f 79 0a 20 20  , hashDestroy.  
1ad30 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
1ad40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ad50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ad60 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76  _create_module_v
1ad70 32 28 0a 20 20 20 20 20 20 20 20 20 20 64 62 2c  2(.          db,
1ad80 20 22 66 74 73 34 22 2c 20 26 66 74 73 33 4d 6f   "fts4", &fts3Mo
1ad90 64 75 6c 65 2c 20 28 76 6f 69 64 20 2a 29 70 48  dule, (void *)pH
1ada0 61 73 68 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ash, 0.      );.
1adb0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1adc0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41   rc;.  }..  /* A
1add0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
1ade0 72 72 65 64 2e 20 44 65 6c 65 74 65 20 74 68 65  rred. Delete the
1adf0 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
1ae00 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
1ae10 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 61 73 73 65   code. */.  asse
1ae20 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
1ae30 4b 20 29 3b 0a 20 20 69 66 28 20 70 48 61 73 68  K );.  if( pHash
1ae40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
1ae50 74 73 33 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts3HashClear(pHa
1ae60 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sh);.    sqlite3
1ae70 5f 66 72 65 65 28 70 48 61 73 68 29 3b 0a 20 20  _free(pHash);.  
1ae80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ae90 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1aea0 20 61 6e 20 46 74 73 33 4d 75 6c 74 69 53 65 67   an Fts3MultiSeg
1aeb0 52 65 61 64 65 72 20 66 6f 72 20 65 61 63 68 20  Reader for each 
1aec0 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 78 70  token in the exp
1aed0 72 65 73 73 69 6f 6e 20 68 65 61 64 65 64 0a 2a  ression headed.*
1aee0 2a 20 62 79 20 70 45 78 70 72 2e 20 0a 2a 2a 0a  * by pExpr. .**.
1aef0 2a 2a 20 41 6e 20 46 74 73 33 53 65 67 52 65 61  ** An Fts3SegRea
1af00 64 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 20  der object is a 
1af10 63 75 72 73 6f 72 20 74 68 61 74 20 63 61 6e 20  cursor that can 
1af20 73 65 65 6b 20 6f 72 20 73 63 61 6e 20 61 20 72  seek or scan a r
1af30 61 6e 67 65 20 6f 66 0a 2a 2a 20 65 6e 74 72 69  ange of.** entri
1af40 65 73 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67  es within a sing
1af50 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  le segment b-tre
1af60 65 2e 20 41 6e 20 46 74 73 33 4d 75 6c 74 69 53  e. An Fts3MultiS
1af70 65 67 52 65 61 64 65 72 20 75 73 65 73 20 6d 75  egReader uses mu
1af80 6c 74 69 70 6c 65 0a 2a 2a 20 46 74 73 33 53 65  ltiple.** Fts3Se
1af90 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20  gReader objects 
1afa0 69 6e 74 65 72 6e 61 6c 6c 79 20 74 6f 20 70 72  internally to pr
1afb0 6f 76 69 64 65 20 61 6e 20 69 6e 74 65 72 66 61  ovide an interfa
1afc0 63 65 20 74 6f 20 73 65 65 6b 20 6f 72 20 73 63  ce to seek or sc
1afd0 61 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  an.** within the
1afe0 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 65   union of all se
1aff0 67 6d 65 6e 74 73 20 6f 66 20 61 20 62 2d 74 72  gments of a b-tr
1b000 65 65 2e 20 48 65 6e 63 65 20 74 68 65 20 6e 61  ee. Hence the na
1b010 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
1b020 20 61 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 4d   allocated Fts3M
1b030 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 6a 75  ultiSegReader ju
1b040 73 74 20 73 65 65 6b 73 20 74 6f 20 61 20 73 69  st seeks to a si
1b050 6e 67 6c 65 20 65 6e 74 72 79 20 69 6e 20 61 0a  ngle entry in a.
1b060 2a 2a 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ** segment b-tre
1b070 65 20 28 69 66 20 74 68 65 20 74 65 72 6d 20 69  e (if the term i
1b080 73 20 6e 6f 74 20 61 20 70 72 65 66 69 78 20 6f  s not a prefix o
1b090 72 20 69 74 20 69 73 20 61 20 70 72 65 66 69 78  r it is a prefix
1b0a0 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68   for which.** th
1b0b0 65 72 65 20 65 78 69 73 74 73 20 70 72 65 66 69  ere exists prefi
1b0c0 78 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65 20  x b-tree of the 
1b0d0 72 69 67 68 74 20 6c 65 6e 67 74 68 29 20 74 68  right length) th
1b0e0 65 6e 20 69 74 20 6d 61 79 20 62 65 20 74 72 61  en it may be tra
1b0f0 76 65 72 73 65 64 0a 2a 2a 20 61 6e 64 20 6d 65  versed.** and me
1b100 72 67 65 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c  rged incremental
1b110 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ly. Otherwise, i
1b120 74 20 68 61 73 20 74 6f 20 62 65 20 6d 65 72 67  t has to be merg
1b130 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 2d 6d 65  ed into an in-me
1b140 6d 6f 72 79 20 0a 2a 2a 20 64 6f 63 6c 69 73 74  mory .** doclist
1b150 20 61 6e 64 20 74 68 65 6e 20 74 72 61 76 65 72   and then traver
1b160 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
1b170 6f 69 64 20 66 74 73 33 45 76 61 6c 41 6c 6c 6f  oid fts3EvalAllo
1b180 63 61 74 65 52 65 61 64 65 72 73 28 0a 20 20 46  cateReaders(.  F
1b190 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b1b0 2a 20 46 54 53 20 63 75 72 73 6f 72 20 68 61 6e  * FTS cursor han
1b1c0 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70  dle */.  Fts3Exp
1b1d0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
1b1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1b1f0 63 61 74 65 20 72 65 61 64 65 72 73 20 66 6f 72  cate readers for
1b200 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
1b210 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 54 6f 6b   */.  int *pnTok
1b220 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1b230 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
1b240 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
1b250 6b 65 6e 73 20 69 6e 20 70 68 72 61 73 65 2e 20  kens in phrase. 
1b260 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 72 2c 20  */.  int *pnOr, 
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b280 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74       /* OUT: Tot
1b290 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 4f 52 20  al number of OR 
1b2a0 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 2e 20 2a  nodes in expr. *
1b2b0 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  /.  int *pRc    
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
1b2e0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a  rror code */.){.
1b2f0 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 53    if( pExpr && S
1b300 51 4c 49 54 45 5f 4f 4b 3d 3d 2a 70 52 63 20 29  QLITE_OK==*pRc )
1b310 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1b320 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59  >eType==FTSQUERY
1b330 5f 50 48 52 41 53 45 20 29 7b 0a 20 20 20 20 20  _PHRASE ){.     
1b340 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
1b350 74 20 6e 54 6f 6b 65 6e 20 3d 20 70 45 78 70 72  t nToken = pExpr
1b360 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65  ->pPhrase->nToke
1b370 6e 3b 0a 20 20 20 20 20 20 2a 70 6e 54 6f 6b 65  n;.      *pnToke
1b380 6e 20 2b 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20  n += nToken;.   
1b390 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54     for(i=0; i<nT
1b3a0 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oken; i++){.    
1b3b0 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
1b3c0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70  ken *pToken = &p
1b3d0 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 61  Expr->pPhrase->a
1b3e0 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  Token[i];.      
1b3f0 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 54    int rc = fts3T
1b400 65 72 6d 53 65 67 52 65 61 64 65 72 43 75 72 73  ermSegReaderCurs
1b410 6f 72 28 70 43 73 72 2c 20 0a 20 20 20 20 20 20  or(pCsr, .      
1b420 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 7a 2c        pToken->z,
1b430 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 54 6f 6b   pToken->n, pTok
1b440 65 6e 2d 3e 69 73 50 72 65 66 69 78 2c 20 26 70  en->isPrefix, &p
1b450 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 0a 20  Token->pSegcsr. 
1b460 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1b470 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b490 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
1b4a0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1b4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b4c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1b4d0 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 69 44  xpr->pPhrase->iD
1b4e0 6f 63 6c 69 73 74 54 6f 6b 65 6e 3d 3d 30 20 29  oclistToken==0 )
1b4f0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
1b500 50 68 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74  Phrase->iDoclist
1b510 54 6f 6b 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  Token = -1;.    
1b520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e  }else{.      *pn
1b530 4f 72 20 2b 3d 20 28 70 45 78 70 72 2d 3e 65 54  Or += (pExpr->eT
1b540 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f 52  ype==FTSQUERY_OR
1b550 29 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61  );.      fts3Eva
1b560 6c 41 6c 6c 6f 63 61 74 65 52 65 61 64 65 72 73  lAllocateReaders
1b570 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c  (pCsr, pExpr->pL
1b580 65 66 74 2c 20 70 6e 54 6f 6b 65 6e 2c 20 70 6e  eft, pnToken, pn
1b590 4f 72 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20  Or, pRc);.      
1b5a0 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65  fts3EvalAllocate
1b5b0 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70 45  Readers(pCsr, pE
1b5c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 70 6e 54  xpr->pRight, pnT
1b5d0 6f 6b 65 6e 2c 20 70 6e 4f 72 2c 20 70 52 63 29  oken, pnOr, pRc)
1b5e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1b5f0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
1b600 4c 69 73 74 2f 6e 4c 69 73 74 20 63 6f 6e 74 61  List/nList conta
1b610 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66  in the doclist f
1b620 6f 72 20 74 6f 6b 65 6e 20 69 54 6f 6b 65 6e 20  or token iToken 
1b630 6f 66 20 70 68 72 61 73 65 20 70 2e 0a 2a 2a 20  of phrase p..** 
1b640 49 74 20 69 73 20 6d 65 72 67 65 64 20 69 6e 74  It is merged int
1b650 6f 20 74 68 65 20 6d 61 69 6e 20 64 6f 63 6c 69  o the main docli
1b660 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 2d 3e  st stored in p->
1b670 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41 6c  doclist.aAll/nAl
1b680 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  l..**.** This fu
1b690 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1b6a0 68 61 74 20 70 4c 69 73 74 20 70 6f 69 6e 74 73  hat pList points
1b6b0 20 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c 6c   to a buffer all
1b6c0 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
1b6d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
1b6e0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1b6f0 74 61 6b 65 73 20 72 65 73 70 6f 6e 73 69 62 69  takes responsibi
1b700 6c 69 74 79 20 66 6f 72 20 65 76 65 6e 74 75 61  lity for eventua
1b710 6c 6c 79 0a 2a 2a 20 66 72 65 65 69 6e 67 20 74  lly.** freeing t
1b720 68 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  he buffer..*/.st
1b730 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45 76  atic void fts3Ev
1b740 61 6c 50 68 72 61 73 65 4d 65 72 67 65 54 6f 6b  alPhraseMergeTok
1b750 65 6e 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  en(.  Fts3Table 
1b760 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
1b770 20 20 20 20 20 20 2f 2a 20 46 54 53 20 54 61 62        /* FTS Tab
1b780 6c 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  le pointer */.  
1b790 46 74 73 33 50 68 72 61 73 65 20 2a 70 2c 20 20  Fts3Phrase *p,  
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 2f 2a 20 50 68 72 61 73 65 20 74 6f 20 6d 65 72  /* Phrase to mer
1b7c0 67 65 20 70 4c 69 73 74 2f 6e 4c 69 73 74 20 69  ge pList/nList i
1b7d0 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f  nto */.  int iTo
1b7e0 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
1b7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65           /* Toke
1b800 6e 20 70 4c 69 73 74 2f 6e 4c 69 73 74 20 63 6f  n pList/nList co
1b810 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2a 2f 0a  rresponds to */.
1b820 20 20 63 68 61 72 20 2a 70 4c 69 73 74 2c 20 20    char *pList,  
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b840 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1b850 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  doclist */.  int
1b860 20 6e 4c 69 73 74 20 20 20 20 20 20 20 20 20 20   nList          
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b880 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1b890 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 29 7b 0a 20  in pList */.){. 
1b8a0 20 61 73 73 65 72 74 28 20 69 54 6f 6b 65 6e 21   assert( iToken!
1b8b0 3d 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65  =p->iDoclistToke
1b8c0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73  n );..  if( pLis
1b8d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
1b8e0 74 65 33 5f 66 72 65 65 28 70 2d 3e 64 6f 63 6c  te3_free(p->docl
1b8f0 69 73 74 2e 61 41 6c 6c 29 3b 0a 20 20 20 20 70  ist.aAll);.    p
1b900 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 3d  ->doclist.aAll =
1b910 20 30 3b 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69   0;.    p->docli
1b920 73 74 2e 6e 41 6c 6c 20 3d 20 30 3b 0a 20 20 7d  st.nAll = 0;.  }
1b930 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e  ..  else if( p->
1b940 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3c 30 20  iDoclistToken<0 
1b950 29 7b 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73  ){.    p->doclis
1b960 74 2e 61 41 6c 6c 20 3d 20 70 4c 69 73 74 3b 0a  t.aAll = pList;.
1b970 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 6e      p->doclist.n
1b980 41 6c 6c 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 7d  All = nList;.  }
1b990 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e  ..  else if( p->
1b9a0 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 3d 3d 30 20  doclist.aAll==0 
1b9b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1b9c0 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ree(pList);.  }.
1b9d0 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 63 68  .  else {.    ch
1b9e0 61 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 63  ar *pLeft;.    c
1b9f0 68 61 72 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  har *pRight;.   
1ba00 20 69 6e 74 20 6e 4c 65 66 74 3b 0a 20 20 20 20   int nLeft;.    
1ba10 69 6e 74 20 6e 52 69 67 68 74 3b 0a 20 20 20 20  int nRight;.    
1ba20 69 6e 74 20 6e 44 69 66 66 3b 0a 0a 20 20 20 20  int nDiff;..    
1ba30 69 66 28 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54  if( p->iDoclistT
1ba40 6f 6b 65 6e 3c 69 54 6f 6b 65 6e 20 29 7b 0a 20  oken<iToken ){. 
1ba50 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 2d 3e       pLeft = p->
1ba60 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 3b 0a 20 20  doclist.aAll;.  
1ba70 20 20 20 20 6e 4c 65 66 74 20 3d 20 70 2d 3e 64      nLeft = p->d
1ba80 6f 63 6c 69 73 74 2e 6e 41 6c 6c 3b 0a 20 20 20  oclist.nAll;.   
1ba90 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73     pRight = pLis
1baa0 74 3b 0a 20 20 20 20 20 20 6e 52 69 67 68 74 20  t;.      nRight 
1bab0 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e  = nList;.      n
1bac0 44 69 66 66 20 3d 20 69 54 6f 6b 65 6e 20 2d 20  Diff = iToken - 
1bad0 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e  p->iDoclistToken
1bae0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1baf0 20 20 20 70 52 69 67 68 74 20 3d 20 70 2d 3e 64     pRight = p->d
1bb00 6f 63 6c 69 73 74 2e 61 41 6c 6c 3b 0a 20 20 20  oclist.aAll;.   
1bb10 20 20 20 6e 52 69 67 68 74 20 3d 20 70 2d 3e 64     nRight = p->d
1bb20 6f 63 6c 69 73 74 2e 6e 41 6c 6c 3b 0a 20 20 20  oclist.nAll;.   
1bb30 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74     pLeft = pList
1bb40 3b 0a 20 20 20 20 20 20 6e 4c 65 66 74 20 3d 20  ;.      nLeft = 
1bb50 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e 44 69  nList;.      nDi
1bb60 66 66 20 3d 20 70 2d 3e 69 44 6f 63 6c 69 73 74  ff = p->iDoclist
1bb70 54 6f 6b 65 6e 20 2d 20 69 54 6f 6b 65 6e 3b 0a  Token - iToken;.
1bb80 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 44      }..    fts3D
1bb90 6f 63 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67  oclistPhraseMerg
1bba0 65 28 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78  e(pTab->bDescIdx
1bbb0 2c 20 6e 44 69 66 66 2c 20 70 4c 65 66 74 2c 20  , nDiff, pLeft, 
1bbc0 6e 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 26 6e  nLeft, pRight,&n
1bbd0 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69  Right);.    sqli
1bbe0 74 65 33 5f 66 72 65 65 28 70 4c 65 66 74 29 3b  te3_free(pLeft);
1bbf0 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e  .    p->doclist.
1bc00 61 41 6c 6c 20 3d 20 70 52 69 67 68 74 3b 0a 20  aAll = pRight;. 
1bc10 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41     p->doclist.nA
1bc20 6c 6c 20 3d 20 6e 52 69 67 68 74 3b 0a 20 20 7d  ll = nRight;.  }
1bc30 0a 0a 20 20 69 66 28 20 69 54 6f 6b 65 6e 3e 70  ..  if( iToken>p
1bc40 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 20  ->iDoclistToken 
1bc50 29 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  ) p->iDoclistTok
1bc60 65 6e 20 3d 20 69 54 6f 6b 65 6e 3b 0a 7d 0a 0a  en = iToken;.}..
1bc70 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 64  /*.** Load the d
1bc80 6f 63 6c 69 73 74 20 66 6f 72 20 70 68 72 61 73  oclist for phras
1bc90 65 20 70 20 69 6e 74 6f 20 70 2d 3e 64 6f 63 6c  e p into p->docl
1bca0 69 73 74 2e 61 41 6c 6c 2f 6e 41 6c 6c 2e 20 54  ist.aAll/nAll. T
1bcb0 68 65 20 6c 6f 61 64 65 64 20 64 6f 63 6c 69 73  he loaded doclis
1bcc0 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 74 61  t.** does not ta
1bcd0 6b 65 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  ke deferred toke
1bce0 6e 73 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e  ns into account.
1bcf0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1bd00 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1bd10 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1bd20 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   otherwise an SQ
1bd30 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1bd40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1bd50 74 73 33 45 76 61 6c 50 68 72 61 73 65 4c 6f 61  ts3EvalPhraseLoa
1bd60 64 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  d(.  Fts3Cursor 
1bd70 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
1bd80 20 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73       /* FTS Curs
1bd90 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  or handle */.  F
1bda0 74 73 33 50 68 72 61 73 65 20 2a 70 20 20 20 20  ts3Phrase *p    
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bdc0 2a 20 50 68 72 61 73 65 20 6f 62 6a 65 63 74 20  * Phrase object 
1bdd0 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  */.){.  Fts3Tabl
1bde0 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54  e *pTab = (Fts3T
1bdf0 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73  able *)pCsr->bas
1be00 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69  e.pVtab;.  int i
1be10 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 72 63 20  Token;.  int rc 
1be20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1be30 66 6f 72 28 69 54 6f 6b 65 6e 3d 30 3b 20 72 63  for(iToken=0; rc
1be40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1be50 54 6f 6b 65 6e 3c 70 2d 3e 6e 54 6f 6b 65 6e 3b  Token<p->nToken;
1be60 20 69 54 6f 6b 65 6e 2b 2b 29 7b 0a 20 20 20 20   iToken++){.    
1be70 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20  Fts3PhraseToken 
1be80 2a 70 54 6f 6b 65 6e 20 3d 20 26 70 2d 3e 61 54  *pToken = &p->aT
1be90 6f 6b 65 6e 5b 69 54 6f 6b 65 6e 5d 3b 0a 20 20  oken[iToken];.  
1bea0 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
1beb0 2d 3e 70 44 65 66 65 72 72 65 64 3d 3d 30 20 7c  ->pDeferred==0 |
1bec0 7c 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73  | pToken->pSegcs
1bed0 72 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  r==0 );..    if(
1bee0 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72   pToken->pSegcsr
1bef0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   ){.      int nT
1bf00 68 69 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  his = 0;.      c
1bf10 68 61 72 20 2a 70 54 68 69 73 20 3d 20 30 3b 0a  har *pThis = 0;.
1bf20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54        rc = fts3T
1bf30 65 72 6d 53 65 6c 65 63 74 28 70 54 61 62 2c 20  ermSelect(pTab, 
1bf40 70 54 6f 6b 65 6e 2c 20 70 2d 3e 69 43 6f 6c 75  pToken, p->iColu
1bf50 6d 6e 2c 20 26 6e 54 68 69 73 2c 20 26 70 54 68  mn, &nThis, &pTh
1bf60 69 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  is);.      if( r
1bf70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bf80 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
1bf90 50 68 72 61 73 65 4d 65 72 67 65 54 6f 6b 65 6e  PhraseMergeToken
1bfa0 28 70 54 61 62 2c 20 70 2c 20 69 54 6f 6b 65 6e  (pTab, p, iToken
1bfb0 2c 20 70 54 68 69 73 2c 20 6e 54 68 69 73 29 3b  , pThis, nThis);
1bfc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bfd0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
1bfe0 6e 2d 3e 70 53 65 67 63 73 72 3d 3d 30 20 29 3b  n->pSegcsr==0 );
1bff0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1c000 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1c010 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c020 6c 65 64 20 6f 6e 20 65 61 63 68 20 70 68 72 61  led on each phra
1c030 73 65 20 61 66 74 65 72 20 74 68 65 20 70 6f 73  se after the pos
1c040 69 74 69 6f 6e 20 6c 69 73 74 73 20 66 6f 72 0a  ition lists for.
1c050 2a 2a 20 61 6e 79 20 64 65 66 65 72 72 65 64 20  ** any deferred 
1c060 74 6f 6b 65 6e 73 20 68 61 76 65 20 62 65 65 6e  tokens have been
1c070 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
1c080 6f 72 79 2e 20 49 74 20 75 70 64 61 74 65 73 20  ory. It updates 
1c090 74 68 65 20 70 68 72 61 73 65 73 0a 2a 2a 20 63  the phrases.** c
1c0a0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
1c0b0 6c 69 73 74 20 74 6f 20 69 6e 63 6c 75 64 65 20  list to include 
1c0c0 6f 6e 6c 79 20 74 68 6f 73 65 20 70 6f 73 69 74  only those posit
1c0d0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 72 65  ions that are re
1c0e0 61 6c 6c 79 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  ally.** instance
1c0f0 73 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20  s of the phrase 
1c100 28 61 66 74 65 72 20 63 6f 6e 73 69 64 65 72 69  (after consideri
1c110 6e 67 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  ng deferred toke
1c120 6e 73 29 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ns). If this.** 
1c130 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1c140 68 72 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 61  hrase does not a
1c150 70 70 65 61 72 20 69 6e 20 74 68 65 20 63 75 72  ppear in the cur
1c160 72 65 6e 74 20 72 6f 77 2c 20 64 6f 63 6c 69 73  rent row, doclis
1c170 74 2e 70 4c 69 73 74 0a 2a 2a 20 61 6e 64 20 64  t.pList.** and d
1c180 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 61 72 65  oclist.nList are
1c190 20 62 6f 74 68 20 7a 65 72 6f 65 64 2e 0a 2a 2a   both zeroed..**
1c1a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1c1b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
1c1c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74  error occurs, ot
1c1d0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1c1e0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
1c1f0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1c200 45 76 61 6c 44 65 66 65 72 72 65 64 50 68 72 61  EvalDeferredPhra
1c210 73 65 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70  se(Fts3Cursor *p
1c220 43 73 72 2c 20 46 74 73 33 50 68 72 61 73 65 20  Csr, Fts3Phrase 
1c230 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69 6e 74  *pPhrase){.  int
1c240 20 69 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20   iToken;        
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c260 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
1c270 74 68 72 6f 75 67 68 20 70 68 72 61 73 65 20 74  through phrase t
1c280 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  okens */.  int r
1c290 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1c2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c2b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
1c2c0 68 61 72 20 2a 61 50 6f 73 6c 69 73 74 20 3d 20  har *aPoslist = 
1c2d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1c2e0 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  * Position list 
1c2f0 66 6f 72 20 64 65 66 65 72 72 65 64 20 74 6f 6b  for deferred tok
1c300 65 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f  ens */.  int nPo
1c310 73 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  slist = 0;      
1c320 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c330 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
1c340 50 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  Poslist */.  int
1c350 20 69 50 72 65 76 20 3d 20 2d 31 3b 20 20 20 20   iPrev = -1;    
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c370 54 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20  Token number of 
1c380 70 72 65 76 69 6f 75 73 20 64 65 66 65 72 72 65  previous deferre
1c390 64 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 61 73  d token */..  as
1c3a0 73 65 72 74 28 20 70 50 68 72 61 73 65 2d 3e 64  sert( pPhrase->d
1c3b0 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74  oclist.bFreeList
1c3c0 3d 3d 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 54  ==0 );..  for(iT
1c3d0 6f 6b 65 6e 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  oken=0; rc==SQLI
1c3e0 54 45 5f 4f 4b 20 26 26 20 69 54 6f 6b 65 6e 3c  TE_OK && iToken<
1c3f0 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b  pPhrase->nToken;
1c400 20 69 54 6f 6b 65 6e 2b 2b 29 7b 0a 20 20 20 20   iToken++){.    
1c410 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20  Fts3PhraseToken 
1c420 2a 70 54 6f 6b 65 6e 20 3d 20 26 70 50 68 72 61  *pToken = &pPhra
1c430 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b 65  se->aToken[iToke
1c440 6e 5d 3b 0a 20 20 20 20 46 74 73 33 44 65 66 65  n];.    Fts3Defe
1c450 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65  rredToken *pDefe
1c460 72 72 65 64 20 3d 20 70 54 6f 6b 65 6e 2d 3e 70  rred = pToken->p
1c470 44 65 66 65 72 72 65 64 3b 0a 0a 20 20 20 20 69  Deferred;..    i
1c480 66 28 20 70 44 65 66 65 72 72 65 64 20 29 7b 0a  f( pDeferred ){.
1c490 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73        char *pLis
1c4a0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  t;.      int nLi
1c4b0 73 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  st;.      rc = s
1c4c0 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 72  qlite3Fts3Deferr
1c4d0 65 64 54 6f 6b 65 6e 4c 69 73 74 28 70 44 65 66  edTokenList(pDef
1c4e0 65 72 72 65 64 2c 20 26 70 4c 69 73 74 2c 20 26  erred, &pList, &
1c4f0 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  nList);.      if
1c500 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c510 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1c520 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1c530 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c540 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c 69 73  te3_free(aPoslis
1c550 74 29 3b 0a 20 20 20 20 20 20 20 20 70 50 68 72  t);.        pPhr
1c560 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69  ase->doclist.pLi
1c570 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1c580 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
1c590 2e 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  .nList = 0;.    
1c5a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c5b0 45 5f 4f 4b 3b 0a 0a 20 20 20 20 20 20 7d 65 6c  E_OK;..      }el
1c5c0 73 65 20 69 66 28 20 61 50 6f 73 6c 69 73 74 3d  se if( aPoslist=
1c5d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 50  =0 ){.        aP
1c5e0 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  oslist = pList;.
1c5f0 20 20 20 20 20 20 20 20 6e 50 6f 73 6c 69 73 74          nPoslist
1c600 20 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 20 20 20   = nList;..     
1c610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c620 63 68 61 72 20 2a 61 4f 75 74 20 3d 20 70 4c 69  char *aOut = pLi
1c630 73 74 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  st;.        char
1c640 20 2a 70 31 20 3d 20 61 50 6f 73 6c 69 73 74 3b   *p1 = aPoslist;
1c650 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1c660 32 20 3d 20 61 4f 75 74 3b 0a 0a 20 20 20 20 20  2 = aOut;..     
1c670 20 20 20 61 73 73 65 72 74 28 20 69 50 72 65 76     assert( iPrev
1c680 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 66  >=0 );.        f
1c690 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65  ts3PoslistPhrase
1c6a0 4d 65 72 67 65 28 26 61 4f 75 74 2c 20 69 54 6f  Merge(&aOut, iTo
1c6b0 6b 65 6e 2d 69 50 72 65 76 2c 20 30 2c 20 31 2c  ken-iPrev, 0, 1,
1c6c0 20 26 70 31 2c 20 26 70 32 29 3b 0a 20 20 20 20   &p1, &p2);.    
1c6d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c6e0 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  (aPoslist);.    
1c6f0 20 20 20 20 61 50 6f 73 6c 69 73 74 20 3d 20 70      aPoslist = p
1c700 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 50  List;.        nP
1c710 6f 73 6c 69 73 74 20 3d 20 61 4f 75 74 20 2d 20  oslist = aOut - 
1c720 61 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20  aPoslist;.      
1c730 20 20 69 66 28 20 6e 50 6f 73 6c 69 73 74 3d 3d    if( nPoslist==
1c740 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1c750 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73  qlite3_free(aPos
1c760 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  list);.         
1c770 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
1c780 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t.pList = 0;.   
1c790 20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e         pPhrase->
1c7a0 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20  doclist.nList = 
1c7b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  0;.          ret
1c7c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c7d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c7e0 0a 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69  .      iPrev = i
1c7f0 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  Token;.    }.  }
1c800 0a 0a 20 20 69 66 28 20 69 50 72 65 76 3e 3d 30  ..  if( iPrev>=0
1c810 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   ){.    int nMax
1c820 55 6e 64 65 66 65 72 72 65 64 20 3d 20 70 50 68  Undeferred = pPh
1c830 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54 6f  rase->iDoclistTo
1c840 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 6e 4d 61  ken;.    if( nMa
1c850 78 55 6e 64 65 66 65 72 72 65 64 3c 30 20 29 7b  xUndeferred<0 ){
1c860 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
1c870 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20  doclist.pList = 
1c880 61 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20  aPoslist;.      
1c890 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
1c8a0 2e 6e 4c 69 73 74 20 3d 20 6e 50 6f 73 6c 69 73  .nList = nPoslis
1c8b0 74 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65  t;.      pPhrase
1c8c0 2d 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64  ->doclist.iDocid
1c8d0 20 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64   = pCsr->iPrevId
1c8e0 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d  ;.      pPhrase-
1c8f0 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69  >doclist.bFreeLi
1c900 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  st = 1;.    }els
1c910 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 69  e{.      int nDi
1c920 73 74 61 6e 63 65 3b 0a 20 20 20 20 20 20 63 68  stance;.      ch
1c930 61 72 20 2a 70 31 3b 0a 20 20 20 20 20 20 63 68  ar *p1;.      ch
1c940 61 72 20 2a 70 32 3b 0a 20 20 20 20 20 20 63 68  ar *p2;.      ch
1c950 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20 20 20 20  ar *aOut;..     
1c960 20 69 66 28 20 6e 4d 61 78 55 6e 64 65 66 65 72   if( nMaxUndefer
1c970 72 65 64 3e 69 50 72 65 76 20 29 7b 0a 20 20 20  red>iPrev ){.   
1c980 20 20 20 20 20 70 31 20 3d 20 61 50 6f 73 6c 69       p1 = aPosli
1c990 73 74 3b 0a 20 20 20 20 20 20 20 20 70 32 20 3d  st;.        p2 =
1c9a0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
1c9b0 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  t.pList;.       
1c9c0 20 6e 44 69 73 74 61 6e 63 65 20 3d 20 6e 4d 61   nDistance = nMa
1c9d0 78 55 6e 64 65 66 65 72 72 65 64 20 2d 20 69 50  xUndeferred - iP
1c9e0 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rev;.      }else
1c9f0 7b 0a 20 20 20 20 20 20 20 20 70 31 20 3d 20 70  {.        p1 = p
1ca00 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
1ca10 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  pList;.        p
1ca20 32 20 3d 20 61 50 6f 73 6c 69 73 74 3b 0a 20 20  2 = aPoslist;.  
1ca30 20 20 20 20 20 20 6e 44 69 73 74 61 6e 63 65 20        nDistance 
1ca40 3d 20 69 50 72 65 76 20 2d 20 6e 4d 61 78 55 6e  = iPrev - nMaxUn
1ca50 64 65 66 65 72 72 65 64 3b 0a 20 20 20 20 20 20  deferred;.      
1ca60 7d 0a 0a 20 20 20 20 20 20 61 4f 75 74 20 3d 20  }..      aOut = 
1ca70 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1ca80 6d 61 6c 6c 6f 63 28 6e 50 6f 73 6c 69 73 74 2b  malloc(nPoslist+
1ca90 38 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61  8);.      if( !a
1caa0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Out ){.        s
1cab0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73  qlite3_free(aPos
1cac0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 72  list);.        r
1cad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1cae0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1caf0 20 20 0a 20 20 20 20 20 20 70 50 68 72 61 73 65    .      pPhrase
1cb00 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20  ->doclist.pList 
1cb10 3d 20 61 4f 75 74 3b 0a 20 20 20 20 20 20 69 66  = aOut;.      if
1cb20 28 20 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72  ( fts3PoslistPhr
1cb30 61 73 65 4d 65 72 67 65 28 26 61 4f 75 74 2c 20  aseMerge(&aOut, 
1cb40 6e 44 69 73 74 61 6e 63 65 2c 20 30 2c 20 31 2c  nDistance, 0, 1,
1cb50 20 26 70 31 2c 20 26 70 32 29 20 29 7b 0a 20 20   &p1, &p2) ){.  
1cb60 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64        pPhrase->d
1cb70 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74  oclist.bFreeList
1cb80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
1cb90 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e  hrase->doclist.n
1cba0 4c 69 73 74 20 3d 20 28 61 4f 75 74 20 2d 20 70  List = (aOut - p
1cbb0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
1cbc0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pList);.      }e
1cbd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1cbe0 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74 29 3b  ite3_free(aOut);
1cbf0 0a 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65  .        pPhrase
1cc00 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20  ->doclist.pList 
1cc10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 68  = 0;.        pPh
1cc20 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c  rase->doclist.nL
1cc30 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ist = 0;.      }
1cc40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1cc50 72 65 65 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20  ree(aPoslist);. 
1cc60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1cc70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1cc80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1cc90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
1cca0 6f 72 20 65 61 63 68 20 46 74 73 33 50 68 72 61  or each Fts3Phra
1ccb0 73 65 20 69 6e 20 61 20 66 75 6c 6c 2d 74 65 78  se in a full-tex
1ccc0 74 20 71 75 65 72 79 20 0a 2a 2a 20 65 78 70 72  t query .** expr
1ccd0 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
1cce0 6c 69 7a 65 20 74 68 65 20 6d 65 63 68 61 6e 69  lize the mechani
1ccf0 73 6d 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67  sm for returning
1cd00 20 72 6f 77 73 2e 20 4f 6e 63 65 20 74 68 69 73   rows. Once this
1cd10 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  .** function has
1cd20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 73 75 63   been called suc
1cd30 63 65 73 73 66 75 6c 6c 79 20 6f 6e 20 61 6e 20  cessfully on an 
1cd40 46 74 73 33 50 68 72 61 73 65 2c 20 69 74 20 6d  Fts3Phrase, it m
1cd50 61 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 77 69  ay be.** used wi
1cd60 74 68 20 66 74 73 33 45 76 61 6c 50 68 72 61 73  th fts3EvalPhras
1cd70 65 4e 65 78 74 28 29 20 74 6f 20 69 74 65 72 61  eNext() to itera
1cd80 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  te through the m
1cd90 61 74 63 68 69 6e 67 20 64 6f 63 69 64 73 2e 0a  atching docids..
1cda0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1cdb0 65 72 20 62 4f 70 74 4f 6b 20 69 73 20 74 72 75  er bOptOk is tru
1cdc0 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 72 61  e, then the phra
1cdd0 73 65 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e  se may (or may n
1cde0 6f 74 29 20 75 73 65 20 74 68 65 0a 2a 2a 20 69  ot) use the.** i
1cdf0 6e 63 72 65 6d 65 6e 74 61 6c 20 6c 6f 61 64 69  ncremental loadi
1ce00 6e 67 20 73 74 72 61 74 65 67 79 2e 20 4f 74 68  ng strategy. Oth
1ce10 65 72 77 69 73 65 2c 20 74 68 65 20 65 6e 74 69  erwise, the enti
1ce20 72 65 20 64 6f 63 6c 69 73 74 20 69 73 20 6c 6f  re doclist is lo
1ce30 61 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 6d 65 6d  aded into.** mem
1ce40 6f 72 79 20 77 69 74 68 69 6e 20 74 68 69 73 20  ory within this 
1ce50 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  call..**.** SQLI
1ce60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ce70 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
1ce80 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73 65 20  curs, otherwise 
1ce90 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1cea0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1ceb0 69 6e 74 20 66 74 73 33 45 76 61 6c 50 68 72 61  int fts3EvalPhra
1cec0 73 65 53 74 61 72 74 28 46 74 73 33 43 75 72 73  seStart(Fts3Curs
1ced0 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 4f  or *pCsr, int bO
1cee0 70 74 4f 6b 2c 20 46 74 73 33 50 68 72 61 73 65  ptOk, Fts3Phrase
1cef0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
1cf20 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 50   code */.  Fts3P
1cf30 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 46 69 72  hraseToken *pFir
1cf40 73 74 20 3d 20 26 70 2d 3e 61 54 6f 6b 65 6e 5b  st = &p->aToken[
1cf50 30 5d 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  0];.  Fts3Table 
1cf60 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  *pTab = (Fts3Tab
1cf70 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
1cf80 70 56 74 61 62 3b 0a 0a 20 20 69 66 28 20 70 43  pVtab;..  if( pC
1cf90 73 72 2d 3e 62 44 65 73 63 3d 3d 70 54 61 62 2d  sr->bDesc==pTab-
1cfa0 3e 62 44 65 73 63 49 64 78 20 0a 20 20 20 26 26  >bDescIdx .   &&
1cfb0 20 62 4f 70 74 4f 6b 3d 3d 31 20 0a 20 20 20 26   bOptOk==1 .   &
1cfc0 26 20 70 2d 3e 6e 54 6f 6b 65 6e 3d 3d 31 20 0a  & p->nToken==1 .
1cfd0 20 20 20 26 26 20 70 46 69 72 73 74 2d 3e 70 53     && pFirst->pS
1cfe0 65 67 63 73 72 20 0a 20 20 20 26 26 20 70 46 69  egcsr .   && pFi
1cff0 72 73 74 2d 3e 70 53 65 67 63 73 72 2d 3e 62 4c  rst->pSegcsr->bL
1d000 6f 6f 6b 75 70 20 0a 20 20 29 7b 0a 20 20 20 20  ookup .  ){.    
1d010 2f 2a 20 55 73 65 20 74 68 65 20 69 6e 63 72 65  /* Use the incre
1d020 6d 65 6e 74 61 6c 20 61 70 70 72 6f 61 63 68 2e  mental approach.
1d030 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
1d040 20 3d 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3e   = (p->iColumn >
1d050 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 20  = pTab->nColumn 
1d060 3f 20 2d 31 20 3a 20 70 2d 3e 69 43 6f 6c 75 6d  ? -1 : p->iColum
1d070 6e 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  n);.    rc = sql
1d080 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 53  ite3Fts3MsrIncrS
1d090 74 61 72 74 28 0a 20 20 20 20 20 20 20 20 70 54  tart(.        pT
1d0a0 61 62 2c 20 70 46 69 72 73 74 2d 3e 70 53 65 67  ab, pFirst->pSeg
1d0b0 63 73 72 2c 20 69 43 6f 6c 2c 20 70 46 69 72 73  csr, iCol, pFirs
1d0c0 74 2d 3e 7a 2c 20 70 46 69 72 73 74 2d 3e 6e 29  t->z, pFirst->n)
1d0d0 3b 0a 20 20 20 20 70 2d 3e 62 49 6e 63 72 20 3d  ;.    p->bIncr =
1d0e0 20 31 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1;..  }else{.  
1d0f0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 66 75    /* Load the fu
1d100 6c 6c 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  ll doclist for t
1d110 68 65 20 70 68 72 61 73 65 20 69 6e 74 6f 20 6d  he phrase into m
1d120 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 72 63  emory. */.    rc
1d130 20 3d 20 66 74 73 33 45 76 61 6c 50 68 72 61 73   = fts3EvalPhras
1d140 65 4c 6f 61 64 28 70 43 73 72 2c 20 70 29 3b 0a  eLoad(pCsr, p);.
1d150 20 20 20 20 70 2d 3e 62 49 6e 63 72 20 3d 20 30      p->bIncr = 0
1d160 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1d170 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1d180 7c 20 70 2d 3e 6e 54 6f 6b 65 6e 3c 31 20 7c 7c  | p->nToken<1 ||
1d190 20 70 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 70 53   p->aToken[0].pS
1d1a0 65 67 63 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 62  egcsr==0 || p->b
1d1b0 49 6e 63 72 20 29 3b 0a 20 20 72 65 74 75 72 6e  Incr );.  return
1d1c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1d1d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1d1e0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 62  sed to iterate b
1d1f0 61 63 6b 77 61 72 64 73 20 28 66 72 6f 6d 20 74  ackwards (from t
1d200 68 65 20 65 6e 64 20 74 6f 20 73 74 61 72 74 29  he end to start)
1d210 20 0a 2a 2a 20 74 68 72 6f 75 67 68 20 64 6f 63   .** through doc
1d220 6c 69 73 74 73 2e 20 49 74 20 69 73 20 75 73 65  lists. It is use
1d230 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65  d by this module
1d240 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1d250 75 67 68 20 70 68 72 61 73 65 0a 2a 2a 20 64 6f  ugh phrase.** do
1d260 63 6c 69 73 74 73 20 69 6e 20 72 65 76 65 72 73  clists in revers
1d270 65 20 61 6e 64 20 62 79 20 74 68 65 20 66 74 73  e and by the fts
1d280 33 5f 77 72 69 74 65 2e 63 20 6d 6f 64 75 6c 65  3_write.c module
1d290 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1d2a0 75 67 68 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d 74  ugh.** pending-t
1d2b0 65 72 6d 73 20 6c 69 73 74 73 20 77 68 65 6e 20  erms lists when 
1d2c0 77 72 69 74 69 6e 67 20 74 6f 20 64 61 74 61 62  writing to datab
1d2d0 61 73 65 73 20 77 69 74 68 20 22 6f 72 64 65 72  ases with "order
1d2e0 3d 64 65 73 63 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  =desc"..**.** Th
1d2f0 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 62 65  e doclist may be
1d300 20 73 6f 72 74 65 64 20 69 6e 20 61 73 63 65 6e   sorted in ascen
1d310 64 69 6e 67 20 28 70 61 72 61 6d 65 74 65 72 20  ding (parameter 
1d320 62 44 65 73 63 49 64 78 3d 3d 30 29 20 6f 72 20  bDescIdx==0) or 
1d330 0a 2a 2a 20 64 65 73 63 65 6e 64 69 6e 67 20 28  .** descending (
1d340 70 61 72 61 6d 65 74 65 72 20 62 44 65 73 63 49  parameter bDescI
1d350 64 78 3d 3d 31 29 20 6f 72 64 65 72 20 6f 66 20  dx==1) order of 
1d360 64 6f 63 69 64 2e 20 52 65 67 61 72 64 6c 65 73  docid. Regardles
1d370 73 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  s, this.** funct
1d380 69 6f 6e 20 69 74 65 72 61 74 65 73 20 66 72 6f  ion iterates fro
1d390 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
1d3a0 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20   doclist to the 
1d3b0 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  beginning..*/.vo
1d3c0 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f  id sqlite3Fts3Do
1d3d0 63 6c 69 73 74 50 72 65 76 28 0a 20 20 69 6e 74  clistPrev(.  int
1d3e0 20 62 44 65 73 63 49 64 78 2c 20 20 20 20 20 20   bDescIdx,      
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d400 54 72 75 65 20 69 66 20 74 68 65 20 64 6f 63 6c  True if the docl
1d410 69 73 74 20 69 73 20 64 65 73 63 20 2a 2f 0a 20  ist is desc */. 
1d420 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c   char *aDoclist,
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65   /* Pointer to e
1d450 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 2a 2f  ntire doclist */
1d460 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 2c  .  int nDoclist,
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d480 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
1d490 61 44 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65  aDoclist in byte
1d4a0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  s */.  char **pp
1d4b0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
1d4c0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1d4d0 3a 20 49 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  : Iterator point
1d4e0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
1d4f0 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 2c 20  int64 *piDocid, 
1d500 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
1d510 54 3a 20 44 6f 63 69 64 20 70 6f 69 6e 74 65 72  T: Docid pointer
1d520 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73   */.  int *pnLis
1d530 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1d540 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1d550 20 4c 69 73 74 20 6c 65 6e 67 74 68 20 70 6f 69   List length poi
1d560 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 62  nter */.  u8 *pb
1d570 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Eof             
1d580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1d590 3a 20 45 6e 64 2d 6f 66 2d 66 69 6c 65 20 66 6c  : End-of-file fl
1d5a0 61 67 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ag */.){.  char 
1d5b0 2a 70 20 3d 20 2a 70 70 49 74 65 72 3b 0a 0a 20  *p = *ppIter;.. 
1d5c0 20 61 73 73 65 72 74 28 20 6e 44 6f 63 6c 69 73   assert( nDoclis
1d5d0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1d5e0 20 2a 70 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20   *pbEof==0 );.  
1d5f0 61 73 73 65 72 74 28 20 70 20 7c 7c 20 2a 70 69  assert( p || *pi
1d600 44 6f 63 69 64 3d 3d 30 20 29 3b 0a 20 20 61 73  Docid==0 );.  as
1d610 73 65 72 74 28 20 21 70 20 7c 7c 20 28 70 3e 61  sert( !p || (p>a
1d620 44 6f 63 6c 69 73 74 20 26 26 20 70 3c 26 61 44  Doclist && p<&aD
1d630 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69 73 74 5d  oclist[nDoclist]
1d640 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30  ) );..  if( p==0
1d650 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1d660 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20 30  int64 iDocid = 0
1d670 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 78  ;.    char *pNex
1d680 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  t = 0;.    char 
1d690 2a 70 44 6f 63 69 64 20 3d 20 61 44 6f 63 6c 69  *pDocid = aDocli
1d6a0 73 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 45  st;.    char *pE
1d6b0 6e 64 20 3d 20 26 61 44 6f 63 6c 69 73 74 5b 6e  nd = &aDoclist[n
1d6c0 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20 69 6e  Doclist];.    in
1d6d0 74 20 69 4d 75 6c 20 3d 20 31 3b 0a 0a 20 20 20  t iMul = 1;..   
1d6e0 20 77 68 69 6c 65 28 20 70 44 6f 63 69 64 3c 70   while( pDocid<p
1d6f0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  End ){.      sql
1d700 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74  ite3_int64 iDelt
1d710 61 3b 0a 20 20 20 20 20 20 70 44 6f 63 69 64 20  a;.      pDocid 
1d720 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
1d730 74 56 61 72 69 6e 74 28 70 44 6f 63 69 64 2c 20  tVarint(pDocid, 
1d740 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
1d750 69 44 6f 63 69 64 20 2b 3d 20 28 69 4d 75 6c 20  iDocid += (iMul 
1d760 2a 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  * iDelta);.     
1d770 20 70 4e 65 78 74 20 3d 20 70 44 6f 63 69 64 3b   pNext = pDocid;
1d780 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69  .      fts3Posli
1d790 73 74 43 6f 70 79 28 30 2c 20 26 70 44 6f 63 69  stCopy(0, &pDoci
1d7a0 64 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  d);.      while(
1d7b0 20 70 44 6f 63 69 64 3c 70 45 6e 64 20 26 26 20   pDocid<pEnd && 
1d7c0 2a 70 44 6f 63 69 64 3d 3d 30 20 29 20 70 44 6f  *pDocid==0 ) pDo
1d7d0 63 69 64 2b 2b 3b 0a 20 20 20 20 20 20 69 4d 75  cid++;.      iMu
1d7e0 6c 20 3d 20 28 62 44 65 73 63 49 64 78 20 3f 20  l = (bDescIdx ? 
1d7f0 2d 31 20 3a 20 31 29 3b 0a 20 20 20 20 7d 0a 0a  -1 : 1);.    }..
1d800 20 20 20 20 2a 70 6e 4c 69 73 74 20 3d 20 70 45      *pnList = pE
1d810 6e 64 20 2d 20 70 4e 65 78 74 3b 0a 20 20 20 20  nd - pNext;.    
1d820 2a 70 70 49 74 65 72 20 3d 20 70 4e 65 78 74 3b  *ppIter = pNext;
1d830 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d 20  .    *piDocid = 
1d840 69 44 6f 63 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  iDocid;.  }else{
1d850 0a 20 20 20 20 69 6e 74 20 69 4d 75 6c 20 3d 20  .    int iMul = 
1d860 28 62 44 65 73 63 49 64 78 20 3f 20 2d 31 20 3a  (bDescIdx ? -1 :
1d870 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1d880 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20  _int64 iDelta;. 
1d890 20 20 20 66 74 73 33 47 65 74 52 65 76 65 72 73     fts3GetRevers
1d8a0 65 56 61 72 69 6e 74 28 26 70 2c 20 61 44 6f 63  eVarint(&p, aDoc
1d8b0 6c 69 73 74 2c 20 26 69 44 65 6c 74 61 29 3b 0a  list, &iDelta);.
1d8c0 20 20 20 20 2a 70 69 44 6f 63 69 64 20 2d 3d 20      *piDocid -= 
1d8d0 28 69 4d 75 6c 20 2a 20 69 44 65 6c 74 61 29 3b  (iMul * iDelta);
1d8e0 0a 0a 20 20 20 20 69 66 28 20 70 3d 3d 61 44 6f  ..    if( p==aDo
1d8f0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a  clist ){.      *
1d900 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  pbEof = 1;.    }
1d910 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
1d920 20 2a 70 53 61 76 65 20 3d 20 70 3b 0a 20 20 20   *pSave = p;.   
1d930 20 20 20 66 74 73 33 52 65 76 65 72 73 65 50 6f     fts3ReversePo
1d940 73 6c 69 73 74 28 61 44 6f 63 6c 69 73 74 2c 20  slist(aDoclist, 
1d950 26 70 29 3b 0a 20 20 20 20 20 20 2a 70 6e 4c 69  &p);.      *pnLi
1d960 73 74 20 3d 20 28 70 53 61 76 65 20 2d 20 70 29  st = (pSave - p)
1d970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 49  ;.    }.    *ppI
1d980 74 65 72 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a  ter = p;.  }.}..
1d990 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1d9a0 20 6d 6f 76 65 20 74 68 65 20 70 68 72 61 73 65   move the phrase
1d9b0 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
1d9c0 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  nt to the next m
1d9d0 61 74 63 68 69 6e 67 20 64 6f 63 69 64 2e 20 0a  atching docid. .
1d9e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1d9f0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
1da00 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1da10 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  de. Otherwise, r
1da20 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
1da30 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
1da40 65 72 65 20 69 73 20 6e 6f 20 22 6e 65 78 74 22  ere is no "next"
1da50 20 65 6e 74 72 79 20 61 6e 64 20 6e 6f 20 65 72   entry and no er
1da60 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1da70 20 2a 70 62 45 6f 66 20 69 73 20 73 65 74 20 74   *pbEof is set t
1da80 6f 0a 2a 2a 20 31 20 62 65 66 6f 72 65 20 72 65  o.** 1 before re
1da90 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69  turning. Otherwi
1daa0 73 65 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  se, if no error 
1dab0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 69  occurs and the i
1dac0 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 73 75  terator is.** su
1dad0 63 63 65 73 73 66 75 6c 6c 79 20 61 64 76 61 6e  ccessfully advan
1dae0 63 65 64 2c 20 2a 70 62 45 6f 66 20 69 73 20 73  ced, *pbEof is s
1daf0 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  et to 0..*/.stat
1db00 69 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c 50  ic int fts3EvalP
1db10 68 72 61 73 65 4e 65 78 74 28 0a 20 20 46 74 73  hraseNext(.  Fts
1db20 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  3Cursor *pCsr,  
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db40 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64 6c  FTS Cursor handl
1db50 65 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73  e */.  Fts3Phras
1db60 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1db70 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65         /* Phrase
1db80 20 6f 62 6a 65 63 74 20 74 6f 20 61 64 76 61 6e   object to advan
1db90 63 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69 64  ce to next docid
1dba0 20 2a 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66 20   */.  u8 *pbEof 
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
1dbd0 74 20 74 6f 20 31 20 69 66 20 45 4f 46 20 2a 2f  t to 1 if EOF */
1dbe0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1dbf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 33  QLITE_OK;.  Fts3
1dc00 44 6f 63 6c 69 73 74 20 2a 70 44 4c 20 3d 20 26  Doclist *pDL = &
1dc10 70 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 46 74  p->doclist;.  Ft
1dc20 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  s3Table *pTab = 
1dc30 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73  (Fts3Table *)pCs
1dc40 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 0a  r->base.pVtab;..
1dc50 20 20 69 66 28 20 70 2d 3e 62 49 6e 63 72 20 29    if( p->bIncr )
1dc60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1dc70 3e 6e 54 6f 6b 65 6e 3d 3d 31 20 29 3b 0a 20 20  >nToken==1 );.  
1dc80 20 20 61 73 73 65 72 74 28 20 70 44 4c 2d 3e 70    assert( pDL->p
1dc90 4e 65 78 74 44 6f 63 69 64 3d 3d 30 20 29 3b 0a  NextDocid==0 );.
1dca0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dcb0 46 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28  Fts3MsrIncrNext(
1dcc0 70 54 61 62 2c 20 70 2d 3e 61 54 6f 6b 65 6e 5b  pTab, p->aToken[
1dcd0 30 5d 2e 70 53 65 67 63 73 72 2c 20 0a 20 20 20  0].pSegcsr, .   
1dce0 20 20 20 20 20 26 70 44 4c 2d 3e 69 44 6f 63 69       &pDL->iDoci
1dcf0 64 2c 20 26 70 44 4c 2d 3e 70 4c 69 73 74 2c 20  d, &pDL->pList, 
1dd00 26 70 44 4c 2d 3e 6e 4c 69 73 74 0a 20 20 20 20  &pDL->nList.    
1dd10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1dd20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 44 4c  QLITE_OK && !pDL
1dd30 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
1dd40 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20   *pbEof = 1;.   
1dd50 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1dd60 43 73 72 2d 3e 62 44 65 73 63 21 3d 70 54 61 62  Csr->bDesc!=pTab
1dd70 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 70 44  ->bDescIdx && pD
1dd80 4c 2d 3e 6e 41 6c 6c 20 29 7b 0a 20 20 20 20 73  L->nAll ){.    s
1dd90 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73  qlite3Fts3Doclis
1dda0 74 50 72 65 76 28 70 54 61 62 2d 3e 62 44 65 73  tPrev(pTab->bDes
1ddb0 63 49 64 78 2c 20 70 44 4c 2d 3e 61 41 6c 6c 2c  cIdx, pDL->aAll,
1ddc0 20 70 44 4c 2d 3e 6e 41 6c 6c 2c 20 0a 20 20 20   pDL->nAll, .   
1ddd0 20 20 20 20 20 26 70 44 4c 2d 3e 70 4e 65 78 74       &pDL->pNext
1dde0 44 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 69 44 6f  Docid, &pDL->iDo
1ddf0 63 69 64 2c 20 26 70 44 4c 2d 3e 6e 4c 69 73 74  cid, &pDL->nList
1de00 2c 20 70 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20  , pbEof.    );. 
1de10 20 20 20 70 44 4c 2d 3e 70 4c 69 73 74 20 3d 20     pDL->pList = 
1de20 70 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 3b  pDL->pNextDocid;
1de30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
1de40 61 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  ar *pIter;      
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1de70 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1de80 20 61 41 6c 6c 20 2a 2f 0a 20 20 20 20 63 68 61   aAll */.    cha
1de90 72 20 2a 70 45 6e 64 20 3d 20 26 70 44 4c 2d 3e  r *pEnd = &pDL->
1dea0 61 41 6c 6c 5b 70 44 4c 2d 3e 6e 41 6c 6c 5d 3b  aAll[pDL->nAll];
1deb0 20 20 20 20 20 2f 2a 20 31 20 62 79 74 65 20 70       /* 1 byte p
1dec0 61 73 74 20 65 6e 64 20 6f 66 20 61 41 6c 6c 20  ast end of aAll 
1ded0 2a 2f 0a 20 20 20 20 69 66 28 20 70 44 4c 2d 3e  */.    if( pDL->
1dee0 70 4e 65 78 74 44 6f 63 69 64 20 29 7b 0a 20 20  pNextDocid ){.  
1def0 20 20 20 20 70 49 74 65 72 20 3d 20 70 44 4c 2d      pIter = pDL-
1df00 3e 70 4e 65 78 74 44 6f 63 69 64 3b 0a 20 20 20  >pNextDocid;.   
1df10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1df20 74 65 72 20 3d 20 70 44 4c 2d 3e 61 41 6c 6c 3b  ter = pDL->aAll;
1df30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1df40 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20  pIter>=pEnd ){. 
1df50 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
1df60 61 6c 72 65 61 64 79 20 72 65 61 63 68 65 64 20  already reached 
1df70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
1df80 64 6f 63 6c 69 73 74 2e 20 45 4f 46 2e 20 2a 2f  doclist. EOF. */
1df90 0a 20 20 20 20 20 20 2a 70 62 45 6f 66 20 3d 20  .      *pbEof = 
1dfa0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1dfb0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1dfc0 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
1dfd0 70 49 74 65 72 20 2b 3d 20 73 71 6c 69 74 65 33  pIter += sqlite3
1dfe0 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 49  Fts3GetVarint(pI
1dff0 74 65 72 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20  ter, &iDelta);. 
1e000 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 62       if( pTab->b
1e010 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20 70 44  DescIdx==0 || pD
1e020 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 3d 3d 30  L->pNextDocid==0
1e030 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 4c 2d   ){.        pDL-
1e040 3e 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74  >iDocid += iDelt
1e050 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  a;.      }else{.
1e060 20 20 20 20 20 20 20 20 70 44 4c 2d 3e 69 44 6f          pDL->iDo
1e070 63 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20  cid -= iDelta;. 
1e080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 4c       }.      pDL
1e090 2d 3e 70 4c 69 73 74 20 3d 20 70 49 74 65 72 3b  ->pList = pIter;
1e0a0 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69  .      fts3Posli
1e0b0 73 74 43 6f 70 79 28 30 2c 20 26 70 49 74 65 72  stCopy(0, &pIter
1e0c0 29 3b 0a 20 20 20 20 20 20 70 44 4c 2d 3e 6e 4c  );.      pDL->nL
1e0d0 69 73 74 20 3d 20 28 70 49 74 65 72 20 2d 20 70  ist = (pIter - p
1e0e0 44 4c 2d 3e 70 4c 69 73 74 29 3b 0a 0a 20 20 20  DL->pList);..   
1e0f0 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
1e100 70 6f 69 6e 74 73 20 6a 75 73 74 20 70 61 73 74  points just past
1e110 20 74 68 65 20 30 78 30 30 20 74 68 61 74 20 74   the 0x00 that t
1e120 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 70 6f  erminates the po
1e130 73 69 74 69 6f 6e 2d 0a 20 20 20 20 20 20 2a 2a  sition-.      **
1e140 20 6c 69 73 74 20 66 6f 72 20 64 6f 63 75 6d 65   list for docume
1e150 6e 74 20 70 44 4c 2d 3e 69 44 6f 63 69 64 2e 20  nt pDL->iDocid. 
1e160 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 69 73  However, if this
1e170 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 77   position-list w
1e180 61 73 0a 20 20 20 20 20 20 2a 2a 20 65 64 69 74  as.      ** edit
1e190 65 64 20 69 6e 20 70 6c 61 63 65 20 62 79 20 66  ed in place by f
1e1a0 74 73 33 45 76 61 6c 4e 65 61 72 54 72 69 6d 28  ts3EvalNearTrim(
1e1b0 29 2c 20 74 68 65 6e 20 70 49 74 65 72 20 6d 61  ), then pIter ma
1e1c0 79 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 0a 20  y not actually. 
1e1d0 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 74 6f       ** point to
1e1e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1e1f0 65 20 6e 65 78 74 20 64 6f 63 69 64 20 76 61 6c  e next docid val
1e200 75 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ue. The followin
1e210 67 20 6c 69 6e 65 20 64 65 61 6c 73 0a 20 20 20  g line deals.   
1e220 20 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20     ** with this 
1e230 63 61 73 65 20 62 79 20 61 64 76 61 6e 63 69 6e  case by advancin
1e240 67 20 70 49 74 65 72 20 70 61 73 74 20 74 68 65  g pIter past the
1e250 20 7a 65 72 6f 2d 70 61 64 64 69 6e 67 20 61 64   zero-padding ad
1e260 64 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  ded by.      ** 
1e270 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72 69 6d  fts3EvalNearTrim
1e280 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68  ().  */.      wh
1e290 69 6c 65 28 20 70 49 74 65 72 3c 70 45 6e 64 20  ile( pIter<pEnd 
1e2a0 26 26 20 2a 70 49 74 65 72 3d 3d 30 20 29 20 70  && *pIter==0 ) p
1e2b0 49 74 65 72 2b 2b 3b 0a 0a 20 20 20 20 20 20 70  Iter++;..      p
1e2c0 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 20 3d  DL->pNextDocid =
1e2d0 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 61 73   pIter;.      as
1e2e0 73 65 72 74 28 20 70 49 74 65 72 3e 3d 26 70 44  sert( pIter>=&pD
1e2f0 4c 2d 3e 61 41 6c 6c 5b 70 44 4c 2d 3e 6e 41 6c  L->aAll[pDL->nAl
1e300 6c 5d 20 7c 7c 20 2a 70 49 74 65 72 20 29 3b 0a  l] || *pIter );.
1e310 20 20 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 30        *pbEof = 0
1e320 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1e330 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e340 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
1e350 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77   not SQLITE_OK w
1e360 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1e370 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
1e380 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
1e390 74 68 65 72 77 69 73 65 2c 20 66 74 73 33 45 76  therwise, fts3Ev
1e3a0 61 6c 50 68 72 61 73 65 53 74 61 72 74 28 29 20  alPhraseStart() 
1e3b0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 6c  is called on all
1e3c0 20 70 68 72 61 73 65 73 20 77 69 74 68 69 6e 20   phrases within 
1e3d0 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
1e3e0 6e 2e 20 41 6c 73 6f 20 74 68 65 20 46 74 73 33  n. Also the Fts3
1e3f0 45 78 70 72 2e 62 44 65 66 65 72 72 65 64 20 76  Expr.bDeferred v
1e400 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
1e410 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 79 0a 2a  o true for any.*
1e420 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
1e430 72 20 77 68 69 63 68 20 61 6c 6c 20 64 65 73 63  r which all desc
1e440 65 6e 64 65 6e 74 20 74 6f 6b 65 6e 73 20 61 72  endent tokens ar
1e450 65 20 64 65 66 65 72 72 65 64 2e 0a 2a 2a 0a 2a  e deferred..**.*
1e460 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 62  * If parameter b
1e470 4f 70 74 4f 6b 20 69 73 20 7a 65 72 6f 2c 20 74  OptOk is zero, t
1e480 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
1e490 74 65 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  teed that the.**
1e4a0 20 46 74 73 33 50 68 72 61 73 65 2e 64 6f 63 6c   Fts3Phrase.docl
1e4b0 69 73 74 2e 61 41 6c 6c 2f 6e 41 6c 6c 20 76 61  ist.aAll/nAll va
1e4c0 72 69 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 20  riables contain 
1e4d0 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  the entire docli
1e4e0 73 74 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 70  st for.** each p
1e4f0 68 72 61 73 65 20 69 6e 20 74 68 65 20 65 78 70  hrase in the exp
1e500 72 65 73 73 69 6f 6e 20 28 73 75 62 6a 65 63 74  ression (subject
1e510 20 74 6f 20 64 65 66 65 72 72 65 64 20 74 6f 6b   to deferred tok
1e520 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 0a  en processing)..
1e530 2a 2a 20 4f 72 2c 20 69 66 20 62 4f 70 74 4f 6b  ** Or, if bOptOk
1e540 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1e550 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  en one or more t
1e560 6f 6b 65 6e 73 20 77 69 74 68 69 6e 20 74 68 65  okens within the
1e570 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6d   expression.** m
1e580 61 79 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 63  ay be loaded inc
1e590 72 65 6d 65 6e 74 61 6c 6c 79 2c 20 6d 65 61 6e  rementally, mean
1e5a0 69 6e 67 20 64 6f 63 6c 69 73 74 2e 61 41 6c 6c  ing doclist.aAll
1e5b0 2f 6e 41 6c 6c 20 69 73 20 6e 6f 74 20 61 76 61  /nAll is not ava
1e5c0 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
1e5d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e5e0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
1e5f0 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73  ction, *pRc is s
1e600 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20  et to an SQLite 
1e610 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 62 65  error.** code be
1e620 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1e630 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e640 74 73 33 45 76 61 6c 53 74 61 72 74 52 65 61 64  ts3EvalStartRead
1e650 65 72 73 28 0a 20 20 46 74 73 33 43 75 72 73 6f  ers(.  Fts3Curso
1e660 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20  r *pCsr,        
1e670 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 43 75         /* FTS Cu
1e680 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  rsor handle */. 
1e690 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72   Fts3Expr *pExpr
1e6a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e6b0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
1e6c0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 70 68 72  o initialize phr
1e6d0 61 73 65 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ases in */.  int
1e6e0 20 62 4f 70 74 4f 6b 2c 20 20 20 20 20 20 20 20   bOptOk,        
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e700 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 69  True to enable i
1e710 6e 63 72 65 6d 65 6e 74 61 6c 20 6c 6f 61 64 69  ncremental loadi
1e720 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  ng */.  int *pRc
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
1e750 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
1e760 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  .){.  if( pExpr 
1e770 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 2a 70  && SQLITE_OK==*p
1e780 52 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  Rc ){.    if( pE
1e790 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  xpr->eType==FTSQ
1e7a0 55 45 52 59 5f 50 48 52 41 53 45 20 29 7b 0a 20  UERY_PHRASE ){. 
1e7b0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1e7c0 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 70    int nToken = p
1e7d0 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 6e  Expr->pPhrase->n
1e7e0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 66 6f 72  Token;.      for
1e7f0 28 69 3d 30 3b 20 69 3c 6e 54 6f 6b 65 6e 3b 20  (i=0; i<nToken; 
1e800 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1e810 28 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65  ( pExpr->pPhrase
1e820 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 2e 70 44 65 66  ->aToken[i].pDef
1e830 65 72 72 65 64 3d 3d 30 20 29 20 62 72 65 61 6b  erred==0 ) break
1e840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e850 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64  pExpr->bDeferred
1e860 20 3d 20 28 69 3d 3d 6e 54 6f 6b 65 6e 29 3b 0a   = (i==nToken);.
1e870 20 20 20 20 20 20 2a 70 52 63 20 3d 20 66 74 73        *pRc = fts
1e880 33 45 76 61 6c 50 68 72 61 73 65 53 74 61 72 74  3EvalPhraseStart
1e890 28 70 43 73 72 2c 20 62 4f 70 74 4f 6b 2c 20 70  (pCsr, bOptOk, p
1e8a0 45 78 70 72 2d 3e 70 50 68 72 61 73 65 29 3b 0a  Expr->pPhrase);.
1e8b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e8c0 20 66 74 73 33 45 76 61 6c 53 74 61 72 74 52 65   fts3EvalStartRe
1e8d0 61 64 65 72 73 28 70 43 73 72 2c 20 70 45 78 70  aders(pCsr, pExp
1e8e0 72 2d 3e 70 4c 65 66 74 2c 20 62 4f 70 74 4f 6b  r->pLeft, bOptOk
1e8f0 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 66 74  , pRc);.      ft
1e900 73 33 45 76 61 6c 53 74 61 72 74 52 65 61 64 65  s3EvalStartReade
1e910 72 73 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e  rs(pCsr, pExpr->
1e920 70 52 69 67 68 74 2c 20 62 4f 70 74 4f 6b 2c 20  pRight, bOptOk, 
1e930 70 52 63 29 3b 0a 20 20 20 20 20 20 70 45 78 70  pRc);.      pExp
1e940 72 2d 3e 62 44 65 66 65 72 72 65 64 20 3d 20 28  r->bDeferred = (
1e950 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 62 44  pExpr->pLeft->bD
1e960 65 66 65 72 72 65 64 20 26 26 20 70 45 78 70 72  eferred && pExpr
1e970 2d 3e 70 52 69 67 68 74 2d 3e 62 44 65 66 65 72  ->pRight->bDefer
1e980 72 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  red);.    }.  }.
1e990 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 72 72 61  }../*.** An arra
1e9a0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
1e9b0 6e 67 20 73 74 72 75 63 74 75 72 65 73 20 69 73  ng structures is
1e9c0 20 61 73 73 65 6d 62 6c 65 64 20 61 73 20 70 61   assembled as pa
1e9d0 72 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  rt of the proces
1e9e0 73 0a 2a 2a 20 6f 66 20 73 65 6c 65 63 74 69 6e  s.** of selectin
1e9f0 67 20 74 6f 6b 65 6e 73 20 74 6f 20 64 65 66 65  g tokens to defe
1ea00 72 20 62 65 66 6f 72 65 20 74 68 65 20 71 75 65  r before the que
1ea10 72 79 20 73 74 61 72 74 73 20 65 78 65 63 75 74  ry starts execut
1ea20 69 6e 67 20 28 61 73 20 70 61 72 74 0a 2a 2a 20  ing (as part.** 
1ea30 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72 28 29  of the xFilter()
1ea40 20 6d 65 74 68 6f 64 29 2e 20 54 68 65 72 65 20   method). There 
1ea50 69 73 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  is one element i
1ea60 6e 20 74 68 65 20 61 72 72 61 79 20 66 6f 72 20  n the array for 
1ea70 65 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  each.** token in
1ea80 20 74 68 65 20 46 54 53 20 65 78 70 72 65 73 73   the FTS express
1ea90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ion..**.** Token
1eaa0 73 20 61 72 65 20 64 69 76 69 64 65 64 20 69 6e  s are divided in
1eab0 74 6f 20 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73  to AND/NEAR clus
1eac0 74 65 72 73 2e 20 41 6c 6c 20 74 6f 6b 65 6e 73  ters. All tokens
1ead0 20 69 6e 20 61 20 63 6c 75 73 74 65 72 20 62 65   in a cluster be
1eae0 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 70 68 72 61 73  long.** to phras
1eaf0 65 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 6e  es that are conn
1eb00 65 63 74 65 64 20 6f 6e 6c 79 20 62 79 20 41 4e  ected only by AN
1eb10 44 20 61 6e 64 20 4e 45 41 52 20 6f 70 65 72 61  D and NEAR opera
1eb20 74 6f 72 73 20 28 6e 6f 74 20 4f 52 20 6f 72 0a  tors (not OR or.
1eb30 2a 2a 20 4e 4f 54 29 2e 20 57 68 65 6e 20 64 65  ** NOT). When de
1eb40 74 65 72 6d 69 6e 69 6e 67 20 74 6f 6b 65 6e 73  termining tokens
1eb50 20 74 6f 20 64 65 66 65 72 2c 20 65 61 63 68 20   to defer, each 
1eb60 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73 74 65 72  AND/NEAR cluster
1eb70 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a   is considered.*
1eb80 2a 20 73 65 70 61 72 61 74 65 6c 79 2e 20 54 68  * separately. Th
1eb90 65 20 72 6f 6f 74 20 6f 66 20 61 20 74 6f 6b 65  e root of a toke
1eba0 6e 73 20 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73  ns AND/NEAR clus
1ebb0 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ter is stored in
1ebc0 20 0a 2a 2a 20 46 74 73 33 54 6f 6b 65 6e 41 6e   .** Fts3TokenAn
1ebd0 64 43 6f 73 74 2e 70 52 6f 6f 74 2e 0a 2a 2f 0a  dCost.pRoot..*/.
1ebe0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1ebf0 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20  ts3TokenAndCost 
1ec00 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74  Fts3TokenAndCost
1ec10 3b 0a 73 74 72 75 63 74 20 46 74 73 33 54 6f 6b  ;.struct Fts3Tok
1ec20 65 6e 41 6e 64 43 6f 73 74 20 7b 0a 20 20 46 74  enAndCost {.  Ft
1ec30 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
1ec40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1ec50 20 54 68 65 20 70 68 72 61 73 65 20 74 68 65 20   The phrase the 
1ec60 74 6f 6b 65 6e 20 62 65 6c 6f 6e 67 73 20 74 6f  token belongs to
1ec70 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 6b 65 6e   */.  int iToken
1ec80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ec90 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
1eca0 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 70 68  n of token in ph
1ecb0 72 61 73 65 20 2a 2f 0a 20 20 46 74 73 33 50 68  rase */.  Fts3Ph
1ecc0 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  raseToken *pToke
1ecd0 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n;        /* The
1ece0 20 74 6f 6b 65 6e 20 69 74 73 65 6c 66 20 2a 2f   token itself */
1ecf0 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 6f  .  Fts3Expr *pRo
1ed00 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
1ed10 20 20 20 2f 2a 20 52 6f 6f 74 20 6f 66 20 4e 45     /* Root of NE
1ed20 41 52 2f 41 4e 44 20 63 6c 75 73 74 65 72 20 2a  AR/AND cluster *
1ed30 2f 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 20 20  /.  int nOvfl;  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ed60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1ed70 74 6f 20 6c 6f 61 64 20 64 6f 63 6c 69 73 74 20  to load doclist 
1ed80 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
1edb0 6d 6e 20 74 68 65 20 74 6f 6b 65 6e 20 6d 75 73  mn the token mus
1edc0 74 20 6d 61 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f  t match */.};../
1edd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ede0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 6f  on is used to po
1edf0 70 75 6c 61 74 65 20 61 6e 20 61 6c 6c 6f 63 61  pulate an alloca
1ee00 74 65 64 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64  ted Fts3TokenAnd
1ee10 43 6f 73 74 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  Cost array..**.*
1ee20 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
1ee30 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
1ee40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ee50 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1ee60 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
1ee70 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
1ee80 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
1ee90 65 78 65 63 75 74 69 6f 6e 2c 20 2a 70 52 63 20  execution, *pRc 
1eea0 69 73 20 73 65 74 20 74 6f 20 61 6e 0a 2a 2a 20  is set to an.** 
1eeb0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1eec0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1eed0 64 20 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e 43  d fts3EvalTokenC
1eee0 6f 73 74 73 28 0a 20 20 46 74 73 33 43 75 72 73  osts(.  Fts3Curs
1eef0 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
1ef00 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 43          /* FTS C
1ef10 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a  ursor handle */.
1ef20 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 6f 6f    Fts3Expr *pRoo
1ef30 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1ef40 20 20 2f 2a 20 52 6f 6f 74 20 6f 66 20 63 75 72    /* Root of cur
1ef50 72 65 6e 74 20 41 4e 44 2f 4e 45 41 52 20 63 6c  rent AND/NEAR cl
1ef60 75 73 74 65 72 20 2a 2f 0a 20 20 46 74 73 33 45  uster */.  Fts3E
1ef70 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1ef80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1ef90 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 6e 73  pression to cons
1efa0 69 64 65 72 20 2a 2f 0a 20 20 46 74 73 33 54 6f  ider */.  Fts3To
1efb0 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 2a 70 70 54  kenAndCost **ppT
1efc0 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  C,        /* Wri
1efd0 74 65 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  te new entries t
1efe0 6f 20 2a 28 2a 70 70 54 43 29 2b 2b 20 2a 2f 0a  o *(*ppTC)++ */.
1eff0 20 20 46 74 73 33 45 78 70 72 20 2a 2a 2a 70 70    Fts3Expr ***pp
1f000 4f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Or,             
1f010 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 4f    /* Write new O
1f020 52 20 72 6f 6f 74 20 74 6f 20 2a 28 2a 70 70 4f  R root to *(*ppO
1f030 72 29 2b 2b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  r)++ */.  int *p
1f040 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
1f050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
1f060 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
1f070 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  */.){.  if( *pRc
1f080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1f090 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
1f0a0 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
1f0b0 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 7b  SQUERY_PHRASE ){
1f0c0 0a 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73  .      Fts3Phras
1f0d0 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45 78  e *pPhrase = pEx
1f0e0 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 20  pr->pPhrase;.   
1f0f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1f100 66 6f 72 28 69 3d 30 3b 20 2a 70 52 63 3d 3d 53  for(i=0; *pRc==S
1f110 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 50  QLITE_OK && i<pP
1f120 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69  hrase->nToken; i
1f130 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ++){.        Fts
1f140 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 70  3TokenAndCost *p
1f150 54 43 20 3d 20 28 2a 70 70 54 43 29 2b 2b 3b 0a  TC = (*ppTC)++;.
1f160 20 20 20 20 20 20 20 20 70 54 43 2d 3e 70 50 68          pTC->pPh
1f170 72 61 73 65 20 3d 20 70 50 68 72 61 73 65 3b 0a  rase = pPhrase;.
1f180 20 20 20 20 20 20 20 20 70 54 43 2d 3e 69 54 6f          pTC->iTo
1f190 6b 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  ken = i;.       
1f1a0 20 70 54 43 2d 3e 70 52 6f 6f 74 20 3d 20 70 52   pTC->pRoot = pR
1f1b0 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20 70 54 43  oot;.        pTC
1f1c0 2d 3e 70 54 6f 6b 65 6e 20 3d 20 26 70 50 68 72  ->pToken = &pPhr
1f1d0 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 3b 0a  ase->aToken[i];.
1f1e0 20 20 20 20 20 20 20 20 70 54 43 2d 3e 69 43 6f          pTC->iCo
1f1f0 6c 20 3d 20 70 50 68 72 61 73 65 2d 3e 69 43 6f  l = pPhrase->iCo
1f200 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 2a 70  lumn;.        *p
1f210 52 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  Rc = sqlite3Fts3
1f220 4d 73 72 4f 76 66 6c 28 70 43 73 72 2c 20 70 54  MsrOvfl(pCsr, pT
1f230 43 2d 3e 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63  C->pToken->pSegc
1f240 73 72 2c 20 26 70 54 43 2d 3e 6e 4f 76 66 6c 29  sr, &pTC->nOvfl)
1f250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1f260 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 65  lse if( pExpr->e
1f270 54 79 70 65 21 3d 46 54 53 51 55 45 52 59 5f 4e  Type!=FTSQUERY_N
1f280 4f 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OT ){.      if( 
1f290 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
1f2a0 53 51 55 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20  SQUERY_OR ){.   
1f2b0 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 45 78       pRoot = pEx
1f2c0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1f2d0 20 20 20 2a 2a 70 70 4f 72 20 3d 20 70 52 6f 6f     **ppOr = pRoo
1f2e0 74 3b 0a 20 20 20 20 20 20 20 20 28 2a 70 70 4f  t;.        (*ppO
1f2f0 72 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r)++;.      }.  
1f300 20 20 20 20 66 74 73 33 45 76 61 6c 54 6f 6b 65      fts3EvalToke
1f310 6e 43 6f 73 74 73 28 70 43 73 72 2c 20 70 52 6f  nCosts(pCsr, pRo
1f320 6f 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ot, pExpr->pLeft
1f330 2c 20 70 70 54 43 2c 20 70 70 4f 72 2c 20 70 52  , ppTC, ppOr, pR
1f340 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  c);.      if( pE
1f350 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  xpr->eType==FTSQ
1f360 55 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20 20  UERY_OR ){.     
1f370 20 20 20 70 52 6f 6f 74 20 3d 20 70 45 78 70 72     pRoot = pExpr
1f380 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1f390 20 20 2a 2a 70 70 4f 72 20 3d 20 70 52 6f 6f 74    **ppOr = pRoot
1f3a0 3b 0a 20 20 20 20 20 20 20 20 28 2a 70 70 4f 72  ;.        (*ppOr
1f3b0 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )++;.      }.   
1f3c0 20 20 20 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e     fts3EvalToken
1f3d0 43 6f 73 74 73 28 70 43 73 72 2c 20 70 52 6f 6f  Costs(pCsr, pRoo
1f3e0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1f3f0 2c 20 70 70 54 43 2c 20 70 70 4f 72 2c 20 70 52  , ppTC, ppOr, pR
1f400 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  c);.    }.  }.}.
1f410 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1f420 20 74 68 65 20 61 76 65 72 61 67 65 20 64 6f 63   the average doc
1f430 75 6d 65 6e 74 20 28 72 6f 77 29 20 73 69 7a 65  ument (row) size
1f440 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 73 75   in pages. If su
1f450 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 77 72 69  ccessful,.** wri
1f460 74 65 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  te this value to
1f470 20 2a 70 6e 50 61 67 65 20 61 6e 64 20 72 65 74   *pnPage and ret
1f480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
1f490 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
1f4a0 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
1f4b0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1f4c0 54 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 75  The average docu
1f4d0 6d 65 6e 74 20 73 69 7a 65 20 69 6e 20 70 61 67  ment size in pag
1f4e0 65 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  es is calculated
1f4f0 20 62 79 20 66 69 72 73 74 20 63 61 6c 63 75 6c   by first calcul
1f500 61 74 69 6e 67 20 0a 2a 2a 20 64 65 74 65 72 6d  ating .** determ
1f510 69 6e 69 6e 67 20 74 68 65 20 61 76 65 72 61 67  ining the averag
1f520 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2c  e size in bytes,
1f530 20 42 2e 20 49 66 20 42 20 69 73 20 6c 65 73 73   B. If B is less
1f540 20 74 68 61 6e 20 74 68 65 20 61 6d 6f 75 6e 74   than the amount
1f550 0a 2a 2a 20 6f 66 20 64 61 74 61 20 74 68 61 74  .** of data that
1f560 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 61 20 73   will fit on a s
1f570 69 6e 67 6c 65 20 6c 65 61 66 20 70 61 67 65 20  ingle leaf page 
1f580 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62  of an intkey tab
1f590 6c 65 20 69 6e 0a 2a 2a 20 74 68 69 73 20 64 61  le in.** this da
1f5a0 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65  tabase, then the
1f5b0 20 61 76 65 72 61 67 65 20 64 6f 63 73 69 7a 65   average docsize
1f5c0 20 69 73 20 31 2e 20 4f 74 68 65 72 77 69 73 65   is 1. Otherwise
1f5d0 2c 20 69 74 20 69 73 20 31 20 70 6c 75 73 0a 2a  , it is 1 plus.*
1f5e0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1f5f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 63  overflow pages c
1f600 6f 6e 73 75 6d 65 64 20 62 79 20 61 20 72 65 63  onsumed by a rec
1f610 6f 72 64 20 42 20 62 79 74 65 73 20 69 6e 20 73  ord B bytes in s
1f620 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
1f630 6e 74 20 66 74 73 33 45 76 61 6c 41 76 65 72 61  nt fts3EvalAvera
1f640 67 65 44 6f 63 73 69 7a 65 28 46 74 73 33 43 75  geDocsize(Fts3Cu
1f650 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20  rsor *pCsr, int 
1f660 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69 66 28 20  *pnPage){.  if( 
1f670 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3d 3d 30  pCsr->nRowAvg==0
1f680 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 61   ){.    /* The a
1f690 76 65 72 61 67 65 20 64 6f 63 75 6d 65 6e 74 20  verage document 
1f6a0 73 69 7a 65 2c 20 77 68 69 63 68 20 69 73 20 72  size, which is r
1f6b0 65 71 75 69 72 65 64 20 74 6f 20 63 61 6c 63 75  equired to calcu
1f6c0 6c 61 74 65 20 74 68 65 20 63 6f 73 74 0a 20 20  late the cost.  
1f6d0 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 64 6f 63    ** of each doc
1f6e0 6c 69 73 74 2c 20 68 61 73 20 6e 6f 74 20 79 65  list, has not ye
1f6f0 74 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e 65  t been determine
1f700 64 2e 20 52 65 61 64 20 74 68 65 20 72 65 71 75  d. Read the requ
1f710 69 72 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ired .    ** dat
1f720 61 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 74 61  a from the %_sta
1f730 74 20 74 61 62 6c 65 20 74 6f 20 63 61 6c 63 75  t table to calcu
1f740 6c 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  late it..    **.
1f750 20 20 20 20 2a 2a 20 45 6e 74 72 79 20 30 20 6f      ** Entry 0 o
1f760 66 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62  f the %_stat tab
1f770 6c 65 20 69 73 20 61 20 62 6c 6f 62 20 63 6f 6e  le is a blob con
1f780 74 61 69 6e 69 6e 67 20 28 6e 43 6f 6c 2b 31 29  taining (nCol+1)
1f790 20 46 54 53 33 20 0a 20 20 20 20 2a 2a 20 76 61   FTS3 .    ** va
1f7a0 72 69 6e 74 73 2c 20 77 68 65 72 65 20 6e 43 6f  rints, where nCo
1f7b0 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  l is the number 
1f7c0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1f7d0 65 20 46 54 53 33 20 74 61 62 6c 65 2e 0a 20 20  e FTS3 table..  
1f7e0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76    ** The first v
1f7f0 61 72 69 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  arint is the num
1f800 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ber of documents
1f810 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1f820 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
1f830 74 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  table. The follo
1f840 77 69 6e 67 20 6e 43 6f 6c 20 76 61 72 69 6e 74  wing nCol varint
1f850 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 6f  s contain the to
1f860 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 0a 20 20  tal amount of.  
1f870 20 20 2a 2a 20 64 61 74 61 20 73 74 6f 72 65 64    ** data stored
1f880 20 69 6e 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20   in all rows of 
1f890 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
1f8a0 68 65 20 74 61 62 6c 65 2c 20 66 72 6f 6d 20 6c  he table, from l
1f8b0 65 66 74 0a 20 20 20 20 2a 2a 20 74 6f 20 72 69  eft.    ** to ri
1f8c0 67 68 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ght..    */.    
1f8d0 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 33  int rc;.    Fts3
1f8e0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
1f8f0 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73  Table*)pCsr->bas
1f900 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 73 71 6c  e.pVtab;.    sql
1f910 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1f920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
1f930 74 36 34 20 6e 44 6f 63 20 3d 20 30 3b 0a 20 20  t64 nDoc = 0;.  
1f940 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1f950 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 63  nByte = 0;.    c
1f960 6f 6e 73 74 20 63 68 61 72 20 2a 70 45 6e 64 3b  onst char *pEnd;
1f970 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1f980 2a 61 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  *a;..    rc = sq
1f990 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44  lite3Fts3SelectD
1f9a0 6f 63 74 6f 74 61 6c 28 70 2c 20 26 70 53 74 6d  octotal(p, &pStm
1f9b0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
1f9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1f9d0 72 6e 20 72 63 3b 0a 20 20 20 20 61 20 3d 20 73  rn rc;.    a = s
1f9e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1f9f0 6f 62 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  ob(pStmt, 0);.  
1fa00 20 20 61 73 73 65 72 74 28 20 61 20 29 3b 0a 0a    assert( a );..
1fa10 20 20 20 20 70 45 6e 64 20 3d 20 26 61 5b 73 71      pEnd = &a[sq
1fa20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1fa30 65 73 28 70 53 74 6d 74 2c 20 30 29 5d 3b 0a 20  es(pStmt, 0)];. 
1fa40 20 20 20 61 20 2b 3d 20 73 71 6c 69 74 65 33 46     a += sqlite3F
1fa50 74 73 33 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts3GetVarint(a, 
1fa60 26 6e 44 6f 63 29 3b 0a 20 20 20 20 77 68 69 6c  &nDoc);.    whil
1fa70 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20  e( a<pEnd ){.   
1fa80 20 20 20 61 20 2b 3d 20 73 71 6c 69 74 65 33 46     a += sqlite3F
1fa90 74 73 33 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts3GetVarint(a, 
1faa0 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20  &nByte);.    }. 
1fab0 20 20 20 69 66 28 20 6e 44 6f 63 3d 3d 30 20 7c     if( nDoc==0 |
1fac0 7c 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  | nByte==0 ){.  
1fad0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
1fae0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
1faf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1fb00 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
1fb10 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f  }..    pCsr->nDo
1fb20 63 20 3d 20 6e 44 6f 63 3b 0a 20 20 20 20 70 43  c = nDoc;.    pC
1fb30 73 72 2d 3e 6e 52 6f 77 41 76 67 20 3d 20 28 69  sr->nRowAvg = (i
1fb40 6e 74 29 28 28 28 6e 42 79 74 65 20 2f 20 6e 44  nt)(((nByte / nD
1fb50 6f 63 29 20 2b 20 70 2d 3e 6e 50 67 73 7a 29 20  oc) + p->nPgsz) 
1fb60 2f 20 70 2d 3e 6e 50 67 73 7a 29 3b 0a 20 20 20  / p->nPgsz);.   
1fb70 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e   assert( pCsr->n
1fb80 52 6f 77 41 76 67 3e 30 20 29 3b 20 0a 20 20 20  RowAvg>0 ); .   
1fb90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
1fba0 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
1fbb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fbc0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1fbd0 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   }..  *pnPage = 
1fbe0 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3b 0a 20  pCsr->nRowAvg;. 
1fbf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fc00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
1fc10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1fc20 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 74 68  led to select th
1fc30 65 20 74 6f 6b 65 6e 73 20 28 69 66 20 61 6e 79  e tokens (if any
1fc40 29 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 0a  ) that will be .
1fc50 2a 2a 20 64 65 66 65 72 72 65 64 2e 20 54 68 65  ** deferred. The
1fc60 20 61 72 72 61 79 20 61 54 43 5b 5d 20 68 61 73   array aTC[] has
1fc70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6f   already been po
1fc80 70 75 6c 61 74 65 64 20 77 68 65 6e 20 74 68 69  pulated when thi
1fc90 73 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2e 0a  s is.** called..
1fca0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1fcb0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ion is called on
1fcc0 63 65 20 66 6f 72 20 65 61 63 68 20 41 4e 44 2f  ce for each AND/
1fcd0 4e 45 41 52 20 63 6c 75 73 74 65 72 20 69 6e 20  NEAR cluster in 
1fce0 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
1fcf0 6f 6e 2e 20 45 61 63 68 20 69 6e 76 6f 63 61 74  on. Each invocat
1fd00 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
1fd10 68 69 63 68 20 74 6f 6b 65 6e 73 20 74 6f 20 64  hich tokens to d
1fd20 65 66 65 72 20 77 69 74 68 69 6e 0a 2a 2a 20 74  efer within.** t
1fd30 68 65 20 63 6c 75 73 74 65 72 20 77 69 74 68 20  he cluster with 
1fd40 72 6f 6f 74 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  root node pRoot.
1fd50 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
1fd60 6f 76 65 20 74 68 65 20 64 65 66 69 6e 69 74 69  ove the definiti
1fd70 6f 6e 0a 2a 2a 20 6f 66 20 73 74 72 75 63 74 20  on.** of struct 
1fd80 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74  Fts3TokenAndCost
1fd90 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
1fda0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  s..**.** If no e
1fdb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
1fdc0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fdd0 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 46 74  ed and sqlite3Ft
1fde0 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 29 0a 2a  s3DeferToken().*
1fdf0 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 65 61 63 68  * called on each
1fe00 20 74 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 2e   token to defer.
1fe10 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
1fe20 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1fe30 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
1fe40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1fe50 74 73 33 45 76 61 6c 53 65 6c 65 63 74 44 65 66  ts3EvalSelectDef
1fe60 65 72 72 65 64 28 0a 20 20 46 74 73 33 43 75 72  erred(.  Fts3Cur
1fe70 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
1fe80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
1fe90 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f  Cursor handle */
1fea0 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 6f  .  Fts3Expr *pRo
1feb0 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
1fec0 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 74     /* Consider t
1fed0 6f 6b 65 6e 73 20 77 69 74 68 20 74 68 69 73 20  okens with this 
1fee0 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46  root node */.  F
1fef0 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20  ts3TokenAndCost 
1ff00 2a 61 54 43 2c 20 20 20 20 20 20 20 20 20 20 2f  *aTC,          /
1ff10 2a 20 41 72 72 61 79 20 6f 66 20 65 78 70 72 65  * Array of expre
1ff20 73 73 69 6f 6e 20 74 6f 6b 65 6e 73 20 61 6e 64  ssion tokens and
1ff30 20 63 6f 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20   costs */.  int 
1ff40 6e 54 43 20 20 20 20 20 20 20 20 20 20 20 20 20  nTC             
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ff60 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1ff70 20 69 6e 20 61 54 43 5b 5d 20 2a 2f 0a 29 7b 0a   in aTC[] */.){.
1ff80 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
1ff90 62 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a  b = (Fts3Table *
1ffa0 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  )pCsr->base.pVta
1ffb0 62 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 53 69 7a  b;.  int nDocSiz
1ffc0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1ffd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ffe0 66 20 70 61 67 65 73 20 70 65 72 20 64 6f 63 20  f pages per doc 
1fff0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
20000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20020 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
20030 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
20060 61 62 6c 65 20 66 6f 72 20 76 61 72 69 6f 75 73  able for various
20070 20 70 75 72 70 6f 73 65 73 20 2a 2f 0a 20 20 69   purposes */.  i
20080 6e 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 20 20 20  nt nOvfl = 0;   
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
200a0 2a 20 54 6f 74 61 6c 20 6f 76 65 72 66 6c 6f 77  * Total overflow
200b0 20 70 61 67 65 73 20 75 73 65 64 20 62 79 20 64   pages used by d
200c0 6f 63 6c 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74  oclists */.  int
200d0 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 20   nToken = 0;    
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
200f0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
20100 74 6f 6b 65 6e 73 20 69 6e 20 63 6c 75 73 74 65  tokens in cluste
20110 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d 69 6e  r */..  int nMin
20120 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Est = 0;        
20130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
20140 69 6e 69 6d 75 6d 20 63 6f 75 6e 74 20 66 6f 72  inimum count for
20150 20 61 6e 79 20 70 68 72 61 73 65 20 73 6f 20 66   any phrase so f
20160 61 72 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ar. */.  int nLo
20170 61 64 34 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ad4 = 1;        
20180 20 20 20 20 20 20 20 20 20 2f 2a 20 28 50 68 72           /* (Phr
20190 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ases that will b
201a0 65 20 6c 6f 61 64 65 64 29 5e 34 2e 20 2a 2f 0a  e loaded)^4. */.
201b0 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
201c0 74 6f 6b 65 6e 73 20 69 6e 20 74 68 69 73 20 41  tokens in this A
201d0 4e 44 2f 4e 45 41 52 20 63 6c 75 73 74 65 72 2e  ND/NEAR cluster.
201e0 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
201f0 64 6f 63 6c 69 73 74 73 0a 20 20 2a 2a 20 61 73  doclists.  ** as
20200 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20210 65 20 74 6f 6b 65 6e 73 20 73 70 69 6c 6c 20 6f  e tokens spill o
20220 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
20230 65 73 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20  es, or if there 
20240 69 73 0a 20 20 2a 2a 20 6f 6e 6c 79 20 31 20 74  is.  ** only 1 t
20250 6f 6b 65 6e 2c 20 65 78 69 74 20 65 61 72 6c 79  oken, exit early
20260 2e 20 4e 6f 20 74 6f 6b 65 6e 73 20 74 6f 20 64  . No tokens to d
20270 65 66 65 72 20 69 6e 20 74 68 69 73 20 63 61 73  efer in this cas
20280 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  e. */.  for(ii=0
20290 3b 20 69 69 3c 6e 54 43 3b 20 69 69 2b 2b 29 7b  ; ii<nTC; ii++){
202a0 0a 20 20 20 20 69 66 28 20 61 54 43 5b 69 69 5d  .    if( aTC[ii]
202b0 2e 70 52 6f 6f 74 3d 3d 70 52 6f 6f 74 20 29 7b  .pRoot==pRoot ){
202c0 0a 20 20 20 20 20 20 6e 4f 76 66 6c 20 2b 3d 20  .      nOvfl += 
202d0 61 54 43 5b 69 69 5d 2e 6e 4f 76 66 6c 3b 0a 20  aTC[ii].nOvfl;. 
202e0 20 20 20 20 20 6e 54 6f 6b 65 6e 2b 2b 3b 0a 20       nToken++;. 
202f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
20300 4f 76 66 6c 3d 3d 30 20 7c 7c 20 6e 54 6f 6b 65  Ovfl==0 || nToke
20310 6e 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  n<2 ) return SQL
20320 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4f 62  ITE_OK;..  /* Ob
20330 74 61 69 6e 20 74 68 65 20 61 76 65 72 61 67 65  tain the average
20340 20 64 6f 63 73 69 7a 65 20 28 69 6e 20 70 61 67   docsize (in pag
20350 65 73 29 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66  es). */.  rc = f
20360 74 73 33 45 76 61 6c 41 76 65 72 61 67 65 44 6f  ts3EvalAverageDo
20370 63 73 69 7a 65 28 70 43 73 72 2c 20 26 6e 44 6f  csize(pCsr, &nDo
20380 63 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  cSize);.  assert
20390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
203a0 7c 7c 20 6e 44 6f 63 53 69 7a 65 3e 30 20 29 3b  || nDocSize>0 );
203b0 0a 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20  ...  /* Iterate 
203c0 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 6f 6b 65  through all toke
203d0 6e 73 20 69 6e 20 74 68 69 73 20 41 4e 44 2f 4e  ns in this AND/N
203e0 45 41 52 20 63 6c 75 73 74 65 72 2c 20 69 6e 20  EAR cluster, in 
203f0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
20400 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 75 6d  .  ** of the num
20410 62 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ber of overflow 
20420 70 61 67 65 73 20 74 68 61 74 20 77 69 6c 6c 20  pages that will 
20430 62 65 20 6c 6f 61 64 65 64 20 62 79 20 74 68 65  be loaded by the
20440 20 70 61 67 65 72 20 6c 61 79 65 72 20 0a 20 20   pager layer .  
20450 2a 2a 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ** to retrieve t
20460 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
20470 74 20 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 20  t for the token 
20480 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65  from the full-te
20490 78 74 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 20 4c  xt index..  ** L
204a0 6f 61 64 20 74 68 65 20 64 6f 63 6c 69 73 74 73  oad the doclists
204b0 20 66 6f 72 20 74 6f 6b 65 6e 73 20 74 68 61 74   for tokens that
204c0 20 61 72 65 20 65 69 74 68 65 72 3a 0a 20 20 2a   are either:.  *
204d0 2a 0a 20 20 2a 2a 20 20 20 61 2e 20 54 68 65 20  *.  **   a. The 
204e0 63 68 65 61 70 65 73 74 20 74 6f 6b 65 6e 20 69  cheapest token i
204f0 6e 20 74 68 65 20 65 6e 74 69 72 65 20 71 75 65  n the entire que
20500 72 79 20 28 69 2e 65 2e 20 74 68 65 20 6f 6e 65  ry (i.e. the one
20510 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 0a   visited by the.
20520 20 20 2a 2a 20 20 20 20 20 20 66 69 72 73 74 20    **      first 
20530 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69  iteration of thi
20540 73 20 6c 6f 6f 70 29 2c 20 6f 72 0a 20 20 2a 2a  s loop), or.  **
20550 0a 20 20 2a 2a 20 20 20 62 2e 20 50 61 72 74 20  .  **   b. Part 
20560 6f 66 20 61 20 6d 75 6c 74 69 2d 74 6f 6b 65 6e  of a multi-token
20570 20 70 68 72 61 73 65 2e 0a 20 20 2a 2a 0a 20 20   phrase..  **.  
20580 2a 2a 20 41 66 74 65 72 20 65 61 63 68 20 74 6f  ** After each to
20590 6b 65 6e 20 64 6f 63 6c 69 73 74 20 69 73 20 6c  ken doclist is l
205a0 6f 61 64 65 64 2c 20 6d 65 72 67 65 20 69 74 20  oaded, merge it 
205b0 77 69 74 68 20 74 68 65 20 6f 74 68 65 72 73 20  with the others 
205c0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 61  from the.  ** sa
205d0 6d 65 20 70 68 72 61 73 65 20 61 6e 64 20 63 6f  me phrase and co
205e0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
205f0 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  f documents that
20600 20 74 68 65 20 6d 65 72 67 65 64 20 64 6f 63 6c   the merged docl
20610 69 73 74 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  ist.  ** contain
20620 73 2e 20 53 65 74 20 76 61 72 69 61 62 6c 65 20  s. Set variable 
20630 22 6e 4d 69 6e 45 73 74 22 20 74 6f 20 74 68 65  "nMinEst" to the
20640 20 73 6d 61 6c 6c 65 73 74 20 6e 75 6d 62 65 72   smallest number
20650 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e   of documents in
20660 20 0a 20 20 2a 2a 20 61 6e 79 20 70 68 72 61 73   .  ** any phras
20670 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 77 68  e doclist for wh
20680 69 63 68 20 31 20 6f 72 20 6d 6f 72 65 20 74 6f  ich 1 or more to
20690 6b 65 6e 20 64 6f 63 6c 69 73 74 73 20 68 61 76  ken doclists hav
206a0 65 20 62 65 65 6e 20 6c 6f 61 64 65 64 2e 0a 20  e been loaded.. 
206b0 20 2a 2a 20 4c 65 74 20 6e 4f 74 68 65 72 20 62   ** Let nOther b
206c0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
206d0 6f 74 68 65 72 20 70 68 72 61 73 65 73 20 66 6f  other phrases fo
206e0 72 20 77 68 69 63 68 20 69 74 20 69 73 20 63 65  r which it is ce
206f0 72 74 61 69 6e 20 74 68 61 74 0a 20 20 2a 2a 20  rtain that.  ** 
20700 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65  one or more toke
20710 6e 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 64  ns will not be d
20720 65 66 65 72 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  eferred..  **.  
20730 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
20740 68 20 74 6f 6b 65 6e 2c 20 64 65 66 65 72 20 69  h token, defer i
20750 74 20 69 66 20 6c 6f 61 64 69 6e 67 20 74 68 65  t if loading the
20760 20 64 6f 63 6c 69 73 74 20 77 6f 75 6c 64 20 72   doclist would r
20770 65 73 75 6c 74 20 69 6e 0a 20 20 2a 2a 20 6c 6f  esult in.  ** lo
20780 61 64 69 6e 67 20 4e 20 6f 72 20 6d 6f 72 65 20  ading N or more 
20790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 69  overflow pages i
207a0 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20 77 68 65 72  nto memory, wher
207b0 65 20 4e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  e N is computed 
207c0 61 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  as:.  **.  **   
207d0 20 28 6e 4d 69 6e 45 73 74 20 2b 20 34 5e 6e 4f   (nMinEst + 4^nO
207e0 74 68 65 72 20 2d 20 31 29 20 2f 20 28 34 5e 6e  ther - 1) / (4^n
207f0 4f 74 68 65 72 29 0a 20 20 2a 2f 0a 20 20 66 6f  Other).  */.  fo
20800 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 6f 6b 65  r(ii=0; ii<nToke
20810 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
20820 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  OK; ii++){.    i
20830 6e 74 20 69 54 43 3b 20 20 20 20 20 20 20 20 20  nt iTC;         
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20850 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
20860 74 68 72 6f 75 67 68 20 61 54 43 5b 5d 20 61 72  through aTC[] ar
20870 72 61 79 2e 20 2a 2f 0a 20 20 20 20 46 74 73 33  ray. */.    Fts3
20880 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 70 54  TokenAndCost *pT
20890 43 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 65 74  C = 0;    /* Set
208a0 20 74 6f 20 63 68 65 61 70 65 73 74 20 72 65 6d   to cheapest rem
208b0 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 2e 20 2a 2f  aining token. */
208c0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 54 43  ..    /* Set pTC
208d0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
208e0 20 63 68 65 61 70 65 73 74 20 72 65 6d 61 69 6e   cheapest remain
208f0 69 6e 67 20 74 6f 6b 65 6e 2e 20 2a 2f 0a 20 20  ing token. */.  
20900 20 20 66 6f 72 28 69 54 43 3d 30 3b 20 69 54 43    for(iTC=0; iTC
20910 3c 6e 54 43 3b 20 69 54 43 2b 2b 29 7b 0a 20 20  <nTC; iTC++){.  
20920 20 20 20 20 69 66 28 20 61 54 43 5b 69 54 43 5d      if( aTC[iTC]
20930 2e 70 54 6f 6b 65 6e 20 26 26 20 61 54 43 5b 69  .pToken && aTC[i
20940 54 43 5d 2e 70 52 6f 6f 74 3d 3d 70 52 6f 6f 74  TC].pRoot==pRoot
20950 20 0a 20 20 20 20 20 20 20 26 26 20 28 21 70 54   .       && (!pT
20960 43 20 7c 7c 20 61 54 43 5b 69 54 43 5d 2e 6e 4f  C || aTC[iTC].nO
20970 76 66 6c 3c 70 54 43 2d 3e 6e 4f 76 66 6c 29 20  vfl<pTC->nOvfl) 
20980 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
20990 20 20 70 54 43 20 3d 20 26 61 54 43 5b 69 54 43    pTC = &aTC[iTC
209a0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
209b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 43  .    assert( pTC
209c0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 69 20   );..    if( ii 
209d0 26 26 20 70 54 43 2d 3e 6e 4f 76 66 6c 3e 3d 28  && pTC->nOvfl>=(
209e0 28 6e 4d 69 6e 45 73 74 2b 28 6e 4c 6f 61 64 34  (nMinEst+(nLoad4
209f0 2f 34 29 2d 31 29 2f 28 6e 4c 6f 61 64 34 2f 34  /4)-1)/(nLoad4/4
20a00 29 29 2a 6e 44 6f 63 53 69 7a 65 20 29 7b 0a 20  ))*nDocSize ){. 
20a10 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
20a20 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  er of overflow p
20a30 61 67 65 73 20 74 6f 20 6c 6f 61 64 20 66 6f 72  ages to load for
20a40 20 74 68 69 73 20 28 61 6e 64 20 74 68 65 72 65   this (and there
20a50 66 6f 72 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a  fore all.      *
20a60 2a 20 73 75 62 73 65 71 75 65 6e 74 29 20 74 6f  * subsequent) to
20a70 6b 65 6e 73 20 69 73 20 67 72 65 61 74 65 72 20  kens is greater 
20a80 74 68 61 6e 20 74 68 65 20 65 73 74 69 6d 61 74  than the estimat
20a90 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ed number of pag
20aa0 65 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  es .      ** tha
20ab0 74 20 77 69 6c 6c 20 62 65 20 6c 6f 61 64 65 64  t will be loaded
20ac0 20 69 66 20 61 6c 6c 20 73 75 62 73 65 71 75 65   if all subseque
20ad0 6e 74 20 74 6f 6b 65 6e 73 20 61 72 65 20 64 65  nt tokens are de
20ae0 66 65 72 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  ferred..      */
20af0 0a 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73  .      Fts3Phras
20b00 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d  eToken *pToken =
20b10 20 70 54 43 2d 3e 70 54 6f 6b 65 6e 3b 0a 20 20   pTC->pToken;.  
20b20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20b30 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 70  Fts3DeferToken(p
20b40 43 73 72 2c 20 70 54 6f 6b 65 6e 2c 20 70 54 43  Csr, pToken, pTC
20b50 2d 3e 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66  ->iCol);.      f
20b60 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
20b70 6f 72 46 72 65 65 28 70 54 6f 6b 65 6e 2d 3e 70  orFree(pToken->p
20b80 53 65 67 63 73 72 29 3b 0a 20 20 20 20 20 20 70  Segcsr);.      p
20b90 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 20 3d  Token->pSegcsr =
20ba0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
20bb0 20 20 20 20 20 6e 4c 6f 61 64 34 20 3d 20 6e 4c       nLoad4 = nL
20bc0 6f 61 64 34 2a 34 3b 0a 20 20 20 20 20 20 69 66  oad4*4;.      if
20bd0 28 20 69 69 3d 3d 30 20 7c 7c 20 70 54 43 2d 3e  ( ii==0 || pTC->
20be0 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3e  pPhrase->nToken>
20bf0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
20c00 45 69 74 68 65 72 20 74 68 69 73 20 69 73 20 74  Either this is t
20c10 68 65 20 63 68 65 61 70 65 73 74 20 74 6f 6b 65  he cheapest toke
20c20 6e 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  n in the entire 
20c30 71 75 65 72 79 2c 20 6f 72 20 69 74 20 69 73 0a  query, or it is.
20c40 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20          ** part 
20c50 6f 66 20 61 20 6d 75 6c 74 69 2d 74 6f 6b 65 6e  of a multi-token
20c60 20 70 68 72 61 73 65 2e 20 45 69 74 68 65 72 20   phrase. Either 
20c70 77 61 79 2c 20 74 68 65 20 65 6e 74 69 72 65 20  way, the entire 
20c80 64 6f 63 6c 69 73 74 20 77 69 6c 6c 0a 20 20 20  doclist will.   
20c90 20 20 20 20 20 2a 2a 20 28 65 76 65 6e 74 75 61       ** (eventua
20ca0 6c 6c 79 29 20 62 65 20 6c 6f 61 64 65 64 20 69  lly) be loaded i
20cb0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 74 20 6d  nto memory. It m
20cc0 61 79 20 61 73 20 77 65 6c 6c 20 62 65 20 6e 6f  ay as well be no
20cd0 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74  w. */.        Ft
20ce0 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
20cf0 54 6f 6b 65 6e 20 3d 20 70 54 43 2d 3e 70 54 6f  Token = pTC->pTo
20d00 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ken;.        int
20d10 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
20d20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20      char *pList 
20d30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
20d40 3d 20 66 74 73 33 54 65 72 6d 53 65 6c 65 63 74  = fts3TermSelect
20d50 28 70 54 61 62 2c 20 70 54 6f 6b 65 6e 2c 20 70  (pTab, pToken, p
20d60 54 43 2d 3e 69 43 6f 6c 2c 20 26 6e 4c 69 73 74  TC->iCol, &nList
20d70 2c 20 26 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &pList);.     
20d80 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
20d90 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 69 73  QLITE_OK || pLis
20da0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
20db0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20dc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
20dd0 6e 74 20 6e 43 6f 75 6e 74 3b 0a 20 20 20 20 20  nt nCount;.     
20de0 20 20 20 20 20 66 74 73 33 45 76 61 6c 50 68 72       fts3EvalPhr
20df0 61 73 65 4d 65 72 67 65 54 6f 6b 65 6e 28 70 54  aseMergeToken(pT
20e00 61 62 2c 20 70 54 43 2d 3e 70 50 68 72 61 73 65  ab, pTC->pPhrase
20e10 2c 20 70 54 43 2d 3e 69 54 6f 6b 65 6e 2c 70 4c  , pTC->iToken,pL
20e20 69 73 74 2c 6e 4c 69 73 74 29 3b 0a 20 20 20 20  ist,nList);.    
20e30 20 20 20 20 20 20 6e 43 6f 75 6e 74 20 3d 20 66        nCount = f
20e40 74 73 33 44 6f 63 6c 69 73 74 43 6f 75 6e 74 44  ts3DoclistCountD
20e50 6f 63 69 64 73 28 0a 20 20 20 20 20 20 20 20 20  ocids(.         
20e60 20 20 20 20 20 70 54 43 2d 3e 70 50 68 72 61 73       pTC->pPhras
20e70 65 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2c  e->doclist.aAll,
20e80 20 70 54 43 2d 3e 70 50 68 72 61 73 65 2d 3e 64   pTC->pPhrase->d
20e90 6f 63 6c 69 73 74 2e 6e 41 6c 6c 0a 20 20 20 20  oclist.nAll.    
20ea0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
20eb0 20 20 20 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20     if( ii==0 || 
20ec0 6e 43 6f 75 6e 74 3c 6e 4d 69 6e 45 73 74 20 29  nCount<nMinEst )
20ed0 20 6e 4d 69 6e 45 73 74 20 3d 20 6e 43 6f 75 6e   nMinEst = nCoun
20ee0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
20ef0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
20f00 54 43 2d 3e 70 54 6f 6b 65 6e 20 3d 20 30 3b 0a  TC->pToken = 0;.
20f10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20f30 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20f40 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
20f50 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  he xFilter metho
20f60 64 2e 20 49 74 20 69 6e 69 74 69 61 6c 69 7a 65  d. It initialize
20f70 73 0a 2a 2a 20 74 68 65 20 66 75 6c 6c 2d 74 65  s.** the full-te
20f80 78 74 20 71 75 65 72 79 20 63 75 72 72 65 6e 74  xt query current
20f90 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 70 43 73  ly stored in pCs
20fa0 72 2d 3e 70 45 78 70 72 2e 20 54 6f 20 69 74 65  r->pExpr. To ite
20fb0 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
20fc0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61  the results of a
20fd0 20 71 75 65 72 79 2c 20 74 68 65 20 63 61 6c 6c   query, the call
20fe0 65 72 20 64 6f 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  er does:.**.**  
20ff0 20 20 66 74 73 33 45 76 61 6c 53 74 61 72 74 28    fts3EvalStart(
21000 70 43 73 72 29 3b 0a 2a 2a 20 20 20 20 77 68 69  pCsr);.**    whi
21010 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
21020 20 66 74 73 33 45 76 61 6c 4e 65 78 74 28 70 43   fts3EvalNext(pC
21030 73 72 29 3b 0a 2a 2a 20 20 20 20 20 20 69 66 28  sr);.**      if(
21040 20 70 43 73 72 2d 3e 62 45 6f 66 20 29 20 62 72   pCsr->bEof ) br
21050 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 2e 2e 2e  eak;.**      ...
21060 20 72 65 74 75 72 6e 20 72 6f 77 20 70 43 73 72   return row pCsr
21070 2d 3e 69 50 72 65 76 49 64 20 74 6f 20 74 68 65  ->iPrevId to the
21080 20 63 61 6c 6c 65 72 20 2e 2e 2e 0a 2a 2a 20 20   caller ....**  
21090 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e    }.*/.static in
210a0 74 20 66 74 73 33 45 76 61 6c 53 74 61 72 74 28  t fts3EvalStart(
210b0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
210c0 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  ){.  Fts3Table *
210d0 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c  pTab = (Fts3Tabl
210e0 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  e *)pCsr->base.p
210f0 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Vtab;.  int rc =
21100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
21110 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20  t nToken = 0;.  
21120 69 6e 74 20 6e 4f 72 20 3d 20 30 3b 0a 0a 20 20  int nOr = 0;..  
21130 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4d 75  /* Allocate a Mu
21140 6c 74 69 53 65 67 52 65 61 64 65 72 20 66 6f 72  ltiSegReader for
21150 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
21160 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  he expression. *
21170 2f 0a 20 20 66 74 73 33 45 76 61 6c 41 6c 6c 6f  /.  fts3EvalAllo
21180 63 61 74 65 52 65 61 64 65 72 73 28 70 43 73 72  cateReaders(pCsr
21190 2c 20 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 26  , pCsr->pExpr, &
211a0 6e 54 6f 6b 65 6e 2c 20 26 6e 4f 72 2c 20 26 72  nToken, &nOr, &r
211b0 63 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d  c);..  /* Determ
211c0 69 6e 65 20 77 68 69 63 68 2c 20 69 66 20 61 6e  ine which, if an
211d0 79 2c 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65  y, tokens in the
211e0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
211f0 6c 64 20 62 65 20 64 65 66 65 72 72 65 64 2e 20  ld be deferred. 
21200 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
21210 49 54 45 5f 4f 4b 20 26 26 20 6e 54 6f 6b 65 6e  ITE_OK && nToken
21220 3e 31 20 26 26 20 70 54 61 62 2d 3e 62 48 61 73  >1 && pTab->bHas
21230 53 74 61 74 20 29 7b 0a 20 20 20 20 46 74 73 33  Stat ){.    Fts3
21240 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 61 54  TokenAndCost *aT
21250 43 3b 0a 20 20 20 20 46 74 73 33 45 78 70 72 20  C;.    Fts3Expr 
21260 2a 2a 61 70 4f 72 3b 0a 20 20 20 20 61 54 43 20  **apOr;.    aTC 
21270 3d 20 28 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43  = (Fts3TokenAndC
21280 6f 73 74 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ost *)sqlite3_ma
21290 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 73 69  lloc(.        si
212a0 7a 65 6f 66 28 46 74 73 33 54 6f 6b 65 6e 41 6e  zeof(Fts3TokenAn
212b0 64 43 6f 73 74 29 20 2a 20 6e 54 6f 6b 65 6e 0a  dCost) * nToken.
212c0 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 46        + sizeof(F
212d0 74 73 33 45 78 70 72 20 2a 29 20 2a 20 6e 4f 72  ts3Expr *) * nOr
212e0 20 2a 20 32 0a 20 20 20 20 29 3b 0a 20 20 20 20   * 2.    );.    
212f0 61 70 4f 72 20 3d 20 28 46 74 73 33 45 78 70 72  apOr = (Fts3Expr
21300 20 2a 2a 29 26 61 54 43 5b 6e 54 6f 6b 65 6e 5d   **)&aTC[nToken]
21310 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 54 43 20  ;..    if( !aTC 
21320 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
21330 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
21350 20 69 69 3b 0a 20 20 20 20 20 20 46 74 73 33 54   ii;.      Fts3T
21360 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 70 54 43  okenAndCost *pTC
21370 20 3d 20 61 54 43 3b 0a 20 20 20 20 20 20 46 74   = aTC;.      Ft
21380 73 33 45 78 70 72 20 2a 2a 70 70 4f 72 20 3d 20  s3Expr **ppOr = 
21390 61 70 4f 72 3b 0a 0a 20 20 20 20 20 20 66 74 73  apOr;..      fts
213a0 33 45 76 61 6c 54 6f 6b 65 6e 43 6f 73 74 73 28  3EvalTokenCosts(
213b0 70 43 73 72 2c 20 30 2c 20 70 43 73 72 2d 3e 70  pCsr, 0, pCsr->p
213c0 45 78 70 72 2c 20 26 70 54 43 2c 20 26 70 70 4f  Expr, &pTC, &ppO
213d0 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 6e  r, &rc);.      n
213e0 54 6f 6b 65 6e 20 3d 20 70 54 43 2d 61 54 43 3b  Token = pTC-aTC;
213f0 0a 20 20 20 20 20 20 6e 4f 72 20 3d 20 70 70 4f  .      nOr = ppO
21400 72 2d 61 70 4f 72 3b 0a 0a 20 20 20 20 20 20 69  r-apOr;..      i
21410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21420 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21430 20 66 74 73 33 45 76 61 6c 53 65 6c 65 63 74 44   fts3EvalSelectD
21440 65 66 65 72 72 65 64 28 70 43 73 72 2c 20 30 2c  eferred(pCsr, 0,
21450 20 61 54 43 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20   aTC, nToken);. 
21460 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
21470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21480 26 20 69 69 3c 6e 4f 72 3b 20 69 69 2b 2b 29 7b  & ii<nOr; ii++){
21490 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
214a0 66 74 73 33 45 76 61 6c 53 65 6c 65 63 74 44 65  fts3EvalSelectDe
214b0 66 65 72 72 65 64 28 70 43 73 72 2c 20 61 70 4f  ferred(pCsr, apO
214c0 72 5b 69 69 5d 2c 20 61 54 43 2c 20 6e 54 6f 6b  r[ii], aTC, nTok
214d0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  en);.        }. 
214e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
214f0 6c 69 74 65 33 5f 66 72 65 65 28 61 54 43 29 3b  lite3_free(aTC);
21500 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
21510 73 33 45 76 61 6c 53 74 61 72 74 52 65 61 64 65  s3EvalStartReade
21520 72 73 28 70 43 73 72 2c 20 70 43 73 72 2d 3e 70  rs(pCsr, pCsr->p
21530 45 78 70 72 2c 20 31 2c 20 26 72 63 29 3b 0a 20  Expr, 1, &rc);. 
21540 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21550 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
21560 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
21570 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 70 68  tion list for ph
21580 72 61 73 65 20 70 50 68 72 61 73 65 2e 0a 2a 2f  rase pPhrase..*/
21590 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
215a0 33 45 76 61 6c 49 6e 76 61 6c 69 64 61 74 65 50  3EvalInvalidateP
215b0 6f 73 6c 69 73 74 28 46 74 73 33 50 68 72 61 73  oslist(Fts3Phras
215c0 65 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69  e *pPhrase){.  i
215d0 66 28 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  f( pPhrase->docl
215e0 69 73 74 2e 62 46 72 65 65 4c 69 73 74 20 29 7b  ist.bFreeList ){
215f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
21600 65 28 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  e(pPhrase->docli
21610 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  st.pList);.  }. 
21620 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
21630 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70  t.pList = 0;.  p
21640 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
21650 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70 50 68  nList = 0;.  pPh
21660 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46  rase->doclist.bF
21670 72 65 65 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a  reeList = 0;.}..
21680 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
21690 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
216a0 20 65 64 69 74 20 74 68 65 20 70 6f 73 69 74 69   edit the positi
216b0 6f 6e 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74  on list associat
216c0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 70  ed with.** the p
216d0 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70 61 73  hrase object pas
216e0 73 65 64 20 61 73 20 74 68 65 20 66 69 66 74 68  sed as the fifth
216f0 20 61 72 67 75 6d 65 6e 74 20 61 63 63 6f 72 64   argument accord
21700 69 6e 67 20 74 6f 20 61 20 4e 45 41 52 0a 2a 2a  ing to a NEAR.**
21710 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 46 6f 72 20   condition. For 
21720 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
21730 20 20 20 61 62 63 20 4e 45 41 52 2f 35 20 22 64     abc NEAR/5 "d
21740 65 66 20 67 68 69 22 0a 2a 2a 0a 2a 2a 20 50 61  ef ghi".**.** Pa
21750 72 61 6d 65 74 65 72 20 6e 4e 65 61 72 20 69 73  rameter nNear is
21760 20 70 61 73 73 65 64 20 74 68 65 20 4e 45 41 52   passed the NEAR
21770 20 64 69 73 74 61 6e 63 65 20 6f 66 20 74 68 65   distance of the
21780 20 65 78 70 72 65 73 73 69 6f 6e 20 28 35 20 69   expression (5 i
21790 6e 0a 2a 2a 20 74 68 65 20 65 78 61 6d 70 6c 65  n.** the example
217a0 20 61 62 6f 76 65 29 2e 20 57 68 65 6e 20 74 68   above). When th
217b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
217c0 61 6c 6c 65 64 2c 20 2a 70 61 50 6f 73 6c 69 73  alled, *paPoslis
217d0 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
217e0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
217f0 2c 20 61 6e 64 20 2a 70 6e 54 6f 6b 65 6e 20 69  , and *pnToken i
21800 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
21810 70 68 72 61 73 65 20 74 6f 6b 65 6e 73 20 69 6e  phrase tokens in
21820 2c 20 74 68 65 0a 2a 2a 20 70 68 72 61 73 65 20  , the.** phrase 
21830 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
21840 65 20 6f 66 20 74 68 65 20 4e 45 41 52 20 6f 70  e of the NEAR op
21850 65 72 61 74 6f 72 20 74 6f 20 70 50 68 72 61 73  erator to pPhras
21860 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  e. For example,.
21870 2a 2a 20 69 66 20 70 50 68 72 61 73 65 20 72 65  ** if pPhrase re
21880 66 65 72 73 20 74 6f 20 74 68 65 20 22 64 65 66  fers to the "def
21890 20 67 68 69 22 20 70 68 72 61 73 65 2c 20 74 68   ghi" phrase, th
218a0 65 6e 20 2a 70 61 50 6f 73 6c 69 73 74 20 70 6f  en *paPoslist po
218b0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 70  ints to.** the p
218c0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 61 73 73  osition list ass
218d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 68 72  ociated with phr
218e0 61 73 65 20 22 61 62 63 22 2e 0a 2a 2a 0a 2a 2a  ase "abc"..**.**
218f0 20 41 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69   All positions i
21900 6e 20 74 68 65 20 70 50 68 72 61 73 65 20 70 6f  n the pPhrase po
21910 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74  sition list that
21920 20 61 72 65 20 6e 6f 74 20 73 75 66 66 69 63 69   are not suffici
21930 65 6e 74 6c 79 0a 2a 2a 20 63 6c 6f 73 65 20 74  ently.** close t
21940 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  o a position in 
21950 74 68 65 20 2a 70 61 50 6f 73 6c 69 73 74 20 70  the *paPoslist p
21960 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 61 72 65  osition list are
21970 20 72 65 6d 6f 76 65 64 2e 20 49 66 20 74 68 69   removed. If thi
21980 73 0a 2a 2a 20 6c 65 61 76 65 73 20 30 20 70 6f  s.** leaves 0 po
21990 73 69 74 69 6f 6e 73 2c 20 7a 65 72 6f 20 69 73  sitions, zero is
219a0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
219b0 77 69 73 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  wise, non-zero..
219c0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
219d0 75 72 6e 69 6e 67 2c 20 2a 70 61 50 6f 73 6c 69  urning, *paPosli
219e0 73 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  st is set to poi
219f0 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  nt to the positi
21a00 6f 6e 20 6c 73 69 74 20 0a 2a 2a 20 61 73 73 6f  on lsit .** asso
21a10 63 69 61 74 65 64 20 77 69 74 68 20 70 50 68 72  ciated with pPhr
21a20 61 73 65 2e 20 41 6e 64 20 2a 70 6e 54 6f 6b 65  ase. And *pnToke
21a30 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
21a40 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
21a50 20 69 6e 0a 2a 2a 20 70 50 68 72 61 73 65 2e 0a   in.** pPhrase..
21a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
21a70 73 33 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 0a  s3EvalNearTrim(.
21a80 20 20 69 6e 74 20 6e 4e 65 61 72 2c 20 20 20 20    int nNear,    
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 2f 2a 20 4e 45 41 52 20 64 69 73 74 61 6e    /* NEAR distan
21ab0 63 65 2e 20 41 73 20 69 6e 20 22 4e 45 41 52 2f  ce. As in "NEAR/
21ac0 6e 4e 65 61 72 22 2e 20 2a 2f 0a 20 20 63 68 61  nNear". */.  cha
21ad0 72 20 2a 61 54 6d 70 2c 20 20 20 20 20 20 20 20  r *aTmp,        
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21af0 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
21b00 74 6f 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  to use */.  char
21b10 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20 20 20   **paPoslist,   
21b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21b30 4e 2f 4f 55 54 3a 20 50 6f 73 69 74 69 6f 6e 20  N/OUT: Position 
21b40 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  list */.  int *p
21b50 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
21b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
21b70 4f 55 54 3a 20 54 6f 6b 65 6e 73 20 69 6e 20 70  OUT: Tokens in p
21b80 68 72 61 73 65 20 6f 66 20 2a 70 61 50 6f 73 6c  hrase of *paPosl
21b90 69 73 74 20 2a 2f 0a 20 20 46 74 73 33 50 68 72  ist */.  Fts3Phr
21ba0 61 73 65 20 2a 70 50 68 72 61 73 65 20 20 20 20  ase *pPhrase    
21bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21bc0 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 74 6f  phrase object to
21bd0 20 74 72 69 6d 20 74 68 65 20 64 6f 63 6c 69 73   trim the doclis
21be0 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  t of */.){.  int
21bf0 20 6e 50 61 72 61 6d 31 20 3d 20 6e 4e 65 61 72   nParam1 = nNear
21c00 20 2b 20 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b   + pPhrase->nTok
21c10 65 6e 3b 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d  en;.  int nParam
21c20 32 20 3d 20 6e 4e 65 61 72 20 2b 20 2a 70 6e 54  2 = nNear + *pnT
21c30 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 4e 65 77  oken;.  int nNew
21c40 3b 0a 20 20 63 68 61 72 20 2a 70 32 3b 20 0a 20  ;.  char *p2; . 
21c50 20 63 68 61 72 20 2a 70 4f 75 74 3b 20 0a 20 20   char *pOut; .  
21c60 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
21c70 72 74 28 20 70 50 68 72 61 73 65 2d 3e 64 6f 63  rt( pPhrase->doc
21c80 6c 69 73 74 2e 70 4c 69 73 74 20 29 3b 0a 0a 20  list.pList );.. 
21c90 20 70 32 20 3d 20 70 4f 75 74 20 3d 20 70 50 68   p2 = pOut = pPh
21ca0 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
21cb0 69 73 74 3b 0a 20 20 72 65 73 20 3d 20 66 74 73  ist;.  res = fts
21cc0 33 50 6f 73 6c 69 73 74 4e 65 61 72 4d 65 72 67  3PoslistNearMerg
21cd0 65 28 0a 20 20 20 20 26 70 4f 75 74 2c 20 61 54  e(.    &pOut, aT
21ce0 6d 70 2c 20 6e 50 61 72 61 6d 31 2c 20 6e 50 61  mp, nParam1, nPa
21cf0 72 61 6d 32 2c 20 70 61 50 6f 73 6c 69 73 74 2c  ram2, paPoslist,
21d00 20 26 70 32 0a 20 20 29 3b 0a 20 20 69 66 28 20   &p2.  );.  if( 
21d10 72 65 73 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20  res ){.    nNew 
21d20 3d 20 28 70 4f 75 74 20 2d 20 70 50 68 72 61 73  = (pOut - pPhras
21d30 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  e->doclist.pList
21d40 29 20 2d 20 31 3b 0a 20 20 20 20 61 73 73 65 72  ) - 1;.    asser
21d50 74 28 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  t( pPhrase->docl
21d60 69 73 74 2e 70 4c 69 73 74 5b 6e 4e 65 77 5d 3d  ist.pList[nNew]=
21d70 3d 27 5c 30 27 20 29 3b 0a 20 20 20 20 61 73 73  ='\0' );.    ass
21d80 65 72 74 28 20 6e 4e 65 77 3c 3d 70 50 68 72 61  ert( nNew<=pPhra
21d90 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73  se->doclist.nLis
21da0 74 20 26 26 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  t && nNew>0 );. 
21db0 20 20 20 6d 65 6d 73 65 74 28 26 70 50 68 72 61     memset(&pPhra
21dc0 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73  se->doclist.pLis
21dd0 74 5b 6e 4e 65 77 5d 2c 20 30 2c 20 70 50 68 72  t[nNew], 0, pPhr
21de0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69  ase->doclist.nLi
21df0 73 74 20 2d 20 6e 4e 65 77 29 3b 0a 20 20 20 20  st - nNew);.    
21e00 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
21e10 2e 6e 4c 69 73 74 20 3d 20 6e 4e 65 77 3b 0a 20  .nList = nNew;. 
21e20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20     *paPoslist = 
21e30 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
21e40 2e 70 4c 69 73 74 3b 0a 20 20 20 20 2a 70 6e 54  .pList;.    *pnT
21e50 6f 6b 65 6e 20 3d 20 70 50 68 72 61 73 65 2d 3e  oken = pPhrase->
21e60 6e 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 0a 20 20 72  nToken;.  }..  r
21e70 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
21e80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
21e90 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
21ea0 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68  *pRc is other th
21eb0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
21ec0 6e 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e 0a  n it is called..
21ed0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
21ee0 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 65 78   advances the ex
21ef0 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20  pression passed 
21f00 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
21f10 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 70 6f 69  gument to.** poi
21f20 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  nt to the next m
21f30 61 74 63 68 69 6e 67 20 72 6f 77 20 69 6e 20 74  atching row in t
21f40 68 65 20 64 61 74 61 62 61 73 65 2e 20 45 78 70  he database. Exp
21f50 72 65 73 73 69 6f 6e 73 20 69 74 65 72 61 74 65  ressions iterate
21f60 20 74 68 72 6f 75 67 68 0a 2a 2a 20 6d 61 74 63   through.** matc
21f70 68 69 6e 67 20 72 6f 77 73 20 69 6e 20 64 6f 63  hing rows in doc
21f80 69 64 20 6f 72 64 65 72 2e 20 41 73 63 65 6e 64  id order. Ascend
21f90 69 6e 67 20 6f 72 64 65 72 20 69 66 20 46 74 73  ing order if Fts
21fa0 33 43 75 72 73 6f 72 2e 62 44 65 73 63 20 69 73  3Cursor.bDesc is
21fb0 20 7a 65 72 6f 2c 0a 2a 2a 20 6f 72 20 64 65 73   zero,.** or des
21fc0 63 65 6e 64 69 6e 67 20 69 66 20 69 74 20 69 73  cending if it is
21fd0 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
21fe0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
21ff0 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74  urs, *pRc is set
22000 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72   to an SQLite er
22010 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
22020 69 73 65 2c 20 69 66 0a 2a 2a 20 73 75 63 63 65  ise, if.** succe
22030 73 73 66 75 6c 2c 20 74 68 65 20 66 6f 6c 6c 6f  ssful, the follo
22040 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 69  wing variables i
22050 6e 20 70 45 78 70 72 20 61 72 65 20 73 65 74 3a  n pExpr are set:
22060 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 33 45 78 70  .**.**   Fts3Exp
22070 72 2e 62 45 6f 66 20 20 20 20 20 20 20 20 20 20  r.bEof          
22080 20 20 20 20 20 20 28 6e 6f 6e 2d 7a 65 72 6f 20        (non-zero 
22090 69 66 20 45 4f 46 20 2d 20 74 68 65 72 65 20 69  if EOF - there i
220a0 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 29 0a 2a  s no next row).*
220b0 2a 20 20 20 46 74 73 33 45 78 70 72 2e 69 44 6f  *   Fts3Expr.iDo
220c0 63 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  cid             
220d0 20 28 76 61 6c 69 64 20 69 66 20 62 45 6f 66 3d   (valid if bEof=
220e0 3d 30 2e 20 54 68 65 20 64 6f 63 69 64 20 6f 66  =0. The docid of
220f0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 29 0a 2a   the next row).*
22100 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
22110 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 79 70  ession is of typ
22120 65 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  e FTSQUERY_PHRAS
22130 45 2c 20 61 6e 64 20 74 68 65 20 65 78 70 72 65  E, and the expre
22140 73 73 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20  ssion is not.** 
22150 61 74 20 45 4f 46 2c 20 74 68 65 6e 20 74 68 65  at EOF, then the
22160 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
22170 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c 61 74  bles are populat
22180 65 64 20 77 69 74 68 20 74 68 65 20 70 6f 73 69  ed with the posi
22190 74 69 6f 6e 20 6c 69 73 74 0a 2a 2a 20 66 6f 72  tion list.** for
221a0 20 74 68 65 20 70 68 72 61 73 65 20 66 6f 72 20   the phrase for 
221b0 74 68 65 20 76 69 73 69 74 65 64 20 72 6f 77 3a  the visited row:
221c0 0a 2a 2a 0a 2a 2a 20 20 20 46 54 73 33 45 78 70  .**.**   FTs3Exp
221d0 72 2e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  r.pPhrase->docli
221e0 73 74 2e 6e 4c 69 73 74 20 20 20 20 20 20 20 20  st.nList        
221f0 28 6c 65 6e 67 74 68 20 6f 66 20 70 4c 69 73 74  (length of pList
22200 20 69 6e 20 62 79 74 65 73 29 0a 2a 2a 20 20 20   in bytes).**   
22210 46 54 73 33 45 78 70 72 2e 70 50 68 72 61 73 65  FTs3Expr.pPhrase
22220 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20  ->doclist.pList 
22230 20 20 20 20 20 20 20 28 70 6f 69 6e 74 65 72 20         (pointer 
22240 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  to position list
22250 29 0a 2a 2a 0a 2a 2a 20 49 74 20 73 61 79 73 20  ).**.** It says 
22260 61 62 6f 76 65 20 74 68 61 74 20 74 68 69 73 20  above that this 
22270 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65  function advance
22280 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
22290 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   to the next.** 
222a0 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e 20 54 68  matching row. Th
222b0 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 72  is is usually tr
222c0 75 65 2c 20 62 75 74 20 74 68 65 72 65 20 61 72  ue, but there ar
222d0 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
222e0 65 78 63 65 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  exceptions:.**.*
222f0 2a 20 20 20 31 2e 20 44 65 66 65 72 72 65 64 20  *   1. Deferred 
22300 74 6f 6b 65 6e 73 20 61 72 65 20 6e 6f 74 20 74  tokens are not t
22310 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e  aken into accoun
22320 74 2e 20 49 66 20 61 20 70 68 72 61 73 65 20 63  t. If a phrase c
22330 6f 6e 73 69 73 74 73 0a 2a 2a 20 20 20 20 20 20  onsists.**      
22340 65 6e 74 69 72 65 6c 79 20 6f 66 20 64 65 66 65  entirely of defe
22350 72 72 65 64 20 74 6f 6b 65 6e 73 2c 20 69 74 20  rred tokens, it 
22360 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61  is assumed to ma
22370 74 63 68 20 65 76 65 72 79 20 72 6f 77 20 69 6e  tch every row in
22380 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 64 62 2e  .**      the db.
22390 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
223a0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
223b0 69 73 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 64  is not populated
223c0 20 61 74 20 61 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20   at all. .**.** 
223d0 20 20 20 20 20 4f 72 2c 20 69 66 20 61 20 70 68       Or, if a ph
223e0 72 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  rase contains on
223f0 65 20 6f 72 20 6d 6f 72 65 20 64 65 66 65 72 72  e or more deferr
22400 65 64 20 74 6f 6b 65 6e 73 20 61 6e 64 20 6f 6e  ed tokens and on
22410 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 6d 6f 72  e or.**      mor
22420 65 20 6e 6f 6e 2d 64 65 66 65 72 72 65 64 20 74  e non-deferred t
22430 6f 6b 65 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  okens, then the 
22440 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 64  expression is ad
22450 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 0a 2a  vanced to the .*
22460 2a 20 20 20 20 20 20 6e 65 78 74 20 70 6f 73 73  *      next poss
22470 69 62 6c 65 20 6d 61 74 63 68 2c 20 63 6f 6e 73  ible match, cons
22480 69 64 65 72 69 6e 67 20 6f 6e 6c 79 20 6e 6f 6e  idering only non
22490 2d 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73  -deferred tokens
224a0 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 20 20  . In other.**   
224b0 20 20 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65     words, if the
224c0 20 70 68 72 61 73 65 20 69 73 20 22 41 20 42 20   phrase is "A B 
224d0 43 22 2c 20 61 6e 64 20 22 42 22 20 69 73 20 64  C", and "B" is d
224e0 65 66 65 72 72 65 64 2c 20 74 68 65 20 65 78 70  eferred, the exp
224f0 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ression.**      
22500 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
22510 68 65 20 6e 65 78 74 20 72 6f 77 20 74 68 61 74  he next row that
22520 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73   contains an ins
22530 74 61 6e 63 65 20 6f 66 20 22 41 20 2a 20 43 22  tance of "A * C"
22540 2c 20 0a 2a 2a 20 20 20 20 20 20 77 68 65 72 65  , .**      where
22550 20 22 2a 22 20 6d 61 79 20 6d 61 74 63 68 20 61   "*" may match a
22560 6e 79 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 2e  ny single token.
22570 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   The position li
22580 73 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 0a  st in this case.
22590 2a 2a 20 20 20 20 20 20 69 73 20 70 6f 70 75 6c  **      is popul
225a0 61 74 65 64 20 61 73 20 66 6f 72 20 22 41 20 2a  ated as for "A *
225b0 20 43 22 20 62 65 66 6f 72 65 20 72 65 74 75 72   C" before retur
225c0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  ning..**.**   2.
225d0 20 4e 45 41 52 20 69 73 20 74 72 65 61 74 65 64   NEAR is treated
225e0 20 61 73 20 41 4e 44 2e 20 49 66 20 74 68 65 20   as AND. If the 
225f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78  expression is "x
22600 20 4e 45 41 52 20 79 22 2c 20 69 74 20 69 73 20   NEAR y", it is 
22610 0a 2a 2a 20 20 20 20 20 20 61 64 76 61 6e 63 65  .**      advance
22620 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
22630 65 20 6e 65 78 74 20 72 6f 77 20 74 68 61 74 20  e next row that 
22640 6d 61 74 63 68 65 73 20 22 78 20 41 4e 44 20 79  matches "x AND y
22650 22 2e 0a 2a 2a 20 0a 2a 2a 20 53 65 65 20 66 74  "..** .** See ft
22660 73 33 45 76 61 6c 54 65 73 74 44 65 66 65 72 72  s3EvalTestDeferr
22670 65 64 41 6e 64 4e 65 61 72 28 29 20 66 6f 72 20  edAndNear() for 
22680 64 65 74 61 69 6c 73 20 6f 6e 20 74 65 73 74 69  details on testi
22690 6e 67 20 69 66 20 61 20 72 6f 77 20 69 73 0a 2a  ng if a row is.*
226a0 2a 20 72 65 61 6c 6c 79 20 61 20 6d 61 74 63 68  * really a match
226b0 2c 20 74 61 6b 69 6e 67 20 69 6e 74 6f 20 61 63  , taking into ac
226c0 63 6f 75 6e 74 20 64 65 66 65 72 72 65 64 20 74  count deferred t
226d0 6f 6b 65 6e 73 20 61 6e 64 20 4e 45 41 52 20 6f  okens and NEAR o
226e0 70 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61  perators..*/.sta
226f0 74 69 63 20 76 6f 69 64 20 66 74 73 33 45 76 61  tic void fts3Eva
22700 6c 4e 65 78 74 52 6f 77 28 0a 20 20 46 74 73 33  lNextRow(.  Fts3
22710 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
22720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22730 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65  TS Cursor handle
22740 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a   */.  Fts3Expr *
22750 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
22760 20 20 20 20 20 20 2f 2a 20 45 78 70 72 2e 20 74        /* Expr. t
22770 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78  o advance to nex
22780 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 20 2a  t matching row *
22790 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  /.  int *pRc    
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
227c0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a  rror code */.){.
227d0 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
227e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
227f0 20 62 44 65 73 63 44 6f 63 6c 69 73 74 20 3d 20   bDescDoclist = 
22800 70 43 73 72 2d 3e 62 44 65 73 63 3b 20 20 20 20  pCsr->bDesc;    
22810 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
22820 44 4f 43 49 44 5f 43 4d 50 28 29 20 6d 61 63 72  DOCID_CMP() macr
22830 6f 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  o */.    assert(
22840 20 70 45 78 70 72 2d 3e 62 45 6f 66 3d 3d 30 20   pExpr->bEof==0 
22850 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 62 53  );.    pExpr->bS
22860 74 61 72 74 20 3d 20 31 3b 0a 0a 20 20 20 20 73  tart = 1;..    s
22870 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54  witch( pExpr->eT
22880 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
22890 65 20 46 54 53 51 55 45 52 59 5f 4e 45 41 52 3a  e FTSQUERY_NEAR:
228a0 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53 51  .      case FTSQ
228b0 55 45 52 59 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  UERY_AND: {.    
228c0 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 4c      Fts3Expr *pL
228d0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
228e0 66 74 3b 0a 20 20 20 20 20 20 20 20 46 74 73 33  ft;.        Fts3
228f0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
22900 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
22910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
22920 4c 65 66 74 2d 3e 62 44 65 66 65 72 72 65 64 20  Left->bDeferred 
22930 7c 7c 20 21 70 52 69 67 68 74 2d 3e 62 44 65 66  || !pRight->bDef
22940 65 72 72 65 64 20 29 3b 0a 0a 20 20 20 20 20 20  erred );..      
22950 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 62 44 65    if( pLeft->bDe
22960 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20 20 20  ferred ){.      
22970 20 20 20 20 2f 2a 20 4c 48 53 20 69 73 20 65 6e      /* LHS is en
22980 74 69 72 65 6c 79 20 64 65 66 65 72 72 65 64 2e  tirely deferred.
22990 20 53 6f 20 77 65 20 61 73 73 75 6d 65 20 69 74   So we assume it
229a0 20 6d 61 74 63 68 65 73 20 65 76 65 72 79 20 72   matches every r
229b0 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ow..          **
229c0 20 41 64 76 61 6e 63 65 20 74 68 65 20 52 48 53   Advance the RHS
229d0 20 69 74 65 72 61 74 6f 72 20 74 6f 20 66 69 6e   iterator to fin
229e0 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 76  d the next row v
229f0 69 73 69 74 65 64 2e 20 2a 2f 0a 20 20 20 20 20  isited. */.     
22a00 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78       fts3EvalNex
22a10 74 52 6f 77 28 70 43 73 72 2c 20 70 52 69 67 68  tRow(pCsr, pRigh
22a20 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20  t, pRc);.       
22a30 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69 64     pExpr->iDocid
22a40 20 3d 20 70 52 69 67 68 74 2d 3e 69 44 6f 63 69   = pRight->iDoci
22a50 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  d;.          pEx
22a60 70 72 2d 3e 62 45 6f 66 20 3d 20 70 52 69 67 68  pr->bEof = pRigh
22a70 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 20 20 20  t->bEof;.       
22a80 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
22a90 74 2d 3e 62 44 65 66 65 72 72 65 64 20 29 7b 0a  t->bDeferred ){.
22aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
22ab0 20 69 73 20 65 6e 74 69 72 65 6c 79 20 64 65 66   is entirely def
22ac0 65 72 72 65 64 2e 20 53 6f 20 77 65 20 61 73 73  erred. So we ass
22ad0 75 6d 65 20 69 74 20 6d 61 74 63 68 65 73 20 65  ume it matches e
22ae0 76 65 72 79 20 72 6f 77 2e 0a 20 20 20 20 20 20  very row..      
22af0 20 20 20 20 2a 2a 20 41 64 76 61 6e 63 65 20 74      ** Advance t
22b00 68 65 20 4c 48 53 20 69 74 65 72 61 74 6f 72 20  he LHS iterator 
22b10 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
22b20 20 72 6f 77 20 76 69 73 69 74 65 64 2e 20 2a 2f   row visited. */
22b30 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45  .          fts3E
22b40 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c  valNextRow(pCsr,
22b50 20 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20   pLeft, pRc);.  
22b60 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
22b70 44 6f 63 69 64 20 3d 20 70 4c 65 66 74 2d 3e 69  Docid = pLeft->i
22b80 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
22b90 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 70   pExpr->bEof = p
22ba0 4c 65 66 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20  Left->bEof;.    
22bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22bc0 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20       /* Neither 
22bd0 74 68 65 20 52 48 53 20 6f 72 20 4c 48 53 20 61  the RHS or LHS a
22be0 72 65 20 64 65 66 65 72 72 65 64 2e 20 2a 2f 0a  re deferred. */.
22bf0 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76            fts3Ev
22c00 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
22c10 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20  pLeft, pRc);.   
22c20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e         fts3EvalN
22c30 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52 69  extRow(pCsr, pRi
22c40 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20  ght, pRc);.     
22c50 20 20 20 20 20 77 68 69 6c 65 28 20 21 70 4c 65       while( !pLe
22c60 66 74 2d 3e 62 45 6f 66 20 26 26 20 21 70 52 69  ft->bEof && !pRi
22c70 67 68 74 2d 3e 62 45 6f 66 20 26 26 20 2a 70 52  ght->bEof && *pR
22c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22c90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22ca0 74 65 33 5f 69 6e 74 36 34 20 69 44 69 66 66 20  te3_int64 iDiff 
22cb0 3d 20 44 4f 43 49 44 5f 43 4d 50 28 70 4c 65 66  = DOCID_CMP(pLef
22cc0 74 2d 3e 69 44 6f 63 69 64 2c 20 70 52 69 67 68  t->iDocid, pRigh
22cd0 74 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  t->iDocid);.    
22ce0 20 20 20 20 20 20 20 20 69 66 28 20 69 44 69 66          if( iDif
22cf0 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  f==0 ) break;.  
22d00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
22d10 69 66 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  iff<0 ){.       
22d20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e         fts3EvalN
22d30 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 4c 65  extRow(pCsr, pLe
22d40 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20  ft, pRc);.      
22d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22d60 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45             fts3E
22d70 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c  valNextRow(pCsr,
22d80 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20   pRight, pRc);. 
22d90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22da0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22db0 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69 64     pExpr->iDocid
22dc0 20 3d 20 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64   = pLeft->iDocid
22dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
22de0 72 2d 3e 62 45 6f 66 20 3d 20 28 70 4c 65 66 74  r->bEof = (pLeft
22df0 2d 3e 62 45 6f 66 20 7c 7c 20 70 52 69 67 68 74  ->bEof || pRight
22e00 2d 3e 62 45 6f 66 29 3b 0a 20 20 20 20 20 20 20  ->bEof);.       
22e10 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
22e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
22e30 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52 59     case FTSQUERY
22e40 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 46  _OR: {.        F
22e50 74 73 33 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  ts3Expr *pLeft =
22e60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
22e70 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20         Fts3Expr 
22e80 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
22e90 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
22ea0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
22eb0 43 6d 70 20 3d 20 44 4f 43 49 44 5f 43 4d 50 28  Cmp = DOCID_CMP(
22ec0 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 2c 20 70  pLeft->iDocid, p
22ed0 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 29 3b 0a  Right->iDocid);.
22ee0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
22ef0 20 70 4c 65 66 74 2d 3e 62 53 74 61 72 74 20 7c   pLeft->bStart |
22f00 7c 20 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3d  | pLeft->iDocid=
22f10 3d 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 20  =pRight->iDocid 
22f20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
22f30 74 28 20 70 52 69 67 68 74 2d 3e 62 53 74 61 72  t( pRight->bStar
22f40 74 20 7c 7c 20 70 4c 65 66 74 2d 3e 69 44 6f 63  t || pLeft->iDoc
22f50 69 64 3d 3d 70 52 69 67 68 74 2d 3e 69 44 6f 63  id==pRight->iDoc
22f60 69 64 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  id );..        i
22f70 66 28 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 20  f( pRight->bEof 
22f80 7c 7c 20 28 70 4c 65 66 74 2d 3e 62 45 6f 66 3d  || (pLeft->bEof=
22f90 3d 30 20 26 26 20 69 43 6d 70 3c 30 29 20 29 7b  =0 && iCmp<0) ){
22fa0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45  .          fts3E
22fb0 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c  valNextRow(pCsr,
22fc0 20 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20   pLeft, pRc);.  
22fd0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22fe0 70 4c 65 66 74 2d 3e 62 45 6f 66 20 7c 7c 20 28  pLeft->bEof || (
22ff0 70 52 69 67 68 74 2d 3e 62 45 6f 66 3d 3d 30 20  pRight->bEof==0 
23000 26 26 20 69 43 6d 70 3e 30 29 20 29 7b 0a 20 20  && iCmp>0) ){.  
23010 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
23020 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52  NextRow(pCsr, pR
23030 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  ight, pRc);.    
23040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23050 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78       fts3EvalNex
23060 74 52 6f 77 28 70 43 73 72 2c 20 70 4c 65 66 74  tRow(pCsr, pLeft
23070 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20  , pRc);.        
23080 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f    fts3EvalNextRo
23090 77 28 70 43 73 72 2c 20 70 52 69 67 68 74 2c 20  w(pCsr, pRight, 
230a0 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pRc);.        }.
230b0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
230c0 62 45 6f 66 20 3d 20 28 70 4c 65 66 74 2d 3e 62  bEof = (pLeft->b
230d0 45 6f 66 20 26 26 20 70 52 69 67 68 74 2d 3e 62  Eof && pRight->b
230e0 45 6f 66 29 3b 0a 20 20 20 20 20 20 20 20 69 43  Eof);.        iC
230f0 6d 70 20 3d 20 44 4f 43 49 44 5f 43 4d 50 28 70  mp = DOCID_CMP(p
23100 4c 65 66 74 2d 3e 69 44 6f 63 69 64 2c 20 70 52  Left->iDocid, pR
23110 69 67 68 74 2d 3e 69 44 6f 63 69 64 29 3b 0a 20  ight->iDocid);. 
23120 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
23130 74 2d 3e 62 45 6f 66 20 7c 7c 20 28 70 4c 65 66  t->bEof || (pLef
23140 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 20 69  t->bEof==0 &&  i
23150 43 6d 70 3c 30 29 20 29 7b 0a 20 20 20 20 20 20  Cmp<0) ){.      
23160 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69      pExpr->iDoci
23170 64 20 3d 20 70 4c 65 66 74 2d 3e 69 44 6f 63 69  d = pLeft->iDoci
23180 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
23190 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
231a0 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70 52 69 67  r->iDocid = pRig
231b0 68 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20  ht->iDocid;.    
231c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 62      }..        b
231d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
231e0 20 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45       case FTSQUE
231f0 52 59 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  RY_NOT: {.      
23200 20 20 46 74 73 33 45 78 70 72 20 2a 70 4c 65 66    Fts3Expr *pLef
23210 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
23220 3b 0a 20 20 20 20 20 20 20 20 46 74 73 33 45 78  ;.        Fts3Ex
23230 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
23240 70 72 2d 3e 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr->pRight;..   
23250 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
23260 3e 62 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20  >bStart==0 ){.  
23270 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
23280 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52  NextRow(pCsr, pR
23290 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  ight, pRc);.    
232a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
232b0 52 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  Rc!=SQLITE_OK ||
232c0 20 70 52 69 67 68 74 2d 3e 62 53 74 61 72 74 20   pRight->bStart 
232d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
232e0 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65        fts3EvalNe
232f0 78 74 52 6f 77 28 70 43 73 72 2c 20 70 4c 65 66  xtRow(pCsr, pLef
23300 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20  t, pRc);.       
23310 20 69 66 28 20 70 4c 65 66 74 2d 3e 62 45 6f 66   if( pLeft->bEof
23320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23330 20 77 68 69 6c 65 28 20 21 2a 70 52 63 20 0a 20   while( !*pRc . 
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
23350 21 70 52 69 67 68 74 2d 3e 62 45 6f 66 20 0a 20  !pRight->bEof . 
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
23370 44 4f 43 49 44 5f 43 4d 50 28 70 4c 65 66 74 2d  DOCID_CMP(pLeft-
23380 3e 69 44 6f 63 69 64 2c 20 70 52 69 67 68 74 2d  >iDocid, pRight-
23390 3e 69 44 6f 63 69 64 29 3e 30 20 0a 20 20 20 20  >iDocid)>0 .    
233a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
233b0 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78       fts3EvalNex
233c0 74 52 6f 77 28 70 43 73 72 2c 20 70 52 69 67 68  tRow(pCsr, pRigh
233d0 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20  t, pRc);.       
233e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
233f0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
23400 6f 63 69 64 20 3d 20 70 4c 65 66 74 2d 3e 69 44  ocid = pLeft->iD
23410 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 70 45  ocid;.        pE
23420 78 70 72 2d 3e 62 45 6f 66 20 3d 20 70 4c 65 66  xpr->bEof = pLef
23430 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 20 20 20  t->bEof;.       
23440 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
23450 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
23460 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 50 68  {.        Fts3Ph
23470 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20  rase *pPhrase = 
23480 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a  pExpr->pPhrase;.
23490 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
234a0 49 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c 69 73  InvalidatePoslis
234b0 74 28 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20  t(pPhrase);.    
234c0 20 20 20 20 2a 70 52 63 20 3d 20 66 74 73 33 45      *pRc = fts3E
234d0 76 61 6c 50 68 72 61 73 65 4e 65 78 74 28 70 43  valPhraseNext(pC
234e0 73 72 2c 20 70 50 68 72 61 73 65 2c 20 26 70 45  sr, pPhrase, &pE
234f0 78 70 72 2d 3e 62 45 6f 66 29 3b 0a 20 20 20 20  xpr->bEof);.    
23500 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69      pExpr->iDoci
23510 64 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63  d = pPhrase->doc
23520 6c 69 73 74 2e 69 44 6f 63 69 64 3b 0a 20 20 20  list.iDocid;.   
23530 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23540 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
23550 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  ./*.** If *pRc i
23560 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
23570 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73 20   or if pExpr is 
23580 6e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  not the root nod
23590 65 20 6f 66 20 61 20 4e 45 41 52 0a 2a 2a 20 63  e of a NEAR.** c
235a0 6c 75 73 74 65 72 2c 20 74 68 65 6e 20 74 68 69  luster, then thi
235b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
235c0 6e 73 20 31 20 69 6d 6d 65 64 69 61 74 65 6c 79  ns 1 immediately
235d0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
235e0 65 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 20  e, it checks if 
235f0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
23600 72 65 61 6c 6c 79 20 64 6f 65 73 20 6d 61 74 63  really does matc
23610 68 20 74 68 65 20 4e 45 41 52 20 0a 2a 2a 20 65  h the NEAR .** e
23620 78 70 72 65 73 73 69 6f 6e 2c 20 75 73 69 6e 67  xpression, using
23630 20 74 68 65 20 64 61 74 61 20 63 75 72 72 65 6e   the data curren
23640 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  tly stored in th
23650 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  e position lists
23660 20 0a 2a 2a 20 28 46 74 73 33 45 78 70 72 2d 3e   .** (Fts3Expr->
23670 70 50 68 72 61 73 65 2e 64 6f 63 6c 69 73 74 2e  pPhrase.doclist.
23680 70 4c 69 73 74 2f 6e 4c 69 73 74 29 20 66 6f 72  pList/nList) for
23690 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e 20   each phrase in 
236a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
236b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
236c0 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 20 6d  rrent row is a m
236d0 61 74 63 68 2c 20 74 68 65 20 70 6f 73 69 74 69  atch, the positi
236e0 6f 6e 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74  on list associat
236f0 65 64 20 77 69 74 68 20 65 61 63 68 0a 2a 2a 20  ed with each.** 
23700 70 68 72 61 73 65 20 69 6e 20 74 68 65 20 4e 45  phrase in the NE
23710 41 52 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  AR expression is
23720 20 65 64 69 74 65 64 20 69 6e 20 70 6c 61 63 65   edited in place
23730 20 74 6f 20 63 6f 6e 74 61 69 6e 20 6f 6e 6c 79   to contain only
23740 20 74 68 6f 73 65 0a 2a 2a 20 70 68 72 61 73 65   those.** phrase
23750 20 69 6e 73 74 61 6e 63 65 73 20 73 75 66 66 69   instances suffi
23760 63 69 65 6e 74 6c 79 20 63 6c 6f 73 65 20 74 6f  ciently close to
23770 20 74 68 65 69 72 20 70 65 65 72 73 20 74 6f 20   their peers to 
23780 73 61 74 69 73 66 79 20 61 6c 6c 20 4e 45 41 52  satisfy all NEAR
23790 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  .** constraints.
237a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
237b0 20 72 65 74 75 72 6e 73 20 31 2e 20 49 66 20 74   returns 1. If t
237c0 68 65 20 4e 45 41 52 20 65 78 70 72 65 73 73 69  he NEAR expressi
237d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 0a 2a 2a 20  on does not .** 
237e0 6d 61 74 63 68 20 74 68 65 20 63 75 72 72 65 6e  match the curren
237f0 74 20 72 6f 77 2c 20 30 20 69 73 20 72 65 74 75  t row, 0 is retu
23800 72 6e 65 64 2e 20 54 68 65 20 70 6f 73 69 74 69  rned. The positi
23810 6f 6e 20 6c 69 73 74 73 20 6d 61 79 20 6f 72 20  on lists may or 
23820 6d 61 79 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 64  may not.** be ed
23830 69 74 65 64 20 69 66 20 30 20 69 73 20 72 65 74  ited if 0 is ret
23840 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
23850 20 69 6e 74 20 66 74 73 33 45 76 61 6c 4e 65 61   int fts3EvalNea
23860 72 54 65 73 74 28 46 74 73 33 45 78 70 72 20 2a  rTest(Fts3Expr *
23870 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 63 29  pExpr, int *pRc)
23880 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  {.  int res = 1;
23890 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
238a0 77 69 6e 67 20 62 6c 6f 63 6b 20 72 75 6e 73 20  wing block runs 
238b0 69 66 20 70 45 78 70 72 20 69 73 20 74 68 65 20  if pExpr is the 
238c0 72 6f 6f 74 20 6f 66 20 61 20 4e 45 41 52 20 71  root of a NEAR q
238d0 75 65 72 79 2e 0a 20 20 2a 2a 20 46 6f 72 20 65  uery..  ** For e
238e0 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72  xample, the quer
238f0 79 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  y:.  **.  **    
23900 20 20 20 20 20 22 77 22 20 4e 45 41 52 20 22 78       "w" NEAR "x
23910 22 20 4e 45 41 52 20 22 79 22 20 4e 45 41 52 20  " NEAR "y" NEAR 
23920 22 7a 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68  "z".  **.  ** wh
23930 69 63 68 20 69 73 20 72 65 70 72 65 73 65 6e 74  ich is represent
23940 65 64 20 69 6e 20 74 72 65 65 20 66 6f 72 6d 20  ed in tree form 
23950 61 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  as:.  **.  **   
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 20 20              |.  
23980 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23990 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 4e              +--N
239a0 45 41 52 2d 2d 2b 20 20 20 20 20 20 3c 2d 2d 20  EAR--+      <-- 
239b0 72 6f 6f 74 20 6f 66 20 4e 45 41 52 20 71 75 65  root of NEAR que
239c0 72 79 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  ry.  **         
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 7c 20 20 20 20 20 20 20 20 7c 0a 20 20 2a 2a   |        |.  **
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a00 20 20 20 20 20 2b 2d 2d 4e 45 41 52 2d 2d 2b 20       +--NEAR--+ 
23a10 20 20 22 7a 22 0a 20 20 2a 2a 20 20 20 20 20 20    "z".  **      
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
23a30 20 20 20 20 20 20 20 20 7c 0a 20 20 2a 2a 20 20          |.  **  
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d                +-
23a50 2d 4e 45 41 52 2d 2d 2b 20 20 20 22 79 22 0a 20  -NEAR--+   "y". 
23a60 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
23a70 20 20 20 7c 20 20 20 20 20 20 20 20 7c 0a 20 20     |        |.  
23a80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23a90 20 22 77 22 20 20 20 20 20 20 22 78 22 0a 20 20   "w"      "x".  
23aa0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 69 67 68  **.  ** The righ
23ab0 74 2d 68 61 6e 64 20 63 68 69 6c 64 20 6f 66 20  t-hand child of 
23ac0 61 20 4e 45 41 52 20 6e 6f 64 65 20 69 73 20 61  a NEAR node is a
23ad0 6c 77 61 79 73 20 61 20 70 68 72 61 73 65 2e 20  lways a phrase. 
23ae0 54 68 65 20 0a 20 20 2a 2a 20 6c 65 66 74 2d 68  The .  ** left-h
23af0 61 6e 64 20 63 68 69 6c 64 20 6d 61 79 20 62 65  and child may be
23b00 20 65 69 74 68 65 72 20 61 20 70 68 72 61 73 65   either a phrase
23b10 20 6f 72 20 61 20 4e 45 41 52 20 6e 6f 64 65 2e   or a NEAR node.
23b20 20 54 68 65 72 65 20 61 72 65 0a 20 20 2a 2a 20   There are.  ** 
23b30 6e 6f 20 65 78 63 65 70 74 69 6f 6e 73 20 74 6f  no exceptions to
23b40 20 74 68 69 73 20 2d 20 69 74 27 73 20 74 68 65   this - it's the
23b50 20 77 61 79 20 74 68 65 20 70 61 72 73 65 72 20   way the parser 
23b60 69 6e 20 66 74 73 33 5f 65 78 70 72 2e 63 20 77  in fts3_expr.c w
23b70 6f 72 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  orks..  */.  if(
23b80 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
23b90 20 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 65   .   && pExpr->e
23ba0 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e  Type==FTSQUERY_N
23bb0 45 41 52 20 0a 20 20 20 26 26 20 70 45 78 70 72  EAR .   && pExpr
23bc0 2d 3e 62 45 6f 66 3d 3d 30 0a 20 20 20 26 26 20  ->bEof==0.   && 
23bd0 28 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 3d  (pExpr->pParent=
23be0 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 50 61  =0 || pExpr->pPa
23bf0 72 65 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53  rent->eType!=FTS
23c00 51 55 45 52 59 5f 4e 45 41 52 29 0a 20 20 29 7b  QUERY_NEAR).  ){
23c10 0a 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70  .    Fts3Expr *p
23c20 3b 20 0a 20 20 20 20 69 6e 74 20 6e 54 6d 70 20  ; .    int nTmp 
23c30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23c40 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
23c50 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20   temp space */. 
23c60 20 20 20 63 68 61 72 20 2a 61 54 6d 70 3b 20 20     char *aTmp;  
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c80 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
23c90 6f 72 20 50 6f 73 6c 69 73 74 4e 65 61 72 4d 65  or PoslistNearMe
23ca0 72 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a  rge() */..    /*
23cb0 20 41 6c 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72   Allocate tempor
23cc0 61 72 79 20 77 6f 72 6b 69 6e 67 20 73 70 61 63  ary working spac
23cd0 65 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d  e. */.    for(p=
23ce0 70 45 78 70 72 3b 20 70 2d 3e 70 4c 65 66 74 3b  pExpr; p->pLeft;
23cf0 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20 20   p=p->pLeft){.  
23d00 20 20 20 20 6e 54 6d 70 20 2b 3d 20 70 2d 3e 70      nTmp += p->p
23d10 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e  Right->pPhrase->
23d20 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 3b 0a 20  doclist.nList;. 
23d30 20 20 20 7d 0a 20 20 20 20 6e 54 6d 70 20 2b 3d     }.    nTmp +=
23d40 20 70 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63   p->pPhrase->doc
23d50 6c 69 73 74 2e 6e 4c 69 73 74 3b 0a 20 20 20 20  list.nList;.    
23d60 61 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTmp = sqlite3_m
23d70 61 6c 6c 6f 63 28 6e 54 6d 70 2a 32 29 3b 0a 20  alloc(nTmp*2);. 
23d80 20 20 20 69 66 28 20 21 61 54 6d 70 20 29 7b 0a     if( !aTmp ){.
23d90 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
23da0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
23db0 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 65   res = 0;.    }e
23dc0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
23dd0 2a 61 50 6f 73 6c 69 73 74 20 3d 20 70 2d 3e 70  *aPoslist = p->p
23de0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
23df0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
23e00 20 6e 54 6f 6b 65 6e 20 3d 20 70 2d 3e 70 50 68   nToken = p->pPh
23e10 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 0a 20  rase->nToken;.. 
23e20 20 20 20 20 20 66 6f 72 28 70 3d 70 2d 3e 70 50       for(p=p->pP
23e30 61 72 65 6e 74 3b 72 65 73 20 26 26 20 70 20 26  arent;res && p &
23e40 26 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  & p->eType==FTSQ
23e50 55 45 52 59 5f 4e 45 41 52 3b 20 70 3d 70 2d 3e  UERY_NEAR; p=p->
23e60 70 50 61 72 65 6e 74 29 7b 0a 20 20 20 20 20 20  pParent){.      
23e70 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50    Fts3Phrase *pP
23e80 68 72 61 73 65 20 3d 20 70 2d 3e 70 52 69 67 68  hrase = p->pRigh
23e90 74 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 20 20  t->pPhrase;.    
23ea0 20 20 20 20 69 6e 74 20 6e 4e 65 61 72 20 3d 20      int nNear = 
23eb0 70 2d 3e 6e 4e 65 61 72 3b 0a 20 20 20 20 20 20  p->nNear;.      
23ec0 20 20 72 65 73 20 3d 20 66 74 73 33 45 76 61 6c    res = fts3Eval
23ed0 4e 65 61 72 54 72 69 6d 28 6e 4e 65 61 72 2c 20  NearTrim(nNear, 
23ee0 61 54 6d 70 2c 20 26 61 50 6f 73 6c 69 73 74 2c  aTmp, &aPoslist,
23ef0 20 26 6e 54 6f 6b 65 6e 2c 20 70 50 68 72 61 73   &nToken, pPhras
23f00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  e);.      }.  . 
23f10 20 20 20 20 20 61 50 6f 73 6c 69 73 74 20 3d 20       aPoslist = 
23f20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70  pExpr->pRight->p
23f30 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
23f40 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e 54 6f  pList;.      nTo
23f50 6b 65 6e 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ken = pExpr->pRi
23f60 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54  ght->pPhrase->nT
23f70 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  oken;.      for(
23f80 70 3d 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  p=pExpr->pLeft; 
23f90 70 20 26 26 20 72 65 73 3b 20 70 3d 70 2d 3e 70  p && res; p=p->p
23fa0 4c 65 66 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Left){.        i
23fb0 6e 74 20 6e 4e 65 61 72 20 3d 20 70 2d 3e 70 50  nt nNear = p->pP
23fc0 61 72 65 6e 74 2d 3e 6e 4e 65 61 72 3b 0a 20 20  arent->nNear;.  
23fd0 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65        Fts3Phrase
23fe0 20 2a 70 50 68 72 61 73 65 20 3d 20 28 0a 20 20   *pPhrase = (.  
23ff0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 54 79            p->eTy
24000 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
24010 52 20 3f 20 70 2d 3e 70 52 69 67 68 74 2d 3e 70  R ? p->pRight->p
24020 50 68 72 61 73 65 20 3a 20 70 2d 3e 70 50 68 72  Phrase : p->pPhr
24030 61 73 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ase.        );. 
24040 20 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73         res = fts
24050 33 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 6e 4e  3EvalNearTrim(nN
24060 65 61 72 2c 20 61 54 6d 70 2c 20 26 61 50 6f 73  ear, aTmp, &aPos
24070 6c 69 73 74 2c 20 26 6e 54 6f 6b 65 6e 2c 20 70  list, &nToken, p
24080 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  Phrase);.      }
24090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
240a0 74 65 33 5f 66 72 65 65 28 61 54 6d 70 29 3b 0a  te3_free(aTmp);.
240b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
240c0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
240d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 68   function is a h
240e0 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
240f0 6f 72 20 66 74 73 33 45 76 61 6c 54 65 73 74 44  or fts3EvalTestD
24100 65 66 65 72 72 65 64 41 6e 64 4e 65 61 72 28 29  eferredAndNear()
24110 2e 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f  ..** Assuming no
24120 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 6f 72   error occurs or
24130 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 49   has occurred, I
24140 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  t returns non-ze
24150 72 6f 20 69 66 20 74 68 65 0a 2a 2a 20 65 78 70  ro if the.** exp
24160 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
24170 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24180 75 6d 65 6e 74 20 6d 61 74 63 68 65 73 20 74 68  ument matches th
24190 65 20 72 6f 77 20 74 68 61 74 20 70 43 73 72 20  e row that pCsr 
241a0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
241b0 69 6e 74 73 20 74 6f 2c 20 6f 72 20 7a 65 72 6f  ints to, or zero
241c0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
241d0 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  .**.** If *pRc i
241e0 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
241f0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
24200 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
24210 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
24220 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24230 72 73 20 64 75 72 69 6e 67 20 65 78 65 63 75 74  rs during execut
24240 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ion of this func
24250 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73 65  tion, *pRc is se
24260 74 20 74 6f 20 0a 2a 2a 20 74 68 65 20 61 70 70  t to .** the app
24270 72 6f 70 72 69 61 74 65 20 53 51 4c 69 74 65 20  ropriate SQLite 
24280 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74  error code. In t
24290 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 74  his case the ret
242a0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 0a  urned value is .
242b0 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ** undefined..*/
242c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
242d0 45 76 61 6c 54 65 73 74 45 78 70 72 28 0a 20 20  EvalTestExpr(.  
242e0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
242f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24300 2f 2a 20 46 54 53 20 63 75 72 73 6f 72 20 68 61  /* FTS cursor ha
24310 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  ndle */.  Fts3Ex
24320 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
24330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
24340 72 20 74 6f 20 74 65 73 74 2e 20 4d 61 79 20 6f  r to test. May o
24350 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 72 6f 6f  r may not be roo
24360 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  t. */.  int *pRc
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
24390 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
243a0 0a 29 7b 0a 20 20 69 6e 74 20 62 48 69 74 20 3d  .){.  int bHit =
243b0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
243c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
243d0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 2a  value */.  if( *
243e0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
243f0 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 45  {.    switch( pE
24400 78 70 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  xpr->eType ){.  
24410 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52      case FTSQUER
24420 59 5f 4e 45 41 52 3a 0a 20 20 20 20 20 20 63 61  Y_NEAR:.      ca
24430 73 65 20 46 54 53 51 55 45 52 59 5f 41 4e 44 3a  se FTSQUERY_AND:
24440 0a 20 20 20 20 20 20 20 20 62 48 69 74 20 3d 20  .        bHit = 
24450 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  (.            ft
24460 73 33 45 76 61 6c 54 65 73 74 45 78 70 72 28 70  s3EvalTestExpr(p
24470 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Csr, pExpr->pLef
24480 74 2c 20 70 52 63 29 0a 20 20 20 20 20 20 20 20  t, pRc).        
24490 20 26 26 20 66 74 73 33 45 76 61 6c 54 65 73 74   && fts3EvalTest
244a0 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70 72  Expr(pCsr, pExpr
244b0 2d 3e 70 52 69 67 68 74 2c 20 70 52 63 29 0a 20  ->pRight, pRc). 
244c0 20 20 20 20 20 20 20 20 26 26 20 66 74 73 33 45          && fts3E
244d0 76 61 6c 4e 65 61 72 54 65 73 74 28 70 45 78 70  valNearTest(pExp
244e0 72 2c 20 70 52 63 29 0a 20 20 20 20 20 20 20 20  r, pRc).        
244f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  );..        /* I
24500 66 20 74 68 65 20 4e 45 41 52 20 65 78 70 72 65  f the NEAR expre
24510 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d  ssion does not m
24520 61 74 63 68 20 61 6e 79 20 72 6f 77 73 2c 20 7a  atch any rows, z
24530 65 72 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ero the doclist 
24540 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
24550 61 6c 6c 20 70 68 72 61 73 65 73 20 69 6e 76 6f  all phrases invo
24560 6c 76 65 64 20 69 6e 20 74 68 65 20 4e 45 41 52  lved in the NEAR
24570 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
24580 65 20 74 68 65 20 73 6e 69 70 70 65 74 28 29 2c  e the snippet(),
24590 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 66 73  .        ** offs
245a0 65 74 73 28 29 20 61 6e 64 20 6d 61 74 63 68 69  ets() and matchi
245b0 6e 66 6f 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  nfo() functions 
245c0 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 73 65 64  are not supposed
245d0 20 74 6f 20 72 65 63 6f 67 6e 69 7a 65 20 0a 20   to recognize . 
245e0 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 69 6e         ** any in
245f0 73 74 61 6e 63 65 73 20 6f 66 20 70 68 72 61 73  stances of phras
24600 65 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74  es that are part
24610 20 6f 66 20 75 6e 6d 61 74 63 68 65 64 20 4e 45   of unmatched NE
24620 41 52 20 71 75 65 72 69 65 73 2e 20 0a 20 20 20  AR queries. .   
24630 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d       ** For exam
24640 70 6c 65 20 69 66 20 74 68 69 73 20 65 78 70 72  ple if this expr
24650 65 73 73 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  ession:.        
24660 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
24670 20 2e 2e 2e 20 4d 41 54 43 48 20 27 61 20 4f 52   ... MATCH 'a OR
24680 20 28 62 20 4e 45 41 52 20 63 29 27 0a 20 20 20   (b NEAR c)'.   
24690 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
246a0 2a 2a 20 69 73 20 6d 61 74 63 68 65 64 20 61 67  ** is matched ag
246b0 61 69 6e 73 74 20 61 20 72 6f 77 20 63 6f 6e 74  ainst a row cont
246c0 61 69 6e 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  aining:.        
246d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
246e0 20 20 20 20 20 27 61 20 62 20 64 20 65 27 0a 20       'a b d e'. 
246f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
24700 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 73 6e    ** then any sn
24710 69 70 70 65 74 28 29 20 73 68 6f 75 6c 64 20 6f  ippet() should o
24720 6e 79 20 68 69 67 68 6c 69 67 68 74 20 74 68 65  ny highlight the
24730 20 22 61 22 20 74 65 72 6d 2c 20 6e 6f 74 20 74   "a" term, not t
24740 68 65 20 22 62 22 0a 20 20 20 20 20 20 20 20 2a  he "b".        *
24750 2a 20 28 61 73 20 22 62 22 20 69 73 20 70 61 72  * (as "b" is par
24760 74 20 6f 66 20 61 20 6e 6f 6e 2d 6d 61 74 63 68  t of a non-match
24770 69 6e 67 20 4e 45 41 52 20 63 6c 61 75 73 65 29  ing NEAR clause)
24780 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24790 20 20 20 20 20 69 66 28 20 62 48 69 74 3d 3d 30       if( bHit==0
247a0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45   .         && pE
247b0 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  xpr->eType==FTSQ
247c0 55 45 52 59 5f 4e 45 41 52 20 0a 20 20 20 20 20  UERY_NEAR .     
247d0 20 20 20 20 26 26 20 28 70 45 78 70 72 2d 3e 70      && (pExpr->p
247e0 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 45 78  Parent==0 || pEx
247f0 70 72 2d 3e 70 50 61 72 65 6e 74 2d 3e 65 54 79  pr->pParent->eTy
24800 70 65 21 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe!=FTSQUERY_NEA
24810 52 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  R).        ){.  
24820 20 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72          Fts3Expr
24830 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 66   *p;.          f
24840 6f 72 28 70 3d 70 45 78 70 72 3b 20 70 2d 3e 70  or(p=pExpr; p->p
24850 50 68 72 61 73 65 3d 3d 30 3b 20 70 3d 70 2d 3e  Phrase==0; p=p->
24860 70 4c 65 66 74 29 7b 0a 20 20 20 20 20 20 20 20  pLeft){.        
24870 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
24880 74 2d 3e 69 44 6f 63 69 64 3d 3d 70 43 73 72 2d  t->iDocid==pCsr-
24890 3e 69 50 72 65 76 49 64 20 29 7b 0a 20 20 20 20  >iPrevId ){.    
248a0 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76            fts3Ev
248b0 61 6c 49 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c  alInvalidatePosl
248c0 69 73 74 28 70 2d 3e 70 52 69 67 68 74 2d 3e 70  ist(p->pRight->p
248d0 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20  Phrase);.       
248e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
248f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
24900 20 70 2d 3e 69 44 6f 63 69 64 3d 3d 70 43 73 72   p->iDocid==pCsr
24910 2d 3e 69 50 72 65 76 49 64 20 29 7b 0a 20 20 20  ->iPrevId ){.   
24920 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61           fts3Eva
24930 6c 49 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c 69  lInvalidatePosli
24940 73 74 28 70 2d 3e 70 50 68 72 61 73 65 29 3b 0a  st(p->pPhrase);.
24950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24960 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 62      }..        b
24970 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
24980 65 20 46 54 53 51 55 45 52 59 5f 4f 52 3a 20 7b  e FTSQUERY_OR: {
24990 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 48 69  .        int bHi
249a0 74 31 20 3d 20 66 74 73 33 45 76 61 6c 54 65 73  t1 = fts3EvalTes
249b0 74 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70  tExpr(pCsr, pExp
249c0 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a  r->pLeft, pRc);.
249d0 20 20 20 20 20 20 20 20 69 6e 74 20 62 48 69 74          int bHit
249e0 32 20 3d 20 66 74 73 33 45 76 61 6c 54 65 73 74  2 = fts3EvalTest
249f0 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70 72  Expr(pCsr, pExpr
24a00 2d 3e 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a  ->pRight, pRc);.
24a10 20 20 20 20 20 20 20 20 62 48 69 74 20 3d 20 62          bHit = b
24a20 48 69 74 31 20 7c 7c 20 62 48 69 74 32 3b 0a 20  Hit1 || bHit2;. 
24a30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24a40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
24a50 65 20 46 54 53 51 55 45 52 59 5f 4e 4f 54 3a 0a  e FTSQUERY_NOT:.
24a60 20 20 20 20 20 20 20 20 62 48 69 74 20 3d 20 28          bHit = (
24a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
24a80 33 45 76 61 6c 54 65 73 74 45 78 70 72 28 70 43  3EvalTestExpr(pC
24a90 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  sr, pExpr->pLeft
24aa0 2c 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 20  , pRc).         
24ab0 26 26 20 21 66 74 73 33 45 76 61 6c 54 65 73 74  && !fts3EvalTest
24ac0 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70 72  Expr(pCsr, pExpr
24ad0 2d 3e 70 52 69 67 68 74 2c 20 70 52 63 29 0a 20  ->pRight, pRc). 
24ae0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
24af0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
24b00 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
24b10 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70 44 65     if( pCsr->pDe
24b20 66 65 72 72 65 64 20 0a 20 20 20 20 20 20 20 20  ferred .        
24b30 20 26 26 20 28 70 45 78 70 72 2d 3e 69 44 6f 63   && (pExpr->iDoc
24b40 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49  id==pCsr->iPrevI
24b50 64 20 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65 66  d || pExpr->bDef
24b60 65 72 72 65 64 29 0a 20 20 20 20 20 20 20 20 29  erred).        )
24b70 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33  {.          Fts3
24b80 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
24b90 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65  = pExpr->pPhrase
24ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
24bb0 72 74 28 20 70 45 78 70 72 2d 3e 62 44 65 66 65  rt( pExpr->bDefe
24bc0 72 72 65 64 20 7c 7c 20 70 50 68 72 61 73 65 2d  rred || pPhrase-
24bd0 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69  >doclist.bFreeLi
24be0 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st==0 );.       
24bf0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 62 44     if( pExpr->bD
24c00 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20 20  eferred ){.     
24c10 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 49         fts3EvalI
24c20 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c 69 73 74  nvalidatePoslist
24c30 28 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20  (pPhrase);.     
24c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24c50 20 2a 70 52 63 20 3d 20 66 74 73 33 45 76 61 6c   *pRc = fts3Eval
24c60 44 65 66 65 72 72 65 64 50 68 72 61 73 65 28 70  DeferredPhrase(p
24c70 43 73 72 2c 20 70 50 68 72 61 73 65 29 3b 0a 20  Csr, pPhrase);. 
24c80 20 20 20 20 20 20 20 20 20 62 48 69 74 20 3d 20           bHit = 
24c90 28 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73  (pPhrase->doclis
24ca0 74 2e 70 4c 69 73 74 21 3d 30 29 3b 0a 20 20 20  t.pList!=0);.   
24cb0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
24cc0 6f 63 69 64 20 3d 20 70 43 73 72 2d 3e 69 50 72  ocid = pCsr->iPr
24cd0 65 76 49 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  evId;.        }e
24ce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 62  lse{.          b
24cf0 48 69 74 20 3d 20 28 70 45 78 70 72 2d 3e 62 45  Hit = (pExpr->bE
24d00 6f 66 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  of==0 && pExpr->
24d10 69 44 6f 63 69 64 3d 3d 70 43 73 72 2d 3e 69 50  iDocid==pCsr->iP
24d20 72 65 76 49 64 29 3b 0a 20 20 20 20 20 20 20 20  revId);.        
24d30 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
24d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24d50 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 48 69 74   }.  return bHit
24d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24d70 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24d80 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24d90 20 70 61 72 74 20 6f 66 20 65 61 63 68 20 78 4e   part of each xN
24da0 65 78 74 20 6f 70 65 72 61 74 69 6f 6e 20 77 68  ext operation wh
24db0 65 6e 0a 2a 2a 20 69 74 65 72 61 74 69 6e 67 20  en.** iterating 
24dc0 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 75  through the resu
24dd0 6c 74 73 20 6f 66 20 61 20 66 75 6c 6c 2d 74 65  lts of a full-te
24de0 78 74 20 71 75 65 72 79 2e 20 41 74 20 74 68 69  xt query. At thi
24df0 73 20 70 6f 69 6e 74 20 74 68 65 0a 2a 2a 20 63  s point the.** c
24e00 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
24e10 61 20 72 6f 77 20 74 68 61 74 20 6d 61 74 63 68  a row that match
24e20 65 73 20 74 68 65 20 71 75 65 72 79 20 65 78 70  es the query exp
24e30 72 65 73 73 69 6f 6e 2c 20 77 69 74 68 20 74 68  ression, with th
24e40 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63  e.** following c
24e50 61 76 65 61 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  aveats:.**.**   
24e60 2a 20 55 70 20 75 6e 74 69 6c 20 74 68 69 73 20  * Up until this 
24e70 70 6f 69 6e 74 2c 20 22 4e 45 41 52 22 20 6f 70  point, "NEAR" op
24e80 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 65  erators in the e
24e90 78 70 72 65 73 73 69 6f 6e 20 68 61 76 65 20 62  xpression have b
24ea0 65 65 6e 0a 2a 2a 20 20 20 20 20 74 72 65 61 74  een.**     treat
24eb0 65 64 20 61 73 20 22 41 4e 44 22 2e 0a 2a 2a 0a  ed as "AND"..**.
24ec0 2a 2a 20 20 20 2a 20 44 65 66 65 72 72 65 64 20  **   * Deferred 
24ed0 74 6f 6b 65 6e 73 20 68 61 76 65 20 6e 6f 74 20  tokens have not 
24ee0 79 65 74 20 62 65 65 6e 20 63 6f 6e 73 69 64 65  yet been conside
24ef0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  red..**.** If *p
24f00 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
24f10 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
24f20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24f30 2c 20 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  , it immediately
24f40 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2e 20 4f  .** returns 0. O
24f50 74 68 65 72 77 69 73 65 2c 20 69 74 20 74 65 73  therwise, it tes
24f60 74 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ts whether or no
24f70 74 20 61 66 74 65 72 20 63 6f 6e 73 69 64 65 72  t after consider
24f80 69 6e 67 20 4e 45 41 52 0a 2a 2a 20 6f 70 65 72  ing NEAR.** oper
24f90 61 74 6f 72 73 20 61 6e 64 20 64 65 66 65 72 72  ators and deferr
24fa0 65 64 20 74 6f 6b 65 6e 73 20 74 68 65 20 63 75  ed tokens the cu
24fb0 72 72 65 6e 74 20 72 6f 77 20 69 73 20 73 74 69  rrent row is sti
24fc0 6c 6c 20 61 20 6d 61 74 63 68 20 66 6f 72 20 74  ll a match for t
24fd0 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
24fe0 2e 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69  . It returns 1 i
24ff0 66 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f  f both of the fo
25000 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
25010 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 2a 70 52  :.**.**   1. *pR
25020 63 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 77  c is SQLITE_OK w
25030 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
25040 6e 20 72 65 74 75 72 6e 73 2c 20 61 6e 64 0a 2a  n returns, and.*
25050 2a 0a 2a 2a 20 20 20 32 2e 20 41 66 74 65 72 20  *.**   2. After 
25060 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 63 75 72  scanning the cur
25070 72 65 6e 74 20 46 54 53 20 74 61 62 6c 65 20 72  rent FTS table r
25080 6f 77 20 66 6f 72 20 74 68 65 20 64 65 66 65 72  ow for the defer
25090 72 65 64 20 74 6f 6b 65 6e 73 2c 0a 2a 2a 20 20  red tokens,.**  
250a0 20 20 20 20 69 74 20 69 73 20 64 65 74 65 72 6d      it is determ
250b0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 72 6f  ined that the ro
250c0 77 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 6d 61 74  w does *not* mat
250d0 63 68 20 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a  ch the query..**
250e0 0a 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 65 72  .** Or, if no er
250f0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 69  ror occurs and i
25100 74 20 73 65 65 6d 73 20 74 68 65 20 63 75 72 72  t seems the curr
25110 65 6e 74 20 72 6f 77 20 64 6f 65 73 20 6d 61 74  ent row does mat
25120 63 68 20 74 68 65 20 46 54 53 0a 2a 2a 20 71 75  ch the FTS.** qu
25130 65 72 79 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ery, return 0..*
25140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
25150 33 45 76 61 6c 54 65 73 74 44 65 66 65 72 72 65  3EvalTestDeferre
25160 64 41 6e 64 4e 65 61 72 28 46 74 73 33 43 75 72  dAndNear(Fts3Cur
25170 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a  sor *pCsr, int *
25180 70 52 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pRc){.  int rc =
25190 20 2a 70 52 63 3b 0a 20 20 69 6e 74 20 62 4d 69   *pRc;.  int bMi
251a0 73 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  ss = 0;.  if( rc
251b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
251c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
251d0 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
251e0 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 2c  deferred tokens,
251f0 20 6c 6f 61 64 20 74 68 65 20 63 75 72 72 65 6e   load the curren
25200 74 20 72 6f 77 20 69 6e 74 6f 0a 20 20 20 20 2a  t row into.    *
25210 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 73 63 61  * memory and sca
25220 6e 20 69 74 20 74 6f 20 64 65 74 65 72 6d 69 6e  n it to determin
25230 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  e the position l
25240 69 73 74 20 66 6f 72 20 65 61 63 68 20 64 65 66  ist for each def
25250 65 72 72 65 64 0a 20 20 20 20 2a 2a 20 74 6f 6b  erred.    ** tok
25260 65 6e 2e 20 54 68 65 6e 2c 20 73 65 65 20 69 66  en. Then, see if
25270 20 74 68 69 73 20 72 6f 77 20 69 73 20 72 65 61   this row is rea
25280 6c 6c 79 20 61 20 6d 61 74 63 68 2c 20 63 6f 6e  lly a match, con
25290 73 69 64 65 72 69 6e 67 20 64 65 66 65 72 72 65  sidering deferre
252a0 64 0a 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20  d.    ** tokens 
252b0 61 6e 64 20 4e 45 41 52 20 6f 70 65 72 61 74 6f  and NEAR operato
252c0 72 73 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  rs (neither of w
252d0 68 69 63 68 20 77 65 72 65 20 74 61 6b 65 6e 20  hich were taken 
252e0 69 6e 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  into account.   
252f0 20 2a 2a 20 65 61 72 6c 69 65 72 2c 20 62 79 20   ** earlier, by 
25300 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
25310 29 29 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  )). .    */.    
25320 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72  if( pCsr->pDefer
25330 72 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  red ){.      rc 
25340 3d 20 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b  = fts3CursorSeek
25350 28 30 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20  (0, pCsr);.     
25360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
25380 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 43 61   = sqlite3Fts3Ca
25390 63 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69  cheDeferredDocli
253a0 73 74 73 28 70 43 73 72 29 3b 0a 20 20 20 20 20  sts(pCsr);.     
253b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 4d 69   }.    }.    bMi
253c0 73 73 20 3d 20 28 30 3d 3d 66 74 73 33 45 76 61  ss = (0==fts3Eva
253d0 6c 54 65 73 74 45 78 70 72 28 70 43 73 72 2c 20  lTestExpr(pCsr, 
253e0 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 26 72 63  pCsr->pExpr, &rc
253f0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 72 65 65  ));..    /* Free
25400 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
25410 73 74 73 20 61 63 63 75 6d 75 6c 61 74 65 64 20  sts accumulated 
25420 66 6f 72 20 65 61 63 68 20 64 65 66 65 72 72 65  for each deferre
25430 64 20 74 6f 6b 65 6e 20 61 62 6f 76 65 2e 20 2a  d token above. *
25440 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  /.    sqlite3Fts
25450 33 46 72 65 65 44 65 66 65 72 72 65 64 44 6f 63  3FreeDeferredDoc
25460 6c 69 73 74 73 28 70 43 73 72 29 3b 0a 20 20 20  lists(pCsr);.   
25470 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a   *pRc = rc;.  }.
25480 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
25490 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4d 69 73 73  LITE_OK && bMiss
254a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
254b0 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
254c0 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 6d 61  document that ma
254d0 74 63 68 65 73 20 74 68 65 20 46 54 53 20 65 78  tches the FTS ex
254e0 70 72 65 73 73 69 6f 6e 20 69 6e 0a 2a 2a 20 46  pression in.** F
254f0 74 73 33 43 75 72 73 6f 72 2e 70 45 78 70 72 2e  ts3Cursor.pExpr.
25500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
25510 74 73 33 45 76 61 6c 4e 65 78 74 28 46 74 73 33  ts3EvalNext(Fts3
25520 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
25530 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25540 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
25550 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
25560 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  */.  Fts3Expr *p
25570 45 78 70 72 20 3d 20 70 43 73 72 2d 3e 70 45 78  Expr = pCsr->pEx
25580 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  pr;.  assert( pC
25590 73 72 2d 3e 69 73 45 6f 66 3d 3d 30 20 29 3b 0a  sr->isEof==0 );.
255a0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
255b0 7b 0a 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f  {.    pCsr->isEo
255c0 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
255d0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
255e0 66 28 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69  f( pCsr->isRequi
255f0 72 65 53 65 65 6b 3d 3d 30 20 29 7b 0a 20 20 20  reSeek==0 ){.   
25600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
25610 65 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b  et(pCsr->pStmt);
25620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
25630 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 64  ssert( sqlite3_d
25640 61 74 61 5f 63 6f 75 6e 74 28 70 43 73 72 2d 3e  ata_count(pCsr->
25650 70 53 74 6d 74 29 3d 3d 30 20 29 3b 0a 20 20 20  pStmt)==0 );.   
25660 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52     fts3EvalNextR
25670 6f 77 28 70 43 73 72 2c 20 70 45 78 70 72 2c 20  ow(pCsr, pExpr, 
25680 26 72 63 29 3b 0a 20 20 20 20 20 20 70 43 73 72  &rc);.      pCsr
25690 2d 3e 69 73 45 6f 66 20 3d 20 70 45 78 70 72 2d  ->isEof = pExpr-
256a0 3e 62 45 6f 66 3b 0a 20 20 20 20 20 20 70 43 73  >bEof;.      pCs
256b0 72 2d 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b  r->isRequireSeek
256c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 43 73 72   = 1;.      pCsr
256d0 2d 3e 69 73 4d 61 74 63 68 69 6e 66 6f 4e 65 65  ->isMatchinfoNee
256e0 64 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ded = 1;.      p
256f0 43 73 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 70  Csr->iPrevId = p
25700 45 78 70 72 2d 3e 69 44 6f 63 69 64 3b 0a 20 20  Expr->iDocid;.  
25710 20 20 7d 77 68 69 6c 65 28 20 70 43 73 72 2d 3e    }while( pCsr->
25720 69 73 45 6f 66 3d 3d 30 20 26 26 20 66 74 73 33  isEof==0 && fts3
25730 45 76 61 6c 54 65 73 74 44 65 66 65 72 72 65 64  EvalTestDeferred
25740 41 6e 64 4e 65 61 72 28 70 43 73 72 2c 20 26 72  AndNear(pCsr, &r
25750 63 29 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  c) );.  }.  retu
25760 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25770 52 65 73 74 61 72 74 20 69 6e 74 65 72 61 74 69  Restart interati
25780 6f 6e 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  on for expressio
25790 6e 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  n pExpr so that 
257a0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
257b0 0a 2a 2a 20 66 74 73 33 45 76 61 6c 4e 65 78 74  .** fts3EvalNext
257c0 28 29 20 76 69 73 69 74 73 20 74 68 65 20 66 69  () visits the fi
257d0 72 73 74 20 72 6f 77 2e 20 44 6f 20 6e 6f 74 20  rst row. Do not 
257e0 61 6c 6c 6f 77 20 69 6e 63 72 65 6d 65 6e 74 61  allow incrementa
257f0 6c 20 0a 2a 2a 20 6c 6f 61 64 69 6e 67 20 6f 72  l .** loading or
25800 20 6d 65 72 67 69 6e 67 20 6f 66 20 70 68 72 61   merging of phra
25810 73 65 20 64 6f 63 6c 69 73 74 73 20 66 6f 72 20  se doclists for 
25820 74 68 69 73 20 69 74 65 72 61 74 69 6f 6e 2e 0a  this iteration..
25830 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
25840 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
25850 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
25860 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
25870 65 64 2c 20 69 74 20 69 73 0a 2a 2a 20 61 20 6e  ed, it is.** a n
25880 6f 2d 6f 70 2e 20 49 66 20 61 6e 20 65 72 72 6f  o-op. If an erro
25890 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
258a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a  this function, *
258b0 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pRc is set to an
258c0 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  .** SQLite error
258d0 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74   code before ret
258e0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
258f0 63 20 76 6f 69 64 20 66 74 73 33 45 76 61 6c 52  c void fts3EvalR
25900 65 73 74 61 72 74 28 0a 20 20 46 74 73 33 43 75  estart(.  Fts3Cu
25910 72 73 6f 72 20 2a 70 43 73 72 2c 0a 20 20 46 74  rsor *pCsr,.  Ft
25920 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20  s3Expr *pExpr,. 
25930 20 69 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20 69   int *pRc.){.  i
25940 66 28 20 70 45 78 70 72 20 26 26 20 2a 70 52 63  f( pExpr && *pRc
25950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25960 20 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70     Fts3Phrase *p
25970 50 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e  Phrase = pExpr->
25980 70 50 68 72 61 73 65 3b 0a 0a 20 20 20 20 69 66  pPhrase;..    if
25990 28 20 70 50 68 72 61 73 65 20 29 7b 0a 20 20 20  ( pPhrase ){.   
259a0 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c     fts3EvalInval
259b0 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68  idatePoslist(pPh
259c0 72 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rase);.      if(
259d0 20 70 50 68 72 61 73 65 2d 3e 62 49 6e 63 72 20   pPhrase->bIncr 
259e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
259f0 74 28 20 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b  t( pPhrase->nTok
25a00 65 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  en==1 );.       
25a10 20 61 73 73 65 72 74 28 20 70 50 68 72 61 73 65   assert( pPhrase
25a20 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 70 53 65 67  ->aToken[0].pSeg
25a30 63 73 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73  csr );.        s
25a40 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
25a50 72 52 65 73 74 61 72 74 28 70 50 68 72 61 73 65  rRestart(pPhrase
25a60 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 70 53 65 67  ->aToken[0].pSeg
25a70 63 73 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  csr);.        *p
25a80 52 63 20 3d 20 66 74 73 33 45 76 61 6c 50 68 72  Rc = fts3EvalPhr
25a90 61 73 65 53 74 61 72 74 28 70 43 73 72 2c 20 30  aseStart(pCsr, 0
25aa0 2c 20 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20  , pPhrase);.    
25ab0 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 68 72 61    }..      pPhra
25ac0 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4e 65 78  se->doclist.pNex
25ad0 74 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20  tDocid = 0;.    
25ae0 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69    pPhrase->docli
25af0 73 74 2e 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20  st.iDocid = 0;. 
25b00 20 20 20 7d 0a 0a 20 20 20 20 70 45 78 70 72 2d     }..    pExpr-
25b10 3e 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20  >iDocid = 0;.   
25b20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 30   pExpr->bEof = 0
25b30 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 62 53 74  ;.    pExpr->bSt
25b40 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20 66 74  art = 0;..    ft
25b50 73 33 45 76 61 6c 52 65 73 74 61 72 74 28 70 43  s3EvalRestart(pC
25b60 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  sr, pExpr->pLeft
25b70 2c 20 70 52 63 29 3b 0a 20 20 20 20 66 74 73 33  , pRc);.    fts3
25b80 45 76 61 6c 52 65 73 74 61 72 74 28 70 43 73 72  EvalRestart(pCsr
25b90 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
25ba0 20 70 52 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pRc);.  }.}../*
25bb0 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 6f 63 61  .** After alloca
25bc0 74 69 6e 67 20 74 68 65 20 46 74 73 33 45 78 70  ting the Fts3Exp
25bd0 72 2e 61 4d 49 5b 5d 20 61 72 72 61 79 20 66 6f  r.aMI[] array fo
25be0 72 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e  r each phrase in
25bf0 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
25c00 69 6f 6e 20 72 6f 6f 74 65 64 20 61 74 20 70 45  ion rooted at pE
25c10 78 70 72 2c 20 74 68 65 20 63 75 72 73 6f 72 20  xpr, the cursor 
25c20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
25c30 20 61 6c 6c 20 72 6f 77 73 20 6d 61 74 63 68 65   all rows matche
25c40 64 0a 2a 2a 20 62 79 20 70 45 78 70 72 2c 20 63  d.** by pExpr, c
25c50 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
25c60 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 72 6f  tion for each ro
25c70 77 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  w. This function
25c80 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74   increments.** t
25c90 68 65 20 76 61 6c 75 65 73 20 69 6e 20 46 74 73  he values in Fts
25ca0 33 45 78 70 72 2e 61 4d 49 5b 5d 20 61 63 63 6f  3Expr.aMI[] acco
25cb0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 6f 73  rding to the pos
25cc0 69 74 69 6f 6e 2d 6c 69 73 74 20 63 75 72 72 65  ition-list curre
25cd0 6e 74 6c 79 0a 2a 2a 20 66 6f 75 6e 64 20 69 6e  ntly.** found in
25ce0 20 46 74 73 33 45 78 70 72 2e 70 50 68 72 61 73   Fts3Expr.pPhras
25cf0 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  e->doclist.pList
25d00 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
25d10 20 70 68 72 61 73 65 20 0a 2a 2a 20 65 78 70 72   phrase .** expr
25d20 65 73 73 69 6f 6e 20 6e 6f 64 65 73 2e 0a 2a 2f  ession nodes..*/
25d30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
25d40 33 45 76 61 6c 55 70 64 61 74 65 43 6f 75 6e 74  3EvalUpdateCount
25d50 73 28 46 74 73 33 45 78 70 72 20 2a 70 45 78 70  s(Fts3Expr *pExp
25d60 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  r){.  if( pExpr 
25d70 29 7b 0a 20 20 20 20 46 74 73 33 50 68 72 61 73  ){.    Fts3Phras
25d80 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45 78  e *pPhrase = pEx
25d90 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 20  pr->pPhrase;.   
25da0 20 69 66 28 20 70 50 68 72 61 73 65 20 26 26 20   if( pPhrase && 
25db0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
25dc0 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  .pList ){.      
25dd0 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  int iCol = 0;.  
25de0 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 70 50      char *p = pP
25df0 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
25e00 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 61 73 73  List;..      ass
25e10 65 72 74 28 20 2a 70 20 29 3b 0a 20 20 20 20 20  ert( *p );.     
25e20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
25e30 20 20 20 20 20 75 38 20 63 20 3d 20 30 3b 0a 20       u8 c = 0;. 
25e40 20 20 20 20 20 20 20 69 6e 74 20 69 43 6e 74 20         int iCnt 
25e50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = 0;.        whi
25e60 6c 65 28 20 30 78 46 45 20 26 20 28 2a 70 20 7c  le( 0xFE & (*p |
25e70 20 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   c) ){.         
25e80 20 69 66 28 20 28 63 26 30 78 38 30 29 3d 3d 30   if( (c&0x80)==0
25e90 20 29 20 69 43 6e 74 2b 2b 3b 0a 20 20 20 20 20   ) iCnt++;.     
25ea0 20 20 20 20 20 63 20 3d 20 2a 70 2b 2b 20 26 20       c = *p++ & 
25eb0 30 78 38 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  0x80;.        }.
25ec0 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 49 5b  .        /* aMI[
25ed0 69 43 6f 6c 2a 33 20 2b 20 31 5d 20 3d 20 4e 75  iCol*3 + 1] = Nu
25ee0 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72 65 6e  mber of occurren
25ef0 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ces.        ** a
25f00 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 32 5d 20 3d  MI[iCol*3 + 2] =
25f10 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
25f20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 74 20 6c 65  containing at le
25f30 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  ast one instance
25f40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
25f50 20 20 20 20 70 45 78 70 72 2d 3e 61 4d 49 5b 69      pExpr->aMI[i
25f60 43 6f 6c 2a 33 20 2b 20 31 5d 20 2b 3d 20 69 43  Col*3 + 1] += iC
25f70 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  nt;.        pExp
25f80 72 2d 3e 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20  r->aMI[iCol*3 + 
25f90 32 5d 20 2b 3d 20 28 69 43 6e 74 3e 30 29 3b 0a  2] += (iCnt>0);.
25fa0 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d          if( *p==
25fb0 30 78 30 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  0x00 ) break;.  
25fc0 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20        p++;.     
25fd0 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46     p += sqlite3F
25fe0 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
25ff0 2c 20 26 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  , &iCol);.      
26000 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
26010 33 45 76 61 6c 55 70 64 61 74 65 43 6f 75 6e 74  3EvalUpdateCount
26020 73 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  s(pExpr->pLeft);
26030 0a 20 20 20 20 66 74 73 33 45 76 61 6c 55 70 64  .    fts3EvalUpd
26040 61 74 65 43 6f 75 6e 74 73 28 70 45 78 70 72 2d  ateCounts(pExpr-
26050 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  >pRight);.  }.}.
26060 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
26070 6e 20 70 45 78 70 72 20 6d 75 73 74 20 62 65 20  n pExpr must be 
26080 6f 66 20 74 79 70 65 20 46 54 53 51 55 45 52 59  of type FTSQUERY
26090 5f 50 48 52 41 53 45 2e 0a 2a 2a 0a 2a 2a 20 49  _PHRASE..**.** I
260a0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
260b0 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ady allocated an
260c0 64 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 69  d populated, thi
260d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
260e0 61 74 65 73 20 61 6e 64 0a 2a 2a 20 70 6f 70 75  ates and.** popu
260f0 6c 61 74 65 73 20 74 68 65 20 46 74 73 33 45 78  lates the Fts3Ex
26100 70 72 2e 61 4d 49 5b 5d 20 61 72 72 61 79 20 66  pr.aMI[] array f
26110 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  or expression pE
26120 78 70 72 2e 20 49 66 20 70 45 78 70 72 20 69 73  xpr. If pExpr is
26130 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4e 45   part.** of a NE
26140 41 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  AR expression, t
26150 68 65 6e 20 69 74 20 61 6c 73 6f 20 61 6c 6c 6f  hen it also allo
26160 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61  cates and popula
26170 74 65 73 20 74 68 65 20 73 61 6d 65 20 61 72 72  tes the same arr
26180 61 79 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 74  ay.** for all ot
26190 68 65 72 20 70 68 72 61 73 65 73 20 74 68 61 74  her phrases that
261a0 20 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65   are part of the
261b0 20 4e 45 41 52 20 65 78 70 72 65 73 73 69 6f 6e   NEAR expression
261c0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
261d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
261e0 20 74 68 65 20 61 4d 49 5b 5d 20 61 72 72 61 79   the aMI[] array
261f0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
26200 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a   allocated and.*
26210 2a 20 70 6f 70 75 6c 61 74 65 64 2e 20 4f 74 68  * populated. Oth
26220 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
26230 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
26240 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
26250 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
26260 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
26270 45 76 61 6c 47 61 74 68 65 72 53 74 61 74 73 28  EvalGatherStats(
26280 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
26290 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
262a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a     /* Cursor obj
262b0 65 63 74 20 2a 2f 0a 20 20 46 74 73 33 45 78 70  ect */.  Fts3Exp
262c0 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
262d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 51           /* FTSQ
262e0 55 45 52 59 5f 50 48 52 41 53 45 20 65 78 70 72  UERY_PHRASE expr
262f0 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  ession */.){.  i
26300 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26310 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
26320 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26330 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
26340 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
26350 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20 20 69  RY_PHRASE );.  i
26360 66 28 20 70 45 78 70 72 2d 3e 61 4d 49 3d 3d 30  f( pExpr->aMI==0
26370 20 29 7b 0a 20 20 20 20 46 74 73 33 54 61 62 6c   ){.    Fts3Tabl
26380 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54  e *pTab = (Fts3T
26390 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73  able *)pCsr->bas
263a0 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 46 74 73  e.pVtab;.    Fts
263b0 33 45 78 70 72 20 2a 70 52 6f 6f 74 3b 20 20 20  3Expr *pRoot;   
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
263d0 52 6f 6f 74 20 6f 66 20 4e 45 41 52 20 65 78 70  Root of NEAR exp
263e0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 46  ression */.    F
263f0 74 73 33 45 78 70 72 20 2a 70 3b 20 20 20 20 20  ts3Expr *p;     
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26410 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
26420 66 6f 72 20 73 65 76 65 72 61 6c 20 70 75 72 70  for several purp
26430 6f 73 65 73 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  oses */..    sql
26440 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76  ite3_int64 iPrev
26450 49 64 20 3d 20 70 43 73 72 2d 3e 69 50 72 65 76  Id = pCsr->iPrev
26460 49 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  Id;.    sqlite3_
26470 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 0a 20 20  int64 iDocid;.  
26480 20 20 75 38 20 62 45 6f 66 3b 0a 0a 20 20 20 20    u8 bEof;..    
26490 2f 2a 20 46 69 6e 64 20 74 68 65 20 72 6f 6f 74  /* Find the root
264a0 20 6f 66 20 74 68 65 20 4e 45 41 52 20 65 78 70   of the NEAR exp
264b0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  ression */.    p
264c0 52 6f 6f 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Root = pExpr;.  
264d0 20 20 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e    while( pRoot->
264e0 70 50 61 72 65 6e 74 20 26 26 20 70 52 6f 6f 74  pParent && pRoot
264f0 2d 3e 70 50 61 72 65 6e 74 2d 3e 65 54 79 70 65  ->pParent->eType
26500 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20  ==FTSQUERY_NEAR 
26510 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  ){.      pRoot =
26520 20 70 52 6f 6f 74 2d 3e 70 50 61 72 65 6e 74 3b   pRoot->pParent;
26530 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 6f 63 69  .    }.    iDoci
26540 64 20 3d 20 70 52 6f 6f 74 2d 3e 69 44 6f 63 69  d = pRoot->iDoci
26550 64 3b 0a 20 20 20 20 62 45 6f 66 20 3d 20 70 52  d;.    bEof = pR
26560 6f 6f 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 61  oot->bEof;.    a
26570 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62 53  ssert( pRoot->bS
26580 74 61 72 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  tart );..    /* 
26590 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
265a0 6f 72 20 74 68 65 20 61 4d 53 49 5b 5d 20 61 72  or the aMSI[] ar
265b0 72 61 79 20 6f 66 20 65 61 63 68 20 46 54 53 51  ray of each FTSQ
265c0 55 45 52 59 5f 50 48 52 41 53 45 20 6e 6f 64 65  UERY_PHRASE node
265d0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 52   */.    for(p=pR
265e0 6f 6f 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4c 65  oot; p; p=p->pLe
265f0 66 74 29 7b 0a 20 20 20 20 20 20 46 74 73 33 45  ft){.      Fts3E
26600 78 70 72 20 2a 70 45 20 3d 20 28 70 2d 3e 65 54  xpr *pE = (p->eT
26610 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48  ype==FTSQUERY_PH
26620 52 41 53 45 3f 70 3a 70 2d 3e 70 52 69 67 68 74  RASE?p:p->pRight
26630 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26640 20 70 45 2d 3e 61 4d 49 3d 3d 30 20 29 3b 0a 20   pE->aMI==0 );. 
26650 20 20 20 20 20 70 45 2d 3e 61 4d 49 20 3d 20 28       pE->aMI = (
26660 75 33 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  u32 *)sqlite3_ma
26670 6c 6c 6f 63 28 70 54 61 62 2d 3e 6e 43 6f 6c 75  lloc(pTab->nColu
26680 6d 6e 20 2a 20 33 20 2a 20 73 69 7a 65 6f 66 28  mn * 3 * sizeof(
26690 75 33 32 29 29 3b 0a 20 20 20 20 20 20 69 66 28  u32));.      if(
266a0 20 21 70 45 2d 3e 61 4d 49 20 29 20 72 65 74 75   !pE->aMI ) retu
266b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
266c0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 45  .      memset(pE
266d0 2d 3e 61 4d 49 2c 20 30 2c 20 70 54 61 62 2d 3e  ->aMI, 0, pTab->
266e0 6e 43 6f 6c 75 6d 6e 20 2a 20 33 20 2a 20 73 69  nColumn * 3 * si
266f0 7a 65 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20  zeof(u32));.    
26700 7d 0a 0a 20 20 20 20 66 74 73 33 45 76 61 6c 52  }..    fts3EvalR
26710 65 73 74 61 72 74 28 70 43 73 72 2c 20 70 52 6f  estart(pCsr, pRo
26720 6f 74 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 77  ot, &rc);..    w
26730 68 69 6c 65 28 20 70 43 73 72 2d 3e 69 73 45 6f  hile( pCsr->isEo
26740 66 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  f==0 && rc==SQLI
26750 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20  TE_OK ){..      
26760 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  do {.        /* 
26770 45 6e 73 75 72 65 20 74 68 65 20 25 5f 63 6f 6e  Ensure the %_con
26780 74 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69  tent statement i
26790 73 20 72 65 73 65 74 2e 20 2a 2f 0a 20 20 20 20  s reset. */.    
267a0 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 73      if( pCsr->is
267b0 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29  RequireSeek==0 )
267c0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
267d0 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  Csr->pStmt);.   
267e0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
267f0 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28  ite3_data_count(
26800 70 43 73 72 2d 3e 70 53 74 6d 74 29 3d 3d 30 20  pCsr->pStmt)==0 
26810 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  );..        /* A
26820 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
26830 78 74 20 64 6f 63 75 6d 65 6e 74 20 2a 2f 0a 20  xt document */. 
26840 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e         fts3EvalN
26850 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52 6f  extRow(pCsr, pRo
26860 6f 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ot, &rc);.      
26870 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
26880 70 52 6f 6f 74 2d 3e 62 45 6f 66 3b 0a 20 20 20  pRoot->bEof;.   
26890 20 20 20 20 20 70 43 73 72 2d 3e 69 73 52 65 71       pCsr->isReq
268a0 75 69 72 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20  uireSeek = 1;.  
268b0 20 20 20 20 20 20 70 43 73 72 2d 3e 69 73 4d 61        pCsr->isMa
268c0 74 63 68 69 6e 66 6f 4e 65 65 64 65 64 20 3d 20  tchinfoNeeded = 
268d0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  1;.        pCsr-
268e0 3e 69 50 72 65 76 49 64 20 3d 20 70 52 6f 6f 74  >iPrevId = pRoot
268f0 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  ->iDocid;.      
26900 7d 77 68 69 6c 65 28 20 70 43 73 72 2d 3e 69 73  }while( pCsr->is
26910 45 6f 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Eof==0 .        
26920 20 20 20 26 26 20 70 52 6f 6f 74 2d 3e 65 54 79     && pRoot->eTy
26930 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
26940 52 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  R .           &&
26950 20 66 74 73 33 45 76 61 6c 54 65 73 74 44 65 66   fts3EvalTestDef
26960 65 72 72 65 64 41 6e 64 4e 65 61 72 28 70 43 73  erredAndNear(pCs
26970 72 2c 20 26 72 63 29 20 0a 20 20 20 20 20 20 29  r, &rc) .      )
26980 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
26990 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43  =SQLITE_OK && pC
269a0 73 72 2d 3e 69 73 45 6f 66 3d 3d 30 20 29 7b 0a  sr->isEof==0 ){.
269b0 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
269c0 55 70 64 61 74 65 43 6f 75 6e 74 73 28 70 52 6f  UpdateCounts(pRo
269d0 6f 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ot);.      }.   
269e0 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e 69 73   }..    pCsr->is
269f0 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  Eof = 0;.    pCs
26a00 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 69 50 72  r->iPrevId = iPr
26a10 65 76 49 64 3b 0a 0a 20 20 20 20 69 66 28 20 62  evId;..    if( b
26a20 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  Eof ){.      pRo
26a30 6f 74 2d 3e 62 45 6f 66 20 3d 20 62 45 6f 66 3b  ot->bEof = bEof;
26a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26a50 20 20 2f 2a 20 43 61 75 74 69 6f 6e 3a 20 70 52    /* Caution: pR
26a60 6f 6f 74 20 6d 61 79 20 69 74 65 72 61 74 65 20  oot may iterate 
26a70 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20 69  through docids i
26a80 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
26a90 65 73 63 65 6e 64 69 6e 67 0a 20 20 20 20 20 20  escending.      
26aa0 2a 2a 20 6f 72 64 65 72 2e 20 46 6f 72 20 74 68  ** order. For th
26ab0 69 73 20 72 65 61 73 6f 6e 2c 20 65 76 65 6e 20  is reason, even 
26ac0 74 68 6f 75 67 68 20 69 74 20 73 65 65 6d 73 20  though it seems 
26ad0 6d 6f 72 65 20 64 65 66 65 6e 73 69 76 65 2c 20  more defensive, 
26ae0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 6f  the .      ** do
26af0 20 6c 6f 6f 70 20 63 61 6e 20 6e 6f 74 20 62 65   loop can not be
26b00 20 77 72 69 74 74 65 6e 3a 0a 20 20 20 20 20 20   written:.      
26b10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 64 6f  **.      **   do
26b20 20 7b 2e 2e 2e 7d 20 77 68 69 6c 65 28 20 70 52   {...} while( pR
26b30 6f 6f 74 2d 3e 69 44 6f 63 69 64 3c 69 44 6f 63  oot->iDocid<iDoc
26b40 69 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  id && rc==SQLITE
26b50 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  _OK );.      */.
26b60 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 52 65        fts3EvalRe
26b70 73 74 61 72 74 28 70 43 73 72 2c 20 70 52 6f 6f  start(pCsr, pRoo
26b80 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 64  t, &rc);.      d
26b90 6f 20 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33  o {.        fts3
26ba0 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72  EvalNextRow(pCsr
26bb0 2c 20 70 52 6f 6f 74 2c 20 26 72 63 29 3b 0a 20  , pRoot, &rc);. 
26bc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26bd0 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b  Root->bEof==0 );
26be0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70  .      }while( p
26bf0 52 6f 6f 74 2d 3e 69 44 6f 63 69 64 21 3d 69 44  Root->iDocid!=iD
26c00 6f 63 69 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  ocid && rc==SQLI
26c10 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66  TE_OK );.      f
26c20 74 73 33 45 76 61 6c 54 65 73 74 44 65 66 65 72  ts3EvalTestDefer
26c30 72 65 64 41 6e 64 4e 65 61 72 28 70 43 73 72 2c  redAndNear(pCsr,
26c40 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
26c50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26c60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26c70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
26c80 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 28 29 20  the matchinfo() 
26c90 6d 6f 64 75 6c 65 20 74 6f 20 71 75 65 72 79 20  module to query 
26ca0 61 20 70 68 72 61 73 65 20 0a 2a 2a 20 65 78 70  a phrase .** exp
26cb0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
26cc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
26cd0 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  nformation:.**.*
26ce0 2a 20 20 20 31 2e 20 54 68 65 20 74 6f 74 61 6c  *   1. The total
26cf0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72   number of occur
26d00 72 65 6e 63 65 73 20 6f 66 20 74 68 65 20 70 68  rences of the ph
26d10 72 61 73 65 20 69 6e 20 65 61 63 68 20 63 6f 6c  rase in each col
26d20 75 6d 6e 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20  umn of .**      
26d30 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 28 63  the FTS table (c
26d40 6f 6e 73 69 64 65 72 69 6e 67 20 61 6c 6c 20 72  onsidering all r
26d50 6f 77 73 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ows), and.**.** 
26d60 20 20 32 2e 20 46 6f 72 20 65 61 63 68 20 63 6f    2. For each co
26d70 6c 75 6d 6e 2c 20 74 68 65 20 6e 75 6d 62 65 72  lumn, the number
26d80 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
26d90 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20  table for which 
26da0 74 68 65 0a 2a 2a 20 20 20 20 20 20 63 6f 6c 75  the.**      colu
26db0 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  mn contains at l
26dc0 65 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63  east one instanc
26dd0 65 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 2e  e of the phrase.
26de0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
26df0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
26e00 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26e10 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20   and the values 
26e20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
26e30 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
26e40 74 68 65 20 61 72 72 61 79 20 61 69 4f 75 74 20  the array aiOut 
26e50 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
26e60 2a 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33  *   aiOut[iCol*3
26e70 20 2b 20 31 5d 20 3d 20 4e 75 6d 62 65 72 20 6f   + 1] = Number o
26e80 66 20 6f 63 63 75 72 72 65 6e 63 65 73 0a 2a 2a  f occurrences.**
26e90 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20     aiOut[iCol*3 
26ea0 2b 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66  + 2] = Number of
26eb0 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67   rows containing
26ec0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e   at least one in
26ed0 73 74 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 43 61 76  stance.**.** Cav
26ee0 65 61 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eats:.**.**   * 
26ef0 49 66 20 61 20 70 68 72 61 73 65 20 63 6f 6e 73  If a phrase cons
26f00 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
26f10 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73   deferred tokens
26f20 2c 20 74 68 65 6e 20 61 6c 6c 20 6f 75 74 70 75  , then all outpu
26f30 74 20 0a 2a 2a 20 20 20 20 20 76 61 6c 75 65 73  t .**     values
26f40 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 20   are set to the 
26f50 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65  number of docume
26f60 6e 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  nts in the table
26f70 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 20 20  . In other.**   
26f80 20 20 77 6f 72 64 73 20 77 65 20 61 73 73 75 6d    words we assum
26f90 65 20 74 68 61 74 20 76 65 72 79 20 63 6f 6d 6d  e that very comm
26fa0 6f 6e 20 74 6f 6b 65 6e 73 20 6f 63 63 75 72 20  on tokens occur 
26fb0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 69 6e 20  exactly once in 
26fc0 65 61 63 68 20 0a 2a 2a 20 20 20 20 20 63 6f 6c  each .**     col
26fd0 75 6d 6e 20 6f 66 20 65 61 63 68 20 72 6f 77 20  umn of each row 
26fe0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
26ff0 0a 2a 2a 20 20 20 2a 20 49 66 20 61 20 70 68 72  .**   * If a phr
27000 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ase contains som
27010 65 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  e deferred token
27020 73 20 28 61 6e 64 20 73 6f 6d 65 20 6e 6f 6e 2d  s (and some non-
27030 64 65 66 65 72 72 65 64 20 0a 2a 2a 20 20 20 20  deferred .**    
27040 20 74 6f 6b 65 6e 73 29 2c 20 63 6f 75 6e 74 20   tokens), count 
27050 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6f 63  the potential oc
27060 63 75 72 72 65 6e 63 65 20 69 64 65 6e 74 69 66  currence identif
27070 69 65 64 20 62 79 20 63 6f 6e 73 69 64 65 72 69  ied by consideri
27080 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6e 6f  ng.**     the no
27090 6e 2d 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  n-deferred token
270a0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74  s instead of act
270b0 75 61 6c 20 70 68 72 61 73 65 20 6f 63 63 75 72  ual phrase occur
270c0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  rences..**.**   
270d0 2a 20 49 66 20 74 68 65 20 70 68 72 61 73 65 20  * If the phrase 
270e0 69 73 20 70 61 72 74 20 6f 66 20 61 20 4e 45 41  is part of a NEA
270f0 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  R expression, th
27100 65 6e 20 6f 6e 6c 79 20 70 68 72 61 73 65 20 69  en only phrase i
27110 6e 73 74 61 6e 63 65 73 0a 2a 2a 20 20 20 20 20  nstances.**     
27120 74 68 61 74 20 6d 65 65 74 20 74 68 65 20 4e 45  that meet the NE
27130 41 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 72  AR constraint ar
27140 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  e included in th
27150 65 20 63 6f 75 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  e counts..*/.int
27160 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c   sqlite3Fts3Eval
27170 50 68 72 61 73 65 53 74 61 74 73 28 0a 20 20 46  PhraseStats(.  F
27180 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271a0 2a 20 46 54 53 20 63 75 72 73 6f 72 20 68 61 6e  * FTS cursor han
271b0 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70  dle */.  Fts3Exp
271c0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
271d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61           /* Phra
271e0 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  se expression */
271f0 0a 20 20 75 33 32 20 2a 61 69 4f 75 74 20 20 20  .  u32 *aiOut   
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 77     /* Array to w
27220 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
27230 6f 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  o (see above) */
27240 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  .){.  Fts3Table 
27250 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  *pTab = (Fts3Tab
27260 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
27270 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
27280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27290 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 69 66 28 20  nt iCol;..  if( 
272a0 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64  pExpr->bDeferred
272b0 20 26 26 20 70 45 78 70 72 2d 3e 70 50 61 72 65   && pExpr->pPare
272c0 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55  nt->eType!=FTSQU
272d0 45 52 59 5f 4e 45 41 52 20 29 7b 0a 20 20 20 20  ERY_NEAR ){.    
272e0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44  assert( pCsr->nD
272f0 6f 63 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  oc>0 );.    for(
27300 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
27310 62 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c  b->nColumn; iCol
27320 2b 2b 29 7b 0a 20 20 20 20 20 20 61 69 4f 75 74  ++){.      aiOut
27330 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 20 3d 20 28  [iCol*3 + 1] = (
27340 75 33 32 29 70 43 73 72 2d 3e 6e 44 6f 63 3b 0a  u32)pCsr->nDoc;.
27350 20 20 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c        aiOut[iCol
27360 2a 33 20 2b 20 32 5d 20 3d 20 28 75 33 32 29 70  *3 + 2] = (u32)p
27370 43 73 72 2d 3e 6e 44 6f 63 3b 0a 20 20 20 20 7d  Csr->nDoc;.    }
27380 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
27390 20 3d 20 66 74 73 33 45 76 61 6c 47 61 74 68 65   = fts3EvalGathe
273a0 72 53 74 61 74 73 28 70 43 73 72 2c 20 70 45 78  rStats(pCsr, pEx
273b0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  pr);.    if( rc=
273c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
273d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
273e0 72 2d 3e 61 4d 49 20 29 3b 0a 20 20 20 20 20 20  r->aMI );.      
273f0 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
27400 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pTab->nColumn; 
27410 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
27420 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20 2b 20   aiOut[iCol*3 + 
27430 31 5d 20 3d 20 70 45 78 70 72 2d 3e 61 4d 49 5b  1] = pExpr->aMI[
27440 69 43 6f 6c 2a 33 20 2b 20 31 5d 3b 0a 20 20 20  iCol*3 + 1];.   
27450 20 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a       aiOut[iCol*
27460 33 20 2b 20 32 5d 20 3d 20 70 45 78 70 72 2d 3e  3 + 2] = pExpr->
27470 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 32 5d 3b  aMI[iCol*3 + 2];
27480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27490 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
274a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
274b0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 70  pression pExpr p
274c0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
274d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
274e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
274f0 20 6d 75 73 74 20 62 65 20 6f 66 20 74 79 70 65   must be of type
27500 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45   FTSQUERY_PHRASE
27510 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  . .**.** The ret
27520 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
27530 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
27540 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
27550 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  fer containing.*
27560 2a 20 61 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  * a position-lis
27570 74 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  t indicating the
27580 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
27590 74 68 65 20 70 68 72 61 73 65 20 69 6e 20 63 6f  the phrase in co
275a0 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 6f 66 20  lumn iCol.** of 
275b0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
275c0 20 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65   .**.** More spe
275d0 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 72  cifically, the r
275e0 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 20 63  eturned buffer c
275f0 6f 6e 74 61 69 6e 73 20 31 20 76 61 72 69 6e 74  ontains 1 varint
27600 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 6f 63   for each .** oc
27610 63 75 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70  curence of the p
27620 68 72 61 73 65 20 69 6e 20 74 68 65 20 63 6f 6c  hrase in the col
27630 75 6d 6e 2c 20 73 74 6f 72 65 64 20 75 73 69 6e  umn, stored usin
27640 67 20 74 68 65 20 6e 6f 72 6d 61 6c 20 28 64 65  g the normal (de
27650 6c 74 61 2b 32 29 20 0a 2a 2a 20 63 6f 6d 70 72  lta+2) .** compr
27660 65 73 73 69 6f 6e 20 61 6e 64 20 69 73 20 74 65  ession and is te
27670 72 6d 69 6e 61 74 65 64 20 62 79 20 65 69 74 68  rminated by eith
27680 65 72 20 61 6e 20 30 78 30 31 20 6f 72 20 30 78  er an 0x01 or 0x
27690 30 30 20 62 79 74 65 2e 20 46 6f 72 20 65 78 61  00 byte. For exa
276a0 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20  mple,.** if the 
276b0 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
276c0 20 63 6f 6e 74 61 69 6e 73 20 22 61 20 62 20 58   contains "a b X
276d0 20 63 20 64 20 58 20 58 22 20 61 6e 64 20 74 68   c d X X" and th
276e0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a  e position-list.
276f0 2a 2a 20 66 6f 72 20 27 58 27 20 69 73 20 72 65  ** for 'X' is re
27700 71 75 65 73 74 65 64 2c 20 74 68 65 20 62 75 66  quested, the buf
27710 66 65 72 20 72 65 74 75 72 6e 65 64 20 6d 61 79  fer returned may
27720 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20   contain:.**.** 
27730 20 20 20 20 30 78 30 34 20 30 78 30 35 20 30 78      0x04 0x05 0x
27740 30 33 20 30 78 30 31 20 20 20 6f 72 20 20 20 30  03 0x01   or   0
27750 78 30 34 20 30 78 30 35 20 30 78 30 33 20 30 78  x04 0x05 0x03 0x
27760 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  00.**.** This fu
27770 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 72 65 67  nction works reg
27780 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
27790 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 68  er or not the ph
277a0 72 61 73 65 20 69 73 20 64 65 66 65 72 72 65 64  rase is deferred
277b0 2c 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  ,.** incremental
277c0 2c 20 6f 72 20 6e 65 69 74 68 65 72 2e 0a 2a 2f  , or neither..*/
277d0 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74  .char *sqlite3Ft
277e0 73 33 45 76 61 6c 50 68 72 61 73 65 50 6f 73 6c  s3EvalPhrasePosl
277f0 69 73 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f  ist(.  Fts3Curso
27800 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20  r *pCsr,        
27810 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 63         /* FTS3 c
27820 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
27830 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70    Fts3Expr *pExp
27840 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
27850 20 20 2f 2a 20 50 68 72 61 73 65 20 74 6f 20 72    /* Phrase to r
27860 65 74 75 72 6e 20 64 6f 63 6c 69 73 74 20 66 6f  eturn doclist fo
27870 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  r */.  int iCol 
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
278a0 20 74 6f 20 72 65 74 75 72 6e 20 70 6f 73 69 74   to return posit
278b0 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 2a 2f 0a  ion list for */.
278c0 29 7b 0a 20 20 46 74 73 33 50 68 72 61 73 65 20  ){.  Fts3Phrase 
278d0 2a 70 50 68 72 61 73 65 20 3d 20 70 45 78 70 72  *pPhrase = pExpr
278e0 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 46 74 73  ->pPhrase;.  Fts
278f0 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  3Table *pTab = (
27900 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72  Fts3Table *)pCsr
27910 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20  ->base.pVtab;.  
27920 63 68 61 72 20 2a 70 49 74 65 72 20 3d 20 70 50  char *pIter = pP
27930 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
27940 4c 69 73 74 3b 0a 20 20 69 6e 74 20 69 54 68 69  List;.  int iThi
27950 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43  s;..  assert( iC
27960 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
27970 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  ab->nColumn );. 
27980 20 69 66 28 20 21 70 49 74 65 72 20 0a 20 20 20   if( !pIter .   
27990 7c 7c 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 0a  || pExpr->bEof .
279a0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 44 6f     || pExpr->iDo
279b0 63 69 64 21 3d 70 43 73 72 2d 3e 69 50 72 65 76  cid!=pCsr->iPrev
279c0 49 64 0a 20 20 20 7c 7c 20 28 70 50 68 72 61 73  Id.   || (pPhras
279d0 65 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  e->iColumn<pTab-
279e0 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50 68 72  >nColumn && pPhr
279f0 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  ase->iColumn!=iC
27a00 6f 6c 29 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  ol) .  ){.    re
27a10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 61  turn 0;.  }..  a
27a20 73 73 65 72 74 28 20 70 50 68 72 61 73 65 2d 3e  ssert( pPhrase->
27a30 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 3e 30 20  doclist.nList>0 
27a40 29 3b 0a 20 20 69 66 28 20 2a 70 49 74 65 72 3d  );.  if( *pIter=
27a50 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 70 49 74  =0x01 ){.    pIt
27a60 65 72 2b 2b 3b 0a 20 20 20 20 70 49 74 65 72 20  er++;.    pIter 
27a70 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
27a80 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
27a90 20 26 69 54 68 69 73 29 3b 0a 20 20 7d 65 6c 73   &iThis);.  }els
27aa0 65 7b 0a 20 20 20 20 69 54 68 69 73 20 3d 20 30  e{.    iThis = 0
27ab0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69  ;.  }.  while( i
27ac0 54 68 69 73 3c 69 43 6f 6c 20 29 7b 0a 20 20 20  This<iCol ){.   
27ad0 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43   fts3ColumnlistC
27ae0 6f 70 79 28 30 2c 20 26 70 49 74 65 72 29 3b 0a  opy(0, &pIter);.
27af0 20 20 20 20 69 66 28 20 2a 70 49 74 65 72 3d 3d      if( *pIter==
27b00 30 78 30 30 20 29 20 72 65 74 75 72 6e 20 30 3b  0x00 ) return 0;
27b10 0a 20 20 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20  .    pIter++;.  
27b20 20 20 70 49 74 65 72 20 2b 3d 20 73 71 6c 69 74    pIter += sqlit
27b30 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33  e3Fts3GetVarint3
27b40 32 28 70 49 74 65 72 2c 20 26 69 54 68 69 73 29  2(pIter, &iThis)
27b50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
27b60 28 28 69 43 6f 6c 3d 3d 69 54 68 69 73 29 3f 70  ((iCol==iThis)?p
27b70 49 74 65 72 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Iter:0);.}../*.*
27b80 2a 20 46 72 65 65 20 61 6c 6c 20 63 6f 6d 70 6f  * Free all compo
27b90 6e 65 6e 74 73 20 6f 66 20 74 68 65 20 46 74 73  nents of the Fts
27ba0 33 50 68 72 61 73 65 20 73 74 72 75 63 74 75 72  3Phrase structur
27bb0 65 20 74 68 61 74 20 77 65 72 65 20 61 6c 6c 6f  e that were allo
27bc0 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
27bd0 65 76 61 6c 20 6d 6f 64 75 6c 65 2e 20 53 70 65  eval module. Spe
27be0 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
27bf0 6d 65 61 6e 73 20 74 6f 20 66 72 65 65 3a 0a 2a  means to free:.*
27c00 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 63 6f 6e  *.**   * the con
27c10 74 65 6e 74 73 20 6f 66 20 70 50 68 72 61 73 65  tents of pPhrase
27c20 2d 3e 64 6f 63 6c 69 73 74 2c 20 61 6e 64 0a 2a  ->doclist, and.*
27c30 2a 20 20 20 2a 20 61 6e 79 20 46 74 73 33 4d 75  *   * any Fts3Mu
27c40 6c 74 69 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ltiSegReader obj
27c50 65 63 74 73 20 68 65 6c 64 20 62 79 20 70 68 72  ects held by phr
27c60 61 73 65 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ase tokens..*/.v
27c70 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 45  oid sqlite3Fts3E
27c80 76 61 6c 50 68 72 61 73 65 43 6c 65 61 6e 75 70  valPhraseCleanup
27c90 28 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68  (Fts3Phrase *pPh
27ca0 72 61 73 65 29 7b 0a 20 20 69 66 28 20 70 50 68  rase){.  if( pPh
27cb0 72 61 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  rase ){.    int 
27cc0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  i;.    sqlite3_f
27cd0 72 65 65 28 70 50 68 72 61 73 65 2d 3e 64 6f 63  ree(pPhrase->doc
27ce0 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a 20 20 20 20  list.aAll);.    
27cf0 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64 61  fts3EvalInvalida
27d00 74 65 50 6f 73 6c 69 73 74 28 70 50 68 72 61 73  tePoslist(pPhras
27d10 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  e);.    memset(&
27d20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
27d30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
27d40 44 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66  Doclist));.    f
27d50 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73  or(i=0; i<pPhras
27d60 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b  e->nToken; i++){
27d70 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65  .      fts3SegRe
27d80 61 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 70  aderCursorFree(p
27d90 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69  Phrase->aToken[i
27da0 5d 2e 70 53 65 67 63 73 72 29 3b 0a 20 20 20 20  ].pSegcsr);.    
27db0 20 20 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65    pPhrase->aToke
27dc0 6e 5b 69 5d 2e 70 53 65 67 63 73 72 20 3d 20 30  n[i].pSegcsr = 0
27dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
27de0 69 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 0a  if !SQLITE_CORE.
27df0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
27e00 20 41 50 49 20 70 6f 69 6e 74 65 72 20 74 61 62   API pointer tab
27e10 6c 65 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  le, if required.
27e20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
27e30 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 28 0a  extension_init(.
27e40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
27e50 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
27e60 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  g,.  const sqlit
27e70 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
27e80 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54  *pApi.){.  SQLIT
27e90 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
27ea0 32 28 70 41 70 69 29 0a 20 20 72 65 74 75 72 6e  2(pApi).  return
27eb0 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
27ec0 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  (db);.}.#endif..
27ed0 23 65 6e 64 69 66 0a                             #endif.