System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 44f998657ec849362484bb389c5728e821fc8c59:


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: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
31b0: 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e  E_CORE) || defin
31c0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
31d0: 5f 46 54 53 33 29 0a 0a 23 69 66 20 64 65 66 69  _FTS3)..#if defi
31e0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
31f0: 45 5f 46 54 53 33 29 20 26 26 20 21 64 65 66 69  E_FTS3) && !defi
3200: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
3210: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
3220: 5f 43 4f 52 45 20 31 0a 23 65 6e 64 69 66 0a 0a  _CORE 1.#endif..
3230: 23 69 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e  #include "fts3In
3240: 74 2e 68 22 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  t.h"..#include <
3250: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
3260: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
3270: 6e 63 6c 75 64 65 20 3c 73 74 64 64 65 66 2e 68  nclude <stddef.h
3280: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  >.#include <stdi
3290: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  o.h>.#include <s
32a0: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
32b0: 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 23 69  e <stdarg.h>..#i
32c0: 6e 63 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a  nclude "fts3.h".
32d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43  #ifndef SQLITE_C
32e0: 4f 52 45 20 0a 23 20 69 6e 63 6c 75 64 65 20 22  ORE .# include "
32f0: 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 20 20  sqlite3ext.h".  
3300: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
3310: 5f 49 4e 49 54 31 0a 23 65 6e 64 69 66 0a 0a 2f  _INIT1.#endif../
3320: 2a 20 0a 2a 2a 20 57 72 69 74 65 20 61 20 36 34  * .** Write a 64
3330: 2d 62 69 74 20 76 61 72 69 61 62 6c 65 2d 6c 65  -bit variable-le
3340: 6e 67 74 68 20 69 6e 74 65 67 65 72 20 74 6f 20  ngth integer to 
3350: 6d 65 6d 6f 72 79 20 73 74 61 72 74 69 6e 67 20  memory starting 
3360: 61 74 20 70 5b 30 5d 2e 0a 2a 2a 20 54 68 65 20  at p[0]..** The 
3370: 6c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 20 77  length of data w
3380: 72 69 74 74 65 6e 20 77 69 6c 6c 20 62 65 20 62  ritten will be b
3390: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 46 54 53  etween 1 and FTS
33a0: 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 62 79 74  3_VARINT_MAX byt
33b0: 65 73 2e 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  es..** The numbe
33c0: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
33d0: 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  en is returned..
33e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
33f0: 73 33 50 75 74 56 61 72 69 6e 74 28 63 68 61 72  s3PutVarint(char
3400: 20 2a 70 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36   *p, sqlite_int6
3410: 34 20 76 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  4 v){.  unsigned
3420: 20 63 68 61 72 20 2a 71 20 3d 20 28 75 6e 73 69   char *q = (unsi
3430: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70 3b 0a  gned char *) p;.
3440: 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20    sqlite_uint64 
3450: 76 75 20 3d 20 76 3b 0a 20 20 64 6f 7b 0a 20 20  vu = v;.  do{.  
3460: 20 20 2a 71 2b 2b 20 3d 20 28 75 6e 73 69 67 6e    *q++ = (unsign
3470: 65 64 20 63 68 61 72 29 20 28 28 76 75 20 26 20  ed char) ((vu & 
3480: 30 78 37 66 29 20 7c 20 30 78 38 30 29 3b 0a 20  0x7f) | 0x80);. 
3490: 20 20 20 76 75 20 3e 3e 3d 20 37 3b 0a 20 20 7d     vu >>= 7;.  }
34a0: 77 68 69 6c 65 28 20 76 75 21 3d 30 20 29 3b 0a  while( vu!=0 );.
34b0: 20 20 71 5b 2d 31 5d 20 26 3d 20 30 78 37 66 3b    q[-1] &= 0x7f;
34c0: 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 68 69    /* turn off hi
34d0: 67 68 20 62 69 74 20 69 6e 20 66 69 6e 61 6c 20  gh bit in final 
34e0: 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
34f0: 28 20 71 20 2d 20 28 75 6e 73 69 67 6e 65 64 20  ( q - (unsigned 
3500: 63 68 61 72 20 2a 29 70 20 3c 3d 20 46 54 53 33  char *)p <= FTS3
3510: 5f 56 41 52 49 4e 54 5f 4d 41 58 20 29 3b 0a 20  _VARINT_MAX );. 
3520: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 28 71   return (int) (q
3530: 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   - (unsigned cha
3540: 72 20 2a 29 70 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  r *)p);.}../* .*
3550: 2a 20 52 65 61 64 20 61 20 36 34 2d 62 69 74 20  * Read a 64-bit 
3560: 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20  variable-length 
3570: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 6d 65 6d  integer from mem
3580: 6f 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20  ory starting at 
3590: 70 5b 30 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  p[0]..** Return 
35a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
35b0: 74 65 73 20 72 65 61 64 2c 20 6f 72 20 30 20 6f  tes read, or 0 o
35c0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20  n error..** The 
35d0: 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20  value is stored 
35e0: 69 6e 20 2a 76 2e 0a 2a 2f 0a 69 6e 74 20 73 71  in *v..*/.int sq
35f0: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
3600: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  nt(const char *p
3610: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
3620: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
3630: 67 6e 65 64 20 63 68 61 72 20 2a 71 20 3d 20 28  gned char *q = (
3640: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3650: 68 61 72 20 2a 29 20 70 3b 0a 20 20 73 71 6c 69  har *) p;.  sqli
3660: 74 65 5f 75 69 6e 74 36 34 20 78 20 3d 20 30 2c  te_uint64 x = 0,
3670: 20 79 20 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28   y = 1;.  while(
3680: 20 28 2a 71 26 30 78 38 30 29 3d 3d 30 78 38 30   (*q&0x80)==0x80
3690: 20 26 26 20 71 2d 28 75 6e 73 69 67 6e 65 64 20   && q-(unsigned 
36a0: 63 68 61 72 20 2a 29 70 3c 46 54 53 33 5f 56 41  char *)p<FTS3_VA
36b0: 52 49 4e 54 5f 4d 41 58 20 29 7b 0a 20 20 20 20  RINT_MAX ){.    
36c0: 78 20 2b 3d 20 79 20 2a 20 28 2a 71 2b 2b 20 26  x += y * (*q++ &
36d0: 20 30 78 37 66 29 3b 0a 20 20 20 20 79 20 3c 3c   0x7f);.    y <<
36e0: 3d 20 37 3b 0a 20 20 7d 0a 20 20 78 20 2b 3d 20  = 7;.  }.  x += 
36f0: 79 20 2a 20 28 2a 71 2b 2b 29 3b 0a 20 20 2a 76  y * (*q++);.  *v
3700: 20 3d 20 28 73 71 6c 69 74 65 5f 69 6e 74 36 34   = (sqlite_int64
3710: 29 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  ) x;.  return (i
3720: 6e 74 29 20 28 71 20 2d 20 28 75 6e 73 69 67 6e  nt) (q - (unsign
3730: 65 64 20 63 68 61 72 20 2a 29 70 29 3b 0a 7d 0a  ed char *)p);.}.
3740: 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74  ./*.** Similar t
3750: 6f 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  o sqlite3Fts3Get
3760: 56 61 72 69 6e 74 28 29 2c 20 65 78 63 65 70 74  Varint(), except
3770: 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
3780: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
3790: 20 61 0a 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74   a.** 32-bit int
37a0: 65 67 65 72 20 62 65 66 6f 72 65 20 69 74 20 69  eger before it i
37b0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
37c0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  nt sqlite3Fts3Ge
37d0: 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20  tVarint32(const 
37e0: 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69  char *p, int *pi
37f0: 29 7b 0a 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ){. sqlite_int64
3800: 20 69 3b 0a 20 69 6e 74 20 72 65 74 20 3d 20 73   i;. int ret = s
3810: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
3820: 69 6e 74 28 70 2c 20 26 69 29 3b 0a 20 2a 70 69  int(p, &i);. *pi
3830: 20 3d 20 28 69 6e 74 29 20 69 3b 0a 20 72 65 74   = (int) i;. ret
3840: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
3850: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3860: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
3870: 75 69 72 65 64 20 74 6f 20 65 6e 63 6f 64 65 20  uired to encode 
3880: 76 20 61 73 20 61 20 76 61 72 69 6e 74 0a 2a 2f  v as a varint.*/
3890: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
38a0: 56 61 72 69 6e 74 4c 65 6e 28 73 71 6c 69 74 65  VarintLen(sqlite
38b0: 33 5f 75 69 6e 74 36 34 20 76 29 7b 0a 20 20 69  3_uint64 v){.  i
38c0: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 64 6f 7b 0a  nt i = 0;.  do{.
38d0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 76 20 3e      i++;.    v >
38e0: 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65 28 20  >= 7;.  }while( 
38f0: 76 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  v!=0 );.  return
3900: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   i;.}../*.** Con
3910: 76 65 72 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c  vert an SQL-styl
3920: 65 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e quoted string 
3930: 69 6e 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74  into a normal st
3940: 72 69 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e 67  ring by removing
3950: 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68  .** the quote ch
3960: 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 63  aracters.  The c
3970: 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e  onversion is don
3980: 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20  e in-place.  If 
3990: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65  the.** input doe
39a0: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
39b0: 20 61 20 71 75 6f 74 65 20 63 68 61 72 61 63 74   a quote charact
39c0: 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  er, then this ro
39d0: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f  utine.** is a no
39e0: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  -op..**.** Examp
39f0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22  les:.**.**     "
3a00: 61 62 63 22 20 20 20 62 65 63 6f 6d 65 73 20 20  abc"   becomes  
3a10: 20 61 62 63 0a 2a 2a 20 20 20 20 20 27 78 79 7a   abc.**     'xyz
3a20: 27 20 20 20 62 65 63 6f 6d 65 73 20 20 20 78 79  '   becomes   xy
3a30: 7a 0a 2a 2a 20 20 20 20 20 5b 70 71 72 5d 20 20  z.**     [pqr]  
3a40: 20 62 65 63 6f 6d 65 73 20 20 20 70 71 72 0a 2a   becomes   pqr.*
3a50: 2a 20 20 20 20 20 60 6d 6e 6f 60 20 20 20 62 65  *     `mno`   be
3a60: 63 6f 6d 65 73 20 20 20 6d 6e 6f 0a 2a 2a 0a 2a  comes   mno.**.*
3a70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
3a80: 73 33 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a  s3Dequote(char *
3a90: 7a 29 7b 0a 20 20 63 68 61 72 20 71 75 6f 74 65  z){.  char quote
3aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ab0: 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65 20 63        /* Quote c
3ac0: 68 61 72 61 63 74 65 72 20 28 69 66 20 61 6e 79  haracter (if any
3ad0: 20 29 20 2a 2f 0a 0a 20 20 71 75 6f 74 65 20 3d   ) */..  quote =
3ae0: 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 71 75 6f   z[0];.  if( quo
3af0: 74 65 3d 3d 27 5b 27 20 7c 7c 20 71 75 6f 74 65  te=='[' || quote
3b00: 3d 3d 27 5c 27 27 20 7c 7c 20 71 75 6f 74 65 3d  =='\'' || quote=
3b10: 3d 27 22 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27  ='"' || quote=='
3b20: 60 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  `' ){.    int iI
3b30: 6e 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  n = 1;          
3b40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3b50: 20 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74 6f   of next byte to
3b60: 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 70 75 74   read from input
3b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74   */.    int iOut
3b80: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
3b90: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
3ba0: 66 20 6e 65 78 74 20 62 79 74 65 20 74 6f 20 77  f next byte to w
3bb0: 72 69 74 65 20 74 6f 20 6f 75 74 70 75 74 20 2a  rite to output *
3bc0: 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  /..    /* If the
3bd0: 20 66 69 72 73 74 20 62 79 74 65 20 77 61 73 20   first byte was 
3be0: 61 20 27 5b 27 2c 20 74 68 65 6e 20 74 68 65 20  a '[', then the 
3bf0: 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68 61 72  close-quote char
3c00: 61 63 74 65 72 20 69 73 20 61 20 27 5d 27 20 2a  acter is a ']' *
3c10: 2f 0a 20 20 20 20 69 66 28 20 71 75 6f 74 65 3d  /.    if( quote=
3c20: 3d 27 5b 27 20 29 20 71 75 6f 74 65 20 3d 20 27  ='[' ) quote = '
3c30: 5d 27 3b 20 20 0a 0a 20 20 20 20 77 68 69 6c 65  ]';  ..    while
3c40: 28 20 41 4c 57 41 59 53 28 7a 5b 69 49 6e 5d 29  ( ALWAYS(z[iIn])
3c50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
3c60: 69 49 6e 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20  iIn]==quote ){. 
3c70: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 49 6e         if( z[iIn
3c80: 2b 31 5d 21 3d 71 75 6f 74 65 20 29 20 62 72 65  +1]!=quote ) bre
3c90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 5b 69 4f  ak;.        z[iO
3ca0: 75 74 2b 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20  ut++] = quote;. 
3cb0: 20 20 20 20 20 20 20 69 49 6e 20 2b 3d 20 32 3b         iIn += 2;
3cc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3cd0: 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20        z[iOut++] 
3ce0: 3d 20 7a 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20  = z[iIn++];.    
3cf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
3d00: 69 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  iOut] = '\0';.  
3d10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
3d20: 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20  a single varint 
3d30: 66 72 6f 6d 20 74 68 65 20 64 6f 63 6c 69 73 74  from the doclist
3d40: 20 61 74 20 2a 70 70 20 61 6e 64 20 61 64 76 61   at *pp and adva
3d50: 6e 63 65 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  nce *pp to point
3d60: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
3d70: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
3d80: 6e 64 20 6f 66 20 74 68 65 20 76 61 72 69 6e 74  nd of the varint
3d90: 2e 20 20 41 64 64 20 74 68 65 20 76 61 6c 75 65  .  Add the value
3da0: 20 6f 66 20 74 68 65 20 76 61 72 69 6e 74 0a 2a   of the varint.*
3db0: 2a 20 74 6f 20 2a 70 56 61 6c 2e 0a 2a 2f 0a 73  * to *pVal..*/.s
3dc0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 47  tatic void fts3G
3dd0: 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 63 68  etDeltaVarint(ch
3de0: 61 72 20 2a 2a 70 70 2c 20 73 71 6c 69 74 65 33  ar **pp, sqlite3
3df0: 5f 69 6e 74 36 34 20 2a 70 56 61 6c 29 7b 0a 20  _int64 *pVal){. 
3e00: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
3e10: 56 61 6c 3b 0a 20 20 2a 70 70 20 2b 3d 20 73 71  Val;.  *pp += sq
3e20: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
3e30: 6e 74 28 2a 70 70 2c 20 26 69 56 61 6c 29 3b 0a  nt(*pp, &iVal);.
3e40: 20 20 2a 70 56 61 6c 20 2b 3d 20 69 56 61 6c 3b    *pVal += iVal;
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 20 6c 6f 6e  .}../*.** As lon
3e60: 67 20 61 73 20 2a 70 70 20 68 61 73 20 6e 6f 74  g as *pp has not
3e70: 20 72 65 61 63 68 65 64 20 69 74 73 20 65 6e 64   reached its end
3e80: 20 28 70 45 6e 64 29 2c 20 74 68 65 6e 20 64 6f   (pEnd), then do
3e90: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 61 73 20   the same.** as 
3ea0: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
3eb0: 6e 74 28 29 3a 20 72 65 61 64 20 61 20 73 69 6e  nt(): read a sin
3ec0: 67 6c 65 20 76 61 72 69 6e 74 20 61 6e 64 20 61  gle varint and a
3ed0: 64 64 20 69 74 20 74 6f 20 2a 70 56 61 6c 2e 0a  dd it to *pVal..
3ee0: 2a 2a 20 42 75 74 20 69 66 20 77 65 20 68 61 76  ** But if we hav
3ef0: 65 20 72 65 61 63 68 65 64 20 74 68 65 20 65 6e  e reached the en
3f00: 64 20 6f 66 20 74 68 65 20 76 61 72 69 6e 74 2c  d of the varint,
3f10: 20 6a 75 73 74 20 73 65 74 20 2a 70 70 3d 30 20   just set *pp=0 
3f20: 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 20 2a 70 56  and.** leave *pV
3f30: 61 6c 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  al unchanged..*/
3f40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
3f50: 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 32  3GetDeltaVarint2
3f60: 28 63 68 61 72 20 2a 2a 70 70 2c 20 63 68 61 72  (char **pp, char
3f70: 20 2a 70 45 6e 64 2c 20 73 71 6c 69 74 65 33 5f   *pEnd, sqlite3_
3f80: 69 6e 74 36 34 20 2a 70 56 61 6c 29 7b 0a 20 20  int64 *pVal){.  
3f90: 69 66 28 20 2a 70 70 3e 3d 70 45 6e 64 20 29 7b  if( *pp>=pEnd ){
3fa0: 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
3fb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 33 47  }else{.    fts3G
3fc0: 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 70 70  etDeltaVarint(pp
3fd0: 2c 20 70 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pVal);.  }.}..
3fe0: 2f 2a 0a 2a 2a 20 54 68 65 20 78 44 69 73 63 6f  /*.** The xDisco
3ff0: 6e 6e 65 63 74 28 29 20 76 69 72 74 75 61 6c 20  nnect() virtual 
4000: 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f  table method..*/
4010: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
4020: 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64  DisconnectMethod
4030: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
4040: 56 74 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62  Vtab){.  Fts3Tab
4050: 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62  le *p = (Fts3Tab
4060: 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e  le *)pVtab;.  in
4070: 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
4080: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
4090: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
40a0: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20  p->pSegments==0 
40b0: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e  );..  /* Free an
40c0: 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
40d0: 6d 65 6e 74 73 20 68 65 6c 64 20 2a 2f 0a 20 20  ments held */.  
40e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 53 69 7a 65 6f  for(i=0; i<Sizeo
40f0: 66 41 72 72 61 79 28 70 2d 3e 61 53 74 6d 74 29  fArray(p->aStmt)
4100: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
4110: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
4120: 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aStmt[i]);.  }. 
4130: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
4140: 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 29 3b 0a  >zSegmentsTbl);.
4150: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
4160: 20 74 6f 6b 65 6e 69 7a 65 72 20 64 65 73 74 72   tokenizer destr
4170: 75 63 74 6f 72 20 74 6f 20 66 72 65 65 20 74 68  uctor to free th
4180: 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 2a 2f 0a  e tokenizer. */.
4190: 20 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2d    p->pTokenizer-
41a0: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73 74 72  >pModule->xDestr
41b0: 6f 79 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72  oy(p->pTokenizer
41c0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
41d0: 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
41e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
41f0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 6f 6e  .** Construct on
4200: 65 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20 73 74  e or more SQL st
4210: 61 74 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  atements from th
4220: 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  e format string 
4230: 67 69 76 65 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  given.** and the
4240: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 6f 73 65  n evaluate those
4250: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 54 68 65   statements. The
4260: 20 73 75 63 63 65 73 73 20 63 6f 64 65 20 69 73   success code is
4270: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
4280: 20 2a 70 52 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   *pRc..**.** If 
4290: 2a 70 52 63 20 69 73 20 69 6e 69 74 69 61 6c 6c  *pRc is initiall
42a0: 79 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  y non-zero then 
42b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
42c0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
42d0: 69 63 20 76 6f 69 64 20 66 74 73 33 44 62 45 78  ic void fts3DbEx
42e0: 65 63 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  ec(.  int *pRc, 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4300: 53 75 63 63 65 73 73 20 63 6f 64 65 20 2a 2f 0a  Success code */.
4310: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
4320: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4330: 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 6f  base in which to
4340: 20 72 75 6e 20 53 51 4c 20 2a 2f 0a 20 20 63 6f   run SQL */.  co
4350: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
4360: 74 2c 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 73  t,   /* Format s
4370: 74 72 69 6e 67 20 66 6f 72 20 53 51 4c 20 2a 2f  tring for SQL */
4380: 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  .  ...          
4390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
43a0: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 6f  uments to the fo
43b0: 72 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rmat string */.)
43c0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
43d0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
43e0: 69 66 28 20 2a 70 52 63 20 29 20 72 65 74 75 72  if( *pRc ) retur
43f0: 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  n;.  va_start(ap
4400: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
4410: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  ql = sqlite3_vmp
4420: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
4430: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
4440: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
4450: 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51  ){.    *pRc = SQ
4460: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
4470: 6c 73 65 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  lse{.    *pRc = 
4480: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
4490: 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
44a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
44b0: 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(zSql);.  }.}..
44c0: 2f 2a 0a 2a 2a 20 54 68 65 20 78 44 65 73 74 72  /*.** The xDestr
44d0: 6f 79 28 29 20 76 69 72 74 75 61 6c 20 74 61 62  oy() virtual tab
44e0: 6c 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  le method..*/.st
44f0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 73  atic int fts3Des
4500: 74 72 6f 79 4d 65 74 68 6f 64 28 73 71 6c 69 74  troyMethod(sqlit
4510: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
4520: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4530: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
4540: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
4550: 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c  de */.  Fts3Tabl
4560: 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
4570: 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c  e *)pVtab;.  sql
4580: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4590: 3b 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  ;..  /* Drop the
45a0: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 20 2a   shadow tables *
45b0: 2f 0a 20 20 66 74 73 33 44 62 45 78 65 63 28 26  /.  fts3DbExec(&
45c0: 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20 54 41  rc, db, "DROP TA
45d0: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 25 51  BLE IF EXISTS %Q
45e0: 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22 2c 20  .'%q_content'", 
45f0: 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
4600: 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65 63 28  );.  fts3DbExec(
4610: 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20 54  &rc, db, "DROP T
4620: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 25  ABLE IF EXISTS %
4630: 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 22  Q.'%q_segments'"
4640: 2c 20 70 2d 3e 7a 44 62 2c 70 2d 3e 7a 4e 61 6d  , p->zDb,p->zNam
4650: 65 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65 63  e);.  fts3DbExec
4660: 28 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20  (&rc, db, "DROP 
4670: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
4680: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c  %Q.'%q_segdir'",
4690: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
46a0: 65 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65 63  e);.  fts3DbExec
46b0: 28 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20  (&rc, db, "DROP 
46c0: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
46d0: 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 22  %Q.'%q_docsize'"
46e0: 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61  , p->zDb, p->zNa
46f0: 6d 65 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65  me);.  fts3DbExe
4700: 63 28 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50  c(&rc, db, "DROP
4710: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
4720: 20 25 51 2e 27 25 71 5f 73 74 61 74 27 22 2c 20   %Q.'%q_stat'", 
4730: 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
4740: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65 72  );..  /* If ever
4750: 79 74 68 69 6e 67 20 68 61 73 20 77 6f 72 6b 65  ything has worke
4760: 64 2c 20 69 6e 76 6f 6b 65 20 66 74 73 33 44 69  d, invoke fts3Di
4770: 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 29  sconnectMethod()
4780: 20 74 6f 20 66 72 65 65 20 74 68 65 0a 20 20 2a   to free the.  *
4790: 2a 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  * memory associa
47a0: 74 65 64 20 77 69 74 68 20 74 68 65 20 46 74 73  ted with the Fts
47b0: 33 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  3Table structure
47c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
47d0: 54 45 5f 4f 4b 2e 0a 20 20 2a 2a 20 4f 74 68 65  TE_OK..  ** Othe
47e0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
47f0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
4800: 64 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  de..  */.  retur
4810: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
4820: 20 3f 20 66 74 73 33 44 69 73 63 6f 6e 6e 65 63   ? fts3Disconnec
4830: 74 4d 65 74 68 6f 64 28 70 56 74 61 62 29 20 3a  tMethod(pVtab) :
4840: 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
4850: 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64  Invoke sqlite3_d
4860: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 74 6f  eclare_vtab() to
4870: 20 64 65 63 6c 61 72 65 20 74 68 65 20 73 63 68   declare the sch
4880: 65 6d 61 20 66 6f 72 20 74 68 65 20 46 54 53 33  ema for the FTS3
4890: 20 74 61 62 6c 65 0a 2a 2a 20 70 61 73 73 65 64   table.** passed
48a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
48b0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
48c0: 64 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20  done as part of 
48d0: 74 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 0a 2a  the xConnect().*
48e0: 2a 20 61 6e 64 20 78 43 72 65 61 74 65 28 29 20  * and xCreate() 
48f0: 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 20 49  methods..**.** I
4900: 66 20 2a 70 52 63 20 69 73 20 6e 6f 6e 2d 7a 65  f *pRc is non-ze
4910: 72 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ro when this fun
4920: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
4930: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20   it is a no-op. 
4940: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
4950: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
4960: 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
4970: 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65  or code is store
4980: 64 20 69 6e 20 2a 70 52 63 0a 2a 2a 20 62 65 66  d in *pRc.** bef
4990: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
49a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
49b0: 73 33 44 65 63 6c 61 72 65 56 74 61 62 28 69 6e  s3DeclareVtab(in
49c0: 74 20 2a 70 52 63 2c 20 46 74 73 33 54 61 62 6c  t *pRc, Fts3Tabl
49d0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 2a 70 52  e *p){.  if( *pR
49e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
49f0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
4a20: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
4a30: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
4a50: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
4a60: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  /* SQL statement
4a90: 20 70 61 73 73 65 64 20 74 6f 20 64 65 63 6c 61   passed to decla
4aa0: 72 65 5f 76 74 61 62 28 29 20 2a 2f 0a 20 20 20  re_vtab() */.   
4ab0: 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b 20 20 20   char *zCols;   
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ad0: 2a 20 4c 69 73 74 20 6f 66 20 75 73 65 72 20 64  * List of user d
4ae0: 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 2a  efined columns *
4af0: 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  /..    /* Create
4b00: 20 61 20 6c 69 73 74 20 6f 66 20 75 73 65 72 20   a list of user 
4b10: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20  columns for the 
4b20: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
4b30: 0a 20 20 20 20 7a 43 6f 6c 73 20 3d 20 73 71 6c  .    zCols = sql
4b40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51  ite3_mprintf("%Q
4b50: 2c 20 22 2c 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e  , ", p->azColumn
4b60: 5b 30 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [0]);.    for(i=
4b70: 31 3b 20 7a 43 6f 6c 73 20 26 26 20 69 3c 70 2d  1; zCols && i<p-
4b80: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
4b90: 20 20 20 20 20 20 7a 43 6f 6c 73 20 3d 20 73 71        zCols = sq
4ba0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
4bb0: 7a 25 51 2c 20 22 2c 20 7a 43 6f 6c 73 2c 20 70  z%Q, ", zCols, p
4bc0: 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a  ->azColumn[i]);.
4bd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
4be0: 65 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20 22  eate the whole "
4bf0: 43 52 45 41 54 45 20 54 41 42 4c 45 22 20 73 74  CREATE TABLE" st
4c00: 61 74 65 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  atement to pass 
4c10: 74 6f 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 20  to SQLite */.   
4c20: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
4c30: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
4c40: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78   "CREATE TABLE x
4c50: 28 25 73 20 25 51 20 48 49 44 44 45 4e 2c 20 64  (%s %Q HIDDEN, d
4c60: 6f 63 69 64 20 48 49 44 44 45 4e 29 22 2c 20 7a  ocid HIDDEN)", z
4c70: 43 6f 6c 73 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20  Cols, p->zName. 
4c80: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a     );.    if( !z
4c90: 43 6f 6c 73 20 7c 7c 20 21 7a 53 71 6c 20 29 7b  Cols || !zSql ){
4ca0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4cb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
4cc0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
4cd0: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
4ce0: 76 74 61 62 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  vtab(p->db, zSql
4cf0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
4d00: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4d20: 65 65 28 7a 43 6f 6c 73 29 3b 0a 20 20 20 20 2a  ee(zCols);.    *
4d30: 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  pRc = rc;.  }.}.
4d40: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
4d50: 65 20 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20  e backing store 
4d60: 74 61 62 6c 65 73 20 28 25 5f 63 6f 6e 74 65 6e  tables (%_conten
4d70: 74 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20 61 6e  t, %_segments an
4d80: 64 20 25 5f 73 65 67 64 69 72 29 0a 2a 2a 20 72  d %_segdir).** r
4d90: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 46  equired by the F
4da0: 54 53 33 20 74 61 62 6c 65 20 70 61 73 73 65 64  TS3 table passed
4db0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
4dc0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 64  ument. This is d
4dd0: 6f 6e 65 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  one.** as part o
4de0: 66 20 74 68 65 20 76 74 61 62 20 78 43 72 65 61  f the vtab xCrea
4df0: 74 65 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  te() method..**.
4e00: 2a 2a 20 49 66 20 74 68 65 20 70 2d 3e 62 48 61  ** If the p->bHa
4e10: 73 44 6f 63 73 69 7a 65 20 62 6f 6f 6c 65 61 6e  sDocsize boolean
4e20: 20 69 73 20 74 72 75 65 20 28 69 6e 64 69 63 61   is true (indica
4e30: 74 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 69  ting that this i
4e40: 73 20 61 6e 0a 2a 2a 20 46 54 53 34 20 74 61 62  s an.** FTS4 tab
4e50: 6c 65 2c 20 6e 6f 74 20 61 6e 20 46 54 53 33 20  le, not an FTS3 
4e60: 74 61 62 6c 65 29 20 74 68 65 6e 20 61 6c 73 6f  table) then also
4e70: 20 63 72 65 61 74 65 20 74 68 65 20 25 5f 64 6f   create the %_do
4e80: 63 73 69 7a 65 20 61 6e 64 0a 2a 2a 20 25 5f 73  csize and.** %_s
4e90: 74 61 74 20 74 61 62 6c 65 73 20 72 65 71 75 69  tat tables requi
4ea0: 72 65 64 20 62 79 20 46 54 53 34 2e 0a 2a 2f 0a  red by FTS4..*/.
4eb0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 43  static int fts3C
4ec0: 72 65 61 74 65 54 61 62 6c 65 73 28 46 74 73 33  reateTables(Fts3
4ed0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
4ee0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f00: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
4f10: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f30: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
4f40: 69 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  iable */.  char 
4f50: 2a 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 3b 20 20  *zContentCols;  
4f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4f70: 6c 75 6d 6e 73 20 6f 66 20 25 5f 63 6f 6e 74 65  lumns of %_conte
4f80: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  nt table */.  sq
4f90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4fa0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
4fb0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
4fc0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
4fd0: 2a 20 43 72 65 61 74 65 20 61 20 6c 69 73 74 20  * Create a list 
4fe0: 6f 66 20 75 73 65 72 20 63 6f 6c 75 6d 6e 73 20  of user columns 
4ff0: 66 6f 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  for the content 
5000: 74 61 62 6c 65 20 2a 2f 0a 20 20 7a 43 6f 6e 74  table */.  zCont
5010: 65 6e 74 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  entCols = sqlite
5020: 33 5f 6d 70 72 69 6e 74 66 28 22 64 6f 63 69 64  3_mprintf("docid
5030: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5040: 20 4b 45 59 22 29 3b 0a 20 20 66 6f 72 28 69 3d   KEY");.  for(i=
5050: 30 3b 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 20  0; zContentCols 
5060: 26 26 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b  && i<p->nColumn;
5070: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
5080: 2a 7a 20 3d 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e  *z = p->azColumn
5090: 5b 69 5d 3b 0a 20 20 20 20 7a 43 6f 6e 74 65 6e  [i];.    zConten
50a0: 74 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f  tCols = sqlite3_
50b0: 6d 70 72 69 6e 74 66 28 22 25 7a 2c 20 27 63 25  mprintf("%z, 'c%
50c0: 64 25 71 27 22 2c 20 7a 43 6f 6e 74 65 6e 74 43  d%q'", zContentC
50d0: 6f 6c 73 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a  ols, i, z);.  }.
50e0: 20 20 69 66 28 20 7a 43 6f 6e 74 65 6e 74 43 6f    if( zContentCo
50f0: 6c 73 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  ls==0 ) rc = SQL
5100: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 2f 2a  ITE_NOMEM;..  /*
5110: 20 43 72 65 61 74 65 20 74 68 65 20 63 6f 6e 74   Create the cont
5120: 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
5130: 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64  ts3DbExec(&rc, d
5140: 62 2c 20 0a 20 20 20 20 20 22 43 52 45 41 54 45  b, .     "CREATE
5150: 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 63 6f   TABLE %Q.'%q_co
5160: 6e 74 65 6e 74 27 28 25 73 29 22 2c 0a 20 20 20  ntent'(%s)",.   
5170: 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
5180: 6d 65 2c 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73  me, zContentCols
5190: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  .  );.  sqlite3_
51a0: 66 72 65 65 28 7a 43 6f 6e 74 65 6e 74 43 6f 6c  free(zContentCol
51b0: 73 29 3b 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  s);.  /* Create 
51c0: 6f 74 68 65 72 20 74 61 62 6c 65 73 20 2a 2f 0a  other tables */.
51d0: 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72 63    fts3DbExec(&rc
51e0: 2c 20 64 62 2c 20 0a 20 20 20 20 20 20 22 43 52  , db, .      "CR
51f0: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 27 25  EATE TABLE %Q.'%
5200: 71 5f 73 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63  q_segments'(bloc
5210: 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  kid INTEGER PRIM
5220: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
5230: 4c 4f 42 29 3b 22 2c 0a 20 20 20 20 20 20 70 2d  LOB);",.      p-
5240: 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20  >zDb, p->zName. 
5250: 20 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65 63   );.  fts3DbExec
5260: 28 26 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20  (&rc, db, .     
5270: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
5280: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 28 22 0a  Q.'%q_segdir'(".
5290: 20 20 20 20 20 20 20 20 22 6c 65 76 65 6c 20 49          "level I
52a0: 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20 20  NTEGER,".       
52b0: 20 22 69 64 78 20 49 4e 54 45 47 45 52 2c 22 0a   "idx INTEGER,".
52c0: 20 20 20 20 20 20 20 20 22 73 74 61 72 74 5f 62          "start_b
52d0: 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 22 0a 20  lock INTEGER,". 
52e0: 20 20 20 20 20 20 20 22 6c 65 61 76 65 73 5f 65         "leaves_e
52f0: 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52  nd_block INTEGER
5300: 2c 22 0a 20 20 20 20 20 20 20 20 22 65 6e 64 5f  ,".        "end_
5310: 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 22 0a  block INTEGER,".
5320: 20 20 20 20 20 20 20 20 22 72 6f 6f 74 20 42 4c          "root BL
5330: 4f 42 2c 22 0a 20 20 20 20 20 20 20 20 22 50 52  OB,".        "PR
5340: 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c 2c  IMARY KEY(level,
5350: 20 69 64 78 29 22 0a 20 20 20 20 20 20 22 29 3b   idx)".      ");
5360: 22 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c  ",.      p->zDb,
5370: 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20   p->zName.  );. 
5380: 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73   if( p->bHasDocs
5390: 69 7a 65 20 29 7b 0a 20 20 20 20 66 74 73 33 44  ize ){.    fts3D
53a0: 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a  bExec(&rc, db, .
53b0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
53c0: 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 64 6f 63  TABLE %Q.'%q_doc
53d0: 73 69 7a 65 27 28 64 6f 63 69 64 20 49 4e 54 45  size'(docid INTE
53e0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
53f0: 20 73 69 7a 65 20 42 4c 4f 42 29 3b 22 2c 0a 20   size BLOB);",. 
5400: 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70         p->zDb, p
5410: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
5420: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73   }.  if( p->bHas
5430: 53 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73 33  Stat ){.    fts3
5440: 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20  DbExec(&rc, db, 
5450: 0a 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45  .        "CREATE
5460: 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73 74   TABLE %Q.'%q_st
5470: 61 74 27 28 69 64 20 49 4e 54 45 47 45 52 20 50  at'(id INTEGER P
5480: 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 61 6c 75  RIMARY KEY, valu
5490: 65 20 42 4c 4f 42 29 3b 22 2c 0a 20 20 20 20 20  e BLOB);",.     
54a0: 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e     p->zDb, p->zN
54b0: 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  ame.    );.  }. 
54c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
54d0: 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63  *.** Store the c
54e0: 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
54f0: 70 61 67 65 2d 73 69 7a 65 20 69 6e 20 62 79 74  page-size in byt
5500: 65 73 20 69 6e 20 70 2d 3e 6e 50 67 73 7a 2e 0a  es in p->nPgsz..
5510: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
5520: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
5530: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5540: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
5550: 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72  no-op. .** Other
5560: 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
5570: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
5580: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
5590: 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 52 63  s stored in *pRc
55a0: 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
55b0: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
55c0: 76 6f 69 64 20 66 74 73 33 44 61 74 61 62 61 73  void fts3Databas
55d0: 65 50 61 67 65 53 69 7a 65 28 69 6e 74 20 2a 70  ePageSize(int *p
55e0: 52 63 2c 20 46 74 73 33 54 61 62 6c 65 20 2a 70  Rc, Fts3Table *p
55f0: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
5600: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5610: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5630: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
5640: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 2f 2a 20 53 51 4c 20 74 65 78 74 20 22 50    /* SQL text "P
5670: 52 41 47 4d 41 20 25 51 2e 70 61 67 65 5f 73 69  RAGMA %Q.page_si
5680: 7a 65 22 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ze" */.    sqlit
5690: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
56b0: 69 6c 65 64 20 22 50 52 41 47 4d 41 20 25 51 2e  iled "PRAGMA %Q.
56c0: 70 61 67 65 5f 73 69 7a 65 22 20 73 74 61 74 65  page_size" state
56d0: 6d 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 20 20 7a  ment */.  .    z
56e0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
56f0: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25 51  rintf("PRAGMA %Q
5700: 2e 70 61 67 65 5f 73 69 7a 65 22 2c 20 70 2d 3e  .page_size", p->
5710: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  zDb);.    if( !z
5720: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Sql ){.      rc 
5730: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
5760: 65 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 53 71  epare(p->db, zSq
5770: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
5780: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
5790: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
57a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
57b0: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
57c0: 20 20 20 70 2d 3e 6e 50 67 73 7a 20 3d 20 73 71     p->nPgsz = sq
57d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
57e0: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
57f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5800: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
5810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5820: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
5830: 50 67 73 7a 3e 30 20 7c 7c 20 72 63 21 3d 53 51  Pgsz>0 || rc!=SQ
5840: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73  LITE_OK );.    s
5850: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
5860: 29 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  );.    *pRc = rc
5870: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 22  ;.  }.}../*.** "
5880: 53 70 65 63 69 61 6c 22 20 46 54 53 34 20 61 72  Special" FTS4 ar
5890: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6c 75  guments are colu
58a0: 6d 6e 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  mn specification
58b0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
58c0: 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
58d0: 20 3c 6b 65 79 3e 20 3d 20 3c 76 61 6c 75 65 3e   <key> = <value>
58e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 61 79  .**.** There may
58f0: 20 6e 6f 74 20 62 65 20 77 68 69 74 65 73 70 61   not be whitespa
5900: 63 65 20 73 75 72 72 6f 75 6e 64 69 6e 67 20 74  ce surrounding t
5910: 68 65 20 22 3d 22 20 63 68 61 72 61 63 74 65 72  he "=" character
5920: 2e 20 54 68 65 20 3c 76 61 6c 75 65 3e 20 0a 2a  . The <value> .*
5930: 2a 20 74 65 72 6d 20 6d 61 79 20 62 65 20 71 75  * term may be qu
5940: 6f 74 65 64 2c 20 62 75 74 20 74 68 65 20 3c 6b  oted, but the <k
5950: 65 79 3e 20 6d 61 79 20 6e 6f 74 2e 0a 2a 2f 0a  ey> may not..*/.
5960: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
5970: 73 53 70 65 63 69 61 6c 43 6f 6c 75 6d 6e 28 0a  sSpecialColumn(.
5980: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
5990: 20 0a 20 20 69 6e 74 20 2a 70 6e 4b 65 79 2c 0a   .  int *pnKey,.
59a0: 20 20 63 68 61 72 20 2a 2a 70 7a 56 61 6c 75 65    char **pzValue
59b0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c  .){.  char *zVal
59c0: 75 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ue;.  const char
59d0: 20 2a 7a 43 73 72 20 3d 20 7a 3b 0a 0a 20 20 77   *zCsr = z;..  w
59e0: 68 69 6c 65 28 20 2a 7a 43 73 72 21 3d 27 3d 27  hile( *zCsr!='='
59f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 43 73   ){.    if( *zCs
5a00: 72 3d 3d 27 5c 30 27 20 29 20 72 65 74 75 72 6e  r=='\0' ) return
5a10: 20 30 3b 0a 20 20 20 20 7a 43 73 72 2b 2b 3b 0a   0;.    zCsr++;.
5a20: 20 20 7d 0a 0a 20 20 2a 70 6e 4b 65 79 20 3d 20    }..  *pnKey = 
5a30: 28 69 6e 74 29 28 7a 43 73 72 2d 7a 29 3b 0a 20  (int)(zCsr-z);. 
5a40: 20 7a 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65   zValue = sqlite
5a50: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
5a60: 26 7a 43 73 72 5b 31 5d 29 3b 0a 20 20 69 66 28  &zCsr[1]);.  if(
5a70: 20 7a 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 73   zValue ){.    s
5a80: 71 6c 69 74 65 33 46 74 73 33 44 65 71 75 6f 74  qlite3Fts3Dequot
5a90: 65 28 7a 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 20  e(zValue);.  }. 
5aa0: 20 2a 70 7a 56 61 6c 75 65 20 3d 20 7a 56 61 6c   *pzValue = zVal
5ab0: 75 65 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ue;.  return 1;.
5ac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
5ad0: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d  nction is the im
5ae0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5af0: 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63  both the xConnec
5b00: 74 20 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a  t and xCreate.**
5b10: 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
5b20: 46 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62  FTS3 virtual tab
5b30: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72  le..**.** The ar
5b40: 67 76 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  gv[] array conta
5b50: 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ins the followin
5b60: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b  g:.**.**   argv[
5b70: 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e  0]   -> module n
5b80: 61 6d 65 20 20 28 22 66 74 73 33 22 20 6f 72 20  ame  ("fts3" or 
5b90: 22 66 74 73 34 22 29 0a 2a 2a 20 20 20 61 72 67  "fts4").**   arg
5ba0: 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61  v[1]   -> databa
5bb0: 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67  se name.**   arg
5bc0: 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20  v[2]   -> table 
5bd0: 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e  name.**   argv[.
5be0: 2e 2e 5d 20 2d 3e 20 22 63 6f 6c 75 6d 6e 20 6e  ..] -> "column n
5bf0: 61 6d 65 22 20 61 6e 64 20 6f 74 68 65 72 20 6d  ame" and other m
5c00: 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 20 66  odule argument f
5c10: 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ields..*/.static
5c20: 20 69 6e 74 20 66 74 73 33 49 6e 69 74 56 74 61   int fts3InitVta
5c30: 62 28 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  b(.  int isCreat
5c40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5c50: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
5c60: 20 78 43 72 65 61 74 65 2c 20 66 61 6c 73 65 20   xCreate, false 
5c70: 66 6f 72 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a  for xConnect */.
5c80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 20 2f 2a 20 54 68 65 20 53 51 4c 69 74 65 20    /* The SQLite 
5cb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5cc0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
5cd0: 41 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Aux,            
5ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
5cf0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
5d00: 67 20 74 6f 6b 65 6e 69 7a 65 72 73 20 2a 2f 0a  g tokenizers */.
5d10: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
5d40: 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20  lements in argv 
5d50: 61 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  array */.  const
5d60: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61   char * const *a
5d70: 72 67 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43  rgv,       /* xC
5d80: 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61  reate/xConnect a
5d90: 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f  rgument array */
5da0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
5db0: 2a 2a 70 70 56 54 61 62 2c 20 20 20 20 20 20 20  **ppVTab,       
5dc0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
5dd0: 72 65 73 75 6c 74 69 6e 67 20 76 74 61 62 20 73  resulting vtab s
5de0: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
5df0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20  .  char **pzErr 
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6e 79 20     /* Write any 
5e20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65  error message he
5e30: 72 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 48  re */.){.  Fts3H
5e40: 61 73 68 20 2a 70 48 61 73 68 20 3d 20 28 46 74  ash *pHash = (Ft
5e50: 73 33 48 61 73 68 20 2a 29 70 41 75 78 3b 0a 20  s3Hash *)pAux;. 
5e60: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20   Fts3Table *p = 
5e70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5e80: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
5e90: 6c 6c 6f 63 61 74 65 64 20 76 74 61 62 20 2a 2f  llocated vtab */
5ea0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5eb0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
5ec0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
5ed0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
5f00: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
5f10: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f   /* Size of allo
5f40: 63 61 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20  cation used for 
5f50: 2a 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  *p */.  int iCol
5f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5f70: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
5f80: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  n index */.  int
5f90: 20 6e 53 74 72 69 6e 67 20 3d 20 30 3b 20 20 20   nString = 0;   
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5fb0: 42 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  Bytes required t
5fc0: 6f 20 68 6f 6c 64 20 61 6c 6c 20 63 6f 6c 75 6d  o hold all colum
5fd0: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
5fe0: 20 6e 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20   nCol = 0;      
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6000: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
6010: 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
6020: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  le */.  char *zC
6030: 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sr;             
6040: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
6050: 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6c   for holding col
6060: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
6070: 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6090: 2a 20 42 79 74 65 73 20 72 65 71 75 69 72 65 64  * Bytes required
60a0: 20 74 6f 20 68 6f 6c 64 20 64 61 74 61 62 61 73   to hold databas
60b0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
60c0: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
60e0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
60f0: 20 68 6f 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65   hold table name
6100: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 74 73 34   */.  int isFts4
6110: 20 3d 20 28 61 72 67 76 5b 30 5d 5b 33 5d 3d 3d   = (argv[0][3]==
6120: 27 34 27 29 3b 20 2f 2a 20 54 72 75 65 20 66 6f  '4'); /* True fo
6130: 72 20 46 54 53 34 2c 20 66 61 6c 73 65 20 66 6f  r FTS4, false fo
6140: 72 20 46 54 53 33 20 2a 2f 0a 20 20 69 6e 74 20  r FTS3 */.  int 
6150: 62 4e 6f 44 6f 63 73 69 7a 65 20 3d 20 30 3b 20  bNoDocsize = 0; 
6160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6170: 72 75 65 20 74 6f 20 6f 6d 69 74 20 25 5f 64 6f  rue to omit %_do
6180: 63 73 69 7a 65 20 74 61 62 6c 65 20 2a 2f 0a 20  csize table */. 
6190: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 43   const char **aC
61a0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
61b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
61c0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73  umn names */.  s
61d0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
61e0: 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 30   *pTokenizer = 0
61f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ;        /* Toke
6200: 6e 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 74  nizer for this t
6210: 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  able */..  asser
6220: 74 28 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 30  t( strlen(argv[0
6230: 5d 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  ])==4 );.  asser
6240: 74 28 20 28 73 71 6c 69 74 65 33 5f 73 74 72 6e  t( (sqlite3_strn
6250: 69 63 6d 70 28 61 72 67 76 5b 30 5d 2c 20 22 66  icmp(argv[0], "f
6260: 74 73 34 22 2c 20 34 29 3d 3d 30 20 26 26 20 69  ts4", 4)==0 && i
6270: 73 46 74 73 34 29 0a 20 20 20 20 20 20 20 7c 7c  sFts4).       ||
6280: 20 28 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63   (sqlite3_strnic
6290: 6d 70 28 61 72 67 76 5b 30 5d 2c 20 22 66 74 73  mp(argv[0], "fts
62a0: 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 21 69 73  3", 4)==0 && !is
62b0: 46 74 73 34 29 0a 20 20 29 3b 0a 0a 20 20 6e 44  Fts4).  );..  nD
62c0: 62 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  b = (int)strlen(
62d0: 61 72 67 76 5b 31 5d 29 20 2b 20 31 3b 0a 20 20  argv[1]) + 1;.  
62e0: 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72  nName = (int)str
62f0: 6c 65 6e 28 61 72 67 76 5b 32 5d 29 20 2b 20 31  len(argv[2]) + 1
6300: 3b 0a 0a 20 20 61 43 6f 6c 20 3d 20 28 63 6f 6e  ;..  aCol = (con
6310: 73 74 20 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  st char **)sqlit
6320: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
6330: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a  (const char *) *
6340: 20 28 61 72 67 63 2d 32 29 20 29 3b 0a 20 20 69   (argc-2) );.  i
6350: 66 28 20 21 61 43 6f 6c 20 29 20 72 65 74 75 72  f( !aCol ) retur
6360: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6370: 20 20 6d 65 6d 73 65 74 28 28 76 6f 69 64 20 2a    memset((void *
6380: 29 61 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  )aCol, 0, sizeof
6390: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a  (const char *) *
63a0: 20 28 61 72 67 63 2d 32 29 29 3b 0a 0a 20 20 2f   (argc-2));..  /
63b0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
63c0: 6c 6c 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ll of the argume
63d0: 6e 74 73 20 70 61 73 73 65 64 20 62 79 20 74 68  nts passed by th
63e0: 65 20 75 73 65 72 20 74 6f 20 74 68 65 20 46 54  e user to the FT
63f0: 53 33 2f 34 0a 20 20 2a 2a 20 6d 6f 64 75 6c 65  S3/4.  ** module
6400: 20 28 69 2e 65 2e 20 61 6c 6c 20 74 68 65 20 63   (i.e. all the c
6410: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
6420: 73 70 65 63 69 61 6c 20 61 72 67 75 6d 65 6e 74  special argument
6430: 73 29 2e 20 54 68 69 73 20 6c 6f 6f 70 0a 20 20  s). This loop.  
6440: 2a 2a 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c  ** does the foll
6450: 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
6460: 20 20 20 2b 20 46 69 67 75 72 65 73 20 6f 75 74     + Figures out
6470: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6480: 6f 6c 75 6d 6e 73 20 74 68 65 20 46 54 53 58 20  olumns the FTSX 
6490: 74 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2c  table will have,
64a0: 20 61 6e 64 0a 20 20 2a 2a 20 20 20 20 20 74 68   and.  **     th
64b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
64c0: 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20  s of space that 
64d0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
64e0: 64 20 74 6f 20 73 74 6f 72 65 20 63 6f 70 69 65  d to store copie
64f0: 73 0a 20 20 2a 2a 20 20 20 20 20 6f 66 20 74 68  s.  **     of th
6500: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a  e column names..
6510: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 49 66    **.  **   + If
6520: 20 74 68 65 72 65 20 69 73 20 61 20 74 6f 6b 65   there is a toke
6530: 6e 69 7a 65 72 20 73 70 65 63 69 66 69 63 61 74  nizer specificat
6540: 69 6f 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  ion included in 
6550: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20  the arguments,. 
6560: 20 2a 2a 20 20 20 20 20 69 6e 69 74 69 61 6c 69   **     initiali
6570: 7a 65 73 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65  zes the tokenize
6580: 72 20 70 54 6f 6b 65 6e 69 7a 65 72 2e 0a 20 20  r pTokenizer..  
6590: 2a 2f 0a 20 20 66 6f 72 28 69 3d 33 3b 20 72 63  */.  for(i=3; rc
65a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
65b0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
65c0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 20 3d   char const *z =
65d0: 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 6e   argv[i];.    in
65e0: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 63 68 61 72  t nKey;.    char
65f0: 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 2f 2a 20   *zVal;..    /* 
6600: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
6610: 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 73 70 65   a tokenizer spe
6620: 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  cification */.  
6630: 20 20 69 66 28 20 21 70 54 6f 6b 65 6e 69 7a 65    if( !pTokenize
6640: 72 20 0a 20 20 20 20 20 26 26 20 73 74 72 6c 65  r .     && strle
6650: 6e 28 7a 29 3e 38 0a 20 20 20 20 20 26 26 20 30  n(z)>8.     && 0
6660: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
6670: 6d 70 28 7a 2c 20 22 74 6f 6b 65 6e 69 7a 65 22  mp(z, "tokenize"
6680: 2c 20 38 29 20 0a 20 20 20 20 20 26 26 20 30 3d  , 8) .     && 0=
6690: 3d 73 71 6c 69 74 65 33 46 74 73 33 49 73 49 64  =sqlite3Fts3IsId
66a0: 43 68 61 72 28 7a 5b 38 5d 29 0a 20 20 20 20 29  Char(z[8]).    )
66b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
66c0: 69 74 65 33 46 74 73 33 49 6e 69 74 54 6f 6b 65  ite3Fts3InitToke
66d0: 6e 69 7a 65 72 28 70 48 61 73 68 2c 20 26 7a 5b  nizer(pHash, &z[
66e0: 39 5d 2c 20 26 70 54 6f 6b 65 6e 69 7a 65 72 2c  9], &pTokenizer,
66f0: 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 0a   pzErr);.    }..
6700: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
6710: 69 74 20 69 73 20 61 6e 20 46 54 53 34 20 73 70  it is an FTS4 sp
6720: 65 63 69 61 6c 20 61 72 67 75 6d 65 6e 74 2e 20  ecial argument. 
6730: 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
6740: 69 73 46 74 73 34 20 26 26 20 66 74 73 33 49 73  isFts4 && fts3Is
6750: 53 70 65 63 69 61 6c 43 6f 6c 75 6d 6e 28 7a 2c  SpecialColumn(z,
6760: 20 26 6e 4b 65 79 2c 20 26 7a 56 61 6c 29 20 29   &nKey, &zVal) )
6770: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 56 61  {.      if( !zVa
6780: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
6790: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
67a0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 74 73          goto fts
67b0: 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 20 20 20 20  3_init_out;.    
67c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4b    }.      if( nK
67d0: 65 79 3d 3d 39 20 26 26 20 30 3d 3d 73 71 6c 69  ey==9 && 0==sqli
67e0: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20  te3_strnicmp(z, 
67f0: 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 39 29 20  "matchinfo", 9) 
6800: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
6810: 74 72 6c 65 6e 28 7a 56 61 6c 29 3d 3d 34 20 26  trlen(zVal)==4 &
6820: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
6830: 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 66 74 73  nicmp(zVal, "fts
6840: 33 22 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  3", 4) ){.      
6850: 20 20 20 20 62 4e 6f 44 6f 63 73 69 7a 65 20 3d      bNoDocsize =
6860: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
6870: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a  e{.          *pz
6880: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
6890: 72 69 6e 74 66 28 22 75 6e 72 65 63 6f 67 6e 69  rintf("unrecogni
68a0: 7a 65 64 20 6d 61 74 63 68 69 6e 66 6f 3a 20 25  zed matchinfo: %
68b0: 73 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  s", zVal);.     
68c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
68d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
68e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
68f0: 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
6900: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6910: 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61  "unrecognized pa
6920: 72 61 6d 65 74 65 72 3a 20 25 73 22 2c 20 7a 29  rameter: %s", z)
6930: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
6940: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
6950: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
6960: 65 33 5f 66 72 65 65 28 7a 56 61 6c 29 3b 0a 20  e3_free(zVal);. 
6970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68     }..    /* Oth
6980: 65 72 77 69 73 65 2c 20 74 68 65 20 61 72 67 75  erwise, the argu
6990: 6d 65 6e 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ment is a column
69a0: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 65 6c   name. */.    el
69b0: 73 65 20 7b 0a 20 20 20 20 20 20 6e 53 74 72 69  se {.      nStri
69c0: 6e 67 20 2b 3d 20 28 69 6e 74 29 28 73 74 72 6c  ng += (int)(strl
69d0: 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  en(z) + 1);.    
69e0: 20 20 61 43 6f 6c 5b 6e 43 6f 6c 2b 2b 5d 20 3d    aCol[nCol++] =
69f0: 20 7a 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   z;.    }.  }.  
6a00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6a10: 4b 20 29 20 67 6f 74 6f 20 66 74 73 33 5f 69 6e  K ) goto fts3_in
6a20: 69 74 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  it_out;..  if( n
6a30: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Col==0 ){.    as
6a40: 73 65 72 74 28 20 6e 53 74 72 69 6e 67 3d 3d 30  sert( nString==0
6a50: 20 29 3b 0a 20 20 20 20 61 43 6f 6c 5b 30 5d 20   );.    aCol[0] 
6a60: 3d 20 22 63 6f 6e 74 65 6e 74 22 3b 0a 20 20 20  = "content";.   
6a70: 20 6e 53 74 72 69 6e 67 20 3d 20 38 3b 0a 20 20   nString = 8;.  
6a80: 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 0a    nCol = 1;.  }.
6a90: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 69 7a 65  .  if( pTokenize
6aa0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
6ab0: 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
6ac0: 54 6f 6b 65 6e 69 7a 65 72 28 70 48 61 73 68 2c  Tokenizer(pHash,
6ad0: 20 22 73 69 6d 70 6c 65 22 2c 20 26 70 54 6f 6b   "simple", &pTok
6ae0: 65 6e 69 7a 65 72 2c 20 70 7a 45 72 72 29 3b 0a  enizer, pzErr);.
6af0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6b00: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 74 73  TE_OK ) goto fts
6b10: 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 20 20 7d 0a  3_init_out;.  }.
6b20: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
6b30: 69 7a 65 72 20 29 3b 0a 0a 0a 20 20 2f 2a 20 41  izer );...  /* A
6b40: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
6b50: 6c 61 74 65 20 74 68 65 20 46 74 73 33 54 61 62  late the Fts3Tab
6b60: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  le structure. */
6b70: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
6b80: 66 28 46 74 73 33 54 61 62 6c 65 29 20 2b 20 20  f(Fts3Table) +  
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
6ba0: 74 73 33 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ts3Table */.    
6bb0: 20 20 20 20 20 20 6e 43 6f 6c 20 2a 20 73 69 7a        nCol * siz
6bc0: 65 6f 66 28 63 68 61 72 20 2a 29 20 2b 20 20 20  eof(char *) +   
6bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a             /* az
6be0: 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20  Column */.      
6bf0: 20 20 20 20 6e 4e 61 6d 65 20 2b 20 20 20 20 20      nName +     
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
6c20: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e  e */.          n
6c30: 44 62 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  Db +            
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 20 20 20 2f 2a 20 7a 44 62 20 2a 2f 0a 20 20      /* zDb */.  
6c60: 20 20 20 20 20 20 20 20 6e 53 74 72 69 6e 67 3b          nString;
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c90: 53 70 61 63 65 20 66 6f 72 20 61 7a 43 6f 6c 75  Space for azColu
6ca0: 6d 6e 20 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20  mn strings */.  
6cb0: 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29  p = (Fts3Table*)
6cc0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
6cd0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  Byte);.  if( p==
6ce0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
6cf0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6d00: 67 6f 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f  goto fts3_init_o
6d10: 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
6d20: 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  (p, 0, nByte);. 
6d30: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70   p->db = db;.  p
6d40: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
6d50: 3b 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  ;.  p->nPendingD
6d60: 61 74 61 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 7a  ata = 0;.  p->az
6d70: 43 6f 6c 75 6d 6e 20 3d 20 28 63 68 61 72 20 2a  Column = (char *
6d80: 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 54  *)&p[1];.  p->pT
6d90: 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65  okenizer = pToke
6da0: 6e 69 7a 65 72 3b 0a 20 20 70 2d 3e 6e 4e 6f 64  nizer;.  p->nNod
6db0: 65 53 69 7a 65 20 3d 20 31 30 30 30 3b 0a 20 20  eSize = 1000;.  
6dc0: 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
6dd0: 74 61 20 3d 20 46 54 53 33 5f 4d 41 58 5f 50 45  ta = FTS3_MAX_PE
6de0: 4e 44 49 4e 47 5f 44 41 54 41 3b 0a 20 20 70 2d  NDING_DATA;.  p-
6df0: 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 3d 20 28  >bHasDocsize = (
6e00: 69 73 46 74 73 34 20 26 26 20 62 4e 6f 44 6f 63  isFts4 && bNoDoc
6e10: 73 69 7a 65 3d 3d 30 29 3b 0a 20 20 70 2d 3e 62  size==0);.  p->b
6e20: 48 61 73 53 74 61 74 20 3d 20 69 73 46 74 73 34  HasStat = isFts4
6e30: 3b 0a 20 20 66 74 73 33 48 61 73 68 49 6e 69 74  ;.  fts3HashInit
6e40: 28 26 70 2d 3e 70 65 6e 64 69 6e 67 54 65 72 6d  (&p->pendingTerm
6e50: 73 2c 20 46 54 53 33 5f 48 41 53 48 5f 53 54 52  s, FTS3_HASH_STR
6e60: 49 4e 47 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 46  ING, 1);..  /* F
6e70: 69 6c 6c 20 69 6e 20 74 68 65 20 7a 4e 61 6d 65  ill in the zName
6e80: 20 61 6e 64 20 7a 44 62 20 66 69 65 6c 64 73 20   and zDb fields 
6e90: 6f 66 20 74 68 65 20 76 74 61 62 20 73 74 72 75  of the vtab stru
6ea0: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 43 73 72  cture. */.  zCsr
6eb0: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 61   = (char *)&p->a
6ec0: 7a 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 3b 0a 20  zColumn[nCol];. 
6ed0: 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 43 73 72   p->zName = zCsr
6ee0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43 73 72 2c  ;.  memcpy(zCsr,
6ef0: 20 61 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29   argv[2], nName)
6f00: 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 6e 4e 61 6d  ;.  zCsr += nNam
6f10: 65 3b 0a 20 20 70 2d 3e 7a 44 62 20 3d 20 7a 43  e;.  p->zDb = zC
6f20: 73 72 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43 73  sr;.  memcpy(zCs
6f30: 72 2c 20 61 72 67 76 5b 31 5d 2c 20 6e 44 62 29  r, argv[1], nDb)
6f40: 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 6e 44 62 3b  ;.  zCsr += nDb;
6f50: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
6f60: 68 65 20 61 7a 43 6f 6c 75 6d 6e 20 61 72 72 61  he azColumn arra
6f70: 79 20 2a 2f 0a 20 20 66 6f 72 28 69 43 6f 6c 3d  y */.  for(iCol=
6f80: 30 3b 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43  0; iCol<nCol; iC
6f90: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20  ol++){.    char 
6fa0: 2a 7a 3b 20 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  *z; .    int n;.
6fb0: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
6fc0: 73 71 6c 69 74 65 33 46 74 73 33 4e 65 78 74 54  sqlite3Fts3NextT
6fd0: 6f 6b 65 6e 28 61 43 6f 6c 5b 69 43 6f 6c 5d 2c  oken(aCol[iCol],
6fe0: 20 26 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   &n);.    memcpy
6ff0: 28 7a 43 73 72 2c 20 7a 2c 20 6e 29 3b 0a 20 20  (zCsr, z, n);.  
7000: 20 20 7a 43 73 72 5b 6e 5d 20 3d 20 27 5c 30 27    zCsr[n] = '\0'
7010: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
7020: 33 44 65 71 75 6f 74 65 28 7a 43 73 72 29 3b 0a  3Dequote(zCsr);.
7030: 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b      p->azColumn[
7040: 69 43 6f 6c 5d 20 3d 20 7a 43 73 72 3b 0a 20 20  iCol] = zCsr;.  
7050: 20 20 7a 43 73 72 20 2b 3d 20 6e 2b 31 3b 0a 20    zCsr += n+1;. 
7060: 20 20 20 61 73 73 65 72 74 28 20 7a 43 73 72 20     assert( zCsr 
7070: 3c 3d 20 26 28 28 63 68 61 72 20 2a 29 70 29 5b  <= &((char *)p)[
7080: 6e 42 79 74 65 5d 20 29 3b 0a 20 20 7d 0a 0a 20  nByte] );.  }.. 
7090: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
70a0: 6e 20 78 43 72 65 61 74 65 20 63 61 6c 6c 2c 20  n xCreate call, 
70b0: 63 72 65 61 74 65 20 74 68 65 20 75 6e 64 65 72  create the under
70c0: 6c 79 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  lying tables in 
70d0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
70e0: 73 65 2e 20 54 4f 44 4f 3a 20 46 6f 72 20 78 43  se. TODO: For xC
70f0: 6f 6e 6e 65 63 74 28 29 2c 20 69 74 20 63 6f 75  onnect(), it cou
7100: 6c 64 20 76 65 72 69 66 79 20 74 68 61 74 20 73  ld verify that s
7110: 61 69 64 20 74 61 62 6c 65 73 20 65 78 69 73 74  aid tables exist
7120: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43  ..  */.  if( isC
7130: 72 65 61 74 65 20 29 7b 0a 20 20 20 20 72 63 20  reate ){.    rc 
7140: 3d 20 66 74 73 33 43 72 65 61 74 65 54 61 62 6c  = fts3CreateTabl
7150: 65 73 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  es(p);.  }..  /*
7160: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
7170: 70 61 67 65 2d 73 69 7a 65 20 66 6f 72 20 74 68  page-size for th
7180: 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  e database. This
7190: 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
71a0: 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 65 73  order to.  ** es
71b0: 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20  timate the cost 
71c0: 6f 66 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  of loading large
71d0: 20 64 6f 63 6c 69 73 74 73 20 66 72 6f 6d 20 74   doclists from t
71e0: 68 65 20 64 61 74 61 62 61 73 65 20 28 73 65 65  he database (see
71f0: 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20   .  ** function 
7200: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
7210: 61 64 65 72 43 6f 73 74 28 29 20 66 6f 72 20 64  aderCost() for d
7220: 65 74 61 69 6c 73 29 2e 0a 20 20 2a 2f 0a 20 20  etails)..  */.  
7230: 66 74 73 33 44 61 74 61 62 61 73 65 50 61 67 65  fts3DatabasePage
7240: 53 69 7a 65 28 26 72 63 2c 20 70 29 3b 0a 0a 20  Size(&rc, p);.. 
7250: 20 2f 2a 20 44 65 63 6c 61 72 65 20 74 68 65 20   /* Declare the 
7260: 74 61 62 6c 65 20 73 63 68 65 6d 61 20 74 6f 20  table schema to 
7270: 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 66 74 73  SQLite. */.  fts
7280: 33 44 65 63 6c 61 72 65 56 74 61 62 28 26 72 63  3DeclareVtab(&rc
7290: 2c 20 70 29 3b 0a 0a 66 74 73 33 5f 69 6e 69 74  , p);..fts3_init
72a0: 5f 6f 75 74 3a 0a 0a 20 20 73 71 6c 69 74 65 33  _out:..  sqlite3
72b0: 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29 61 43  _free((void *)aC
72c0: 6f 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ol);.  if( rc!=S
72d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
72e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 66  if( p ){.      f
72f0: 74 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74  ts3DisconnectMet
7300: 68 6f 64 28 28 73 71 6c 69 74 65 33 5f 76 74 61  hod((sqlite3_vta
7310: 62 20 2a 29 70 29 3b 0a 20 20 20 20 7d 65 6c 73  b *)p);.    }els
7320: 65 20 69 66 28 20 70 54 6f 6b 65 6e 69 7a 65 72  e if( pTokenizer
7330: 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e   ){.      pToken
7340: 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  izer->pModule->x
7350: 44 65 73 74 72 6f 79 28 70 54 6f 6b 65 6e 69 7a  Destroy(pTokeniz
7360: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  er);.    }.  }el
7370: 73 65 7b 0a 20 20 20 20 2a 70 70 56 54 61 62 20  se{.    *ppVTab 
7380: 3d 20 26 70 2d 3e 62 61 73 65 3b 0a 20 20 7d 0a  = &p->base;.  }.
7390: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
73a0: 2f 2a 0a 2a 2a 20 54 68 65 20 78 43 6f 6e 6e 65  /*.** The xConne
73b0: 63 74 28 29 20 61 6e 64 20 78 43 72 65 61 74 65  ct() and xCreate
73c0: 28 29 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 74  () methods for t
73d0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
73e0: 2e 20 41 6c 6c 20 74 68 65 0a 2a 2a 20 77 6f 72  . All the.** wor
73f0: 6b 20 69 73 20 64 6f 6e 65 20 69 6e 20 66 75 6e  k is done in fun
7400: 63 74 69 6f 6e 20 66 74 73 33 49 6e 69 74 56 74  ction fts3InitVt
7410: 61 62 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ab()..*/.static 
7420: 69 6e 74 20 66 74 73 33 43 6f 6e 6e 65 63 74 4d  int fts3ConnectM
7430: 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
7440: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
7450: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
7460: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
7470: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  */.  void *pAux,
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
74a0: 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61 73  to tokenizer has
74b0: 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  h table */.  int
74c0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
74e0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
74f0: 74 73 20 69 6e 20 61 72 67 76 20 61 72 72 61 79  ts in argv array
7500: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7510: 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76 2c 20   * const *argv, 
7520: 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
7530: 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67 75 6d 65  /xConnect argume
7540: 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71  nt array */.  sq
7550: 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
7560: 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tab,          /*
7570: 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c 69 74 65   OUT: New sqlite
7580: 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f  3_vtab object */
7590: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20  .  char **pzErr 
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69 74     /* OUT: sqlit
75c0: 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65 72 72 6f  e3_malloc'd erro
75d0: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a  r message */.){.
75e0: 20 20 72 65 74 75 72 6e 20 66 74 73 33 49 6e 69    return fts3Ini
75f0: 74 56 74 61 62 28 30 2c 20 64 62 2c 20 70 41 75  tVtab(0, db, pAu
7600: 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70  x, argc, argv, p
7610: 70 56 74 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d  pVtab, pzErr);.}
7620: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
7630: 43 72 65 61 74 65 4d 65 74 68 6f 64 28 0a 20 20  CreateMethod(.  
7640: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7670: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  ection */.  void
7680: 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20 20   *pAux,         
7690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
76a0: 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b 65 6e 69  ointer to tokeni
76b0: 7a 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  zer hash table *
76c0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
76f0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72 67   elements in arg
7700: 76 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e  v array */.  con
7710: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
7720: 2a 61 72 67 76 2c 20 20 20 20 20 20 20 2f 2a 20  *argv,       /* 
7730: 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74  xCreate/xConnect
7740: 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
7750: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  */.  sqlite3_vta
7760: 62 20 2a 2a 70 70 56 74 61 62 2c 20 20 20 20 20  b **ppVtab,     
7770: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
7780: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62   sqlite3_vtab ob
7790: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
77a0: 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20  *pzErr          
77b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
77c0: 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  : sqlite3_malloc
77d0: 27 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  'd error message
77e0: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
77f0: 66 74 73 33 49 6e 69 74 56 74 61 62 28 31 2c 20  fts3InitVtab(1, 
7800: 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
7810: 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a  argv, ppVtab, pz
7820: 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  Err);.}../* .** 
7830: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
7840: 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  f the xBestIndex
7850: 20 6d 65 74 68 6f 64 20 66 6f 72 20 46 54 53 33   method for FTS3
7860: 20 74 61 62 6c 65 73 2e 20 54 68 65 72 65 0a 2a   tables. There.*
7870: 2a 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73  * are three poss
7880: 69 62 6c 65 20 73 74 72 61 74 65 67 69 65 73 2c  ible strategies,
7890: 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 70 72 65   in order of pre
78a0: 66 65 72 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20  ference:.**.**  
78b0: 20 31 2e 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75   1. Direct looku
78c0: 70 20 62 79 20 72 6f 77 69 64 20 6f 72 20 64 6f  p by rowid or do
78d0: 63 69 64 2e 20 0a 2a 2a 20 20 20 32 2e 20 46 75  cid. .**   2. Fu
78e0: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 20 75  ll-text search u
78f0: 73 69 6e 67 20 61 20 4d 41 54 43 48 20 6f 70 65  sing a MATCH ope
7900: 72 61 74 6f 72 20 6f 6e 20 61 20 6e 6f 6e 2d 64  rator on a non-d
7910: 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  ocid column..** 
7920: 20 20 33 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e    3. Linear scan
7930: 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61   of %_content ta
7940: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
7950: 6e 74 20 66 74 73 33 42 65 73 74 49 6e 64 65 78  nt fts3BestIndex
7960: 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
7970: 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69  tab *pVTab, sqli
7980: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
7990: 70 49 6e 66 6f 29 7b 0a 20 20 46 74 73 33 54 61  pInfo){.  Fts3Ta
79a0: 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
79b0: 62 6c 65 20 2a 29 70 56 54 61 62 3b 0a 20 20 69  ble *)pVTab;.  i
79c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79e0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
79f0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ble */.  int iCo
7a00: 6e 73 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  ns = -1;        
7a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
7a20: 78 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  x of constraint 
7a30: 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20  to use */..  /* 
7a40: 42 79 20 64 65 66 61 75 6c 74 20 75 73 65 20 61  By default use a
7a50: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
7a60: 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65 78 70  . This is an exp
7a70: 65 6e 73 69 76 65 20 6f 70 74 69 6f 6e 2c 0a 20  ensive option,. 
7a80: 20 2a 2a 20 73 6f 20 73 65 61 72 63 68 20 74 68   ** so search th
7a90: 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 73 74 72  rough the constr
7aa0: 61 69 6e 74 73 20 74 6f 20 73 65 65 20 69 66 20  aints to see if 
7ab0: 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  a more efficient
7ac0: 20 0a 20 20 2a 2a 20 73 74 72 61 74 65 67 79 20   .  ** strategy 
7ad0: 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  is possible..  *
7ae0: 2f 0a 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75  /.  pInfo->idxNu
7af0: 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 53 43 41  m = FTS3_FULLSCA
7b00: 4e 5f 53 45 41 52 43 48 3b 0a 20 20 70 49 6e 66  N_SEARCH;.  pInf
7b10: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
7b20: 20 3d 20 35 30 30 30 30 30 3b 0a 20 20 66 6f 72   = 500000;.  for
7b30: 28 69 3d 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e 6e  (i=0; i<pInfo->n
7b40: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
7b50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c  {.    struct sql
7b60: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7b70: 72 61 69 6e 74 20 2a 70 43 6f 6e 73 20 3d 20 26  raint *pCons = &
7b80: 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  pInfo->aConstrai
7b90: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
7ba0: 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 20  Cons->usable==0 
7bb0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
7bc0: 20 2f 2a 20 41 20 64 69 72 65 63 74 20 6c 6f 6f   /* A direct loo
7bd0: 6b 75 70 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  kup on the rowid
7be0: 20 6f 72 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e   or docid column
7bf0: 2e 20 41 73 73 69 67 6e 20 61 20 63 6f 73 74 20  . Assign a cost 
7c00: 6f 66 20 31 2e 30 2e 20 2a 2f 0a 20 20 20 20 69  of 1.0. */.    i
7c10: 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51  f( pCons->op==SQ
7c20: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7c30: 52 41 49 4e 54 5f 45 51 20 0a 20 20 20 20 20 26  RAINT_EQ .     &
7c40: 26 20 28 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d  & (pCons->iColum
7c50: 6e 3c 30 20 7c 7c 20 70 43 6f 6e 73 2d 3e 69 43  n<0 || pCons->iC
7c60: 6f 6c 75 6d 6e 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d  olumn==p->nColum
7c70: 6e 2b 31 20 29 0a 20 20 20 20 29 7b 0a 20 20 20  n+1 ).    ){.   
7c80: 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d     pInfo->idxNum
7c90: 20 3d 20 46 54 53 33 5f 44 4f 43 49 44 5f 53 45   = FTS3_DOCID_SE
7ca0: 41 52 43 48 3b 0a 20 20 20 20 20 20 70 49 6e 66  ARCH;.      pInf
7cb0: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
7cc0: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 69 43   = 1.0;.      iC
7cd0: 6f 6e 73 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a  ons = i;.    }..
7ce0: 20 20 20 20 2f 2a 20 41 20 4d 41 54 43 48 20 63      /* A MATCH c
7cf0: 6f 6e 73 74 72 61 69 6e 74 2e 20 55 73 65 20 61  onstraint. Use a
7d00: 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63   full-text searc
7d10: 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
7d20: 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72   If there is mor
7d30: 65 20 74 68 61 6e 20 6f 6e 65 20 4d 41 54 43 48  e than one MATCH
7d40: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 76 61 69   constraint avai
7d50: 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 66  lable, use the f
7d60: 69 72 73 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  irst.    ** one 
7d70: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 49 66 20  encountered. If 
7d80: 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20  there is both a 
7d90: 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74  MATCH constraint
7da0: 20 61 6e 64 20 61 20 64 69 72 65 63 74 0a 20 20   and a direct.  
7db0: 20 20 2a 2a 20 72 6f 77 69 64 2f 64 6f 63 69 64    ** rowid/docid
7dc0: 20 6c 6f 6f 6b 75 70 2c 20 70 72 65 66 65 72 20   lookup, prefer 
7dd0: 74 68 65 20 4d 41 54 43 48 20 73 74 72 61 74 65  the MATCH strate
7de0: 67 79 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  gy. This is done
7df0: 20 65 76 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   even .    ** th
7e00: 6f 75 67 68 20 74 68 65 20 72 6f 77 69 64 2f 64  ough the rowid/d
7e10: 6f 63 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 66  ocid lookup is f
7e20: 61 73 74 65 72 20 74 68 61 6e 20 61 20 4d 41 54  aster than a MAT
7e30: 43 48 20 71 75 65 72 79 2c 20 73 65 6c 65 63 74  CH query, select
7e40: 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f  ing.    ** it wo
7e50: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 6e 20 22  uld lead to an "
7e60: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75  unable to use fu
7e70: 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20  nction MATCH in 
7e80: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 0a 20  the requested . 
7e90: 20 20 20 2a 2a 20 63 6f 6e 74 65 78 74 22 20 65     ** context" e
7ea0: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
7eb0: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d   if( pCons->op==
7ec0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7ed0: 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 0a 20  STRAINT_MATCH . 
7ee0: 20 20 20 20 26 26 20 70 43 6f 6e 73 2d 3e 69 43      && pCons->iC
7ef0: 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 43 6f 6e  olumn>=0 && pCon
7f00: 73 2d 3e 69 43 6f 6c 75 6d 6e 3c 3d 70 2d 3e 6e  s->iColumn<=p->n
7f10: 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20  Column.    ){.  
7f20: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75      pInfo->idxNu
7f30: 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 54 45 58  m = FTS3_FULLTEX
7f40: 54 5f 53 45 41 52 43 48 20 2b 20 70 43 6f 6e 73  T_SEARCH + pCons
7f50: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
7f60: 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65   pInfo->estimate
7f70: 64 43 6f 73 74 20 3d 20 32 2e 30 3b 0a 20 20 20  dCost = 2.0;.   
7f80: 20 20 20 69 43 6f 6e 73 20 3d 20 69 3b 0a 20 20     iCons = i;.  
7f90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7fa0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 43 6f 6e  .  }..  if( iCon
7fb0: 73 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 66  s>=0 ){.    pInf
7fc0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
7fd0: 61 67 65 5b 69 43 6f 6e 73 5d 2e 61 72 67 76 49  age[iCons].argvI
7fe0: 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49  ndex = 1;.    pI
7ff0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
8000: 55 73 61 67 65 5b 69 43 6f 6e 73 5d 2e 6f 6d 69  Usage[iCons].omi
8010: 74 20 3d 20 31 3b 0a 20 20 7d 20 0a 20 20 72 65  t = 1;.  } .  re
8020: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8030: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
8040: 6e 74 61 74 69 6f 6e 20 6f 66 20 78 4f 70 65 6e  ntation of xOpen
8050: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
8060: 69 63 20 69 6e 74 20 66 74 73 33 4f 70 65 6e 4d  ic int fts3OpenM
8070: 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
8080: 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74  ab *pVTab, sqlit
8090: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
80a0: 2a 70 70 43 73 72 29 7b 0a 20 20 73 71 6c 69 74  *ppCsr){.  sqlit
80b0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
80c0: 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20  pCsr;           
80d0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
80e0: 20 63 75 72 73 6f 72 20 2a 2f 0a 0a 20 20 55 4e   cursor */..  UN
80f0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8100: 56 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  VTab);..  /* All
8110: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 6c  ocate a buffer l
8120: 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
8130: 61 6e 20 46 74 73 33 43 75 72 73 6f 72 20 73 74  an Fts3Cursor st
8140: 72 75 63 74 75 72 65 2e 20 49 66 20 74 68 65 0a  ructure. If the.
8150: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
8160: 73 75 63 63 65 65 64 73 2c 20 7a 65 72 6f 20 69  succeeds, zero i
8170: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
8180: 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
8190: 65 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  e, .  ** if the 
81a0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
81b0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
81c0: 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 2a 70  NOMEM..  */.  *p
81d0: 70 43 73 72 20 3d 20 70 43 73 72 20 3d 20 28 73  pCsr = pCsr = (s
81e0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
81f0: 6f 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  or *)sqlite3_mal
8200: 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 43  loc(sizeof(Fts3C
8210: 75 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 21  ursor));.  if( !
8220: 70 43 73 72 20 29 7b 0a 20 20 20 20 72 65 74 75  pCsr ){.    retu
8230: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8240: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43  .  }.  memset(pC
8250: 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  sr, 0, sizeof(Ft
8260: 73 33 43 75 72 73 6f 72 29 29 3b 0a 20 20 72 65  s3Cursor));.  re
8270: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8280: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
8290: 68 65 20 63 75 72 73 6f 72 2e 20 20 46 6f 72 20  he cursor.  For 
82a0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
82b0: 6d 61 74 69 6f 6e 20 73 65 65 20 74 68 65 20 64  mation see the d
82c0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  ocumentation.** 
82d0: 6f 6e 20 74 68 65 20 78 43 6c 6f 73 65 20 6d 65  on the xClose me
82e0: 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
82f0: 75 61 6c 20 74 61 62 6c 65 20 69 6e 74 65 72 66  ual table interf
8300: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
8310: 6e 74 20 66 74 73 33 43 6c 6f 73 65 4d 65 74 68  nt fts3CloseMeth
8320: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  od(sqlite3_vtab_
8330: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29  cursor *pCursor)
8340: 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  {.  Fts3Cursor *
8350: 70 43 73 72 20 3d 20 28 46 74 73 33 43 75 72 73  pCsr = (Fts3Curs
8360: 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20  or *)pCursor;.  
8370: 61 73 73 65 72 74 28 20 28 28 46 74 73 33 54 61  assert( ((Fts3Ta
8380: 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65  ble *)pCsr->base
8390: 2e 70 56 74 61 62 29 2d 3e 70 53 65 67 6d 65 6e  .pVtab)->pSegmen
83a0: 74 73 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ts==0 );.  sqlit
83b0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72  e3_finalize(pCsr
83c0: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  ->pStmt);.  sqli
83d0: 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65 28  te3Fts3ExprFree(
83e0: 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20  pCsr->pExpr);.  
83f0: 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65 44  sqlite3Fts3FreeD
8400: 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 70 43  eferredTokens(pC
8410: 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sr);.  sqlite3_f
8420: 72 65 65 28 70 43 73 72 2d 3e 61 44 6f 63 6c 69  ree(pCsr->aDocli
8430: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st);.  sqlite3_f
8440: 72 65 65 28 70 43 73 72 2d 3e 61 4d 61 74 63 68  ree(pCsr->aMatch
8450: 69 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  info);.  sqlite3
8460: 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72  _free(pCsr);.  r
8470: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 73 69 74 69  .}../*.** Positi
8490: 6f 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 53 74  on the pCsr->pSt
84a0: 6d 74 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20  mt statement so 
84b0: 74 68 61 74 20 69 74 20 69 73 20 6f 6e 20 74 68  that it is on th
84c0: 65 20 72 6f 77 0a 2a 2a 20 6f 66 20 74 68 65 20  e row.** of the 
84d0: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  %_content table 
84e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
84f0: 65 20 6c 61 73 74 20 6d 61 74 63 68 2e 20 20 52  e last match.  R
8500: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
8510: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
8520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
8530: 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 73 71  ts3CursorSeek(sq
8540: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
8550: 43 6f 6e 74 65 78 74 2c 20 46 74 73 33 43 75 72  Context, Fts3Cur
8560: 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 66  sor *pCsr){.  if
8570: 28 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72  ( pCsr->isRequir
8580: 65 53 65 65 6b 20 29 7b 0a 20 20 20 20 70 43 73  eSeek ){.    pCs
8590: 72 2d 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b  r->isRequireSeek
85a0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
85b0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 73  3_bind_int64(pCs
85c0: 72 2d 3e 70 53 74 6d 74 2c 20 31 2c 20 70 43 73  r->pStmt, 1, pCs
85d0: 72 2d 3e 69 50 72 65 76 49 64 29 3b 0a 20 20 20  r->iPrevId);.   
85e0: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
85f0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
8600: 73 72 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20  sr->pStmt) ){.  
8610: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8620: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
8630: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
8640: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
8650: 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  sr->pStmt);.    
8660: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8670: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
8680: 2a 20 49 66 20 6e 6f 20 72 6f 77 20 77 61 73 20  * If no row was 
8690: 66 6f 75 6e 64 20 61 6e 64 20 6e 6f 20 65 72 72  found and no err
86a0: 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20  or has occured, 
86b0: 74 68 65 6e 20 74 68 65 20 25 5f 63 6f 6e 74 65  then the %_conte
86c0: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  nt.        ** ta
86d0: 62 6c 65 20 69 73 20 6d 69 73 73 69 6e 67 20 61  ble is missing a
86e0: 20 72 6f 77 20 74 68 61 74 20 69 73 20 70 72 65   row that is pre
86f0: 73 65 6e 74 20 69 6e 20 74 68 65 20 66 75 6c 6c  sent in the full
8700: 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 20 20 20  -text index..   
8710: 20 20 20 20 20 2a 2a 20 54 68 65 20 64 61 74 61       ** The data
8720: 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65 20   structures are 
8730: 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 20 20 20  corrupt..       
8740: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
8750: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
8760: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
8770: 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a  Csr->isEof = 1;.
8780: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 74 65        if( pConte
8790: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  xt ){.        sq
87a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
87b0: 6f 72 5f 63 6f 64 65 28 70 43 6f 6e 74 65 78 74  or_code(pContext
87c0: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
87d0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
87e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
87f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8800: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
8810: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8820: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 63 65  is used to proce
8830: 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  ss a single inte
8840: 72 69 6f 72 20 6e 6f 64 65 20 77 68 65 6e 20 73  rior node when s
8850: 65 61 72 63 68 69 6e 67 0a 2a 2a 20 61 20 62 2d  earching.** a b-
8860: 74 72 65 65 20 66 6f 72 20 61 20 74 65 72 6d 20  tree for a term 
8870: 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78 2e 20  or term prefix. 
8880: 54 68 65 20 6e 6f 64 65 20 64 61 74 61 20 69 73  The node data is
8890: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
88a0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 76 69 61  .** function via
88b0: 20 74 68 65 20 7a 4e 6f 64 65 2f 6e 4e 6f 64 65   the zNode/nNode
88c0: 20 70 61 72 61 6d 65 74 65 72 73 2e 20 54 68 65   parameters. The
88d0: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
88e0: 66 6f 72 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  for is.** passed
88f0: 20 69 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e   in zTerm/nTerm.
8900: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 69 46 69 72 73  .**.** If piFirs
8910: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  t is not NULL, t
8920: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
8930: 6e 20 73 65 74 73 20 2a 70 69 46 69 72 73 74 20  n sets *piFirst 
8940: 74 6f 20 74 68 65 20 62 6c 6f 63 6b 69 64 0a 2a  to the blockid.*
8950: 2a 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6e  * of the child n
8960: 6f 64 65 20 74 68 61 74 20 68 65 61 64 73 20 74  ode that heads t
8970: 68 65 20 73 75 62 2d 74 72 65 65 20 74 68 61 74  he sub-tree that
8980: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 74 68 65   may contain the
8990: 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   term..**.** If 
89a0: 70 69 4c 61 73 74 20 69 73 20 6e 6f 74 20 4e 55  piLast is not NU
89b0: 4c 4c 2c 20 74 68 65 6e 20 2a 70 69 4c 61 73 74  LL, then *piLast
89c0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 72   is set to the r
89d0: 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
89e0: 6e 6f 64 65 0a 2a 2a 20 74 68 61 74 20 68 65 61  node.** that hea
89f0: 64 73 20 61 20 73 75 62 2d 74 72 65 65 20 74 68  ds a sub-tree th
8a00: 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  at may contain a
8a10: 20 74 65 72 6d 20 66 6f 72 20 77 68 69 63 68 20   term for which 
8a20: 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 69 73 0a 2a  zTerm/nTerm is.*
8a30: 2a 20 61 20 70 72 65 66 69 78 2e 0a 2a 2a 0a 2a  * a prefix..**.*
8a40: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
8a50: 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
8a60: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
8a70: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  ed. Otherwise, S
8a80: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
8a90: 74 69 63 20 69 6e 74 20 66 74 73 33 53 63 61 6e  tic int fts3Scan
8aa0: 49 6e 74 65 72 69 6f 72 4e 6f 64 65 28 0a 20 20  InteriorNode(.  
8ab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
8ac0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
8ad0: 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 6c 65 63  /* Term to selec
8ae0: 74 20 6c 65 61 76 65 73 20 66 6f 72 20 2a 2f 0a  t leaves for */.
8af0: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
8b20: 6d 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  m zTerm in bytes
8b30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8b40: 20 2a 7a 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *zNode,        
8b50: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
8b60: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65  containing segme
8b70: 6e 74 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  nt interior node
8b80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 2c   */.  int nNode,
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8bb0: 20 62 75 66 66 65 72 20 61 74 20 7a 4e 6f 64 65   buffer at zNode
8bc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
8bd0: 74 36 34 20 2a 70 69 46 69 72 73 74 2c 20 20 20  t64 *piFirst,   
8be0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
8bf0: 6c 65 63 74 65 64 20 63 68 69 6c 64 20 6e 6f 64  lected child nod
8c00: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
8c10: 6e 74 36 34 20 2a 70 69 4c 61 73 74 20 20 20 20  nt64 *piLast    
8c20: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
8c30: 65 6c 65 63 74 65 64 20 63 68 69 6c 64 20 6e 6f  elected child no
8c40: 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  de */.){.  int r
8c50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
8c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8c70: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
8c80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 73 72 20  onst char *zCsr 
8c90: 3d 20 7a 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f  = zNode;       /
8ca0: 2a 20 43 75 72 73 6f 72 20 74 6f 20 69 74 65 72  * Cursor to iter
8cb0: 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f 64 65  ate through node
8cc0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8cd0: 20 2a 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e   *zEnd = &zCsr[n
8ce0: 4e 6f 64 65 5d 3b 2f 2a 20 45 6e 64 20 6f 66 20  Node];/* End of 
8cf0: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 75  interior node bu
8d00: 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ffer */.  char *
8d10: 7a 42 75 66 66 65 72 20 3d 20 30 3b 20 20 20 20  zBuffer = 0;    
8d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
8d30: 66 65 72 20 74 6f 20 6c 6f 61 64 20 74 65 72 6d  fer to load term
8d40: 73 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  s into */.  int 
8d50: 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20  nAlloc = 0;     
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8d70: 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  ize of allocated
8d80: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
8d90: 20 69 73 46 69 72 73 74 54 65 72 6d 20 3d 20 31   isFirstTerm = 1
8da0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8db0: 54 72 75 65 20 77 68 65 6e 20 70 72 6f 63 65 73  True when proces
8dc0: 73 69 6e 67 20 66 69 72 73 74 20 74 65 72 6d 20  sing first term 
8dd0: 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  on page */.  sql
8de0: 69 74 65 33 5f 69 6e 74 36 34 20 69 43 68 69 6c  ite3_int64 iChil
8df0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8e00: 42 6c 6f 63 6b 20 69 64 20 6f 66 20 63 68 69 6c  Block id of chil
8e10: 64 20 6e 6f 64 65 20 74 6f 20 64 65 73 63 65 6e  d node to descen
8e20: 64 20 74 6f 20 2a 2f 0a 0a 20 20 2f 2a 20 53 6b  d to */..  /* Sk
8e30: 69 70 20 6f 76 65 72 20 74 68 65 20 27 68 65 69  ip over the 'hei
8e40: 67 68 74 27 20 76 61 72 69 6e 74 20 74 68 61 74  ght' varint that
8e50: 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
8e60: 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 0a 20  tart of every . 
8e70: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64   ** interior nod
8e80: 65 2e 20 54 68 65 6e 20 6c 6f 61 64 20 74 68 65  e. Then load the
8e90: 20 62 6c 6f 63 6b 69 64 20 6f 66 20 74 68 65 20   blockid of the 
8ea0: 6c 65 66 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  left-child of th
8eb0: 65 20 62 2d 74 72 65 65 0a 20 20 2a 2a 20 6e 6f  e b-tree.  ** no
8ec0: 64 65 20 69 6e 74 6f 20 76 61 72 69 61 62 6c 65  de into variable
8ed0: 20 69 43 68 69 6c 64 2e 20 20 0a 20 20 2a 2a 0a   iChild.  .  **.
8ee0: 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
8ef0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
8f00: 6f 6e 20 64 69 73 6b 20 69 73 20 63 6f 72 72 75  on disk is corru
8f10: 70 74 65 64 2c 20 74 68 69 73 20 28 72 65 61 64  pted, this (read
8f20: 69 6e 67 20 74 77 6f 0a 20 20 2a 2a 20 76 61 72  ing two.  ** var
8f30: 69 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 62 75  ints from the bu
8f40: 66 66 65 72 29 20 64 6f 65 73 20 6e 6f 74 20 72  ffer) does not r
8f50: 69 73 6b 20 61 6e 20 6f 76 65 72 72 65 61 64 2e  isk an overread.
8f60: 20 49 66 20 7a 4e 6f 64 65 20 69 73 20 61 0a 20   If zNode is a. 
8f70: 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 74   ** root node, t
8f80: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 63  hen the buffer c
8f90: 6f 6d 65 73 20 66 72 6f 6d 20 61 20 53 45 4c 45  omes from a SELE
8fa0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 51  CT statement. SQ
8fb0: 4c 69 74 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e  Lite does.  ** n
8fc0: 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 67 75 61  ot make this gua
8fd0: 72 61 6e 74 65 65 20 65 78 70 6c 69 63 69 74 6c  rantee explicitl
8fe0: 79 2c 20 62 75 74 20 69 6e 20 70 72 61 63 74 69  y, but in practi
8ff0: 63 65 20 74 68 65 72 65 20 61 72 65 20 61 6c 77  ce there are alw
9000: 61 79 73 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  ays.  ** either 
9010: 6d 6f 72 65 20 74 68 61 6e 20 32 30 20 62 79 74  more than 20 byt
9020: 65 73 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  es of allocated 
9030: 73 70 61 63 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  space following 
9040: 74 68 65 20 6e 4e 6f 64 65 20 62 79 74 65 73 20  the nNode bytes 
9050: 6f 66 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73  of.  ** contents
9060: 2c 20 6f 72 20 74 77 6f 20 7a 65 72 6f 20 62 79  , or two zero by
9070: 74 65 73 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  tes. Or, if the 
9080: 6e 6f 64 65 20 69 73 20 72 65 61 64 20 66 72 6f  node is read fro
9090: 6d 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  m the %_segments
90a0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
90b0: 6e 20 74 68 65 72 65 20 61 72 65 20 61 6c 77 61  n there are alwa
90c0: 79 73 20 32 30 20 62 79 74 65 73 20 6f 66 20 7a  ys 20 bytes of z
90d0: 65 72 6f 65 64 20 70 61 64 64 69 6e 67 20 66 6f  eroed padding fo
90e0: 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 20 20 2a 2a  llowing the.  **
90f0: 20 6e 4e 6f 64 65 20 62 79 74 65 73 20 6f 66 20   nNode bytes of 
9100: 63 6f 6e 74 65 6e 74 20 28 73 65 65 20 73 71 6c  content (see sql
9110: 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63  ite3Fts3ReadBloc
9120: 6b 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 29  k() for details)
9130: 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 2b 3d  ..  */.  zCsr +=
9140: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
9150: 61 72 69 6e 74 28 7a 43 73 72 2c 20 26 69 43 68  arint(zCsr, &iCh
9160: 69 6c 64 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  ild);.  zCsr += 
9170: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
9180: 72 69 6e 74 28 7a 43 73 72 2c 20 26 69 43 68 69  rint(zCsr, &iChi
9190: 6c 64 29 3b 0a 20 20 69 66 28 20 7a 43 73 72 3e  ld);.  if( zCsr>
91a0: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 72 65 74 75  zEnd ){.    retu
91b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
91c0: 54 3b 0a 20 20 7d 0a 20 20 0a 20 20 77 68 69 6c  T;.  }.  .  whil
91d0: 65 28 20 7a 43 73 72 3c 7a 45 6e 64 20 26 26 20  e( zCsr<zEnd && 
91e0: 28 70 69 46 69 72 73 74 20 7c 7c 20 70 69 4c 61  (piFirst || piLa
91f0: 73 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  st) ){.    int c
9200: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
9210: 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 65 6d 63           /* memc
9220: 6d 70 28 29 20 72 65 73 75 6c 74 20 2a 2f 0a 20  mp() result */. 
9230: 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20     int nSuffix; 
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
9260: 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 69   suffix */.    i
9270: 6e 74 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 20  nt nPrefix = 0; 
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9290: 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65  Size of term pre
92a0: 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  fix */.    int n
92b0: 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20 20  Buffer;         
92c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
92d0: 6c 20 74 65 72 6d 20 73 69 7a 65 20 2a 2f 0a 20  l term size */. 
92e0: 20 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68   .    /* Load th
92f0: 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 6e 20 74  e next term on t
9300: 68 65 20 6e 6f 64 65 20 69 6e 74 6f 20 7a 42 75  he node into zBu
9310: 66 66 65 72 2e 20 55 73 65 20 72 65 61 6c 6c 6f  ffer. Use reallo
9320: 63 28 29 20 74 6f 20 65 78 70 61 6e 64 0a 20 20  c() to expand.  
9330: 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
9340: 20 7a 42 75 66 66 65 72 20 69 66 20 72 65 71 75   zBuffer if requ
9350: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ired.  */.    if
9360: 28 20 21 69 73 46 69 72 73 74 54 65 72 6d 20 29  ( !isFirstTerm )
9370: 7b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  {.      zCsr += 
9380: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
9390: 72 69 6e 74 33 32 28 7a 43 73 72 2c 20 26 6e 50  rint32(zCsr, &nP
93a0: 72 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20  refix);.    }.  
93b0: 20 20 69 73 46 69 72 73 74 54 65 72 6d 20 3d 20    isFirstTerm = 
93c0: 30 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  0;.    zCsr += s
93d0: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
93e0: 69 6e 74 33 32 28 7a 43 73 72 2c 20 26 6e 53 75  int32(zCsr, &nSu
93f0: 66 66 69 78 29 3b 0a 20 20 20 20 0a 20 20 20 20  ffix);.    .    
9400: 69 66 28 20 6e 50 72 65 66 69 78 3c 30 20 7c 7c  if( nPrefix<0 ||
9410: 20 6e 53 75 66 66 69 78 3c 30 20 7c 7c 20 26 7a   nSuffix<0 || &z
9420: 43 73 72 5b 6e 53 75 66 66 69 78 5d 3e 7a 45 6e  Csr[nSuffix]>zEn
9430: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
9440: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
9450: 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
9460: 68 5f 73 63 61 6e 3b 0a 20 20 20 20 7d 0a 20 20  h_scan;.    }.  
9470: 20 20 69 66 28 20 6e 50 72 65 66 69 78 2b 6e 53    if( nPrefix+nS
9480: 75 66 66 69 78 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  uffix>nAlloc ){.
9490: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
94a0: 3b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d  ;.      nAlloc =
94b0: 20 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69   (nPrefix+nSuffi
94c0: 78 29 20 2a 20 32 3b 0a 20 20 20 20 20 20 7a 4e  x) * 2;.      zN
94d0: 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
94e0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 7a 42 75  ite3_realloc(zBu
94f0: 66 66 65 72 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20  ffer, nAlloc);. 
9500: 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29       if( !zNew )
9510: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
9520: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9530: 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68       goto finish
9540: 5f 73 63 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  _scan;.      }. 
9550: 20 20 20 20 20 7a 42 75 66 66 65 72 20 3d 20 7a       zBuffer = z
9560: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  New;.    }.    m
9570: 65 6d 63 70 79 28 26 7a 42 75 66 66 65 72 5b 6e  emcpy(&zBuffer[n
9580: 50 72 65 66 69 78 5d 2c 20 7a 43 73 72 2c 20 6e  Prefix], zCsr, n
9590: 53 75 66 66 69 78 29 3b 0a 20 20 20 20 6e 42 75  Suffix);.    nBu
95a0: 66 66 65 72 20 3d 20 6e 50 72 65 66 69 78 20 2b  ffer = nPrefix +
95b0: 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 7a 43   nSuffix;.    zC
95c0: 73 72 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a  sr += nSuffix;..
95d0: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 74      /* Compare t
95e0: 68 65 20 74 65 72 6d 20 77 65 20 61 72 65 20 73  he term we are s
95f0: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 77 69 74  earching for wit
9600: 68 20 74 68 65 20 74 65 72 6d 20 6a 75 73 74 20  h the term just 
9610: 6c 6f 61 64 65 64 20 66 72 6f 6d 0a 20 20 20 20  loaded from.    
9620: 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  ** the interior 
9630: 6e 6f 64 65 2e 20 49 66 20 74 68 65 20 73 70 65  node. If the spe
9640: 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 67  cified term is g
9650: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
9660: 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74  qual.    ** to t
9670: 68 65 20 74 65 72 6d 20 66 72 6f 6d 20 74 68 65  he term from the
9680: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2c 20   interior node, 
9690: 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
96a0: 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 0a  n the sub-tree .
96b0: 20 20 20 20 2a 2a 20 68 65 61 64 65 64 20 62 79      ** headed by
96c0: 20 6e 6f 64 65 20 69 43 68 69 6c 64 20 61 72 65   node iChild are
96d0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54   smaller than zT
96e0: 65 72 6d 2e 20 4e 6f 20 6e 65 65 64 20 74 6f 20  erm. No need to 
96f0: 73 65 61 72 63 68 20 0a 20 20 20 20 2a 2a 20 69  search .    ** i
9700: 43 68 69 6c 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  Child..    **.  
9710: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 74 65    ** If the inte
9720: 72 69 6f 72 20 6e 6f 64 65 20 74 65 72 6d 20 69  rior node term i
9730: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
9740: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
9750: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
9760: 65 20 74 72 65 65 20 68 65 61 64 65 64 20 62 79  e tree headed by
9770: 20 69 43 68 69 6c 64 20 6d 61 79 20 63 6f 6e 74   iChild may cont
9780: 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65  ain the specifie
9790: 64 20 74 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20  d term..    */. 
97a0: 20 20 20 63 6d 70 20 3d 20 6d 65 6d 63 6d 70 28     cmp = memcmp(
97b0: 7a 54 65 72 6d 2c 20 7a 42 75 66 66 65 72 2c 20  zTerm, zBuffer, 
97c0: 28 6e 42 75 66 66 65 72 3e 6e 54 65 72 6d 20 3f  (nBuffer>nTerm ?
97d0: 20 6e 54 65 72 6d 20 3a 20 6e 42 75 66 66 65 72   nTerm : nBuffer
97e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 69 46 69  ));.    if( piFi
97f0: 72 73 74 20 26 26 20 28 63 6d 70 3c 30 20 7c 7c  rst && (cmp<0 ||
9800: 20 28 63 6d 70 3d 3d 30 20 26 26 20 6e 42 75 66   (cmp==0 && nBuf
9810: 66 65 72 3e 6e 54 65 72 6d 29 29 20 29 7b 0a 20  fer>nTerm)) ){. 
9820: 20 20 20 20 20 2a 70 69 46 69 72 73 74 20 3d 20       *piFirst = 
9830: 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 70 69  iChild;.      pi
9840: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  First = 0;.    }
9850: 0a 0a 20 20 20 20 69 66 28 20 70 69 4c 61 73 74  ..    if( piLast
9860: 20 26 26 20 63 6d 70 3c 30 20 29 7b 0a 20 20 20   && cmp<0 ){.   
9870: 20 20 20 2a 70 69 4c 61 73 74 20 3d 20 69 43 68     *piLast = iCh
9880: 69 6c 64 3b 0a 20 20 20 20 20 20 70 69 4c 61 73  ild;.      piLas
9890: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
98a0: 20 20 69 43 68 69 6c 64 2b 2b 3b 0a 20 20 7d 3b    iChild++;.  };
98b0: 0a 0a 20 20 69 66 28 20 70 69 46 69 72 73 74 20  ..  if( piFirst 
98c0: 29 20 2a 70 69 46 69 72 73 74 20 3d 20 69 43 68  ) *piFirst = iCh
98d0: 69 6c 64 3b 0a 20 20 69 66 28 20 70 69 4c 61 73  ild;.  if( piLas
98e0: 74 20 29 20 2a 70 69 4c 61 73 74 20 3d 20 69 43  t ) *piLast = iC
98f0: 68 69 6c 64 3b 0a 0a 20 66 69 6e 69 73 68 5f 73  hild;.. finish_s
9900: 63 61 6e 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  can:.  sqlite3_f
9910: 72 65 65 28 7a 42 75 66 66 65 72 29 3b 0a 20 20  ree(zBuffer);.  
9920: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
9930: 2a 0a 2a 2a 20 54 68 65 20 62 75 66 66 65 72 20  *.** The buffer 
9940: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72  pointed to by ar
9950: 67 75 6d 65 6e 74 20 7a 4e 6f 64 65 20 28 73 69  gument zNode (si
9960: 7a 65 20 6e 4e 6f 64 65 20 62 79 74 65 73 29 20  ze nNode bytes) 
9970: 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20 69  contains an.** i
9980: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 6f 66 20  nterior node of 
9990: 61 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74  a b-tree segment
99a0: 2e 20 54 68 65 20 7a 54 65 72 6d 20 62 75 66 66  . The zTerm buff
99b0: 65 72 20 28 73 69 7a 65 20 6e 54 65 72 6d 20 62  er (size nTerm b
99c0: 79 74 65 73 29 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ytes).** contain
99d0: 73 20 61 20 74 65 72 6d 2e 20 54 68 69 73 20 66  s a term. This f
99e0: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
99f0: 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65   the sub-tree he
9a00: 61 64 65 64 20 62 79 20 74 68 65 20 7a 4e 6f 64  aded by the zNod
9a10: 65 0a 2a 2a 20 6e 6f 64 65 20 66 6f 72 20 74 68  e.** node for th
9a20: 65 20 72 61 6e 67 65 20 6f 66 20 6c 65 61 66 20  e range of leaf 
9a30: 6e 6f 64 65 73 20 74 68 61 74 20 6d 61 79 20 63  nodes that may c
9a40: 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65 63 69  ontain the speci
9a50: 66 69 65 64 20 74 65 72 6d 0a 2a 2a 20 6f 72 20  fied term.** or 
9a60: 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20  terms for which 
9a70: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
9a80: 72 6d 20 69 73 20 61 20 70 72 65 66 69 78 2e 0a  rm is a prefix..
9a90: 2a 2a 0a 2a 2a 20 49 66 20 70 69 4c 65 61 66 20  **.** If piLeaf 
9aa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
9ab0: 6e 20 2a 70 69 4c 65 61 66 20 69 73 20 73 65 74  n *piLeaf is set
9ac0: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 69 64 20   to the blockid 
9ad0: 6f 66 20 74 68 65 20 0a 2a 2a 20 6c 65 66 74 2d  of the .** left-
9ae0: 6d 6f 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 69  most leaf node i
9af0: 6e 20 74 68 65 20 74 72 65 65 20 74 68 61 74 20  n the tree that 
9b00: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  may contain the 
9b10: 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 0a  specified term..
9b20: 2a 2a 20 49 66 20 70 69 4c 65 61 66 32 20 69 73  ** If piLeaf2 is
9b30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
9b40: 2a 70 69 4c 65 61 66 32 20 69 73 20 73 65 74 20  *piLeaf2 is set 
9b50: 74 6f 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 6f  to the blockid o
9b60: 66 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  f the.** right-m
9b70: 6f 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 74 68  ost leaf node th
9b80: 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  at may contain a
9b90: 20 74 65 72 6d 20 66 6f 72 20 77 68 69 63 68 20   term for which 
9ba0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
9bb0: 20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66 69   term is a prefi
9bc0: 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70  x..**.** It is p
9bd0: 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 65  ossible that the
9be0: 20 72 61 6e 67 65 20 6f 66 20 72 65 74 75 72 6e   range of return
9bf0: 65 64 20 6c 65 61 66 20 6e 6f 64 65 73 20 64 6f  ed leaf nodes do
9c00: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 0a  es not contain .
9c10: 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
9c20: 20 74 65 72 6d 20 6f 72 20 61 6e 79 20 74 65 72   term or any ter
9c30: 6d 73 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  ms for which it 
9c40: 69 73 20 61 20 70 72 65 66 69 78 2e 20 48 6f 77  is a prefix. How
9c50: 65 76 65 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  ever, if the .**
9c60: 20 73 65 67 6d 65 6e 74 20 64 6f 65 73 20 63 6f   segment does co
9c70: 6e 74 61 69 6e 20 61 6e 79 20 73 75 63 68 20 74  ntain any such t
9c80: 65 72 6d 73 2c 20 74 68 65 79 20 61 72 65 20 73  erms, they are s
9c90: 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
9ca0: 20 69 64 65 6e 74 69 66 69 65 64 0a 2a 2a 20 72   identified.** r
9cb0: 61 6e 67 65 2e 20 42 65 63 61 75 73 65 20 74 68  ange. Because th
9cc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  is function only
9cd0: 20 69 6e 73 70 65 63 74 73 20 69 6e 74 65 72 69   inspects interi
9ce0: 6f 72 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 73  or segment nodes
9cf0: 20 28 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 6c   (and.** never l
9d00: 6f 61 64 73 20 6c 65 61 66 20 6e 6f 64 65 73 20  oads leaf nodes 
9d10: 69 6e 74 6f 20 6d 65 6d 6f 72 79 29 2c 20 69 74  into memory), it
9d20: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
9d30: 20 74 6f 20 62 65 20 73 75 72 65 2e 0a 2a 2a 0a   to be sure..**.
9d40: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
9d50: 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
9d60: 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20  code other than 
9d70: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
9d80: 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  urned..*/ .stati
9d90: 63 20 69 6e 74 20 66 74 73 33 53 65 6c 65 63 74  c int fts3Select
9da0: 4c 65 61 66 28 0a 20 20 46 74 73 33 54 61 62 6c  Leaf(.  Fts3Tabl
9db0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
9dd0: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
9de0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9df0: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
9e00: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
9e10: 73 65 6c 65 63 74 20 6c 65 61 76 65 73 20 66 6f  select leaves fo
9e20: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  r */.  int nTerm
9e30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9e40: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9e50: 66 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20  f term zTerm in 
9e60: 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  bytes */.  const
9e70: 20 63 68 61 72 20 2a 7a 4e 6f 64 65 2c 20 20 20   char *zNode,   
9e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
9e90: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
9ea0: 73 65 67 6d 65 6e 74 20 69 6e 74 65 72 69 6f 72  segment interior
9eb0: 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   node */.  int n
9ec0: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
9ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9ee0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
9ef0: 7a 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  zNode */.  sqlit
9f00: 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 65 61 66  e3_int64 *piLeaf
9f10: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ,          /* Se
9f20: 6c 65 63 74 65 64 20 6c 65 61 66 20 6e 6f 64 65  lected leaf node
9f30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
9f40: 74 36 34 20 2a 70 69 4c 65 61 66 32 20 20 20 20  t64 *piLeaf2    
9f50: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 65        /* Selecte
9f60: 64 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 29  d leaf node */.)
9f70: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
9fa0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65 69  de */.  int iHei
9fb0: 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
9fc0: 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68          /* Heigh
9fd0: 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20 69  t of this node i
9fe0: 6e 20 74 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73  n tree */..  ass
9ff0: 65 72 74 28 20 70 69 4c 65 61 66 20 7c 7c 20 70  ert( piLeaf || p
a000: 69 4c 65 61 66 32 20 29 3b 0a 0a 20 20 73 71 6c  iLeaf2 );..  sql
a010: 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
a020: 74 33 32 28 7a 4e 6f 64 65 2c 20 26 69 48 65 69  t32(zNode, &iHei
a030: 67 68 74 29 3b 0a 20 20 72 63 20 3d 20 66 74 73  ght);.  rc = fts
a040: 33 53 63 61 6e 49 6e 74 65 72 69 6f 72 4e 6f 64  3ScanInteriorNod
a050: 65 28 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  e(zTerm, nTerm, 
a060: 7a 4e 6f 64 65 2c 20 6e 4e 6f 64 65 2c 20 70 69  zNode, nNode, pi
a070: 4c 65 61 66 2c 20 70 69 4c 65 61 66 32 29 3b 0a  Leaf, piLeaf2);.
a080: 20 20 61 73 73 65 72 74 28 20 21 70 69 4c 65 61    assert( !piLea
a090: 66 32 20 7c 7c 20 21 70 69 4c 65 61 66 20 7c 7c  f2 || !piLeaf ||
a0a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a0b0: 7c 20 28 2a 70 69 4c 65 61 66 3c 3d 2a 70 69 4c  | (*piLeaf<=*piL
a0c0: 65 61 66 32 29 20 29 3b 0a 0a 20 20 69 66 28 20  eaf2) );..  if( 
a0d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
a0e0: 20 69 48 65 69 67 68 74 3e 31 20 29 7b 0a 20 20   iHeight>1 ){.  
a0f0: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20    char *zBlob = 
a100: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a110: 2f 2a 20 42 6c 6f 62 20 72 65 61 64 20 66 72 6f  /* Blob read fro
a120: 6d 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  m %_segments tab
a130: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
a140: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
a150: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a160: 6f 66 20 7a 42 6c 6f 62 20 69 6e 20 62 79 74 65  of zBlob in byte
a170: 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 69  s */..    if( pi
a180: 4c 65 61 66 20 26 26 20 70 69 4c 65 61 66 32 20  Leaf && piLeaf2 
a190: 26 26 20 28 2a 70 69 4c 65 61 66 21 3d 2a 70 69  && (*piLeaf!=*pi
a1a0: 4c 65 61 66 32 29 20 29 7b 0a 20 20 20 20 20 20  Leaf2) ){.      
a1b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
a1c0: 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 2a 70 69  ReadBlock(p, *pi
a1d0: 4c 65 61 66 2c 20 26 7a 42 6c 6f 62 2c 20 26 6e  Leaf, &zBlob, &n
a1e0: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 69 66 28  Blob);.      if(
a1f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a200: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
a210: 74 73 33 53 65 6c 65 63 74 4c 65 61 66 28 70 2c  ts3SelectLeaf(p,
a220: 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a   zTerm, nTerm, z
a230: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70 69 4c  Blob, nBlob, piL
a240: 65 61 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  eaf, 0);.      }
a250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
a260: 72 65 65 28 7a 42 6c 6f 62 29 3b 0a 20 20 20 20  ree(zBlob);.    
a270: 20 20 70 69 4c 65 61 66 20 3d 20 30 3b 0a 20 20    piLeaf = 0;.  
a280: 20 20 20 20 7a 42 6c 6f 62 20 3d 20 30 3b 0a 20      zBlob = 0;. 
a290: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
a2a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a2b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a2c0: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
a2d0: 2c 20 70 69 4c 65 61 66 20 3f 20 2a 70 69 4c 65  , piLeaf ? *piLe
a2e0: 61 66 20 3a 20 2a 70 69 4c 65 61 66 32 2c 20 26  af : *piLeaf2, &
a2f0: 7a 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a  zBlob, &nBlob);.
a300: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
a310: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a320: 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
a330: 6c 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72  lectLeaf(p, zTer
a340: 6d 2c 20 6e 54 65 72 6d 2c 20 7a 42 6c 6f 62 2c  m, nTerm, zBlob,
a350: 20 6e 42 6c 6f 62 2c 20 70 69 4c 65 61 66 2c 20   nBlob, piLeaf, 
a360: 70 69 4c 65 61 66 32 29 3b 0a 20 20 20 20 7d 0a  piLeaf2);.    }.
a370: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a380: 28 7a 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20  (zBlob);.  }..  
a390: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a3a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a3b0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65  n is used to cre
a3c0: 61 74 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65  ate delta-encode
a3d0: 64 20 73 65 72 69 61 6c 69 7a 65 64 20 6c 69 73  d serialized lis
a3e0: 74 73 20 6f 66 20 46 54 53 33 20 0a 2a 2a 20 76  ts of FTS3 .** v
a3f0: 61 72 69 6e 74 73 2e 20 45 61 63 68 20 63 61 6c  arints. Each cal
a400: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
a410: 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 73 69 6e  on appends a sin
a420: 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20  gle varint to a 
a430: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
a440: 76 6f 69 64 20 66 74 73 33 50 75 74 44 65 6c 74  void fts3PutDelt
a450: 61 56 61 72 69 6e 74 28 0a 20 20 63 68 61 72 20  aVarint(.  char 
a460: 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
a470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
a480: 2f 4f 55 54 3a 20 4f 75 74 70 75 74 20 70 6f 69  /OUT: Output poi
a490: 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nter */.  sqlite
a4a0: 33 5f 69 6e 74 36 34 20 2a 70 69 50 72 65 76 2c  3_int64 *piPrev,
a4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
a4c0: 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 76 61  OUT: Previous va
a4d0: 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 6c  lue written to l
a4e0: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
a4f0: 5f 69 6e 74 36 34 20 69 56 61 6c 20 20 20 20 20  _int64 iVal     
a500: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
a510: 65 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  e this value to 
a520: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  the list */.){. 
a530: 20 61 73 73 65 72 74 28 20 69 56 61 6c 2d 2a 70   assert( iVal-*p
a540: 69 50 72 65 76 20 3e 20 30 20 7c 7c 20 28 2a 70  iPrev > 0 || (*p
a550: 69 50 72 65 76 3d 3d 30 20 26 26 20 69 56 61 6c  iPrev==0 && iVal
a560: 3d 3d 30 29 20 29 3b 0a 20 20 2a 70 70 20 2b 3d  ==0) );.  *pp +=
a570: 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
a580: 61 72 69 6e 74 28 2a 70 70 2c 20 69 56 61 6c 2d  arint(*pp, iVal-
a590: 2a 70 69 50 72 65 76 29 3b 0a 20 20 2a 70 69 50  *piPrev);.  *piP
a5a0: 72 65 76 20 3d 20 69 56 61 6c 3b 0a 7d 0a 0a 2f  rev = iVal;.}../
a5b0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
a5c0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a5d0: 64 2c 20 2a 70 70 50 6f 73 6c 69 73 74 20 69 73  d, *ppPoslist is
a5e0: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
a5f0: 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 74 61  t to the .** sta
a600: 72 74 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e  rt of a position
a610: 2d 6c 69 73 74 2e 20 41 66 74 65 72 20 69 74 20  -list. After it 
a620: 72 65 74 75 72 6e 73 2c 20 2a 70 70 50 6f 73 6c  returns, *ppPosl
a630: 69 73 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ist points to th
a640: 65 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20  e.** first byte 
a650: 61 66 74 65 72 20 74 68 65 20 70 6f 73 69 74 69  after the positi
a660: 6f 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on-list..**.** A
a670: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69   position list i
a680: 73 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74 69  s list of positi
a690: 6f 6e 73 20 28 64 65 6c 74 61 20 65 6e 63 6f 64  ons (delta encod
a6a0: 65 64 29 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20  ed) and columns 
a6b0: 66 6f 72 20 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  for .** a single
a6c0: 20 64 6f 63 75 6d 65 6e 74 20 72 65 63 6f 72 64   document record
a6d0: 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 20   of a doclist.  
a6e0: 53 6f 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  So, in other wor
a6f0: 64 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ds, this.** rout
a700: 69 6e 65 20 61 64 76 61 6e 63 65 73 20 2a 70 70  ine advances *pp
a710: 50 6f 73 6c 69 73 74 20 73 6f 20 74 68 61 74 20  Poslist so that 
a720: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
a730: 20 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 0a 2a   next docid in.*
a740: 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 6f  * the doclist, o
a750: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  r to the first b
a760: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
a770: 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2e   of the doclist.
a780: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73 20  .**.** If pp is 
a790: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
a7a0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
a7b0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
a7c0: 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74   are copied.** t
a7d0: 6f 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65  o *pp. *pp is se
a7e0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
a7f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
a800: 74 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  t the last byte 
a810: 63 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65  copied.** before
a820: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
a830: 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
a840: 63 20 76 6f 69 64 20 66 74 73 33 50 6f 73 6c 69  c void fts3Posli
a850: 73 74 43 6f 70 79 28 63 68 61 72 20 2a 2a 70 70  stCopy(char **pp
a860: 2c 20 63 68 61 72 20 2a 2a 70 70 50 6f 73 6c 69  , char **ppPosli
a870: 73 74 29 7b 0a 20 20 63 68 61 72 20 2a 70 45 6e  st){.  char *pEn
a880: 64 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74 3b 0a  d = *ppPoslist;.
a890: 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20    char c = 0;.. 
a8a0: 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20 61   /* The end of a
a8b0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69   position list i
a8c0: 73 20 6d 61 72 6b 65 64 20 62 79 20 61 20 7a 65  s marked by a ze
a8d0: 72 6f 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e  ro encoded as an
a8e0: 20 46 54 53 33 20 0a 20 20 2a 2a 20 76 61 72 69   FTS3 .  ** vari
a8f0: 6e 74 2e 20 41 20 73 69 6e 67 6c 65 20 50 4f 53  nt. A single POS
a900: 5f 45 4e 44 20 28 30 29 20 62 79 74 65 2e 20 45  _END (0) byte. E
a910: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 30 20  xcept, if the 0 
a920: 62 79 74 65 20 69 73 20 70 72 65 63 65 64 65 64  byte is preceded
a930: 20 62 79 0a 20 20 2a 2a 20 61 20 62 79 74 65 20   by.  ** a byte 
a940: 77 69 74 68 20 74 68 65 20 30 78 38 30 20 62 69  with the 0x80 bi
a950: 74 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69  t set, then it i
a960: 73 20 6e 6f 74 20 61 20 76 61 72 69 6e 74 20 30  s not a varint 0
a970: 2c 20 62 75 74 20 74 68 65 20 74 61 69 6c 0a 20  , but the tail. 
a980: 20 2a 2a 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65   ** of some othe
a990: 72 2c 20 6d 75 6c 74 69 2d 62 79 74 65 2c 20 76  r, multi-byte, v
a9a0: 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  alue..  **.  ** 
a9b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68  The following wh
a9c0: 69 6c 65 2d 6c 6f 6f 70 20 6d 6f 76 65 73 20 70  ile-loop moves p
a9d0: 45 6e 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  End to point to 
a9e0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 74  the first byte t
a9f0: 68 61 74 20 69 73 20 6e 6f 74 20 0a 20 20 2a 2a  hat is not .  **
aa00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 65   immediately pre
aa10: 63 65 64 65 64 20 62 79 20 61 20 62 79 74 65 20  ceded by a byte 
aa20: 77 69 74 68 20 74 68 65 20 30 78 38 30 20 62 69  with the 0x80 bi
aa30: 74 20 73 65 74 2e 20 54 68 65 6e 20 69 6e 63 72  t set. Then incr
aa40: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 70 45 6e 64  ements.  ** pEnd
aa50: 20 6f 6e 63 65 20 6d 6f 72 65 20 73 6f 20 74 68   once more so th
aa60: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
aa70: 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  the byte immedia
aa80: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
aa90: 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 62 79 74  he.  ** last byt
aaa0: 65 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  e in the positio
aab0: 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 77  n-list..  */.  w
aac0: 68 69 6c 65 28 20 2a 70 45 6e 64 20 7c 20 63 20  hile( *pEnd | c 
aad0: 29 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e 64  ){.    c = *pEnd
aae0: 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 74  ++ & 0x80;.    t
aaf0: 65 73 74 63 61 73 65 28 20 63 21 3d 30 20 26 26  estcase( c!=0 &&
ab00: 20 28 2a 70 45 6e 64 29 3d 3d 30 20 29 3b 0a 20   (*pEnd)==0 );. 
ab10: 20 7d 0a 20 20 70 45 6e 64 2b 2b 3b 20 20 2f 2a   }.  pEnd++;  /*
ab20: 20 41 64 76 61 6e 63 65 20 70 61 73 74 20 74 68   Advance past th
ab30: 65 20 50 4f 53 5f 45 4e 44 20 74 65 72 6d 69 6e  e POS_END termin
ab40: 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 0a 20 20  ator byte */..  
ab50: 69 66 28 20 70 70 20 29 7b 0a 20 20 20 20 69 6e  if( pp ){.    in
ab60: 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64  t n = (int)(pEnd
ab70: 20 2d 20 2a 70 70 50 6f 73 6c 69 73 74 29 3b 0a   - *ppPoslist);.
ab80: 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70      char *p = *p
ab90: 70 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  p;.    memcpy(p,
aba0: 20 2a 70 70 50 6f 73 6c 69 73 74 2c 20 6e 29 3b   *ppPoslist, n);
abb0: 0a 20 20 20 20 70 20 2b 3d 20 6e 3b 0a 20 20 20  .    p += n;.   
abc0: 20 2a 70 70 20 3d 20 70 3b 0a 20 20 7d 0a 20 20   *pp = p;.  }.  
abd0: 2a 70 70 50 6f 73 6c 69 73 74 20 3d 20 70 45 6e  *ppPoslist = pEn
abe0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  d;.}../*.** When
abf0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ac00: 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 50 6f 73  s called, *ppPos
ac10: 6c 69 73 74 20 69 73 20 61 73 73 75 6d 65 64 20  list is assumed 
ac20: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
ac30: 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20 61 20 63  .** start of a c
ac40: 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 20 41 66 74 65  olumn-list. Afte
ac50: 72 20 69 74 20 72 65 74 75 72 6e 73 2c 20 2a 70  r it returns, *p
ac60: 70 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 73 20  pPoslist points 
ac70: 74 6f 20 74 68 65 0a 2a 2a 20 74 6f 20 74 68 65  to the.** to the
ac80: 20 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53   terminator (POS
ac90: 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45  _COLUMN or POS_E
aca0: 4e 44 29 20 62 79 74 65 20 6f 66 20 74 68 65 20  ND) byte of the 
acb0: 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a  column-list..**.
acc0: 2a 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74  ** A column-list
acd0: 20 69 73 20 6c 69 73 74 20 6f 66 20 64 65 6c 74   is list of delt
ace0: 61 2d 65 6e 63 6f 64 65 64 20 70 6f 73 69 74 69  a-encoded positi
acf0: 6f 6e 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ons for a single
ad00: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 77 69 74 68 69   column.** withi
ad10: 6e 20 61 20 73 69 6e 67 6c 65 20 64 6f 63 75 6d  n a single docum
ad20: 65 6e 74 20 77 69 74 68 69 6e 20 61 20 64 6f 63  ent within a doc
ad30: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
ad40: 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 74  column-list is t
ad50: 65 72 6d 69 6e 61 74 65 64 20 65 69 74 68 65 72  erminated either
ad60: 20 62 79 20 61 20 50 4f 53 5f 43 4f 4c 55 4d 4e   by a POS_COLUMN
ad70: 20 76 61 72 69 6e 74 20 28 31 29 20 6f 72 0a 2a   varint (1) or.*
ad80: 2a 20 61 20 50 4f 53 5f 45 4e 44 20 76 61 72 69  * a POS_END vari
ad90: 6e 74 20 28 30 29 2e 20 20 54 68 69 73 20 72 6f  nt (0).  This ro
ada0: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 2a 70 70  utine leaves *pp
adb0: 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 69 6e 67  Poslist pointing
adc0: 20 74 6f 0a 2a 2a 20 74 68 65 20 50 4f 53 5f 43   to.** the POS_C
add0: 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e 44  OLUMN or POS_END
ade0: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
adf0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74   the column-list
ae00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73  ..**.** If pp is
ae10: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
ae20: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
ae30: 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20  the column-list 
ae40: 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74 6f  are copied.** to
ae50: 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65 74   *pp. *pp is set
ae60: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
ae70: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
ae80: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 63   the last byte c
ae90: 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  opied.** before 
aea0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
aeb0: 74 75 72 6e 73 2e 20 20 54 68 65 20 50 4f 53 5f  turns.  The POS_
aec0: 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e  COLUMN or POS_EN
aed0: 44 20 74 65 72 6d 69 6e 61 74 6f 72 0a 2a 2a 20  D terminator.** 
aee0: 69 73 20 6e 6f 74 20 63 6f 70 69 65 64 20 69 6e  is not copied in
aef0: 74 6f 20 2a 70 70 2e 0a 2a 2f 0a 73 74 61 74 69  to *pp..*/.stati
af00: 63 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75 6d  c void fts3Colum
af10: 6e 6c 69 73 74 43 6f 70 79 28 63 68 61 72 20 2a  nlistCopy(char *
af20: 2a 70 70 2c 20 63 68 61 72 20 2a 2a 70 70 50 6f  *pp, char **ppPo
af30: 73 6c 69 73 74 29 7b 0a 20 20 63 68 61 72 20 2a  slist){.  char *
af40: 70 45 6e 64 20 3d 20 2a 70 70 50 6f 73 6c 69 73  pEnd = *ppPoslis
af50: 74 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b  t;.  char c = 0;
af60: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 2d  ..  /* A column-
af70: 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74  list is terminat
af80: 65 64 20 62 79 20 65 69 74 68 65 72 20 61 20 30  ed by either a 0
af90: 78 30 31 20 6f 72 20 30 78 30 30 20 62 79 74 65  x01 or 0x00 byte
afa0: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f   that is.  ** no
afb0: 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
afc0: 69 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20  i-byte varint.. 
afd0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 30 78 46   */.  while( 0xF
afe0: 45 20 26 20 28 2a 70 45 6e 64 20 7c 20 63 29 20  E & (*pEnd | c) 
aff0: 29 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e 64  ){.    c = *pEnd
b000: 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 74  ++ & 0x80;.    t
b010: 65 73 74 63 61 73 65 28 20 63 21 3d 30 20 26 26  estcase( c!=0 &&
b020: 20 28 28 2a 70 45 6e 64 29 26 30 78 66 65 29 3d   ((*pEnd)&0xfe)=
b030: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
b040: 70 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  pp ){.    int n 
b050: 3d 20 28 69 6e 74 29 28 70 45 6e 64 20 2d 20 2a  = (int)(pEnd - *
b060: 70 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ppPoslist);.    
b070: 63 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20  char *p = *pp;. 
b080: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 2a 70 70     memcpy(p, *pp
b090: 50 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a 20 20 20  Poslist, n);.   
b0a0: 20 70 20 2b 3d 20 6e 3b 0a 20 20 20 20 2a 70 70   p += n;.    *pp
b0b0: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a 70 70 50   = p;.  }.  *ppP
b0c0: 6f 73 6c 69 73 74 20 3d 20 70 45 6e 64 3b 0a 7d  oslist = pEnd;.}
b0d0: 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 75 73  ../*.** Value us
b0e0: 65 64 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  ed to signify th
b0f0: 65 20 65 6e 64 20 6f 66 20 61 6e 20 70 6f 73 69  e end of an posi
b100: 74 69 6f 6e 2d 6c 69 73 74 2e 20 54 68 69 73 20  tion-list. This 
b110: 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65 0a  is safe because.
b120: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** it is not pos
b130: 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20  sible to have a 
b140: 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 32 5e  document with 2^
b150: 33 31 20 74 65 72 6d 73 2e 0a 2a 2f 0a 23 64 65  31 terms..*/.#de
b160: 66 69 6e 65 20 50 4f 53 49 54 49 4f 4e 5f 4c 49  fine POSITION_LI
b170: 53 54 5f 45 4e 44 20 30 78 37 66 66 66 66 66 66  ST_END 0x7ffffff
b180: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
b190: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
b1a0: 6f 20 68 65 6c 70 20 70 61 72 73 65 20 70 6f 73  o help parse pos
b1b0: 69 74 69 6f 6e 2d 6c 69 73 74 73 2e 20 57 68 65  ition-lists. Whe
b1c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
b1d0: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 2a 70  is.** called, *p
b1e0: 70 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 74  p may point to t
b1f0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
b200: 6e 65 78 74 20 76 61 72 69 6e 74 20 69 6e 20 74  next varint in t
b210: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
b220: 0a 2a 2a 20 62 65 69 6e 67 20 70 61 72 73 65 64  .** being parsed
b230: 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e  , or it may poin
b240: 74 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74  t to 1 byte past
b250: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b260: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a 2a 2a  position-list.**
b270: 20 28 69 6e 20 77 68 69 63 68 20 63 61 73 65 20   (in which case 
b280: 2a 2a 70 70 20 77 69 6c 6c 20 62 65 20 61 20 74  **pp will be a t
b290: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20  erminator bytes 
b2a0: 50 4f 53 5f 45 4e 44 20 28 30 29 20 6f 72 0a 2a  POS_END (0) or.*
b2b0: 2a 20 28 31 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  * (1))..**.** If
b2c0: 20 2a 70 70 20 70 6f 69 6e 74 73 20 70 61 73 74   *pp points past
b2d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b2e0: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
b2f0: 2d 6c 69 73 74 2c 20 73 65 74 20 2a 70 69 20 74  -list, set *pi t
b300: 6f 20 0a 2a 2a 20 50 4f 53 49 54 49 4f 4e 5f 4c  o .** POSITION_L
b310: 49 53 54 5f 45 4e 44 20 61 6e 64 20 72 65 74 75  IST_END and retu
b320: 72 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  rn. Otherwise, r
b330: 65 61 64 20 74 68 65 20 6e 65 78 74 20 76 61 72  ead the next var
b340: 69 6e 74 20 66 72 6f 6d 20 2a 70 70 2c 0a 2a 2a  int from *pp,.**
b350: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63   increment the c
b360: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
b370: 2a 70 69 20 62 79 20 74 68 65 20 76 61 6c 75 65  *pi by the value
b380: 20 72 65 61 64 2c 20 61 6e 64 20 73 65 74 20 2a   read, and set *
b390: 70 70 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  pp to.** point t
b3a0: 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65  o the next value
b3b0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
b3c0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
b3d0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
b3e0: 74 69 6e 65 20 2a 70 69 20 6d 75 73 74 20 62 65  tine *pi must be
b3f0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
b400: 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
b410: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 73  the previous pos
b420: 69 74 69 6f 6e 2c 20 6f 72 20 7a 65 72 6f 20 69  ition, or zero i
b430: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
b440: 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74   the first posit
b450: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 70 6f  ion.** in the po
b460: 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 20 42 65  sition-list.  Be
b470: 63 61 75 73 65 20 70 6f 73 69 74 69 6f 6e 73 20  cause positions 
b480: 61 72 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65  are delta-encode
b490: 64 2c 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  d, the value.** 
b4a0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
b4b0: 70 6f 73 69 74 69 6f 6e 20 69 73 20 6e 65 65 64  position is need
b4c0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ed in order to c
b4d0: 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65  ompute the value
b4e0: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20   of.** the next 
b4f0: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
b500: 74 69 63 20 76 6f 69 64 20 66 74 73 33 52 65 61  tic void fts3Rea
b510: 64 4e 65 78 74 50 6f 73 28 0a 20 20 63 68 61 72  dNextPos(.  char
b520: 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
b530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
b540: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 69 6e 74  OUT: Pointer int
b550: 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  o position-list 
b560: 62 75 66 66 65 72 20 2a 2f 0a 20 20 73 71 6c 69  buffer */.  sqli
b570: 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 20 20 20  te3_int64 *pi   
b580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
b590: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
b5a0: 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  from position-li
b5b0: 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28  st */.){.  if( (
b5c0: 2a 2a 70 70 29 26 30 78 46 45 20 29 7b 0a 20 20  **pp)&0xFE ){.  
b5d0: 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61    fts3GetDeltaVa
b5e0: 72 69 6e 74 28 70 70 2c 20 70 69 29 3b 0a 20 20  rint(pp, pi);.  
b5f0: 20 20 2a 70 69 20 2d 3d 20 32 3b 0a 20 20 7d 65    *pi -= 2;.  }e
b600: 6c 73 65 7b 0a 20 20 20 20 2a 70 69 20 3d 20 50  lse{.    *pi = P
b610: 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44  OSITION_LIST_END
b620: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
b630: 66 20 70 61 72 61 6d 65 74 65 72 20 69 43 6f 6c  f parameter iCol
b640: 20 69 73 20 6e 6f 74 20 30 2c 20 77 72 69 74 65   is not 0, write
b650: 20 61 6e 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 28   an POS_COLUMN (
b660: 31 29 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65 64  1) byte followed
b670: 20 62 79 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   by.** the value
b680: 20 6f 66 20 69 43 6f 6c 20 65 6e 63 6f 64 65 64   of iCol encoded
b690: 20 61 73 20 61 20 76 61 72 69 6e 74 20 74 6f 20   as a varint to 
b6a0: 2a 70 70 2e 20 20 20 54 68 69 73 20 77 69 6c 6c  *pp.   This will
b6b0: 20 73 74 61 72 74 20 61 20 6e 65 77 0a 2a 2a 20   start a new.** 
b6c0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  column list..**.
b6d0: 2a 2a 20 53 65 74 20 2a 70 70 20 74 6f 20 70 6f  ** Set *pp to po
b6e0: 69 6e 74 20 74 6f 20 74 68 65 20 62 79 74 65 20  int to the byte 
b6f0: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 6c  just after the l
b700: 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e  ast byte written
b710: 20 62 65 66 6f 72 65 20 0a 2a 2a 20 72 65 74 75   before .** retu
b720: 72 6e 69 6e 67 20 28 64 6f 20 6e 6f 74 20 6d 6f  rning (do not mo
b730: 64 69 66 79 20 69 74 20 69 66 20 69 43 6f 6c 3d  dify it if iCol=
b740: 3d 30 29 2e 20 52 65 74 75 72 6e 20 74 68 65 20  =0). Return the 
b750: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
b760: 62 79 74 65 73 0a 2a 2a 20 77 72 69 74 74 65 6e  bytes.** written
b770: 20 28 30 20 69 66 20 69 43 6f 6c 3d 3d 30 29 2e   (0 if iCol==0).
b780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b790: 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28  ts3PutColNumber(
b7a0: 63 68 61 72 20 2a 2a 70 70 2c 20 69 6e 74 20 69  char **pp, int i
b7b0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  Col){.  int n = 
b7c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b7d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b7e0: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
b7f0: 65 6e 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c  en */.  if( iCol
b800: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 20   ){.    char *p 
b810: 3d 20 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20  = *pp;          
b820: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
b830: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 6e  pointer */.    n
b840: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74   = 1 + sqlite3Ft
b850: 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 5b 31  s3PutVarint(&p[1
b860: 5d 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  ], iCol);.    *p
b870: 20 3d 20 30 78 30 31 3b 0a 20 20 20 20 2a 70 70   = 0x01;.    *pp
b880: 20 3d 20 26 70 5b 6e 5d 3b 0a 20 20 7d 0a 20 20   = &p[n];.  }.  
b890: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
b8a0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 75  ** Compute the u
b8b0: 6e 69 6f 6e 20 6f 66 20 74 77 6f 20 70 6f 73 69  nion of two posi
b8c0: 74 69 6f 6e 20 6c 69 73 74 73 2e 20 20 54 68 65  tion lists.  The
b8d0: 20 6f 75 74 70 75 74 20 77 72 69 74 74 65 6e 0a   output written.
b8e0: 2a 2a 20 69 6e 74 6f 20 2a 70 70 20 63 6f 6e 74  ** into *pp cont
b8f0: 61 69 6e 73 20 61 6c 6c 20 70 6f 73 69 74 69 6f  ains all positio
b900: 6e 73 20 6f 66 20 62 6f 74 68 20 2a 70 70 31 20  ns of both *pp1 
b910: 61 6e 64 20 2a 70 70 32 20 69 6e 20 73 6f 72 74  and *pp2 in sort
b920: 65 64 0a 2a 2a 20 6f 72 64 65 72 20 61 6e 64 20  ed.** order and 
b930: 77 69 74 68 20 61 6e 79 20 64 75 70 6c 69 63 61  with any duplica
b940: 74 65 73 20 72 65 6d 6f 76 65 64 2e 20 20 41 6c  tes removed.  Al
b950: 6c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a  l pointers are.*
b960: 2a 20 75 70 64 61 74 65 64 20 61 70 70 72 6f 70  * updated approp
b970: 72 69 61 74 65 6c 79 2e 20 20 20 54 68 65 20 63  riately.   The c
b980: 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
b990: 69 62 6c 65 20 66 6f 72 20 69 6e 73 75 72 69 6e  ible for insurin
b9a0: 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20  g.** that there 
b9b0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
b9c0: 69 6e 20 2a 70 70 20 74 6f 20 68 6f 6c 64 20 74  in *pp to hold t
b9d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 6f 75 74 70  he complete outp
b9e0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ut..*/.static vo
b9f0: 69 64 20 66 74 73 33 50 6f 73 6c 69 73 74 4d 65  id fts3PoslistMe
ba00: 72 67 65 28 0a 20 20 63 68 61 72 20 2a 2a 70 70  rge(.  char **pp
ba10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba20: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
ba30: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61   buffer */.  cha
ba40: 72 20 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20  r **pp1,        
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba60: 4c 65 66 74 20 69 6e 70 75 74 20 6c 69 73 74 20  Left input list 
ba70: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 32 20  */.  char **pp2 
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 69 6e       /* Right in
baa0: 70 75 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  put list */.){. 
bab0: 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a   char *p = *pp;.
bac0: 20 20 63 68 61 72 20 2a 70 31 20 3d 20 2a 70 70    char *p1 = *pp
bad0: 31 3b 0a 20 20 63 68 61 72 20 2a 70 32 20 3d 20  1;.  char *p2 = 
bae0: 2a 70 70 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20  *pp2;..  while( 
baf0: 2a 70 31 20 7c 7c 20 2a 70 32 20 29 7b 0a 20 20  *p1 || *p2 ){.  
bb00: 20 20 69 6e 74 20 69 43 6f 6c 31 3b 20 20 20 20    int iCol1;    
bb10: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
bb20: 65 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  ent column index
bb30: 20 69 6e 20 70 70 31 20 2a 2f 0a 20 20 20 20 69   in pp1 */.    i
bb40: 6e 74 20 69 43 6f 6c 32 3b 20 20 20 20 20 20 20  nt iCol2;       
bb50: 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
bb60: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e   column index in
bb70: 20 70 70 32 20 2a 2f 0a 0a 20 20 20 20 69 66 28   pp2 */..    if(
bb80: 20 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e   *p1==POS_COLUMN
bb90: 20 29 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   ) sqlite3Fts3Ge
bba0: 74 56 61 72 69 6e 74 33 32 28 26 70 31 5b 31 5d  tVarint32(&p1[1]
bbb0: 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20 20 65  , &iCol1);.    e
bbc0: 6c 73 65 20 69 66 28 20 2a 70 31 3d 3d 50 4f 53  lse if( *p1==POS
bbd0: 5f 45 4e 44 20 29 20 69 43 6f 6c 31 20 3d 20 50  _END ) iCol1 = P
bbe0: 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44  OSITION_LIST_END
bbf0: 3b 0a 20 20 20 20 65 6c 73 65 20 69 43 6f 6c 31  ;.    else iCol1
bc00: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 2a   = 0;..    if( *
bc10: 70 32 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29  p2==POS_COLUMN )
bc20: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
bc30: 61 72 69 6e 74 33 32 28 26 70 32 5b 31 5d 2c 20  arint32(&p2[1], 
bc40: 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20 65 6c 73  &iCol2);.    els
bc50: 65 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53 5f 45  e if( *p2==POS_E
bc60: 4e 44 20 29 20 69 43 6f 6c 32 20 3d 20 50 4f 53  ND ) iCol2 = POS
bc70: 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b 0a  ITION_LIST_END;.
bc80: 20 20 20 20 65 6c 73 65 20 69 43 6f 6c 32 20 3d      else iCol2 =
bc90: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 43 6f   0;..    if( iCo
bca0: 6c 31 3d 3d 69 43 6f 6c 32 20 29 7b 0a 20 20 20  l1==iCol2 ){.   
bcb0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
bcc0: 20 69 31 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   i1 = 0;       /
bcd0: 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e 20  * Last position 
bce0: 66 72 6f 6d 20 70 70 31 20 2a 2f 0a 20 20 20 20  from pp1 */.    
bcf0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
bd00: 69 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  i2 = 0;       /*
bd10: 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e 20 66   Last position f
bd20: 72 6f 6d 20 70 70 32 20 2a 2f 0a 20 20 20 20 20  rom pp2 */.     
bd30: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
bd40: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
bd50: 69 6e 74 20 6e 20 3d 20 66 74 73 33 50 75 74 43  int n = fts3PutC
bd60: 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43 6f  olNumber(&p, iCo
bd70: 6c 31 29 3b 0a 20 20 20 20 20 20 70 31 20 2b 3d  l1);.      p1 +=
bd80: 20 6e 3b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20   n;.      p2 += 
bd90: 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 20  n;..      /* At 
bda0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 6f 74 68  this point, both
bdb0: 20 70 31 20 61 6e 64 20 70 32 20 70 6f 69 6e 74   p1 and p2 point
bdc0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
bdd0: 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 73 0a 20 20   column-lists.  
bde0: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 73      ** for the s
bdf0: 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 74 68 65 20  ame column (the 
be00: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 69 6e 64 65  column with inde
be10: 78 20 69 43 6f 6c 31 20 61 6e 64 20 69 43 6f 6c  x iCol1 and iCol
be20: 32 29 2e 0a 20 20 20 20 20 20 2a 2a 20 41 20 63  2)..      ** A c
be30: 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 61 20  olumn-list is a 
be40: 6c 69 73 74 20 6f 66 20 6e 6f 6e 2d 6e 65 67 61  list of non-nega
be50: 74 69 76 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64  tive delta-encod
be60: 65 64 20 76 61 72 69 6e 74 73 2c 20 65 61 63 68  ed varints, each
be70: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65   .      ** incre
be80: 6d 65 6e 74 65 64 20 62 79 20 32 20 62 65 66 6f  mented by 2 befo
be90: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 2e  re being stored.
bea0: 20 45 61 63 68 20 6c 69 73 74 20 69 73 20 74 65   Each list is te
beb0: 72 6d 69 6e 61 74 65 64 20 62 79 20 61 0a 20 20  rminated by a.  
bec0: 20 20 20 20 2a 2a 20 50 4f 53 5f 45 4e 44 20 28      ** POS_END (
bed0: 30 29 20 6f 72 20 50 4f 53 5f 43 4f 4c 55 4d 4e  0) or POS_COLUMN
bee0: 20 28 31 29 2e 20 54 68 65 20 66 6f 6c 6c 6f 77   (1). The follow
bef0: 69 6e 67 20 62 6c 6f 63 6b 20 6d 65 72 67 65 73  ing block merges
bf00: 20 74 68 65 20 74 77 6f 20 6c 69 73 74 73 0a 20   the two lists. 
bf10: 20 20 20 20 20 2a 2a 20 61 6e 64 20 77 72 69 74       ** and writ
bf20: 65 73 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  es the results t
bf30: 6f 20 62 75 66 66 65 72 20 70 2e 20 70 20 69 73  o buffer p. p is
bf40: 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
bf50: 6f 20 74 68 65 20 62 79 74 65 0a 20 20 20 20 20  o the byte.     
bf60: 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20 6c 69   ** after the li
bf70: 73 74 20 77 72 69 74 74 65 6e 2e 20 4e 6f 20 74  st written. No t
bf80: 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53 5f 45  erminator (POS_E
bf90: 4e 44 20 6f 72 20 50 4f 53 5f 43 4f 4c 55 4d 4e  ND or POS_COLUMN
bfa0: 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 77 72  ) is.      ** wr
bfb0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
bfc0: 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  put..      */.  
bfd0: 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61      fts3GetDelta
bfe0: 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 31 29  Varint(&p1, &i1)
bff0: 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44  ;.      fts3GetD
c000: 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c 20  eltaVarint(&p2, 
c010: 26 69 32 29 3b 0a 20 20 20 20 20 20 64 6f 20 7b  &i2);.      do {
c020: 0a 20 20 20 20 20 20 20 20 66 74 73 33 50 75 74  .        fts3Put
c030: 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c 20  DeltaVarint(&p, 
c040: 26 69 50 72 65 76 2c 20 28 69 31 3c 69 32 29 20  &iPrev, (i1<i2) 
c050: 3f 20 69 31 20 3a 20 69 32 29 3b 20 0a 20 20 20  ? i1 : i2); .   
c060: 20 20 20 20 20 69 50 72 65 76 20 2d 3d 20 32 3b       iPrev -= 2;
c070: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31 3d  .        if( i1=
c080: 3d 69 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =i2 ){.         
c090: 20 66 74 73 33 52 65 61 64 4e 65 78 74 50 6f 73   fts3ReadNextPos
c0a0: 28 26 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20  (&p1, &i1);.    
c0b0: 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e 65        fts3ReadNe
c0c0: 78 74 50 6f 73 28 26 70 32 2c 20 26 69 32 29 3b  xtPos(&p2, &i2);
c0d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
c0e0: 66 28 20 69 31 3c 69 32 20 29 7b 0a 20 20 20 20  f( i1<i2 ){.    
c0f0: 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e 65        fts3ReadNe
c100: 78 74 50 6f 73 28 26 70 31 2c 20 26 69 31 29 3b  xtPos(&p1, &i1);
c110: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c120: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 52 65            fts3Re
c130: 61 64 4e 65 78 74 50 6f 73 28 26 70 32 2c 20 26  adNextPos(&p2, &
c140: 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i2);.        }. 
c150: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 69 31 21       }while( i1!
c160: 3d 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45  =POSITION_LIST_E
c170: 4e 44 20 7c 7c 20 69 32 21 3d 50 4f 53 49 54 49  ND || i2!=POSITI
c180: 4f 4e 5f 4c 49 53 54 5f 45 4e 44 20 29 3b 0a 20  ON_LIST_END );. 
c190: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f     }else if( iCo
c1a0: 6c 31 3c 69 43 6f 6c 32 20 29 7b 0a 20 20 20 20  l1<iCol2 ){.    
c1b0: 20 20 70 31 20 2b 3d 20 66 74 73 33 50 75 74 43    p1 += fts3PutC
c1c0: 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43 6f  olNumber(&p, iCo
c1d0: 6c 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33 43  l1);.      fts3C
c1e0: 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 26 70  olumnlistCopy(&p
c1f0: 2c 20 26 70 31 29 3b 0a 20 20 20 20 7d 65 6c 73  , &p1);.    }els
c200: 65 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 66  e{.      p2 += f
c210: 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28  ts3PutColNumber(
c220: 26 70 2c 20 69 43 6f 6c 32 29 3b 0a 20 20 20 20  &p, iCol2);.    
c230: 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74    fts3Columnlist
c240: 43 6f 70 79 28 26 70 2c 20 26 70 32 29 3b 0a 20  Copy(&p, &p2);. 
c250: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 2b 2b     }.  }..  *p++
c260: 20 3d 20 50 4f 53 5f 45 4e 44 3b 0a 20 20 2a 70   = POS_END;.  *p
c270: 70 20 3d 20 70 3b 0a 20 20 2a 70 70 31 20 3d 20  p = p;.  *pp1 = 
c280: 70 31 20 2b 20 31 3b 0a 20 20 2a 70 70 32 20 3d  p1 + 1;.  *pp2 =
c290: 20 70 32 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a   p2 + 1;.}../*.*
c2a0: 2a 20 6e 54 6f 6b 65 6e 3d 3d 31 20 73 65 61 72  * nToken==1 sear
c2b0: 63 68 65 73 20 66 6f 72 20 61 64 6a 61 63 65 6e  ches for adjacen
c2c0: 74 20 70 6f 73 69 74 69 6f 6e 73 2e 0a 2a 2a 0a  t positions..**.
c2d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c2e0: 20 69 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67   is used to merg
c2f0: 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  e two position l
c300: 69 73 74 73 20 69 6e 74 6f 20 6f 6e 65 2e 20 57  ists into one. W
c310: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 61 6c  hen it is.** cal
c320: 6c 65 64 2c 20 2a 70 70 31 20 61 6e 64 20 2a 70  led, *pp1 and *p
c330: 70 32 20 6d 75 73 74 20 62 6f 74 68 20 70 6f 69  p2 must both poi
c340: 6e 74 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  nt to position l
c350: 69 73 74 73 2e 20 41 20 70 6f 73 69 74 69 6f 6e  ists. A position
c360: 2d 6c 69 73 74 20 69 73 0a 2a 2a 20 74 68 65 20  -list is.** the 
c370: 70 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  part of a doclis
c380: 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 65  t that follows e
c390: 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 64 2e  ach document id.
c3a0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
c3b0: 20 61 20 72 6f 77 0a 2a 2a 20 63 6f 6e 74 61 69   a row.** contai
c3c0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 27 61  ns:.**.**     'a
c3d0: 20 62 20 63 27 7c 27 78 20 79 20 7a 27 7c 27 61   b c'|'x y z'|'a
c3e0: 20 62 20 62 20 61 27 0a 2a 2a 0a 2a 2a 20 54 68   b b a'.**.** Th
c3f0: 65 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  en the position 
c400: 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 72 6f  list for this ro
c410: 77 20 66 6f 72 20 74 6f 6b 65 6e 20 27 62 27 20  w for token 'b' 
c420: 77 6f 75 6c 64 20 63 6f 6e 73 69 73 74 20 6f 66  would consist of
c430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 78 30 32  :.**.**     0x02
c440: 20 30 78 30 31 20 30 78 30 32 20 30 78 30 33 20   0x01 0x02 0x03 
c450: 30 78 30 33 20 30 78 30 30 0a 2a 2a 0a 2a 2a 20  0x03 0x00.**.** 
c460: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
c470: 6f 6e 20 72 65 74 75 72 6e 73 2c 20 62 6f 74 68  on returns, both
c480: 20 2a 70 70 31 20 61 6e 64 20 2a 70 70 32 20 61   *pp1 and *pp2 a
c490: 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  re left pointing
c4a0: 20 74 6f 20 74 68 65 0a 2a 2a 20 62 79 74 65 20   to the.** byte 
c4b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 30 78  following the 0x
c4c0: 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 6f 66  00 terminator of
c4d0: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
c4e0: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  e position lists
c4f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 73 53 61 76  ..**.** If isSav
c500: 65 4c 65 66 74 20 69 73 20 30 2c 20 61 6e 20 65  eLeft is 0, an e
c510: 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f  ntry is added to
c520: 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 73 69   the output posi
c530: 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 0a 2a  tion list for .*
c540: 2a 20 65 61 63 68 20 70 6f 73 69 74 69 6f 6e 20  * each position 
c550: 69 6e 20 2a 70 70 32 20 66 6f 72 20 77 68 69 63  in *pp2 for whic
c560: 68 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  h there exists o
c570: 6e 65 20 6f 72 20 6d 6f 72 65 20 70 6f 73 69 74  ne or more posit
c580: 69 6f 6e 73 20 69 6e 0a 2a 2a 20 2a 70 70 31 20  ions in.** *pp1 
c590: 73 6f 20 74 68 61 74 20 28 70 6f 73 28 2a 70 70  so that (pos(*pp
c5a0: 32 29 3e 70 6f 73 28 2a 70 70 31 29 20 26 26 20  2)>pos(*pp1) && 
c5b0: 70 6f 73 28 2a 70 70 32 29 2d 70 6f 73 28 2a 70  pos(*pp2)-pos(*p
c5c0: 70 31 29 3c 3d 6e 54 6f 6b 65 6e 29 2e 20 69 2e  p1)<=nToken). i.
c5d0: 65 2e 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 2a  e..** when the *
c5e0: 70 70 31 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  pp1 token appear
c5f0: 73 20 62 65 66 6f 72 65 20 74 68 65 20 2a 70 70  s before the *pp
c600: 32 20 74 6f 6b 65 6e 2c 20 62 75 74 20 6e 6f 74  2 token, but not
c610: 20 6d 6f 72 65 20 74 68 61 6e 20 6e 54 6f 6b 65   more than nToke
c620: 6e 0a 2a 2a 20 73 6c 6f 74 73 20 62 65 66 6f 72  n.** slots befor
c630: 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
c640: 69 6e 74 20 66 74 73 33 50 6f 73 6c 69 73 74 50  int fts3PoslistP
c650: 68 72 61 73 65 4d 65 72 67 65 28 0a 20 20 63 68  hraseMerge(.  ch
c660: 61 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  ar **pp,        
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c680: 20 49 4e 2f 4f 55 54 3a 20 50 72 65 61 6c 6c 6f   IN/OUT: Preallo
c690: 63 61 74 65 64 20 6f 75 74 70 75 74 20 62 75 66  cated output buf
c6a0: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  fer */.  int nTo
c6b0: 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
c6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
c6d0: 6d 75 6d 20 64 69 66 66 65 72 65 6e 63 65 20 69  mum difference i
c6e0: 6e 20 74 6f 6b 65 6e 20 70 6f 73 69 74 69 6f 6e  n token position
c6f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  s */.  int isSav
c700: 65 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  eLeft,          
c710: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74         /* Save t
c720: 68 65 20 6c 65 66 74 20 70 6f 73 69 74 69 6f 6e  he left position
c730: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 61 63   */.  int isExac
c740: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
c750: 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 70 31        /* If *pp1
c760: 20 69 73 20 65 78 61 63 74 6c 79 20 6e 54 6f 6b   is exactly nTok
c770: 65 6e 73 20 62 65 66 6f 72 65 20 2a 70 70 32 20  ens before *pp2 
c780: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 31 2c  */.  char **pp1,
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
c7b0: 4c 65 66 74 20 69 6e 70 75 74 20 6c 69 73 74 20  Left input list 
c7c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 32 20  */.  char **pp2 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
c7f0: 52 69 67 68 74 20 69 6e 70 75 74 20 6c 69 73 74  Right input list
c800: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
c810: 20 3d 20 28 70 70 20 3f 20 2a 70 70 20 3a 20 30   = (pp ? *pp : 0
c820: 29 3b 0a 20 20 63 68 61 72 20 2a 70 31 20 3d 20  );.  char *p1 = 
c830: 2a 70 70 31 3b 0a 20 20 63 68 61 72 20 2a 70 32  *pp1;.  char *p2
c840: 20 3d 20 2a 70 70 32 3b 0a 20 20 69 6e 74 20 69   = *pp2;.  int i
c850: 43 6f 6c 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Col1 = 0;.  int 
c860: 69 43 6f 6c 32 20 3d 20 30 3b 0a 0a 20 20 2f 2a  iCol2 = 0;..  /*
c870: 20 4e 65 76 65 72 20 73 65 74 20 62 6f 74 68 20   Never set both 
c880: 69 73 53 61 76 65 4c 65 66 74 20 61 6e 64 20 69  isSaveLeft and i
c890: 73 45 78 61 63 74 20 66 6f 72 20 74 68 65 20 73  sExact for the s
c8a0: 61 6d 65 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  ame invocation. 
c8b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
c8c0: 61 76 65 4c 65 66 74 3d 3d 30 20 7c 7c 20 69 73  aveLeft==0 || is
c8d0: 45 78 61 63 74 3d 3d 30 20 29 3b 0a 0a 20 20 61  Exact==0 );..  a
c8e0: 73 73 65 72 74 28 20 2a 70 31 21 3d 30 20 26 26  ssert( *p1!=0 &&
c8f0: 20 2a 70 32 21 3d 30 20 29 3b 0a 20 20 69 66 28   *p2!=0 );.  if(
c900: 20 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e   *p1==POS_COLUMN
c910: 20 29 7b 20 0a 20 20 20 20 70 31 2b 2b 3b 0a 20   ){ .    p1++;. 
c920: 20 20 20 70 31 20 2b 3d 20 73 71 6c 69 74 65 33     p1 += sqlite3
c930: 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  Fts3GetVarint32(
c940: 70 31 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 7d  p1, &iCol1);.  }
c950: 0a 20 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53 5f  .  if( *p2==POS_
c960: 43 4f 4c 55 4d 4e 20 29 7b 20 0a 20 20 20 20 70  COLUMN ){ .    p
c970: 32 2b 2b 3b 0a 20 20 20 20 70 32 20 2b 3d 20 73  2++;.    p2 += s
c980: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
c990: 69 6e 74 33 32 28 70 32 2c 20 26 69 43 6f 6c 32  int32(p2, &iCol2
c9a0: 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
c9b0: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 69 43   1 ){.    if( iC
c9c0: 6f 6c 31 3d 3d 69 43 6f 6c 32 20 29 7b 0a 20 20  ol1==iCol2 ){.  
c9d0: 20 20 20 20 63 68 61 72 20 2a 70 53 61 76 65 20      char *pSave 
c9e0: 3d 20 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = p;.      sqlit
c9f0: 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d  e3_int64 iPrev =
ca00: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
ca10: 33 5f 69 6e 74 36 34 20 69 50 6f 73 31 20 3d 20  3_int64 iPos1 = 
ca20: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
ca30: 5f 69 6e 74 36 34 20 69 50 6f 73 32 20 3d 20 30  _int64 iPos2 = 0
ca40: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 70 20  ;..      if( pp 
ca50: 26 26 20 69 43 6f 6c 31 20 29 7b 0a 20 20 20 20  && iCol1 ){.    
ca60: 20 20 20 20 2a 70 2b 2b 20 3d 20 50 4f 53 5f 43      *p++ = POS_C
ca70: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70  OLUMN;.        p
ca80: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
ca90: 75 74 56 61 72 69 6e 74 28 70 2c 20 69 43 6f 6c  utVarint(p, iCol
caa0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
cab0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 31 21 3d     assert( *p1!=
cac0: 50 4f 53 5f 45 4e 44 20 26 26 20 2a 70 31 21 3d  POS_END && *p1!=
cad0: 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  POS_COLUMN );.  
cae0: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 32 21      assert( *p2!
caf0: 3d 50 4f 53 5f 45 4e 44 20 26 26 20 2a 70 32 21  =POS_END && *p2!
cb00: 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  =POS_COLUMN );. 
cb10: 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
cb20: 61 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 50  aVarint(&p1, &iP
cb30: 6f 73 31 29 3b 20 69 50 6f 73 31 20 2d 3d 20 32  os1); iPos1 -= 2
cb40: 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44  ;.      fts3GetD
cb50: 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c 20  eltaVarint(&p2, 
cb60: 26 69 50 6f 73 32 29 3b 20 69 50 6f 73 32 20 2d  &iPos2); iPos2 -
cb70: 3d 20 32 3b 0a 0a 20 20 20 20 20 20 77 68 69 6c  = 2;..      whil
cb80: 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e( 1 ){.        
cb90: 69 66 28 20 69 50 6f 73 32 3d 3d 69 50 6f 73 31  if( iPos2==iPos1
cba0: 2b 6e 54 6f 6b 65 6e 20 0a 20 20 20 20 20 20 20  +nToken .       
cbb0: 20 20 7c 7c 20 28 69 73 45 78 61 63 74 3d 3d 30    || (isExact==0
cbc0: 20 26 26 20 69 50 6f 73 32 3e 69 50 6f 73 31 20   && iPos2>iPos1 
cbd0: 26 26 20 69 50 6f 73 32 3c 3d 69 50 6f 73 31 2b  && iPos2<=iPos1+
cbe0: 6e 54 6f 6b 65 6e 29 20 0a 20 20 20 20 20 20 20  nToken) .       
cbf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
cc00: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 61 76  lite3_int64 iSav
cc10: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
cc20: 20 21 70 70 20 29 7b 0a 20 20 20 20 20 20 20 20   !pp ){.        
cc30: 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43      fts3PoslistC
cc40: 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a 20 20 20  opy(0, &p2);.   
cc50: 20 20 20 20 20 20 20 20 20 66 74 73 33 50 6f 73           fts3Pos
cc60: 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29  listCopy(0, &p1)
cc70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
cc80: 70 31 20 3d 20 70 31 3b 0a 20 20 20 20 20 20 20  p1 = p1;.       
cc90: 20 20 20 20 20 2a 70 70 32 20 3d 20 70 32 3b 0a       *pp2 = p2;.
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
ccb0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
ccc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 53 61 76  }.          iSav
ccd0: 65 20 3d 20 69 73 53 61 76 65 4c 65 66 74 20 3f  e = isSaveLeft ?
cce0: 20 69 50 6f 73 31 20 3a 20 69 50 6f 73 32 3b 0a   iPos1 : iPos2;.
ccf0: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50 75            fts3Pu
cd00: 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
cd10: 20 26 69 50 72 65 76 2c 20 69 53 61 76 65 2b 32   &iPrev, iSave+2
cd20: 29 3b 20 69 50 72 65 76 20 2d 3d 20 32 3b 0a 20  ); iPrev -= 2;. 
cd30: 20 20 20 20 20 20 20 20 20 70 53 61 76 65 20 3d           pSave =
cd40: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
cd50: 20 20 20 20 20 20 69 66 28 20 28 21 69 73 53 61        if( (!isSa
cd60: 76 65 4c 65 66 74 20 26 26 20 69 50 6f 73 32 3c  veLeft && iPos2<
cd70: 3d 28 69 50 6f 73 31 2b 6e 54 6f 6b 65 6e 29 29  =(iPos1+nToken))
cd80: 20 7c 7c 20 69 50 6f 73 32 3c 3d 69 50 6f 73 31   || iPos2<=iPos1
cd90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
cda0: 28 20 28 2a 70 32 26 30 78 46 45 29 3d 3d 30 20  ( (*p2&0xFE)==0 
cdb0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
cdc0: 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56     fts3GetDeltaV
cdd0: 61 72 69 6e 74 28 26 70 32 2c 20 26 69 50 6f 73  arint(&p2, &iPos
cde0: 32 29 3b 20 69 50 6f 73 32 20 2d 3d 20 32 3b 0a  2); iPos2 -= 2;.
cdf0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ce00: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 2a 70           if( (*p
ce10: 31 26 30 78 46 45 29 3d 3d 30 20 29 20 62 72 65  1&0xFE)==0 ) bre
ce20: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  ak;.          ft
ce30: 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
ce40: 28 26 70 31 2c 20 26 69 50 6f 73 31 29 3b 20 69  (&p1, &iPos1); i
ce50: 50 6f 73 31 20 2d 3d 20 32 3b 0a 20 20 20 20 20  Pos1 -= 2;.     
ce60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
ce70: 20 20 20 20 69 66 28 20 70 53 61 76 65 20 29 7b      if( pSave ){
ce80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ce90: 20 70 70 20 26 26 20 70 20 29 3b 0a 20 20 20 20   pp && p );.    
cea0: 20 20 20 20 70 20 3d 20 70 53 61 76 65 3b 0a 20      p = pSave;. 
ceb0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
cec0: 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79  s3ColumnlistCopy
ced0: 28 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20  (0, &p1);.      
cee0: 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f  fts3ColumnlistCo
cef0: 70 79 28 30 2c 20 26 70 32 29 3b 0a 20 20 20 20  py(0, &p2);.    
cf00: 20 20 61 73 73 65 72 74 28 20 28 2a 70 31 26 30    assert( (*p1&0
cf10: 78 46 45 29 3d 3d 30 20 26 26 20 28 2a 70 32 26  xFE)==0 && (*p2&
cf20: 30 78 46 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20  0xFE)==0 );.    
cf30: 20 20 69 66 28 20 30 3d 3d 2a 70 31 20 7c 7c 20    if( 0==*p1 || 
cf40: 30 3d 3d 2a 70 32 20 29 20 62 72 65 61 6b 3b 0a  0==*p2 ) break;.
cf50: 0a 20 20 20 20 20 20 70 31 2b 2b 3b 0a 20 20 20  .      p1++;.   
cf60: 20 20 20 70 31 20 2b 3d 20 73 71 6c 69 74 65 33     p1 += sqlite3
cf70: 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  Fts3GetVarint32(
cf80: 70 31 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20  p1, &iCol1);.   
cf90: 20 20 20 70 32 2b 2b 3b 0a 20 20 20 20 20 20 70     p2++;.      p
cfa0: 32 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  2 += sqlite3Fts3
cfb0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 32 2c 20  GetVarint32(p2, 
cfc0: 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20 7d 0a 0a  &iCol2);.    }..
cfd0: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70      /* Advance p
cfe0: 6f 69 6e 74 65 72 20 70 31 20 6f 72 20 70 32 20  ointer p1 or p2 
cff0: 28 77 68 69 63 68 65 76 65 72 20 63 6f 72 72 65  (whichever corre
d000: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 73 6d  sponds to the sm
d010: 61 6c 6c 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  aller of.    ** 
d020: 69 43 6f 6c 31 20 61 6e 64 20 69 43 6f 6c 32 29  iCol1 and iCol2)
d030: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
d040: 74 73 20 74 6f 20 65 69 74 68 65 72 20 74 68 65  ts to either the
d050: 20 30 78 30 30 20 74 68 61 74 20 6d 61 72 6b 73   0x00 that marks
d060: 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
d070: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
d080: 6c 69 73 74 2c 20 6f 72 20 74 68 65 20 30 78 30  list, or the 0x0
d090: 31 20 74 68 61 74 20 70 72 65 63 65 64 65 73 20  1 that precedes 
d0a0: 74 68 65 20 6e 65 78 74 20 0a 20 20 20 20 2a 2a  the next .    **
d0b0: 20 63 6f 6c 75 6d 6e 2d 6e 75 6d 62 65 72 20 69   column-number i
d0c0: 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  n the position l
d0d0: 69 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ist. .    */.   
d0e0: 20 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 31 3c   else if( iCol1<
d0f0: 69 43 6f 6c 32 20 29 7b 0a 20 20 20 20 20 20 66  iCol2 ){.      f
d100: 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70  ts3ColumnlistCop
d110: 79 28 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20  y(0, &p1);.     
d120: 20 69 66 28 20 30 3d 3d 2a 70 31 20 29 20 62 72   if( 0==*p1 ) br
d130: 65 61 6b 3b 0a 20 20 20 20 20 20 70 31 2b 2b 3b  eak;.      p1++;
d140: 0a 20 20 20 20 20 20 70 31 20 2b 3d 20 73 71 6c  .      p1 += sql
d150: 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
d160: 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31 29 3b  t32(p1, &iCol1);
d170: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d180: 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74    fts3Columnlist
d190: 43 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a 20 20  Copy(0, &p2);.  
d1a0: 20 20 20 20 69 66 28 20 30 3d 3d 2a 70 32 20 29      if( 0==*p2 )
d1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 32   break;.      p2
d1c0: 2b 2b 3b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20  ++;.      p2 += 
d1d0: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
d1e0: 72 69 6e 74 33 32 28 70 32 2c 20 26 69 43 6f 6c  rint32(p2, &iCol
d1f0: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  2);.    }.  }.. 
d200: 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79   fts3PoslistCopy
d210: 28 30 2c 20 26 70 32 29 3b 0a 20 20 66 74 73 33  (0, &p2);.  fts3
d220: 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  PoslistCopy(0, &
d230: 70 31 29 3b 0a 20 20 2a 70 70 31 20 3d 20 70 31  p1);.  *pp1 = p1
d240: 3b 0a 20 20 2a 70 70 32 20 3d 20 70 32 3b 0a 20  ;.  *pp2 = p2;. 
d250: 20 69 66 28 20 21 70 70 20 7c 7c 20 2a 70 70 3d   if( !pp || *pp=
d260: 3d 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =p ){.    return
d270: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 2b 2b 20 3d   0;.  }.  *p++ =
d280: 20 30 78 30 30 3b 0a 20 20 2a 70 70 20 3d 20 70   0x00;.  *pp = p
d290: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
d2a0: 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
d2b0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 73 20   position-lists 
d2c0: 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
d2d0: 68 65 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72  he NEAR operator
d2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d2f0: 66 74 73 33 50 6f 73 6c 69 73 74 4e 65 61 72 4d  fts3PoslistNearM
d300: 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a 2a 70  erge(.  char **p
d310: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d320: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
d330: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68  t buffer */.  ch
d340: 61 72 20 2a 61 54 6d 70 2c 20 20 20 20 20 20 20  ar *aTmp,       
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d360: 20 54 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   Temporary buffe
d370: 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74  r space */.  int
d380: 20 6e 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   nRight,        
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d3a0: 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72 65 6e  Maximum differen
d3b0: 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f 73 69  ce in token posi
d3c0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
d3d0: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
d3e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
d3f0: 78 69 6d 75 6d 20 64 69 66 66 65 72 65 6e 63 65  ximum difference
d400: 20 69 6e 20 74 6f 6b 65 6e 20 70 6f 73 69 74 69   in token positi
d410: 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ons */.  char **
d420: 70 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  pp1,            
d430: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
d440: 55 54 3a 20 4c 65 66 74 20 69 6e 70 75 74 20 6c  UT: Left input l
d450: 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ist */.  char **
d460: 70 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  pp2             
d470: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
d480: 55 54 3a 20 52 69 67 68 74 20 69 6e 70 75 74 20  UT: Right input 
d490: 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  list */.){.  cha
d4a0: 72 20 2a 70 31 20 3d 20 2a 70 70 31 3b 0a 20 20  r *p1 = *pp1;.  
d4b0: 63 68 61 72 20 2a 70 32 20 3d 20 2a 70 70 32 3b  char *p2 = *pp2;
d4c0: 0a 0a 20 20 69 66 28 20 21 70 70 20 29 7b 0a 20  ..  if( !pp ){. 
d4d0: 20 20 20 69 66 28 20 66 74 73 33 50 6f 73 6c 69     if( fts3Posli
d4e0: 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 30 2c  stPhraseMerge(0,
d4f0: 20 6e 52 69 67 68 74 2c 20 30 2c 20 30 2c 20 70   nRight, 0, 0, p
d500: 70 31 2c 20 70 70 32 29 20 29 20 72 65 74 75 72  p1, pp2) ) retur
d510: 6e 20 31 3b 0a 20 20 20 20 2a 70 70 31 20 3d 20  n 1;.    *pp1 = 
d520: 70 31 3b 0a 20 20 20 20 2a 70 70 32 20 3d 20 70  p1;.    *pp2 = p
d530: 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 66 74  2;.    return ft
d540: 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d  s3PoslistPhraseM
d550: 65 72 67 65 28 30 2c 20 6e 4c 65 66 74 2c 20 30  erge(0, nLeft, 0
d560: 2c 20 30 2c 20 70 70 32 2c 20 70 70 31 29 3b 0a  , 0, pp2, pp1);.
d570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
d580: 72 20 2a 70 54 6d 70 31 20 3d 20 61 54 6d 70 3b  r *pTmp1 = aTmp;
d590: 0a 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 32  .    char *pTmp2
d5a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 61 54 6d 70  ;.    char *aTmp
d5b0: 32 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  2;.    int res =
d5c0: 20 31 3b 0a 0a 20 20 20 20 66 74 73 33 50 6f 73   1;..    fts3Pos
d5d0: 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65 28  listPhraseMerge(
d5e0: 26 70 54 6d 70 31 2c 20 6e 52 69 67 68 74 2c 20  &pTmp1, nRight, 
d5f0: 30 2c 20 30 2c 20 70 70 31 2c 20 70 70 32 29 3b  0, 0, pp1, pp2);
d600: 0a 20 20 20 20 61 54 6d 70 32 20 3d 20 70 54 6d  .    aTmp2 = pTm
d610: 70 32 20 3d 20 70 54 6d 70 31 3b 0a 20 20 20 20  p2 = pTmp1;.    
d620: 2a 70 70 31 20 3d 20 70 31 3b 0a 20 20 20 20 2a  *pp1 = p1;.    *
d630: 70 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 66 74  pp2 = p2;.    ft
d640: 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d  s3PoslistPhraseM
d650: 65 72 67 65 28 26 70 54 6d 70 32 2c 20 6e 4c 65  erge(&pTmp2, nLe
d660: 66 74 2c 20 31 2c 20 30 2c 20 70 70 32 2c 20 70  ft, 1, 0, pp2, p
d670: 70 31 29 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  p1);.    if( pTm
d680: 70 31 21 3d 61 54 6d 70 20 26 26 20 70 54 6d 70  p1!=aTmp && pTmp
d690: 32 21 3d 61 54 6d 70 32 20 29 7b 0a 20 20 20 20  2!=aTmp2 ){.    
d6a0: 20 20 66 74 73 33 50 6f 73 6c 69 73 74 4d 65 72    fts3PoslistMer
d6b0: 67 65 28 70 70 2c 20 26 61 54 6d 70 2c 20 26 61  ge(pp, &aTmp, &a
d6c0: 54 6d 70 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Tmp2);.    }else
d6d0: 20 69 66 28 20 70 54 6d 70 31 21 3d 61 54 6d 70   if( pTmp1!=aTmp
d6e0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 50 6f   ){.      fts3Po
d6f0: 73 6c 69 73 74 43 6f 70 79 28 70 70 2c 20 26 61  slistCopy(pp, &a
d700: 54 6d 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Tmp);.    }else 
d710: 69 66 28 20 70 54 6d 70 32 21 3d 61 54 6d 70 32  if( pTmp2!=aTmp2
d720: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 50 6f   ){.      fts3Po
d730: 73 6c 69 73 74 43 6f 70 79 28 70 70 2c 20 26 61  slistCopy(pp, &a
d740: 54 6d 70 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Tmp2);.    }else
d750: 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b  {.      res = 0;
d760: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
d770: 72 6e 20 72 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rn res;.  }.}../
d780: 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74 68 61 74  *.** Values that
d790: 20 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20   may be used as 
d7a0: 74 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  the first parame
d7b0: 74 65 72 20 74 6f 20 66 74 73 33 44 6f 63 6c 69  ter to fts3Docli
d7c0: 73 74 4d 65 72 67 65 28 29 2e 0a 2a 2f 0a 23 64  stMerge()..*/.#d
d7d0: 65 66 69 6e 65 20 4d 45 52 47 45 5f 4e 4f 54 20  efine MERGE_NOT 
d7e0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
d7f0: 2f 2a 20 44 20 2b 20 44 20 2d 3e 20 44 20 2a 2f  /* D + D -> D */
d800: 0a 23 64 65 66 69 6e 65 20 4d 45 52 47 45 5f 41  .#define MERGE_A
d810: 4e 44 20 20 20 20 20 20 20 20 33 20 20 20 20 20  ND        3     
d820: 20 20 20 2f 2a 20 44 20 2b 20 44 20 2d 3e 20 44     /* D + D -> D
d830: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 45 52 47   */.#define MERG
d840: 45 5f 4f 52 20 20 20 20 20 20 20 20 20 34 20 20  E_OR         4  
d850: 20 20 20 20 20 20 2f 2a 20 44 20 2b 20 44 20 2d        /* D + D -
d860: 3e 20 44 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  > D */.#define M
d870: 45 52 47 45 5f 50 4f 53 5f 4f 52 20 20 20 20 20  ERGE_POS_OR     
d880: 35 20 20 20 20 20 20 20 20 2f 2a 20 50 20 2b 20  5        /* P + 
d890: 50 20 2d 3e 20 50 20 2a 2f 0a 23 64 65 66 69 6e  P -> P */.#defin
d8a0: 65 20 4d 45 52 47 45 5f 50 48 52 41 53 45 20 20  e MERGE_PHRASE  
d8b0: 20 20 20 36 20 20 20 20 20 20 20 20 2f 2a 20 50     6        /* P
d8c0: 20 2b 20 50 20 2d 3e 20 44 20 2a 2f 0a 23 64 65   + P -> D */.#de
d8d0: 66 69 6e 65 20 4d 45 52 47 45 5f 50 4f 53 5f 50  fine MERGE_POS_P
d8e0: 48 52 41 53 45 20 37 20 20 20 20 20 20 20 20 2f  HRASE 7        /
d8f0: 2a 20 50 20 2b 20 50 20 2d 3e 20 50 20 2a 2f 0a  * P + P -> P */.
d900: 23 64 65 66 69 6e 65 20 4d 45 52 47 45 5f 4e 45  #define MERGE_NE
d910: 41 52 20 20 20 20 20 20 20 38 20 20 20 20 20 20  AR       8      
d920: 20 20 2f 2a 20 50 20 2b 20 50 20 2d 3e 20 44 20    /* P + P -> D 
d930: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 45 52 47 45  */.#define MERGE
d940: 5f 50 4f 53 5f 4e 45 41 52 20 20 20 39 20 20 20  _POS_NEAR   9   
d950: 20 20 20 20 20 2f 2a 20 50 20 2b 20 50 20 2d 3e       /* P + P ->
d960: 20 50 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72   P */../*.** Mer
d970: 67 65 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69  ge the two docli
d980: 73 74 73 20 70 61 73 73 65 64 20 69 6e 20 62 75  sts passed in bu
d990: 66 66 65 72 20 61 31 20 28 73 69 7a 65 20 6e 31  ffer a1 (size n1
d9a0: 20 62 79 74 65 73 29 20 61 6e 64 20 61 32 0a 2a   bytes) and a2.*
d9b0: 2a 20 28 73 69 7a 65 20 6e 32 20 62 79 74 65 73  * (size n2 bytes
d9c0: 29 2e 20 54 68 65 20 6f 75 74 70 75 74 20 69 73  ). The output is
d9d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 70 72 65 2d   written to pre-
d9e0: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
d9f0: 20 61 42 75 66 66 65 72 2c 0a 2a 2a 20 77 68 69   aBuffer,.** whi
da00: 63 68 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ch is guaranteed
da10: 20 74 6f 20 62 65 20 6c 61 72 67 65 20 65 6e 6f   to be large eno
da20: 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
da30: 72 65 73 75 6c 74 73 2e 20 54 68 65 20 6e 75 6d  results. The num
da40: 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
da50: 77 72 69 74 74 65 6e 20 74 6f 20 61 42 75 66 66  written to aBuff
da60: 65 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  er is stored in 
da70: 2a 70 6e 42 75 66 66 65 72 20 62 65 66 6f 72 65  *pnBuffer before
da80: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
da90: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
daa0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
dab0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
dac0: 65 2c 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 65  e, if a malloc e
dad0: 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 77  rror.** occurs w
dae0: 68 69 6c 65 20 61 6c 6c 6f 63 61 74 69 6e 67 20  hile allocating 
daf0: 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
db00: 65 72 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  er as part of th
db10: 65 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f  e merge operatio
db20: 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n,.** SQLITE_NOM
db30: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
db40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
db50: 73 33 44 6f 63 6c 69 73 74 4d 65 72 67 65 28 0a  s3DoclistMerge(.
db60: 20 20 69 6e 74 20 6d 65 72 67 65 74 79 70 65 2c    int mergetype,
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db80: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
db90: 4d 45 52 47 45 5f 58 58 58 20 63 6f 6e 73 74 61  MERGE_XXX consta
dba0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  nts */.  int nPa
dbb0: 72 61 6d 31 2c 20 20 20 20 20 20 20 20 20 20 20  ram1,           
dbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
dbd0: 20 62 79 20 4d 45 52 47 45 5f 4e 45 41 52 20 61   by MERGE_NEAR a
dbe0: 6e 64 20 4d 45 52 47 45 5f 50 4f 53 5f 4e 45 41  nd MERGE_POS_NEA
dbf0: 52 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 61  R */.  int nPara
dc00: 6d 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  m2,             
dc10: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
dc20: 79 20 4d 45 52 47 45 5f 4e 45 41 52 20 61 6e 64  y MERGE_NEAR and
dc30: 20 4d 45 52 47 45 5f 50 4f 53 5f 4e 45 41 52 20   MERGE_POS_NEAR 
dc40: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 42 75 66 66  */.  char *aBuff
dc50: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
dc60: 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f       /* Pre-allo
dc70: 63 61 74 65 64 20 6f 75 74 70 75 74 20 62 75 66  cated output buf
dc80: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
dc90: 42 75 66 66 65 72 2c 20 20 20 20 20 20 20 20 20  Buffer,         
dca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
dcb0: 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 74   Bytes written t
dcc0: 6f 20 61 42 75 66 66 65 72 20 2a 2f 0a 20 20 63  o aBuffer */.  c
dcd0: 68 61 72 20 2a 61 31 2c 20 20 20 20 20 20 20 20  har *a1,        
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dcf0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
dd00: 69 6e 67 20 66 69 72 73 74 20 64 6f 63 6c 69 73  ing first doclis
dd10: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 20  t */.  int n1,  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
dd40: 66 20 62 75 66 66 65 72 20 61 31 20 2a 2f 0a 20  f buffer a1 */. 
dd50: 20 63 68 61 72 20 2a 61 32 2c 20 20 20 20 20 20   char *a2,      
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
dd80: 69 6e 69 6e 67 20 73 65 63 6f 6e 64 20 64 6f 63  ining second doc
dd90: 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 32  list */.  int n2
dda0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ddb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ddc0: 65 20 6f 66 20 62 75 66 66 65 72 20 61 32 20 2a  e of buffer a2 *
ddd0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 20 20  /.  int *pnDoc  
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
de00: 65 72 20 6f 66 20 64 6f 63 69 64 73 20 69 6e 20  er of docids in 
de10: 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 73  output */.){.  s
de20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 31 20  qlite3_int64 i1 
de30: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
de40: 6e 74 36 34 20 69 32 20 3d 20 30 3b 0a 20 20 73  nt64 i2 = 0;.  s
de50: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72  qlite3_int64 iPr
de60: 65 76 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20  ev = 0;..  char 
de70: 2a 70 20 3d 20 61 42 75 66 66 65 72 3b 0a 20 20  *p = aBuffer;.  
de80: 63 68 61 72 20 2a 70 31 20 3d 20 61 31 3b 0a 20  char *p1 = a1;. 
de90: 20 63 68 61 72 20 2a 70 32 20 3d 20 61 32 3b 0a   char *p2 = a2;.
dea0: 20 20 63 68 61 72 20 2a 70 45 6e 64 31 20 3d 20    char *pEnd1 = 
deb0: 26 61 31 5b 6e 31 5d 3b 0a 20 20 63 68 61 72 20  &a1[n1];.  char 
dec0: 2a 70 45 6e 64 32 20 3d 20 26 61 32 5b 6e 32 5d  *pEnd2 = &a2[n2]
ded0: 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 20 3d 20 30  ;.  int nDoc = 0
dee0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6d 65 72  ;..  assert( mer
def0: 67 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 4f 52  getype==MERGE_OR
df00: 20 20 20 20 20 7c 7c 20 6d 65 72 67 65 74 79 70       || mergetyp
df10: 65 3d 3d 4d 45 52 47 45 5f 50 4f 53 5f 4f 52 20  e==MERGE_POS_OR 
df20: 0a 20 20 20 20 20 20 20 7c 7c 20 6d 65 72 67 65  .       || merge
df30: 74 79 70 65 3d 3d 4d 45 52 47 45 5f 41 4e 44 20  type==MERGE_AND 
df40: 20 20 20 7c 7c 20 6d 65 72 67 65 74 79 70 65 3d     || mergetype=
df50: 3d 4d 45 52 47 45 5f 4e 4f 54 0a 20 20 20 20 20  =MERGE_NOT.     
df60: 20 20 7c 7c 20 6d 65 72 67 65 74 79 70 65 3d 3d    || mergetype==
df70: 4d 45 52 47 45 5f 50 48 52 41 53 45 20 7c 7c 20  MERGE_PHRASE || 
df80: 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45 52 47 45  mergetype==MERGE
df90: 5f 50 4f 53 5f 50 48 52 41 53 45 0a 20 20 20 20  _POS_PHRASE.    
dfa0: 20 20 20 7c 7c 20 6d 65 72 67 65 74 79 70 65 3d     || mergetype=
dfb0: 3d 4d 45 52 47 45 5f 4e 45 41 52 20 20 20 7c 7c  =MERGE_NEAR   ||
dfc0: 20 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45 52 47   mergetype==MERG
dfd0: 45 5f 50 4f 53 5f 4e 45 41 52 0a 20 20 29 3b 0a  E_POS_NEAR.  );.
dfe0: 0a 20 20 69 66 28 20 21 61 42 75 66 66 65 72 20  .  if( !aBuffer 
dff0: 29 7b 0a 20 20 20 20 2a 70 6e 42 75 66 66 65 72  ){.    *pnBuffer
e000: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e010: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e020: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
e030: 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 72  e first docid fr
e040: 6f 6d 20 65 61 63 68 20 64 6f 63 6c 69 73 74 20  om each doclist 
e050: 2a 2f 0a 20 20 66 74 73 33 47 65 74 44 65 6c 74  */.  fts3GetDelt
e060: 61 56 61 72 69 6e 74 32 28 26 70 31 2c 20 70 45  aVarint2(&p1, pE
e070: 6e 64 31 2c 20 26 69 31 29 3b 0a 20 20 66 74 73  nd1, &i1);.  fts
e080: 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 32  3GetDeltaVarint2
e090: 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 26 69 32  (&p2, pEnd2, &i2
e0a0: 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 6d 65  );..  switch( me
e0b0: 72 67 65 74 79 70 65 20 29 7b 0a 20 20 20 20 63  rgetype ){.    c
e0c0: 61 73 65 20 4d 45 52 47 45 5f 4f 52 3a 0a 20 20  ase MERGE_OR:.  
e0d0: 20 20 63 61 73 65 20 4d 45 52 47 45 5f 50 4f 53    case MERGE_POS
e0e0: 5f 4f 52 3a 0a 20 20 20 20 20 20 77 68 69 6c 65  _OR:.      while
e0f0: 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
e100: 20 20 20 20 20 20 69 66 28 20 70 32 20 26 26 20        if( p2 && 
e110: 70 31 20 26 26 20 69 31 3d 3d 69 32 20 29 7b 0a  p1 && i1==i2 ){.
e120: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50 75            fts3Pu
e130: 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
e140: 20 26 69 50 72 65 76 2c 20 69 31 29 3b 0a 20 20   &iPrev, i1);.  
e150: 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 72 67          if( merg
e160: 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 50 4f 53  etype==MERGE_POS
e170: 5f 4f 52 20 29 20 66 74 73 33 50 6f 73 6c 69 73  _OR ) fts3Poslis
e180: 74 4d 65 72 67 65 28 26 70 2c 20 26 70 31 2c 20  tMerge(&p, &p1, 
e190: 26 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &p2);.          
e1a0: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
e1b0: 6e 74 32 28 26 70 31 2c 20 70 45 6e 64 31 2c 20  nt2(&p1, pEnd1, 
e1c0: 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &i1);.          
e1d0: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
e1e0: 6e 74 32 28 26 70 32 2c 20 70 45 6e 64 32 2c 20  nt2(&p2, pEnd2, 
e1f0: 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  &i2);.        }e
e200: 6c 73 65 20 69 66 28 20 21 70 32 20 7c 7c 20 28  lse if( !p2 || (
e210: 70 31 20 26 26 20 69 31 3c 69 32 29 20 29 7b 0a  p1 && i1<i2) ){.
e220: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50 75            fts3Pu
e230: 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
e240: 20 26 69 50 72 65 76 2c 20 69 31 29 3b 0a 20 20   &iPrev, i1);.  
e250: 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 72 67          if( merg
e260: 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 50 4f 53  etype==MERGE_POS
e270: 5f 4f 52 20 29 20 66 74 73 33 50 6f 73 6c 69 73  _OR ) fts3Poslis
e280: 74 43 6f 70 79 28 26 70 2c 20 26 70 31 29 3b 0a  tCopy(&p, &p1);.
e290: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
e2a0: 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70  tDeltaVarint2(&p
e2b0: 31 2c 20 70 45 6e 64 31 2c 20 26 69 31 29 3b 0a  1, pEnd1, &i1);.
e2c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e2d0: 20 20 20 20 20 20 20 20 20 66 74 73 33 50 75 74           fts3Put
e2e0: 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c 20  DeltaVarint(&p, 
e2f0: 26 69 50 72 65 76 2c 20 69 32 29 3b 0a 20 20 20  &iPrev, i2);.   
e300: 20 20 20 20 20 20 20 69 66 28 20 6d 65 72 67 65         if( merge
e310: 74 79 70 65 3d 3d 4d 45 52 47 45 5f 50 4f 53 5f  type==MERGE_POS_
e320: 4f 52 20 29 20 66 74 73 33 50 6f 73 6c 69 73 74  OR ) fts3Poslist
e330: 43 6f 70 79 28 26 70 2c 20 26 70 32 29 3b 0a 20  Copy(&p, &p2);. 
e340: 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74           fts3Get
e350: 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70 32  DeltaVarint2(&p2
e360: 2c 20 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a 20  , pEnd2, &i2);. 
e370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e380: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
e390: 20 20 20 63 61 73 65 20 4d 45 52 47 45 5f 41 4e     case MERGE_AN
e3a0: 44 3a 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  D:.      while( 
e3b0: 70 31 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20  p1 && p2 ){.    
e3c0: 20 20 20 20 69 66 28 20 69 31 3d 3d 69 32 20 29      if( i1==i2 )
e3d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
e3e0: 50 75 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26  PutDeltaVarint(&
e3f0: 70 2c 20 26 69 50 72 65 76 2c 20 69 31 29 3b 0a  p, &iPrev, i1);.
e400: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
e410: 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70  tDeltaVarint2(&p
e420: 31 2c 20 70 45 6e 64 31 2c 20 26 69 31 29 3b 0a  1, pEnd1, &i1);.
e430: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
e440: 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70  tDeltaVarint2(&p
e450: 32 2c 20 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a  2, pEnd2, &i2);.
e460: 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63 2b 2b            nDoc++
e470: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
e480: 69 66 28 20 69 31 3c 69 32 20 29 7b 0a 20 20 20  if( i1<i2 ){.   
e490: 20 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65         fts3GetDe
e4a0: 6c 74 61 56 61 72 69 6e 74 32 28 26 70 31 2c 20  ltaVarint2(&p1, 
e4b0: 70 45 6e 64 31 2c 20 26 69 31 29 3b 0a 20 20 20  pEnd1, &i1);.   
e4c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e4d0: 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c        fts3GetDel
e4e0: 74 61 56 61 72 69 6e 74 32 28 26 70 32 2c 20 70  taVarint2(&p2, p
e4f0: 45 6e 64 32 2c 20 26 69 32 29 3b 0a 20 20 20 20  End2, &i2);.    
e500: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e510: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
e520: 63 61 73 65 20 4d 45 52 47 45 5f 4e 4f 54 3a 0a  case MERGE_NOT:.
e530: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 31 20        while( p1 
e540: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
e550: 32 20 26 26 20 69 31 3d 3d 69 32 20 29 7b 0a 20  2 && i1==i2 ){. 
e560: 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74           fts3Get
e570: 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70 31  DeltaVarint2(&p1
e580: 2c 20 70 45 6e 64 31 2c 20 26 69 31 29 3b 0a 20  , pEnd1, &i1);. 
e590: 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74           fts3Get
e5a0: 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70 32  DeltaVarint2(&p2
e5b0: 2c 20 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a 20  , pEnd2, &i2);. 
e5c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e5d0: 20 21 70 32 20 7c 7c 20 69 31 3c 69 32 20 29 7b   !p2 || i1<i2 ){
e5e0: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50  .          fts3P
e5f0: 75 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70  utDeltaVarint(&p
e600: 2c 20 26 69 50 72 65 76 2c 20 69 31 29 3b 0a 20  , &iPrev, i1);. 
e610: 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74           fts3Get
e620: 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70 31  DeltaVarint2(&p1
e630: 2c 20 70 45 6e 64 31 2c 20 26 69 31 29 3b 0a 20  , pEnd1, &i1);. 
e640: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e650: 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74 44          fts3GetD
e660: 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70 32 2c  eltaVarint2(&p2,
e670: 20 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a 20 20   pEnd2, &i2);.  
e680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
e6a0: 20 20 63 61 73 65 20 4d 45 52 47 45 5f 50 4f 53    case MERGE_POS
e6b0: 5f 50 48 52 41 53 45 3a 0a 20 20 20 20 63 61 73  _PHRASE:.    cas
e6c0: 65 20 4d 45 52 47 45 5f 50 48 52 41 53 45 3a 20  e MERGE_PHRASE: 
e6d0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a 70  {.      char **p
e6e0: 70 50 6f 73 20 3d 20 28 6d 65 72 67 65 74 79 70  pPos = (mergetyp
e6f0: 65 3d 3d 4d 45 52 47 45 5f 50 48 52 41 53 45 20  e==MERGE_PHRASE 
e700: 3f 20 30 20 3a 20 26 70 29 3b 0a 20 20 20 20 20  ? 0 : &p);.     
e710: 20 77 68 69 6c 65 28 20 70 31 20 26 26 20 70 32   while( p1 && p2
e720: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e730: 69 31 3d 3d 69 32 20 29 7b 0a 20 20 20 20 20 20  i1==i2 ){.      
e740: 20 20 20 20 63 68 61 72 20 2a 70 53 61 76 65 20      char *pSave 
e750: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = p;.          s
e760: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72  qlite3_int64 iPr
e770: 65 76 53 61 76 65 20 3d 20 69 50 72 65 76 3b 0a  evSave = iPrev;.
e780: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50 75            fts3Pu
e790: 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
e7a0: 20 26 69 50 72 65 76 2c 20 69 31 29 3b 0a 20 20   &iPrev, i1);.  
e7b0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66          if( 0==f
e7c0: 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65  ts3PoslistPhrase
e7d0: 4d 65 72 67 65 28 70 70 50 6f 73 2c 20 6e 50 61  Merge(ppPos, nPa
e7e0: 72 61 6d 31 2c 20 30 2c 20 31 2c 20 26 70 31 2c  ram1, 0, 1, &p1,
e7f0: 20 26 70 32 29 20 29 7b 0a 20 20 20 20 20 20 20   &p2) ){.       
e800: 20 20 20 20 20 70 20 3d 20 70 53 61 76 65 3b 0a       p = pSave;.
e810: 20 20 20 20 20 20 20 20 20 20 20 20 69 50 72 65              iPre
e820: 76 20 3d 20 69 50 72 65 76 53 61 76 65 3b 0a 20  v = iPrevSave;. 
e830: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e840: 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63              nDoc
e850: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
e860: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
e870: 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70  tDeltaVarint2(&p
e880: 31 2c 20 70 45 6e 64 31 2c 20 26 69 31 29 3b 0a  1, pEnd1, &i1);.
e890: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
e8a0: 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70  tDeltaVarint2(&p
e8b0: 32 2c 20 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a  2, pEnd2, &i2);.
e8c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e8d0: 28 20 69 31 3c 69 32 20 29 7b 0a 20 20 20 20 20  ( i1<i2 ){.     
e8e0: 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74       fts3Poslist
e8f0: 43 6f 70 79 28 30 2c 20 26 70 31 29 3b 0a 20 20  Copy(0, &p1);.  
e900: 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74 44          fts3GetD
e910: 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70 31 2c  eltaVarint2(&p1,
e920: 20 70 45 6e 64 31 2c 20 26 69 31 29 3b 0a 20 20   pEnd1, &i1);.  
e930: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e940: 20 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69         fts3Posli
e950: 73 74 43 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a  stCopy(0, &p2);.
e960: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
e970: 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70  tDeltaVarint2(&p
e980: 32 2c 20 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a  2, pEnd2, &i2);.
e990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e9a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e9b0: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
e9c0: 74 3a 20 61 73 73 65 72 74 28 20 6d 65 72 67 65  t: assert( merge
e9d0: 74 79 70 65 3d 3d 4d 45 52 47 45 5f 50 4f 53 5f  type==MERGE_POS_
e9e0: 4e 45 41 52 20 7c 7c 20 6d 65 72 67 65 74 79 70  NEAR || mergetyp
e9f0: 65 3d 3d 4d 45 52 47 45 5f 4e 45 41 52 20 29 3b  e==MERGE_NEAR );
ea00: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 61   {.      char *a
ea10: 54 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  Tmp = 0;.      c
ea20: 68 61 72 20 2a 2a 70 70 50 6f 73 20 3d 20 30 3b  har **ppPos = 0;
ea30: 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 72 67  ..      if( merg
ea40: 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 50 4f 53  etype==MERGE_POS
ea50: 5f 4e 45 41 52 20 29 7b 0a 20 20 20 20 20 20 20  _NEAR ){.       
ea60: 20 70 70 50 6f 73 20 3d 20 26 70 3b 0a 20 20 20   ppPos = &p;.   
ea70: 20 20 20 20 20 61 54 6d 70 20 3d 20 73 71 6c 69       aTmp = sqli
ea80: 74 65 33 5f 6d 61 6c 6c 6f 63 28 32 2a 28 6e 31  te3_malloc(2*(n1
ea90: 2b 6e 32 2b 31 29 29 3b 0a 20 20 20 20 20 20 20  +n2+1));.       
eaa0: 20 69 66 28 20 21 61 54 6d 70 20 29 7b 0a 20 20   if( !aTmp ){.  
eab0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
eac0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ead0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
eae0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 31 20        while( p1 
eaf0: 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20  && p2 ){.       
eb00: 20 69 66 28 20 69 31 3d 3d 69 32 20 29 7b 0a 20   if( i1==i2 ){. 
eb10: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
eb20: 53 61 76 65 20 3d 20 70 3b 0a 20 20 20 20 20 20  Save = p;.      
eb30: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
eb40: 34 20 69 50 72 65 76 53 61 76 65 20 3d 20 69 50  4 iPrevSave = iP
eb50: 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 66  rev;.          f
eb60: 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e  ts3PutDeltaVarin
eb70: 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20 69 31  t(&p, &iPrev, i1
eb80: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
eb90: 28 20 21 66 74 73 33 50 6f 73 6c 69 73 74 4e 65  ( !fts3PoslistNe
eba0: 61 72 4d 65 72 67 65 28 70 70 50 6f 73 2c 20 61  arMerge(ppPos, a
ebb0: 54 6d 70 2c 20 6e 50 61 72 61 6d 31 2c 20 6e 50  Tmp, nParam1, nP
ebc0: 61 72 61 6d 32 2c 20 26 70 31 2c 20 26 70 32 29  aram2, &p1, &p2)
ebd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ebe0: 69 50 72 65 76 20 3d 20 69 50 72 65 76 53 61 76  iPrev = iPrevSav
ebf0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e;.            p
ec00: 20 3d 20 70 53 61 76 65 3b 0a 20 20 20 20 20 20   = pSave;.      
ec10: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
ec20: 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
ec30: 69 6e 74 32 28 26 70 31 2c 20 70 45 6e 64 31 2c  int2(&p1, pEnd1,
ec40: 20 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 20   &i1);.         
ec50: 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
ec60: 69 6e 74 32 28 26 70 32 2c 20 70 45 6e 64 32 2c  int2(&p2, pEnd2,
ec70: 20 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d   &i2);.        }
ec80: 65 6c 73 65 20 69 66 28 20 69 31 3c 69 32 20 29  else if( i1<i2 )
ec90: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
eca0: 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  PoslistCopy(0, &
ecb0: 70 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  p1);.          f
ecc0: 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
ecd0: 74 32 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 26  t2(&p1, pEnd1, &
ece0: 69 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i1);.        }el
ecf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74  se{.          ft
ed00: 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c  s3PoslistCopy(0,
ed10: 20 26 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20   &p2);.         
ed20: 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
ed30: 69 6e 74 32 28 26 70 32 2c 20 70 45 6e 64 32 2c  int2(&p2, pEnd2,
ed40: 20 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d   &i2);.        }
ed50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ed60: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 54 6d 70  qlite3_free(aTmp
ed70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ed80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
ed90: 20 70 6e 44 6f 63 20 29 20 2a 70 6e 44 6f 63 20   pnDoc ) *pnDoc 
eda0: 3d 20 6e 44 6f 63 3b 0a 20 20 2a 70 6e 42 75 66  = nDoc;.  *pnBuf
edb0: 66 65 72 20 3d 20 28 69 6e 74 29 28 70 2d 61 42  fer = (int)(p-aB
edc0: 75 66 66 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  uffer);.  return
edd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ede0: 2a 20 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  * .** A pointer 
edf0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
ee00: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
ee10: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
ee20: 63 6f 6e 74 65 78 74 20 0a 2a 2a 20 61 72 67 75  context .** argu
ee30: 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 46  ment to sqlite3F
ee40: 74 73 33 53 65 67 52 65 61 64 65 72 49 74 65 72  ts3SegReaderIter
ee50: 61 74 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66  ate().*/.typedef
ee60: 20 73 74 72 75 63 74 20 54 65 72 6d 53 65 6c 65   struct TermSele
ee70: 63 74 20 54 65 72 6d 53 65 6c 65 63 74 3b 0a 73  ct TermSelect;.s
ee80: 74 72 75 63 74 20 54 65 72 6d 53 65 6c 65 63 74  truct TermSelect
ee90: 20 7b 0a 20 20 69 6e 74 20 69 73 52 65 71 50 6f   {.  int isReqPo
eea0: 73 3b 0a 20 20 63 68 61 72 20 2a 61 61 4f 75 74  s;.  char *aaOut
eeb0: 70 75 74 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  put[16];        
eec0: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64       /* Malloc'd
eed0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
eee0: 2f 0a 20 20 69 6e 74 20 61 6e 4f 75 74 70 75 74  /.  int anOutput
eef0: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [16];           
ef00: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
ef10: 75 74 70 75 74 20 69 6e 20 62 79 74 65 73 20 2a  utput in bytes *
ef20: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  /.};../*.** Merg
ef30: 65 20 61 6c 6c 20 64 6f 63 6c 69 73 74 73 20 69  e all doclists i
ef40: 6e 20 74 68 65 20 54 65 72 6d 53 65 6c 65 63 74  n the TermSelect
ef50: 2e 61 61 4f 75 74 70 75 74 5b 5d 20 61 72 72 61  .aaOutput[] arra
ef60: 79 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 0a  y into a single.
ef70: 2a 2a 20 64 6f 63 6c 69 73 74 20 73 74 6f 72 65  ** doclist store
ef80: 64 20 69 6e 20 54 65 72 6d 53 65 6c 65 63 74 2e  d in TermSelect.
ef90: 61 61 4f 75 74 70 75 74 5b 30 5d 2e 20 49 66 20  aaOutput[0]. If 
efa0: 73 75 63 63 65 73 73 66 75 6c 2c 20 64 65 6c 65  successful, dele
efb0: 74 65 20 61 6c 6c 0a 2a 2a 20 6f 74 68 65 72 20  te all.** other 
efc0: 64 6f 63 6c 69 73 74 73 20 28 65 78 63 65 70 74  doclists (except
efd0: 20 74 68 65 20 61 61 4f 75 74 70 75 74 5b 30 5d   the aaOutput[0]
efe0: 20 6f 6e 65 29 20 61 6e 64 20 72 65 74 75 72 6e   one) and return
eff0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
f000: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
f010: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
f020: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49   SQLITE_NOMEM. I
f030: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
f040: 73 0a 2a 2a 20 74 68 65 20 72 65 73 70 6f 6e 73  s.** the respons
f050: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
f060: 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 61 6e  aller to free an
f070: 79 20 64 6f 63 6c 69 73 74 73 20 6c 65 66 74 20  y doclists left 
f080: 69 6e 20 74 68 65 0a 2a 2a 20 54 65 72 6d 53 65  in the.** TermSe
f090: 6c 65 63 74 2e 61 61 4f 75 74 70 75 74 5b 5d 20  lect.aaOutput[] 
f0a0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
f0b0: 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65 6c   int fts3TermSel
f0c0: 65 63 74 4d 65 72 67 65 28 54 65 72 6d 53 65 6c  ectMerge(TermSel
f0d0: 65 63 74 20 2a 70 54 53 29 7b 0a 20 20 69 6e 74  ect *pTS){.  int
f0e0: 20 6d 65 72 67 65 74 79 70 65 20 3d 20 28 70 54   mergetype = (pT
f0f0: 53 2d 3e 69 73 52 65 71 50 6f 73 20 3f 20 4d 45  S->isReqPos ? ME
f100: 52 47 45 5f 50 4f 53 5f 4f 52 20 3a 20 4d 45 52  RGE_POS_OR : MER
f110: 47 45 5f 4f 52 29 3b 0a 20 20 63 68 61 72 20 2a  GE_OR);.  char *
f120: 61 4f 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  aOut = 0;.  int 
f130: 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nOut = 0;.  int 
f140: 69 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  i;..  /* Loop th
f150: 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73  rough the doclis
f160: 74 73 20 69 6e 20 74 68 65 20 61 61 4f 75 74 70  ts in the aaOutp
f170: 75 74 5b 5d 20 61 72 72 61 79 2e 20 4d 65 72 67  ut[] array. Merg
f180: 65 20 74 68 65 6d 20 61 6c 6c 0a 20 20 2a 2a 20  e them all.  ** 
f190: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 6f  into a single do
f1a0: 63 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  clist..  */.  fo
f1b0: 72 28 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41  r(i=0; i<SizeofA
f1c0: 72 72 61 79 28 70 54 53 2d 3e 61 61 4f 75 74 70  rray(pTS->aaOutp
f1d0: 75 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ut); i++){.    i
f1e0: 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  f( pTS->aaOutput
f1f0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  [i] ){.      if(
f200: 20 21 61 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !aOut ){.      
f210: 20 20 61 4f 75 74 20 3d 20 70 54 53 2d 3e 61 61    aOut = pTS->aa
f220: 4f 75 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20 20  Output[i];.     
f230: 20 20 20 6e 4f 75 74 20 3d 20 70 54 53 2d 3e 61     nOut = pTS->a
f240: 6e 4f 75 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20  nOutput[i];.    
f250: 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75      pTS->aaOutpu
f260: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[i] = 0;.      
f270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
f280: 6e 74 20 6e 4e 65 77 20 3d 20 6e 4f 75 74 20 2b  nt nNew = nOut +
f290: 20 70 54 53 2d 3e 61 6e 4f 75 74 70 75 74 5b 69   pTS->anOutput[i
f2a0: 5d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ];.        char 
f2b0: 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *aNew = sqlite3_
f2c0: 6d 61 6c 6c 6f 63 28 6e 4e 65 77 29 3b 0a 20 20  malloc(nNew);.  
f2d0: 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20        if( !aNew 
f2e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f2f0: 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74 29 3b  ite3_free(aOut);
f300: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
f310: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f320: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f330: 20 20 66 74 73 33 44 6f 63 6c 69 73 74 4d 65 72    fts3DoclistMer
f340: 67 65 28 6d 65 72 67 65 74 79 70 65 2c 20 30 2c  ge(mergetype, 0,
f350: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
f360: 61 4e 65 77 2c 20 26 6e 4e 65 77 2c 20 70 54 53  aNew, &nNew, pTS
f370: 2d 3e 61 61 4f 75 74 70 75 74 5b 69 5d 2c 20 70  ->aaOutput[i], p
f380: 54 53 2d 3e 61 6e 4f 75 74 70 75 74 5b 69 5d 2c  TS->anOutput[i],
f390: 20 61 4f 75 74 2c 20 6e 4f 75 74 2c 20 30 0a 20   aOut, nOut, 0. 
f3a0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
f3b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f3c0: 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 5d 29  TS->aaOutput[i])
f3d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f3e0: 33 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20  3_free(aOut);.  
f3f0: 20 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74        pTS->aaOut
f400: 70 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  put[i] = 0;.    
f410: 20 20 20 20 61 4f 75 74 20 3d 20 61 4e 65 77 3b      aOut = aNew;
f420: 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
f430: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
f440: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 53 2d 3e    }.  }..  pTS->
f450: 61 61 4f 75 74 70 75 74 5b 30 5d 20 3d 20 61 4f  aaOutput[0] = aO
f460: 75 74 3b 0a 20 20 70 54 53 2d 3e 61 6e 4f 75 74  ut;.  pTS->anOut
f470: 70 75 74 5b 30 5d 20 3d 20 6e 4f 75 74 3b 0a 20  put[0] = nOut;. 
f480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f490: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
f4a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
f4b0: 64 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  d as the sqlite3
f4c0: 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74 65  Fts3SegReaderIte
f4d0: 72 61 74 65 28 29 20 63 61 6c 6c 62 61 63 6b 20  rate() callback 
f4e0: 77 68 65 6e 0a 2a 2a 20 71 75 65 72 79 69 6e 67  when.** querying
f4f0: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
f500: 6e 64 65 78 20 66 6f 72 20 61 20 64 6f 63 6c 69  ndex for a docli
f510: 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  st associated wi
f520: 74 68 20 61 20 74 65 72 6d 20 6f 72 0a 2a 2a 20  th a term or.** 
f530: 74 65 72 6d 2d 70 72 65 66 69 78 2e 0a 2a 2f 0a  term-prefix..*/.
f540: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54  static int fts3T
f550: 65 72 6d 53 65 6c 65 63 74 43 62 28 0a 20 20 46  ermSelectCb(.  F
f560: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f580: 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
f590: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 76 6f 69 64  object */.  void
f5a0: 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20   *pContext,     
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f5c0: 6f 69 6e 74 65 72 20 74 6f 20 54 65 72 6d 53 65  ointer to TermSe
f5d0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 2a  lect structure *
f5e0: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  /.  char *zTerm,
f5f0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 0a 20 20  .  int nTerm,.  
f600: 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 0a  char *aDoclist,.
f610: 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 0a 29    int nDoclist.)
f620: 7b 0a 20 20 54 65 72 6d 53 65 6c 65 63 74 20 2a  {.  TermSelect *
f630: 70 54 53 20 3d 20 28 54 65 72 6d 53 65 6c 65 63  pTS = (TermSelec
f640: 74 20 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 0a 20  t *)pContext;.. 
f650: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
f660: 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
f670: 41 52 41 4d 45 54 45 52 28 7a 54 65 72 6d 29 3b  ARAMETER(zTerm);
f680: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
f690: 54 45 52 28 6e 54 65 72 6d 29 3b 0a 0a 20 20 69  TER(nTerm);..  i
f6a0: 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  f( pTS->aaOutput
f6b0: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [0]==0 ){.    /*
f6c0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
f6d0: 66 69 72 73 74 20 74 65 72 6d 20 73 65 6c 65 63  first term selec
f6e0: 74 65 64 2c 20 63 6f 70 79 20 74 68 65 20 64 6f  ted, copy the do
f6f0: 63 6c 69 73 74 20 74 6f 20 74 68 65 20 6f 75 74  clist to the out
f700: 70 75 74 0a 20 20 20 20 2a 2a 20 62 75 66 66 65  put.    ** buffe
f710: 72 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  r using memcpy()
f720: 2e 20 54 4f 44 4f 3a 20 41 64 64 20 61 20 77 61  . TODO: Add a wa
f730: 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 63 6f  y to transfer co
f740: 6e 74 72 6f 6c 20 6f 66 20 74 68 65 0a 20 20 20  ntrol of the.   
f750: 20 2a 2a 20 61 44 6f 63 6c 69 73 74 20 62 75 66   ** aDoclist buf
f760: 66 65 72 20 66 72 6f 6d 20 74 68 65 20 63 61 6c  fer from the cal
f770: 6c 65 72 20 73 6f 20 61 73 20 74 6f 20 61 76 6f  ler so as to avo
f780: 69 64 20 74 68 65 20 6d 65 6d 63 70 79 28 29 2e  id the memcpy().
f790: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 53 2d  .    */.    pTS-
f7a0: 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20 3d 20 73  >aaOutput[0] = s
f7b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44  qlite3_malloc(nD
f7c0: 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 70 54 53  oclist);.    pTS
f7d0: 2d 3e 61 6e 4f 75 74 70 75 74 5b 30 5d 20 3d 20  ->anOutput[0] = 
f7e0: 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 66  nDoclist;.    if
f7f0: 28 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b  ( pTS->aaOutput[
f800: 30 5d 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  0] ){.      memc
f810: 70 79 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  py(pTS->aaOutput
f820: 5b 30 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e  [0], aDoclist, n
f830: 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65  Doclist);.    }e
f840: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
f850: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f860: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
f870: 20 20 20 69 6e 74 20 6d 65 72 67 65 74 79 70 65     int mergetype
f880: 20 3d 20 28 70 54 53 2d 3e 69 73 52 65 71 50 6f   = (pTS->isReqPo
f890: 73 20 3f 20 4d 45 52 47 45 5f 50 4f 53 5f 4f 52  s ? MERGE_POS_OR
f8a0: 20 3a 20 4d 45 52 47 45 5f 4f 52 29 3b 0a 20 20   : MERGE_OR);.  
f8b0: 20 20 63 68 61 72 20 2a 61 4d 65 72 67 65 20 3d    char *aMerge =
f8c0: 20 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69   aDoclist;.    i
f8d0: 6e 74 20 6e 4d 65 72 67 65 20 3d 20 6e 44 6f 63  nt nMerge = nDoc
f8e0: 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 4f  list;.    int iO
f8f0: 75 74 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4f 75  ut;..    for(iOu
f900: 74 3d 30 3b 20 69 4f 75 74 3c 53 69 7a 65 6f 66  t=0; iOut<Sizeof
f910: 41 72 72 61 79 28 70 54 53 2d 3e 61 61 4f 75 74  Array(pTS->aaOut
f920: 70 75 74 29 3b 20 69 4f 75 74 2b 2b 29 7b 0a 20  put); iOut++){. 
f930: 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 3b       char *aNew;
f940: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b  .      int nNew;
f950: 0a 20 20 20 20 20 20 69 66 28 20 70 54 53 2d 3e  .      if( pTS->
f960: 61 61 4f 75 74 70 75 74 5b 69 4f 75 74 5d 3d 3d  aaOutput[iOut]==
f970: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
f980: 65 72 74 28 20 69 4f 75 74 3e 30 20 29 3b 0a 20  ert( iOut>0 );. 
f990: 20 20 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75         pTS->aaOu
f9a0: 74 70 75 74 5b 69 4f 75 74 5d 20 3d 20 61 4d 65  tput[iOut] = aMe
f9b0: 72 67 65 3b 0a 20 20 20 20 20 20 20 20 70 54 53  rge;.        pTS
f9c0: 2d 3e 61 6e 4f 75 74 70 75 74 5b 69 4f 75 74 5d  ->anOutput[iOut]
f9d0: 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20   = nMerge;.     
f9e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f9f0: 7d 0a 0a 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  }..      nNew = 
fa00: 6e 4d 65 72 67 65 20 2b 20 70 54 53 2d 3e 61 6e  nMerge + pTS->an
fa10: 4f 75 74 70 75 74 5b 69 4f 75 74 5d 3b 0a 20 20  Output[iOut];.  
fa20: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
fa30: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4e 65 77 29 3b  e3_malloc(nNew);
fa40: 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77  .      if( !aNew
fa50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
fa60: 61 4d 65 72 67 65 21 3d 61 44 6f 63 6c 69 73 74  aMerge!=aDoclist
fa70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
fa80: 6c 69 74 65 33 5f 66 72 65 65 28 61 4d 65 72 67  lite3_free(aMerg
fa90: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
faa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fab0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
fac0: 20 7d 0a 20 20 20 20 20 20 66 74 73 33 44 6f 63   }.      fts3Doc
fad0: 6c 69 73 74 4d 65 72 67 65 28 6d 65 72 67 65 74  listMerge(merget
fae0: 79 70 65 2c 20 30 2c 20 30 2c 20 61 4e 65 77 2c  ype, 0, 0, aNew,
faf0: 20 26 6e 4e 65 77 2c 20 0a 20 20 20 20 20 20 20   &nNew, .       
fb00: 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74     pTS->aaOutput
fb10: 5b 69 4f 75 74 5d 2c 20 70 54 53 2d 3e 61 6e 4f  [iOut], pTS->anO
fb20: 75 74 70 75 74 5b 69 4f 75 74 5d 2c 20 61 4d 65  utput[iOut], aMe
fb30: 72 67 65 2c 20 6e 4d 65 72 67 65 2c 20 30 0a 20  rge, nMerge, 0. 
fb40: 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69       );..      i
fb50: 66 28 20 69 4f 75 74 3e 30 20 29 20 73 71 6c 69  f( iOut>0 ) sqli
fb60: 74 65 33 5f 66 72 65 65 28 61 4d 65 72 67 65 29  te3_free(aMerge)
fb70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fb80: 66 72 65 65 28 70 54 53 2d 3e 61 61 4f 75 74 70  free(pTS->aaOutp
fb90: 75 74 5b 69 4f 75 74 5d 29 3b 0a 20 20 20 20 20  ut[iOut]);.     
fba0: 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69   pTS->aaOutput[i
fbb0: 4f 75 74 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Out] = 0;..     
fbc0: 20 61 4d 65 72 67 65 20 3d 20 61 4e 65 77 3b 0a   aMerge = aNew;.
fbd0: 20 20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e        nMerge = n
fbe0: 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28 20 28  New;.      if( (
fbf0: 69 4f 75 74 2b 31 29 3d 3d 53 69 7a 65 6f 66 41  iOut+1)==SizeofA
fc00: 72 72 61 79 28 70 54 53 2d 3e 61 61 4f 75 74 70  rray(pTS->aaOutp
fc10: 75 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ut) ){.        p
fc20: 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75  TS->aaOutput[iOu
fc30: 74 5d 20 3d 20 61 4d 65 72 67 65 3b 0a 20 20 20  t] = aMerge;.   
fc40: 20 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70       pTS->anOutp
fc50: 75 74 5b 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67  ut[iOut] = nMerg
fc60: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
fc70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
fc80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
fc90: 69 63 20 69 6e 74 20 66 74 73 33 44 65 66 65 72  ic int fts3Defer
fca0: 72 65 64 54 65 72 6d 53 65 6c 65 63 74 28 0a 20  redTermSelect(. 
fcb0: 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
fcc0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20  en *pToken,     
fcd0: 20 2f 2a 20 50 68 72 61 73 65 20 74 6f 6b 65 6e   /* Phrase token
fce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 72 6d   */.  int isTerm
fcf0: 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Pos,            
fd00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
fd10: 20 69 6e 63 6c 75 64 65 20 70 6f 73 69 74 69 6f   include positio
fd20: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f  ns */.  int *pnO
fd30: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
fd40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
fd50: 53 69 7a 65 20 6f 66 20 6c 69 73 74 20 2a 2f 0a  Size of list */.
fd60: 20 20 63 68 61 72 20 2a 2a 70 70 4f 75 74 20 20    char **ppOut  
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 2f 2a 20 4f 55 54 3a 20 42 6f 64 79 20 6f    /* OUT: Body o
fd90: 66 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  f list */.){.  c
fda0: 68 61 72 20 2a 61 53 6f 75 72 63 65 3b 0a 20 20  har *aSource;.  
fdb0: 69 6e 74 20 6e 53 6f 75 72 63 65 3b 0a 0a 20 20  int nSource;..  
fdc0: 61 53 6f 75 72 63 65 20 3d 20 73 71 6c 69 74 65  aSource = sqlite
fdd0: 33 46 74 73 33 44 65 66 65 72 72 65 64 44 6f 63  3Fts3DeferredDoc
fde0: 6c 69 73 74 28 70 54 6f 6b 65 6e 2c 20 26 6e 53  list(pToken, &nS
fdf0: 6f 75 72 63 65 29 3b 0a 20 20 69 66 28 20 21 61  ource);.  if( !a
fe00: 53 6f 75 72 63 65 20 29 7b 0a 20 20 20 20 2a 70  Source ){.    *p
fe10: 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  nOut = 0;.    *p
fe20: 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pOut = 0;.  }els
fe30: 65 20 69 66 28 20 69 73 54 65 72 6d 50 6f 73 20  e if( isTermPos 
fe40: 29 7b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  ){.    *ppOut = 
fe50: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
fe60: 53 6f 75 72 63 65 29 3b 0a 20 20 20 20 69 66 28  Source);.    if(
fe70: 20 21 2a 70 70 4f 75 74 20 29 20 72 65 74 75 72   !*ppOut ) retur
fe80: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
fe90: 20 20 20 20 6d 65 6d 63 70 79 28 2a 70 70 4f 75      memcpy(*ppOu
fea0: 74 2c 20 61 53 6f 75 72 63 65 2c 20 6e 53 6f 75  t, aSource, nSou
feb0: 72 63 65 29 3b 0a 20 20 20 20 2a 70 6e 4f 75 74  rce);.    *pnOut
fec0: 20 3d 20 6e 53 6f 75 72 63 65 3b 0a 20 20 7d 65   = nSource;.  }e
fed0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
fee0: 5f 69 6e 74 36 34 20 64 6f 63 69 64 3b 0a 20 20  _int64 docid;.  
fef0: 20 20 2a 70 6e 4f 75 74 20 3d 20 73 71 6c 69 74    *pnOut = sqlit
ff00: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
ff10: 61 53 6f 75 72 63 65 2c 20 26 64 6f 63 69 64 29  aSource, &docid)
ff20: 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 73  ;.    *ppOut = s
ff30: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 2a 70  qlite3_malloc(*p
ff40: 6e 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 21  nOut);.    if( !
ff50: 2a 70 70 4f 75 74 20 29 20 72 65 74 75 72 6e 20  *ppOut ) return 
ff60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ff70: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74    sqlite3Fts3Put
ff80: 56 61 72 69 6e 74 28 2a 70 70 4f 75 74 2c 20 64  Varint(*ppOut, d
ff90: 6f 63 69 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ocid);.  }..  re
ffa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ffb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 46 74 73 33  }../*.** An Fts3
ffc0: 53 65 67 52 65 61 64 65 72 41 72 72 61 79 20 69  SegReaderArray i
ffd0: 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
ffe0: 61 6e 20 61 72 72 61 79 20 6f 66 20 46 74 73 33  an array of Fts3
fff0: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
10000 73 2e 0a 2a 2a 20 45 6c 65 6d 65 6e 74 73 20 61  s..** Elements a
10010 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
10020 61 72 72 61 79 20 75 73 69 6e 67 20 66 74 73 33  array using fts3
10030 53 65 67 52 65 61 64 65 72 41 72 72 61 79 41 64  SegReaderArrayAd
10040 64 28 29 2e 20 0a 2a 2f 0a 73 74 72 75 63 74 20  d(). .*/.struct 
10050 46 74 73 33 53 65 67 52 65 61 64 65 72 41 72 72  Fts3SegReaderArr
10060 61 79 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ay {.  int nSegm
10070 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
10080 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10090 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
100a0 73 20 69 6e 20 61 70 53 65 67 6d 65 6e 74 5b 5d  s in apSegment[]
100b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
100c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
100d0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
100e0 65 64 20 73 69 7a 65 20 6f 66 20 61 70 53 65 67  ed size of apSeg
100f0 6d 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ment[] */.  int 
10100 6e 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  nCost;          
10110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10120 68 65 20 63 6f 73 74 20 6f 66 20 65 78 65 63 75  he cost of execu
10130 74 69 6e 67 20 53 65 67 52 65 61 64 65 72 49 74  ting SegReaderIt
10140 65 72 61 74 65 28 29 20 2a 2f 0a 20 20 46 74 73  erate() */.  Fts
10150 33 53 65 67 52 65 61 64 65 72 20 2a 61 70 53 65  3SegReader *apSe
10160 67 6d 65 6e 74 5b 31 5d 3b 20 20 20 20 2f 2a 20  gment[1];    /* 
10170 41 72 72 61 79 20 6f 66 20 73 65 67 2d 72 65 61  Array of seg-rea
10180 64 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d  der objects */.}
10190 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  ;.../*.** Free a
101a0 6e 20 46 74 73 33 53 65 67 52 65 61 64 65 72 41  n Fts3SegReaderA
101b0 72 72 61 79 20 6f 62 6a 65 63 74 2e 20 41 6c 73  rray object. Als
101c0 6f 20 66 72 65 65 20 61 6c 6c 20 73 65 67 2d 72  o free all seg-r
101d0 65 61 64 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a  eaders in the.**
101e0 20 61 72 72 61 79 20 28 75 73 69 6e 67 20 73 71   array (using sq
101f0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
10200 65 72 46 72 65 65 28 29 29 2e 0a 2a 2f 0a 73 74  erFree())..*/.st
10210 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65  atic void fts3Se
10220 67 52 65 61 64 65 72 41 72 72 61 79 46 72 65 65  gReaderArrayFree
10230 28 46 74 73 33 53 65 67 52 65 61 64 65 72 41 72  (Fts3SegReaderAr
10240 72 61 79 20 2a 70 41 72 72 61 79 29 7b 0a 20 20  ray *pArray){.  
10250 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20  if( pArray ){.  
10260 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
10270 28 69 3d 30 3b 20 69 3c 70 41 72 72 61 79 2d 3e  (i=0; i<pArray->
10280 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a  nSegment; i++){.
10290 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
102a0 33 53 65 67 52 65 61 64 65 72 46 72 65 65 28 70  3SegReaderFree(p
102b0 41 72 72 61 79 2d 3e 61 70 53 65 67 6d 65 6e 74  Array->apSegment
102c0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
102d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72  sqlite3_free(pAr
102e0 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ray);.  }.}..sta
102f0 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
10300 65 61 64 65 72 41 72 72 61 79 41 64 64 28 0a 20  eaderArrayAdd(. 
10310 20 46 74 73 33 53 65 67 52 65 61 64 65 72 41 72   Fts3SegReaderAr
10320 72 61 79 20 2a 2a 70 70 41 72 72 61 79 2c 20 0a  ray **ppArray, .
10330 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
10340 2a 70 4e 65 77 0a 29 7b 0a 20 20 46 74 73 33 53  *pNew.){.  Fts3S
10350 65 67 52 65 61 64 65 72 41 72 72 61 79 20 2a 70  egReaderArray *p
10360 41 72 72 61 79 20 3d 20 2a 70 70 41 72 72 61 79  Array = *ppArray
10370 3b 0a 0a 20 20 69 66 28 20 21 70 41 72 72 61 79  ;..  if( !pArray
10380 20 7c 7c 20 70 41 72 72 61 79 2d 3e 6e 41 6c 6c   || pArray->nAll
10390 6f 63 3d 3d 70 41 72 72 61 79 2d 3e 6e 53 65 67  oc==pArray->nSeg
103a0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
103b0 6e 4e 65 77 20 3d 20 28 70 41 72 72 61 79 20 3f  nNew = (pArray ?
103c0 20 70 41 72 72 61 79 2d 3e 6e 41 6c 6c 6f 63 2b   pArray->nAlloc+
103d0 31 36 20 3a 20 31 36 29 3b 0a 20 20 20 20 70 41  16 : 16);.    pA
103e0 72 72 61 79 20 3d 20 28 46 74 73 33 53 65 67 52  rray = (Fts3SegR
103f0 65 61 64 65 72 41 72 72 61 79 20 2a 29 73 71 6c  eaderArray *)sql
10400 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 41 72  ite3_realloc(pAr
10410 72 61 79 2c 20 0a 20 20 20 20 20 20 20 20 73 69  ray, .        si
10420 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
10430 65 72 41 72 72 61 79 29 20 2b 20 28 6e 4e 65 77  erArray) + (nNew
10440 2d 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  -1) * sizeof(Fts
10450 33 53 65 67 52 65 61 64 65 72 2a 29 0a 20 20 20  3SegReader*).   
10460 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72   );.    if( !pAr
10470 72 61 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ray ){.      sql
10480 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
10490 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  rFree(pNew);.   
104a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
104b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
104c0 20 20 69 66 28 20 6e 4e 65 77 3d 3d 31 36 20 29    if( nNew==16 )
104d0 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 2d 3e  {.      pArray->
104e0 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  nSegment = 0;.  
104f0 20 20 20 20 70 41 72 72 61 79 2d 3e 6e 43 6f 73      pArray->nCos
10500 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
10510 20 70 41 72 72 61 79 2d 3e 6e 41 6c 6c 6f 63 20   pArray->nAlloc 
10520 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 2a 70 70 41  = nNew;.    *ppA
10530 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a 20  rray = pArray;. 
10540 20 7d 0a 0a 20 20 70 41 72 72 61 79 2d 3e 61 70   }..  pArray->ap
10550 53 65 67 6d 65 6e 74 5b 70 41 72 72 61 79 2d 3e  Segment[pArray->
10560 6e 53 65 67 6d 65 6e 74 2b 2b 5d 20 3d 20 70 4e  nSegment++] = pN
10570 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ew;.  return SQL
10580 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
10590 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65  c int fts3TermSe
105a0 67 52 65 61 64 65 72 41 72 72 61 79 28 0a 20 20  gReaderArray(.  
105b0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
105c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
105d0 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
105e0 20 63 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a   cursor handle *
105f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10600 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
10610 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 71      /* Term to q
10620 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  uery for */.  in
10630 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t nTerm,        
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10650 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69   Size of zTerm i
10660 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
10670 20 69 73 50 72 65 66 69 78 2c 20 20 20 20 20 20   isPrefix,      
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10690 54 72 75 65 20 66 6f 72 20 61 20 70 72 65 66 69  True for a prefi
106a0 78 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74  x search */.  Ft
106b0 73 33 53 65 67 52 65 61 64 65 72 41 72 72 61 79  s3SegReaderArray
106c0 20 2a 2a 70 70 41 72 72 61 79 20 20 20 20 2f 2a   **ppArray    /*
106d0 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20   OUT: Allocated 
106e0 73 65 67 2d 72 65 61 64 65 72 20 61 72 72 61 79  seg-reader array
106f0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62   */.){.  Fts3Tab
10700 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62  le *p = (Fts3Tab
10710 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
10720 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pVtab;.  int rc;
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10750 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
10760 33 53 65 67 52 65 61 64 65 72 41 72 72 61 79 20  3SegReaderArray 
10770 2a 70 41 72 72 61 79 20 3d 20 30 3b 20 2f 2a 20  *pArray = 0; /* 
10780 41 72 72 61 79 20 6f 62 6a 65 63 74 20 74 6f 20  Array object to 
10790 62 75 69 6c 64 20 2a 2f 0a 20 20 46 74 73 33 53  build */.  Fts3S
107a0 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
107b0 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 65  r = 0;     /* Se
107c0 67 2d 72 65 61 64 65 72 20 74 6f 20 61 64 64 20  g-reader to add 
107d0 74 6f 20 70 41 72 72 61 79 20 2a 2f 20 0a 20 20  to pArray */ .  
107e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
107f0 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
10800 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  /* SQL statement
10810 20 74 6f 20 73 63 61 6e 20 25 5f 73 65 67 64 69   to scan %_segdi
10820 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
10830 20 69 41 67 65 20 3d 20 30 3b 20 20 20 20 20 20   iAge = 0;      
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10850 55 73 65 64 20 74 6f 20 61 73 73 69 67 6e 20 61  Used to assign a
10860 67 65 73 20 74 6f 20 73 65 67 6d 65 6e 74 73 20  ges to segments 
10870 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
10880 65 20 61 20 73 65 67 2d 72 65 61 64 65 72 20 74  e a seg-reader t
10890 6f 20 73 63 61 6e 20 74 68 65 20 70 65 6e 64 69  o scan the pendi
108a0 6e 67 20 74 65 72 6d 73 2c 20 69 66 20 61 6e 79  ng terms, if any
108b0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
108c0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
108d0 50 65 6e 64 69 6e 67 28 70 2c 20 7a 54 65 72 6d  Pending(p, zTerm
108e0 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66 69  , nTerm, isPrefi
108f0 78 2c 20 26 70 52 65 61 64 65 72 29 3b 0a 20 20  x, &pReader);.  
10900 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10910 4b 20 26 26 20 70 52 65 61 64 65 72 20 29 20 7b  K && pReader ) {
10920 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
10930 67 52 65 61 64 65 72 41 72 72 61 79 41 64 64 28  gReaderArrayAdd(
10940 26 70 41 72 72 61 79 2c 20 70 52 65 61 64 65 72  &pArray, pReader
10950 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  );.  }..  /* Loo
10960 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e  p through the en
10970 74 69 72 65 20 25 5f 73 65 67 64 69 72 20 74 61  tire %_segdir ta
10980 62 6c 65 2e 20 46 6f 72 20 65 61 63 68 20 73 65  ble. For each se
10990 67 6d 65 6e 74 2c 20 63 72 65 61 74 65 20 61 0a  gment, create a.
109a0 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61 64    ** Fts3SegRead
109b0 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  er to iterate th
109c0 72 6f 75 67 68 20 74 68 65 20 73 75 62 73 65 74  rough the subset
109d0 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   of the segment 
109e0 6c 65 61 76 65 73 0a 20 20 2a 2a 20 74 68 61 74  leaves.  ** that
109f0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 74   may contain a t
10a00 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65 73  erm that matches
10a10 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f   zTerm/nTerm. Fo
10a20 72 20 6e 6f 6e 2d 70 72 65 66 69 78 0a 20 20 2a  r non-prefix.  *
10a30 2a 20 73 65 61 72 63 68 65 73 2c 20 74 68 69 73  * searches, this
10a40 20 69 73 20 61 6c 77 61 79 73 20 61 20 73 69 6e   is always a sin
10a50 67 6c 65 20 6c 65 61 66 2e 20 46 6f 72 20 70 72  gle leaf. For pr
10a60 65 66 69 78 20 73 65 61 72 63 68 65 73 2c 20 74  efix searches, t
10a70 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  his.  ** may be 
10a80 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f  a contiguous blo
10a90 63 6b 20 6f 66 20 6c 65 61 76 65 73 2e 0a 20 20  ck of leaves..  
10aa0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
10ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
10ac0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 41 6c   = sqlite3Fts3Al
10ad0 6c 53 65 67 64 69 72 73 28 70 2c 20 26 70 53 74  lSegdirs(p, &pSt
10ae0 6d 74 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  mt);.  }.  while
10af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10b00 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28  && SQLITE_ROW==(
10b10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
10b20 70 28 70 53 74 6d 74 29 29 20 29 7b 0a 20 20 20  p(pStmt)) ){.   
10b30 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
10b40 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
10b50 74 20 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65  t nRoot = sqlite
10b60 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
10b70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20 63 68  Stmt, 4);.    ch
10b80 61 72 20 63 6f 6e 73 74 20 2a 7a 52 6f 6f 74 20  ar const *zRoot 
10b90 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
10ba0 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 3b  _blob(pStmt, 4);
10bb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10bc0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
10bd0 74 6d 74 2c 20 31 29 3d 3d 30 20 29 7b 0a 20 20  tmt, 1)==0 ){.  
10be0 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
10bf0 65 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f  e segment is sto
10c00 72 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  red on the root 
10c10 6e 6f 64 65 20 28 77 68 69 63 68 20 6d 75 73 74  node (which must
10c20 20 62 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 6c   be a.      ** l
10c30 65 61 66 29 2e 20 44 6f 20 6e 6f 74 20 62 6f 74  eaf). Do not bot
10c40 68 65 72 20 69 6e 73 70 65 63 74 69 6e 67 20 61  her inspecting a
10c50 6e 79 20 64 61 74 61 20 69 6e 20 74 68 69 73 20  ny data in this 
10c60 63 61 73 65 2c 20 6a 75 73 74 0a 20 20 20 20 20  case, just.     
10c70 20 2a 2a 20 63 72 65 61 74 65 20 61 20 46 74 73   ** create a Fts
10c80 33 53 65 67 52 65 61 64 65 72 20 74 6f 20 73 63  3SegReader to sc
10c90 61 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 6c 65  an the single le
10ca0 61 66 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  af. .      */.  
10cb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10cc0 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77  Fts3SegReaderNew
10cd0 28 69 41 67 65 2c 20 30 2c 20 30 2c 20 30 2c 20  (iAge, 0, 0, 0, 
10ce0 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 70  zRoot, nRoot, &p
10cf0 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
10d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
10d10 6e 74 36 34 20 69 31 3b 20 20 20 20 20 20 20 20  nt64 i1;        
10d20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
10d30 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69   that may contai
10d40 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 20 20 20  n zTerm */.     
10d50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
10d60 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
10d70 46 69 6e 61 6c 20 6c 65 61 66 20 74 68 61 74 20  Final leaf that 
10d80 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 54 65 72  may contain zTer
10d90 6d 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  m */.      rc = 
10da0 66 74 73 33 53 65 6c 65 63 74 4c 65 61 66 28 70  fts3SelectLeaf(p
10db0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
10dc0 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 69  zRoot, nRoot, &i
10dd0 31 2c 20 28 69 73 50 72 65 66 69 78 3f 26 69 32  1, (isPrefix?&i2
10de0 3a 30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  :0));.      if( 
10df0 69 73 50 72 65 66 69 78 3d 3d 30 20 29 20 69 32  isPrefix==0 ) i2
10e00 20 3d 20 69 31 3b 0a 20 20 20 20 20 20 69 66 28   = i1;.      if(
10e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10e20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10e30 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
10e40 64 65 72 4e 65 77 28 69 41 67 65 2c 20 69 31 2c  derNew(iAge, i1,
10e50 20 69 32 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70   i2, 0, 0, 0, &p
10e60 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
10e70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
10e80 28 70 4e 65 77 3d 3d 30 29 3d 3d 28 72 63 21 3d  (pNew==0)==(rc!=
10e90 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 0a 20  SQLITE_OK) );.. 
10ea0 20 20 20 2f 2a 20 49 66 20 61 20 6e 65 77 20 46     /* If a new F
10eb0 74 73 33 53 65 67 52 65 61 64 65 72 20 77 61 73  ts3SegReader was
10ec0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
10ed0 69 74 20 74 6f 20 74 68 65 20 61 72 72 61 79 2e  it to the array.
10ee0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
10ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10f00 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
10f10 65 61 64 65 72 41 72 72 61 79 41 64 64 28 26 70  eaderArrayAdd(&p
10f20 41 72 72 61 79 2c 20 70 4e 65 77 29 3b 0a 20 20  Array, pNew);.  
10f30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
10f40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10f50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
10f60 74 73 33 53 65 67 52 65 61 64 65 72 43 6f 73 74  ts3SegReaderCost
10f70 28 70 43 73 72 2c 20 70 4e 65 77 2c 20 26 70 41  (pCsr, pNew, &pA
10f80 72 72 61 79 2d 3e 6e 43 6f 73 74 29 3b 0a 20 20  rray->nCost);.  
10f90 20 20 7d 0a 20 20 20 20 69 41 67 65 2b 2b 3b 0a    }.    iAge++;.
10fa0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
10fb0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
10fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
10fd0 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d  eset(pStmt);.  }
10fe0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
10ff0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
11000 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
11010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
11020 74 73 33 53 65 67 52 65 61 64 65 72 41 72 72 61  ts3SegReaderArra
11030 79 46 72 65 65 28 70 41 72 72 61 79 29 3b 0a 20  yFree(pArray);. 
11040 20 20 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20     pArray = 0;. 
11050 20 7d 0a 20 20 2a 70 70 41 72 72 61 79 20 3d 20   }.  *ppArray = 
11060 70 41 72 72 61 79 3b 0a 20 20 72 65 74 75 72 6e  pArray;.  return
11070 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11080 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 72  is function retr
11090 65 69 76 65 73 20 74 68 65 20 64 6f 63 6c 69 73  eives the doclis
110a0 74 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  t for the specif
110b0 69 65 64 20 74 65 72 6d 20 28 6f 72 20 74 65 72  ied term (or ter
110c0 6d 0a 2a 2a 20 70 72 65 66 69 78 29 20 66 72 6f  m.** prefix) fro
110d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
110e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
110f0 6e 65 64 20 64 6f 63 6c 69 73 74 20 6d 61 79 20  ned doclist may 
11100 62 65 20 69 6e 20 6f 6e 65 20 6f 66 20 74 77 6f  be in one of two
11110 20 66 6f 72 6d 61 74 73 2c 20 64 65 70 65 6e 64   formats, depend
11120 69 6e 67 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 76  ing on the .** v
11130 61 6c 75 65 20 6f 66 20 70 61 72 61 6d 65 74 65  alue of paramete
11140 72 20 69 73 52 65 71 50 6f 73 2e 20 49 66 20 69  r isReqPos. If i
11150 73 52 65 71 50 6f 73 20 69 73 20 7a 65 72 6f 2c  sReqPos is zero,
11160 20 74 68 65 6e 20 74 68 65 20 64 6f 63 6c 69 73   then the doclis
11170 74 20 69 73 0a 2a 2a 20 61 20 73 6f 72 74 65 64  t is.** a sorted
11180 20 6c 69 73 74 20 6f 66 20 64 65 6c 74 61 2d 63   list of delta-c
11190 6f 6d 70 72 65 73 73 65 64 20 64 6f 63 69 64 73  ompressed docids
111a0 20 28 61 20 62 61 72 65 20 64 6f 63 6c 69 73 74   (a bare doclist
111b0 29 2e 20 49 66 20 69 73 52 65 71 50 6f 73 0a 2a  ). If isReqPos.*
111c0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
111d0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
111e0 20 6c 69 73 74 20 69 73 20 69 6e 20 74 68 65 20   list is in the 
111f0 73 61 6d 65 20 66 6f 72 6d 61 74 20 61 73 20 69  same format as i
11200 73 20 73 74 6f 72 65 64 20 0a 2a 2a 20 69 6e 20  s stored .** in 
11210 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74  the database wit
11220 68 6f 75 74 20 74 68 65 20 66 6f 75 6e 64 20 6c  hout the found l
11230 65 6e 67 74 68 20 73 70 65 63 69 66 69 65 72 20  ength specifier 
11240 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
11250 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 64 6f 63 6c 69  on-disk.** docli
11260 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sts..*/.static i
11270 6e 74 20 66 74 73 33 54 65 72 6d 53 65 6c 65 63  nt fts3TermSelec
11280 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  t(.  Fts3Table *
11290 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
112a0 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
112b0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
112c0 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65    Fts3PhraseToke
112d0 6e 20 2a 70 54 6f 6b 2c 20 20 20 20 20 20 20 20  n *pTok,        
112e0 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 71 75    /* Token to qu
112f0 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ery for */.  int
11300 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11320 43 6f 6c 75 6d 6e 20 74 6f 20 71 75 65 72 79 20  Column to query 
11330 28 6f 72 20 2d 76 65 20 66 6f 72 20 61 6c 6c 20  (or -ve for all 
11340 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20 69 6e  columns) */.  in
11350 74 20 69 73 52 65 71 50 6f 73 2c 20 20 20 20 20  t isReqPos,     
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11370 20 54 72 75 65 20 74 6f 20 69 6e 63 6c 75 64 65   True to include
11380 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20   position lists 
11390 69 6e 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  in output */.  i
113a0 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20 20  nt *pnOut,      
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
113c0 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 62  * OUT: Size of b
113d0 75 66 66 65 72 20 61 74 20 2a 70 70 4f 75 74 20  uffer at *ppOut 
113e0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 75  */.  char **ppOu
113f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11400 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 6c       /* OUT: Mal
11410 6c 6f 63 65 64 20 72 65 73 75 6c 74 20 62 75 66  loced result buf
11420 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  fer */.){.  int 
11430 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11450 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11460 46 74 73 33 53 65 67 52 65 61 64 65 72 41 72 72  Fts3SegReaderArr
11470 61 79 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20  ay *pArray;     
11480 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 61 72  /* Seg-reader ar
11490 72 61 79 20 66 6f 72 20 74 68 69 73 20 74 65 72  ray for this ter
114a0 6d 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c 65 63  m */.  TermSelec
114b0 74 20 74 73 63 3b 20 20 20 20 20 20 20 20 20 20  t tsc;          
114c0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
114d0 6f 62 6a 65 63 74 20 66 6f 72 20 66 74 73 33 54  object for fts3T
114e0 65 72 6d 53 65 6c 65 63 74 43 62 28 29 20 2a 2f  ermSelectCb() */
114f0 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72  .  Fts3SegFilter
11500 20 66 69 6c 74 65 72 3b 20 20 20 20 20 20 20 20   filter;        
11510 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 65 72 6d   /* Segment term
11520 20 66 69 6c 74 65 72 20 63 6f 6e 66 69 67 75 72   filter configur
11530 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 70 41 72 72  ation */..  pArr
11540 61 79 20 3d 20 70 54 6f 6b 2d 3e 70 41 72 72 61  ay = pTok->pArra
11550 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 73 63  y;.  memset(&tsc
11560 2c 20 30 2c 20 73 69 7a 65 6f 66 28 54 65 72 6d  , 0, sizeof(Term
11570 53 65 6c 65 63 74 29 29 3b 0a 20 20 74 73 63 2e  Select));.  tsc.
11580 69 73 52 65 71 50 6f 73 20 3d 20 69 73 52 65 71  isReqPos = isReq
11590 50 6f 73 3b 0a 0a 20 20 66 69 6c 74 65 72 2e 66  Pos;..  filter.f
115a0 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d  lags = FTS3_SEGM
115b0 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59  ENT_IGNORE_EMPTY
115c0 20 0a 20 20 20 20 20 20 20 20 7c 20 28 70 54 6f   .        | (pTo
115d0 6b 2d 3e 69 73 50 72 65 66 69 78 20 3f 20 46 54  k->isPrefix ? FT
115e0 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46 49  S3_SEGMENT_PREFI
115f0 58 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 7c  X : 0).        |
11600 20 28 69 73 52 65 71 50 6f 73 20 3f 20 46 54 53   (isReqPos ? FTS
11610 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52  3_SEGMENT_REQUIR
11620 45 5f 50 4f 53 20 3a 20 30 29 0a 20 20 20 20 20  E_POS : 0).     
11630 20 20 20 7c 20 28 69 43 6f 6c 75 6d 6e 3c 70 2d     | (iColumn<p-
11640 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 46 54 53 33 5f  >nColumn ? FTS3_
11650 53 45 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e 5f 46  SEGMENT_COLUMN_F
11660 49 4c 54 45 52 20 3a 20 30 29 3b 0a 20 20 66 69  ILTER : 0);.  fi
11670 6c 74 65 72 2e 69 43 6f 6c 20 3d 20 69 43 6f 6c  lter.iCol = iCol
11680 75 6d 6e 3b 0a 20 20 66 69 6c 74 65 72 2e 7a 54  umn;.  filter.zT
11690 65 72 6d 20 3d 20 70 54 6f 6b 2d 3e 7a 3b 0a 20  erm = pTok->z;. 
116a0 20 66 69 6c 74 65 72 2e 6e 54 65 72 6d 20 3d 20   filter.nTerm = 
116b0 70 54 6f 6b 2d 3e 6e 3b 0a 0a 20 20 72 63 20 3d  pTok->n;..  rc =
116c0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
116d0 65 61 64 65 72 49 74 65 72 61 74 65 28 70 2c 20  eaderIterate(p, 
116e0 70 41 72 72 61 79 2d 3e 61 70 53 65 67 6d 65 6e  pArray->apSegmen
116f0 74 2c 20 70 41 72 72 61 79 2d 3e 6e 53 65 67 6d  t, pArray->nSegm
11700 65 6e 74 2c 20 0a 20 20 20 20 20 20 26 66 69 6c  ent, .      &fil
11710 74 65 72 2c 20 66 74 73 33 54 65 72 6d 53 65 6c  ter, fts3TermSel
11720 65 63 74 43 62 2c 20 28 76 6f 69 64 20 2a 29 26  ectCb, (void *)&
11730 74 73 63 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  tsc.  );.  if( r
11740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11750 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 65 72      rc = fts3Ter
11760 6d 53 65 6c 65 63 74 4d 65 72 67 65 28 26 74 73  mSelectMerge(&ts
11770 63 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  c);.  }..  if( r
11780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11790 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 74 73 63      *ppOut = tsc
117a0 2e 61 61 4f 75 74 70 75 74 5b 30 5d 3b 0a 20 20  .aaOutput[0];.  
117b0 20 20 2a 70 6e 4f 75 74 20 3d 20 74 73 63 2e 61    *pnOut = tsc.a
117c0 6e 4f 75 74 70 75 74 5b 30 5d 3b 0a 20 20 7d 65  nOutput[0];.  }e
117d0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
117e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
117f0 69 7a 65 6f 66 41 72 72 61 79 28 74 73 63 2e 61  izeofArray(tsc.a
11800 61 4f 75 74 70 75 74 29 3b 20 69 2b 2b 29 7b 0a  aOutput); i++){.
11810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11820 65 65 28 74 73 63 2e 61 61 4f 75 74 70 75 74 5b  ee(tsc.aaOutput[
11830 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  i]);.    }.  }..
11840 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 41    fts3SegReaderA
11850 72 72 61 79 46 72 65 65 28 70 41 72 72 61 79 29  rrayFree(pArray)
11860 3b 0a 20 20 70 54 6f 6b 2d 3e 70 41 72 72 61 79  ;.  pTok->pArray
11870 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
11880 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11890 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6e 74 73   function counts
118a0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
118b0 72 20 6f 66 20 64 6f 63 69 64 73 20 69 6e 20 74  r of docids in t
118c0 68 65 20 64 6f 63 6c 69 73 74 20 73 74 6f 72 65  he doclist store
118d0 64 0a 2a 2a 20 69 6e 20 62 75 66 66 65 72 20 61  d.** in buffer a
118e0 4c 69 73 74 5b 5d 2c 20 73 69 7a 65 20 6e 4c 69  List[], size nLi
118f0 73 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  st bytes..**.** 
11900 49 66 20 74 68 65 20 69 73 50 6f 73 6c 69 73 74  If the isPoslist
11910 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
11920 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 73  e, then it is as
11930 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 64  sumed that the d
11940 6f 63 6c 69 73 74 0a 2a 2a 20 63 6f 6e 74 61 69  oclist.** contai
11950 6e 73 20 61 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  ns a position-li
11960 73 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  st following eac
11970 68 20 64 6f 63 69 64 2e 20 4f 74 68 65 72 77 69  h docid. Otherwi
11980 73 65 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  se, it is assume
11990 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 64 6f  d.** that the do
119a0 63 6c 69 73 74 20 69 73 20 73 69 6d 70 6c 79 20  clist is simply 
119b0 61 20 6c 69 73 74 20 6f 66 20 64 6f 63 69 64 73  a list of docids
119c0 20 73 74 6f 72 65 64 20 61 73 20 64 65 6c 74 61   stored as delta
119d0 20 65 6e 63 6f 64 65 64 20 0a 2a 2a 20 76 61 72   encoded .** var
119e0 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ints..*/.static 
119f0 69 6e 74 20 66 74 73 33 44 6f 63 6c 69 73 74 43  int fts3DoclistC
11a00 6f 75 6e 74 44 6f 63 69 64 73 28 69 6e 74 20 69  ountDocids(int i
11a10 73 50 6f 73 6c 69 73 74 2c 20 63 68 61 72 20 2a  sPoslist, char *
11a20 61 4c 69 73 74 2c 20 69 6e 74 20 6e 4c 69 73 74  aList, int nList
11a30 29 7b 0a 20 20 69 6e 74 20 6e 44 6f 63 20 3d 20  ){.  int nDoc = 
11a40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11a50 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
11a60 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 61 4c  alue */.  if( aL
11a70 69 73 74 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ist ){.    char 
11a80 2a 61 45 6e 64 20 3d 20 26 61 4c 69 73 74 5b 6e  *aEnd = &aList[n
11a90 4c 69 73 74 5d 3b 20 20 20 2f 2a 20 50 6f 69 6e  List];   /* Poin
11aa0 74 65 72 20 74 6f 20 6f 6e 65 20 62 79 74 65 20  ter to one byte 
11ab0 61 66 74 65 72 20 45 4f 46 20 2a 2f 0a 20 20 20  after EOF */.   
11ac0 20 63 68 61 72 20 2a 70 20 3d 20 61 4c 69 73 74   char *p = aList
11ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11ae0 2a 20 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  * Cursor */.    
11af0 69 66 28 20 21 69 73 50 6f 73 6c 69 73 74 20 29  if( !isPoslist )
11b00 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  {.      /* The n
11b10 75 6d 62 65 72 20 6f 66 20 64 6f 63 69 64 73 20  umber of docids 
11b20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 74  in the list is t
11b30 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6e  he same as the n
11b40 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 20  umber of .      
11b50 2a 2a 20 76 61 72 69 6e 74 73 2e 20 49 6e 20 46  ** varints. In F
11b60 54 53 33 20 61 20 76 61 72 69 6e 74 20 63 6f 6e  TS3 a varint con
11b70 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  sists of a singl
11b80 65 20 62 79 74 65 20 77 69 74 68 20 74 68 65 20  e byte with the 
11b90 30 78 38 30 20 0a 20 20 20 20 20 20 2a 2a 20 62  0x80 .      ** b
11ba0 69 74 20 63 6c 65 61 72 65 64 20 61 6e 64 20 7a  it cleared and z
11bb0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74 65  ero or more byte
11bc0 73 20 77 69 74 68 20 74 68 65 20 30 78 38 30 20  s with the 0x80 
11bd0 62 69 74 20 73 65 74 2e 20 53 6f 20 74 6f 0a 20  bit set. So to. 
11be0 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 74 68       ** count th
11bf0 65 20 76 61 72 69 6e 74 73 20 69 6e 20 74 68 65  e varints in the
11c00 20 62 75 66 66 65 72 2c 20 6a 75 73 74 20 63 6f   buffer, just co
11c10 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
11c20 66 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a  f bytes.      **
11c30 20 77 69 74 68 20 74 68 65 20 30 78 38 30 20 62   with the 0x80 b
11c40 69 74 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20 20  it clear.  */.  
11c50 20 20 20 20 77 68 69 6c 65 28 20 70 3c 61 45 6e      while( p<aEn
11c60 64 20 29 20 6e 44 6f 63 20 2b 3d 20 28 28 28 2a  d ) nDoc += (((*
11c70 70 2b 2b 29 26 30 78 38 30 29 3d 3d 30 29 3b 0a  p++)&0x80)==0);.
11c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c90 20 77 68 69 6c 65 28 20 70 3c 61 45 6e 64 20 29   while( p<aEnd )
11ca0 7b 0a 20 20 20 20 20 20 20 20 6e 44 6f 63 2b 2b  {.        nDoc++
11cb0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
11cc0 20 28 2a 70 2b 2b 29 26 30 78 38 30 20 29 3b 20   (*p++)&0x80 ); 
11cd0 20 20 20 20 2f 2a 20 53 6b 69 70 20 64 6f 63 69      /* Skip doci
11ce0 64 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 20 20  d varint */.    
11cf0 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43      fts3PoslistC
11d00 6f 70 79 28 30 2c 20 26 70 29 3b 20 20 20 2f 2a  opy(0, &p);   /*
11d10 20 53 6b 69 70 20 6f 76 65 72 20 70 6f 73 69 74   Skip over posit
11d20 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ion list */.    
11d30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11d40 20 72 65 74 75 72 6e 20 6e 44 6f 63 3b 0a 7d 0a   return nDoc;.}.
11d50 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
11d60 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65  te3Fts3DeferToke
11d70 6e 28 29 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  n() for each tok
11d80 65 6e 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  en in the expres
11d90 73 69 6f 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 73  sion pExpr..*/.s
11da0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65  tatic int fts3De
11db0 66 65 72 45 78 70 72 65 73 73 69 6f 6e 28 46 74  ferExpression(Ft
11dc0 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
11dd0 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 29  Fts3Expr *pExpr)
11de0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11df0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 45  ITE_OK;.  if( pE
11e00 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  xpr ){.    rc = 
11e10 66 74 73 33 44 65 66 65 72 45 78 70 72 65 73 73  fts3DeferExpress
11e20 69 6f 6e 28 70 43 73 72 2c 20 70 45 78 70 72 2d  ion(pCsr, pExpr-
11e30 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28  >pLeft);.    if(
11e40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11e50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
11e60 33 44 65 66 65 72 45 78 70 72 65 73 73 69 6f 6e  3DeferExpression
11e70 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52  (pCsr, pExpr->pR
11e80 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
11e90 20 69 66 28 20 70 45 78 70 72 2d 3e 65 54 79 70   if( pExpr->eTyp
11ea0 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41  e==FTSQUERY_PHRA
11eb0 53 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE ){.      int 
11ec0 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 70 50  iCol = pExpr->pP
11ed0 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  hrase->iColumn;.
11ee0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
11ef0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
11f00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
11f10 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 6e  Expr->pPhrase->n
11f20 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Token; i++){.   
11f30 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54       Fts3PhraseT
11f40 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26  oken *pToken = &
11f50 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e  pExpr->pPhrase->
11f60 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20  aToken[i];.     
11f70 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 70     if( pToken->p
11f80 44 65 66 65 72 72 65 64 3d 3d 30 20 29 7b 0a 20  Deferred==0 ){. 
11f90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
11fa0 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f  lite3Fts3DeferTo
11fb0 6b 65 6e 28 70 43 73 72 2c 20 70 54 6f 6b 65 6e  ken(pCsr, pToken
11fc0 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , iCol);.       
11fd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11fe0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12000 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76 65 73  function removes
12010 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 6e   the position in
12020 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
12030 20 64 6f 63 6c 69 73 74 2e 20 57 68 65 6e 0a 2a   doclist. When.*
12040 2a 20 63 61 6c 6c 65 64 2c 20 62 75 66 66 65 72  * called, buffer
12050 20 61 4c 69 73 74 20 28 73 69 7a 65 20 2a 70 6e   aList (size *pn
12060 4c 69 73 74 20 62 79 74 65 73 29 20 63 6f 6e 74  List bytes) cont
12070 61 69 6e 73 20 61 20 64 6f 63 6c 69 73 74 20 74  ains a doclist t
12080 68 61 74 20 69 6e 63 6c 75 64 65 73 0a 2a 2a 20  hat includes.** 
12090 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  position informa
120a0 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
120b0 69 6f 6e 20 72 65 6d 6f 76 65 73 20 74 68 65 20  ion removes the 
120c0 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  position informa
120d0 74 69 6f 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  tion so.** that 
120e0 61 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6f  aList contains o
120f0 6e 6c 79 20 64 6f 63 69 64 73 2c 20 61 6e 64 20  nly docids, and 
12100 61 64 6a 75 73 74 73 20 2a 70 6e 4c 69 73 74 20  adjusts *pnList 
12110 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e  to reflect the n
12120 65 77 0a 2a 2a 20 28 70 6f 73 73 69 62 6c 79 20  ew.** (possibly 
12130 72 65 64 75 63 65 64 29 20 73 69 7a 65 20 6f 66  reduced) size of
12140 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f   the doclist..*/
12150 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12160 33 44 6f 63 6c 69 73 74 53 74 72 69 70 50 6f 73  3DoclistStripPos
12170 69 74 69 6f 6e 73 28 0a 20 20 63 68 61 72 20 2a  itions(.  char *
12180 61 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  aList,          
12190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
121a0 4f 55 54 3a 20 42 75 66 66 65 72 20 63 6f 6e 74  OUT: Buffer cont
121b0 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74 20 2a  aining doclist *
121c0 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74 20  /.  int *pnList 
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121e0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
121f0 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  ize of doclist i
12200 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
12210 69 66 28 20 61 4c 69 73 74 20 29 7b 0a 20 20 20  if( aList ){.   
12220 20 63 68 61 72 20 2a 61 45 6e 64 20 3d 20 26 61   char *aEnd = &a
12230 4c 69 73 74 5b 2a 70 6e 4c 69 73 74 5d 3b 20 2f  List[*pnList]; /
12240 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65  * Pointer to one
12250 20 62 79 74 65 20 61 66 74 65 72 20 45 4f 46 20   byte after EOF 
12260 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  */.    char *p =
12270 20 61 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20   aList;         
12280 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 75       /* Input cu
12290 72 73 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61 72  rsor */.    char
122a0 20 2a 70 4f 75 74 20 3d 20 61 4c 69 73 74 3b 20   *pOut = aList; 
122b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
122c0 70 75 74 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  put cursor */.  
122d0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c 61 45  .    while( p<aE
122e0 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nd ){.      sqli
122f0 74 65 33 5f 69 6e 74 36 34 20 64 65 6c 74 61 3b  te3_int64 delta;
12300 0a 20 20 20 20 20 20 70 20 2b 3d 20 73 71 6c 69  .      p += sqli
12310 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
12320 28 70 2c 20 26 64 65 6c 74 61 29 3b 0a 20 20 20  (p, &delta);.   
12330 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f     fts3PoslistCo
12340 70 79 28 30 2c 20 26 70 29 3b 0a 20 20 20 20 20  py(0, &p);.     
12350 20 70 4f 75 74 20 2b 3d 20 73 71 6c 69 74 65 33   pOut += sqlite3
12360 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 70 4f  Fts3PutVarint(pO
12370 75 74 2c 20 64 65 6c 74 61 29 3b 0a 20 20 20 20  ut, delta);.    
12380 7d 0a 0a 20 20 20 20 2a 70 6e 4c 69 73 74 20 3d  }..    *pnList =
12390 20 28 69 6e 74 29 28 70 4f 75 74 20 2d 20 61 4c   (int)(pOut - aL
123a0 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  ist);.  }.}../* 
123b0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 44 6f 63  .** Return a Doc
123c0 4c 69 73 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  List correspondi
123d0 6e 67 20 74 6f 20 74 68 65 20 70 68 72 61 73 65  ng to the phrase
123e0 20 2a 70 50 68 72 61 73 65 2e 0a 2a 2a 0a 2a 2a   *pPhrase..**.**
123f0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
12400 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
12410 5f 4f 4b 2c 20 62 75 74 20 2a 70 6e 4f 75 74 20  _OK, but *pnOut 
12420 69 73 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61  is set to a nega
12430 74 69 76 65 20 76 61 6c 75 65 2c 0a 2a 2a 20 74  tive value,.** t
12440 68 65 6e 20 6e 6f 20 74 6f 6b 65 6e 73 20 69 6e  hen no tokens in
12450 20 74 68 65 20 70 68 72 61 73 65 20 77 65 72 65   the phrase were
12460 20 6c 6f 6f 6b 65 64 20 75 70 20 69 6e 20 74 68   looked up in th
12470 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
12480 78 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  x. This.** is on
12490 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 68 65 6e  ly possible when
124a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
124b0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  s called from wi
124c0 74 68 69 6e 20 78 46 69 6c 74 65 72 28 29 2e 20  thin xFilter(). 
124d0 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  The.** caller sh
124e0 6f 75 6c 64 20 61 73 73 75 6d 65 20 74 68 61 74  ould assume that
124f0 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 6d   all documents m
12500 61 74 63 68 20 74 68 65 20 70 68 72 61 73 65 2e  atch the phrase.
12510 20 54 68 65 20 61 63 74 75 61 6c 0a 2a 2a 20 66   The actual.** f
12520 69 6c 74 65 72 69 6e 67 20 77 69 6c 6c 20 74 61  iltering will ta
12530 6b 65 20 70 6c 61 63 65 20 69 6e 20 78 4e 65 78  ke place in xNex
12540 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  t()..*/.static i
12550 6e 74 20 66 74 73 33 50 68 72 61 73 65 53 65 6c  nt fts3PhraseSel
12560 65 63 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f  ect(.  Fts3Curso
12570 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20  r *pCsr,        
12580 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
12590 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68  l table cursor h
125a0 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 50  andle */.  Fts3P
125b0 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 2c 20  hrase *pPhrase, 
125c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68             /* Ph
125d0 72 61 73 65 20 74 6f 20 72 65 74 75 72 6e 20 61  rase to return a
125e0 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 2a 2f 0a   doclist for */.
125f0 20 20 69 6e 74 20 69 73 52 65 71 50 6f 73 2c 20    int isReqPos, 
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
12620 70 75 74 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  put should conta
12630 69 6e 20 70 6f 73 69 74 69 6f 6e 73 20 2a 2f 0a  in positions */.
12640 20 20 63 68 61 72 20 2a 2a 70 61 4f 75 74 2c 20    char **paOut, 
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
12670 72 20 74 6f 20 6d 61 6c 6c 6f 63 27 64 20 72 65  r to malloc'd re
12680 73 75 6c 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  sult buffer */. 
12690 20 69 6e 74 20 2a 70 6e 4f 75 74 20 20 20 20 20   int *pnOut     
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
126c0 20 62 75 66 66 65 72 20 61 74 20 2a 70 61 4f 75   buffer at *paOu
126d0 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
126e0 70 4f 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pOut = 0;.  int 
126f0 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nOut = 0;.  int 
12700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12710 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
12720 69 43 6f 6c 20 3d 20 70 50 68 72 61 73 65 2d 3e  iCol = pPhrase->
12730 69 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 69  iColumn;.  int i
12740 73 54 65 72 6d 50 6f 73 20 3d 20 28 70 50 68 72  sTermPos = (pPhr
12750 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3e 31 20 7c 7c  ase->nToken>1 ||
12760 20 69 73 52 65 71 50 6f 73 29 3b 0a 20 20 46 74   isReqPos);.  Ft
12770 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
12780 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e  s3Table *)pCsr->
12790 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e  base.pVtab;.  in
127a0 74 20 69 73 46 69 72 73 74 20 3d 20 31 3b 0a 0a  t isFirst = 1;..
127b0 20 20 69 6e 74 20 69 50 72 65 76 54 6f 6b 20 3d    int iPrevTok =
127c0 20 30 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 20 3d   0;.  int nDoc =
127d0 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   0;..  /* If thi
127e0 73 20 69 73 20 61 6e 20 78 46 69 6c 74 65 72 28  s is an xFilter(
127f0 29 20 65 76 61 6c 75 61 74 69 6f 6e 2c 20 63 72  ) evaluation, cr
12800 65 61 74 65 20 61 20 73 65 67 6d 65 6e 74 2d 72  eate a segment-r
12810 65 61 64 65 72 20 66 6f 72 20 65 61 63 68 0a 20  eader for each. 
12820 20 2a 2a 20 70 68 72 61 73 65 20 74 6f 6b 65 6e   ** phrase token
12830 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
12840 20 61 6e 20 78 4e 65 78 74 28 29 20 6f 72 20 73   an xNext() or s
12850 6e 69 70 70 65 74 2f 6f 66 66 73 65 74 73 2f 6d  nippet/offsets/m
12860 61 74 63 68 69 6e 66 6f 0a 20 20 2a 2a 20 65 76  atchinfo.  ** ev
12870 61 6c 75 61 74 69 6f 6e 2c 20 6f 6e 6c 79 20 63  aluation, only c
12880 72 65 61 74 65 20 73 65 67 6d 65 6e 74 2d 72 65  reate segment-re
12890 61 64 65 72 73 20 69 66 20 74 68 65 72 65 20 61  aders if there a
128a0 72 65 20 6e 6f 20 46 74 73 33 44 65 66 65 72 72  re no Fts3Deferr
128b0 65 64 54 6f 6b 65 6e 0a 20 20 2a 2a 20 6f 62 6a  edToken.  ** obj
128c0 65 63 74 73 20 61 74 74 61 63 68 65 64 20 74 6f  ects attached to
128d0 20 74 68 65 20 70 68 72 61 73 65 2d 74 6f 6b 65   the phrase-toke
128e0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
128f0 69 3d 30 3b 20 69 69 3c 70 50 68 72 61 73 65 2d  i=0; ii<pPhrase-
12900 3e 6e 54 6f 6b 65 6e 3b 20 69 69 2b 2b 29 7b 0a  >nToken; ii++){.
12910 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
12920 6b 65 6e 20 2a 70 54 6f 6b 20 3d 20 26 70 50 68  ken *pTok = &pPh
12930 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 69 5d  rase->aToken[ii]
12940 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 2d 3e  ;.    if( pTok->
12950 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20  pArray==0 ){.   
12960 20 20 20 69 66 28 20 28 70 43 73 72 2d 3e 65 45     if( (pCsr->eE
12970 76 61 6c 6d 6f 64 65 3d 3d 46 54 53 33 5f 45 56  valmode==FTS3_EV
12980 41 4c 5f 46 49 4c 54 45 52 29 0a 20 20 20 20 20  AL_FILTER).     
12990 20 20 7c 7c 20 28 70 43 73 72 2d 3e 65 45 76 61    || (pCsr->eEva
129a0 6c 6d 6f 64 65 3d 3d 46 54 53 33 5f 45 56 41 4c  lmode==FTS3_EVAL
129b0 5f 4e 45 58 54 20 26 26 20 70 43 73 72 2d 3e 70  _NEXT && pCsr->p
129c0 44 65 66 65 72 72 65 64 3d 3d 30 29 20 0a 20 20  Deferred==0) .  
129d0 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 65       || (pCsr->e
129e0 45 76 61 6c 6d 6f 64 65 3d 3d 46 54 53 33 5f 45  Evalmode==FTS3_E
129f0 56 41 4c 5f 4d 41 54 43 48 49 4e 46 4f 20 26 26  VAL_MATCHINFO &&
12a00 20 70 54 6f 6b 2d 3e 62 46 75 6c 6c 74 65 78 74   pTok->bFulltext
12a10 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
12a20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 65 72      rc = fts3Ter
12a30 6d 53 65 67 52 65 61 64 65 72 41 72 72 61 79 28  mSegReaderArray(
12a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
12a50 72 2c 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b  r, pTok->z, pTok
12a60 2d 3e 6e 2c 20 70 54 6f 6b 2d 3e 69 73 50 72 65  ->n, pTok->isPre
12a70 66 69 78 2c 20 26 70 54 6f 6b 2d 3e 70 41 72 72  fix, &pTok->pArr
12a80 61 79 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ay.        );.  
12a90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12aa0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12ab0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
12ac0 20 7d 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 69   }.  }..  for(ii
12ad0 3d 30 3b 20 69 69 3c 70 50 68 72 61 73 65 2d 3e  =0; ii<pPhrase->
12ae0 6e 54 6f 6b 65 6e 3b 20 69 69 2b 2b 29 7b 0a 20  nToken; ii++){. 
12af0 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b     Fts3PhraseTok
12b00 65 6e 20 2a 70 54 6f 6b 3b 20 20 20 20 20 20 20  en *pTok;       
12b10 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 66 69 6e   /* Token to fin
12b20 64 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 2a 2f  d doclist for */
12b30 0a 20 20 20 20 69 6e 74 20 69 54 6f 6b 20 3d 20  .    int iTok = 
12b40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12b50 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
12b60 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 74 68  being queried th
12b70 69 73 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  is iteration */.
12b80 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20      char *pList 
12b90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12ba0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
12bb0 74 6f 6b 65 6e 20 64 6f 63 6c 69 73 74 20 2a 2f  token doclist */
12bc0 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  .    int nList =
12bd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12be0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
12bf0 66 66 65 72 20 61 74 20 70 4c 69 73 74 20 2a 2f  ffer at pList */
12c00 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
12c10 61 20 74 6f 6b 65 6e 20 74 6f 20 70 72 6f 63 65  a token to proce
12c20 73 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ss. If this is a
12c30 6e 20 78 46 69 6c 74 65 72 28 29 20 63 61 6c 6c  n xFilter() call
12c40 2c 20 74 68 65 6e 20 74 6f 6b 65 6e 73 20 0a 20  , then tokens . 
12c50 20 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73     ** are proces
12c60 73 65 64 20 69 6e 20 6f 72 64 65 72 20 66 72 6f  sed in order fro
12c70 6d 20 6c 65 61 73 74 20 74 6f 20 6d 6f 73 74 20  m least to most 
12c80 63 6f 73 74 6c 79 2e 20 4f 74 68 65 72 77 69 73  costly. Otherwis
12c90 65 2c 20 74 6f 6b 65 6e 73 20 0a 20 20 20 20 2a  e, tokens .    *
12ca0 2a 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  * are processed 
12cb0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
12cc0 77 68 69 63 68 20 74 68 65 79 20 6f 63 63 75 72  which they occur
12cd0 20 69 6e 20 74 68 65 20 70 68 72 61 73 65 2e 0a   in the phrase..
12ce0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
12cf0 43 73 72 2d 3e 65 45 76 61 6c 6d 6f 64 65 3d 3d  Csr->eEvalmode==
12d00 46 54 53 33 5f 45 56 41 4c 5f 4d 41 54 43 48 49  FTS3_EVAL_MATCHI
12d10 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 61 73 73  NFO ){.      ass
12d20 65 72 74 28 20 69 73 52 65 71 50 6f 73 20 29 3b  ert( isReqPos );
12d30 0a 20 20 20 20 20 20 69 54 6f 6b 20 3d 20 69 69  .      iTok = ii
12d40 3b 0a 20 20 20 20 20 20 70 54 6f 6b 20 3d 20 26  ;.      pTok = &
12d50 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b  pPhrase->aToken[
12d60 69 54 6f 6b 5d 3b 0a 20 20 20 20 20 20 69 66 28  iTok];.      if(
12d70 20 70 54 6f 6b 2d 3e 62 46 75 6c 6c 74 65 78 74   pTok->bFulltext
12d80 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12d90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
12da0 73 72 2d 3e 65 45 76 61 6c 6d 6f 64 65 3d 3d 46  sr->eEvalmode==F
12db0 54 53 33 5f 45 56 41 4c 5f 4e 45 58 54 20 7c 7c  TS3_EVAL_NEXT ||
12dc0 20 69 73 52 65 71 50 6f 73 20 29 7b 0a 20 20 20   isReqPos ){.   
12dd0 20 20 20 69 54 6f 6b 20 3d 20 69 69 3b 0a 20 20     iTok = ii;.  
12de0 20 20 20 20 70 54 6f 6b 20 3d 20 26 70 50 68 72      pTok = &pPhr
12df0 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b  ase->aToken[iTok
12e00 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
12e10 20 20 20 20 69 6e 74 20 6e 4d 69 6e 43 6f 73 74      int nMinCost
12e20 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20   = 0x7FFFFFFF;. 
12e30 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 0a 20 20       int jj;..  
12e40 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
12e50 72 65 6d 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20  remaining token 
12e60 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20  with the lowest 
12e70 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66  cost. */.      f
12e80 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 50 68 72  or(jj=0; jj<pPhr
12e90 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b  ase->nToken; jj+
12ea0 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33  +){.        Fts3
12eb0 53 65 67 52 65 61 64 65 72 41 72 72 61 79 20 2a  SegReaderArray *
12ec0 70 41 72 72 61 79 20 3d 20 70 50 68 72 61 73 65  pArray = pPhrase
12ed0 2d 3e 61 54 6f 6b 65 6e 5b 6a 6a 5d 2e 70 41 72  ->aToken[jj].pAr
12ee0 72 61 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ray;.        if(
12ef0 20 70 41 72 72 61 79 20 26 26 20 70 41 72 72 61   pArray && pArra
12f00 79 2d 3e 6e 43 6f 73 74 3c 6e 4d 69 6e 43 6f 73  y->nCost<nMinCos
12f10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
12f20 54 6f 6b 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20  Tok = jj;.      
12f30 20 20 20 20 6e 4d 69 6e 43 6f 73 74 20 3d 20 70      nMinCost = p
12f40 41 72 72 61 79 2d 3e 6e 43 6f 73 74 3b 0a 20 20  Array->nCost;.  
12f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12f60 20 20 20 20 20 20 70 54 6f 6b 20 3d 20 26 70 50        pTok = &pP
12f70 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 54  hrase->aToken[iT
12f80 6f 6b 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ok];..      /* T
12f90 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
12fa0 6b 65 6e 20 69 66 20 69 74 20 69 73 20 64 65 74  ken if it is det
12fb0 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6c 6f 61  ermined that loa
12fc0 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74  ding the doclist
12fd0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
12fe0 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20 77 6f 75  e next token wou
12ff0 6c 64 20 72 65 71 75 69 72 65 20 6d 6f 72 65 20  ld require more 
13000 49 4f 20 74 68 61 6e 20 6c 6f 61 64 69 6e 67 20  IO than loading 
13010 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 0a 20 20  all documents.  
13020 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
13030 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 64   identified by d
13040 6f 63 6c 69 73 74 20 70 4f 75 74 2f 6e 4f 75 74  oclist pOut/nOut
13050 2e 20 4e 6f 20 66 75 72 74 68 65 72 20 64 6f 63  . No further doc
13060 6c 69 73 74 73 20 77 69 6c 6c 0a 20 20 20 20 20  lists will.     
13070 20 2a 2a 20 62 65 20 6c 6f 61 64 65 64 20 66 72   ** be loaded fr
13080 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  om the full-text
13090 20 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20   index for this 
130a0 70 68 72 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  phrase..      */
130b0 0a 20 20 20 20 20 20 69 66 28 20 6e 4d 69 6e 43  .      if( nMinC
130c0 6f 73 74 3e 6e 44 6f 63 20 26 26 20 69 69 3e 30  ost>nDoc && ii>0
130d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
130e0 20 66 74 73 33 44 65 66 65 72 45 78 70 72 65 73   fts3DeferExpres
130f0 73 69 6f 6e 28 70 43 73 72 2c 20 70 43 73 72 2d  sion(pCsr, pCsr-
13100 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
13110 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13120 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
13130 43 73 72 2d 3e 65 45 76 61 6c 6d 6f 64 65 3d 3d  Csr->eEvalmode==
13140 46 54 53 33 5f 45 56 41 4c 5f 4e 45 58 54 20 26  FTS3_EVAL_NEXT &
13150 26 20 70 54 6f 6b 2d 3e 70 44 65 66 65 72 72 65  & pTok->pDeferre
13160 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
13170 66 74 73 33 44 65 66 65 72 72 65 64 54 65 72 6d  fts3DeferredTerm
13180 53 65 6c 65 63 74 28 70 54 6f 6b 2d 3e 70 44 65  Select(pTok->pDe
13190 66 65 72 72 65 64 2c 20 69 73 54 65 72 6d 50 6f  ferred, isTermPo
131a0 73 2c 20 26 6e 4c 69 73 74 2c 20 26 70 4c 69 73  s, &nList, &pLis
131b0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
131c0 20 20 20 20 20 69 66 28 20 70 54 6f 6b 2d 3e 70       if( pTok->p
131d0 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20  Array ){.       
131e0 20 72 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65   rc = fts3TermSe
131f0 6c 65 63 74 28 70 2c 20 70 54 6f 6b 2c 20 69 43  lect(p, pTok, iC
13200 6f 6c 2c 20 69 73 54 65 72 6d 50 6f 73 2c 20 26  ol, isTermPos, &
13210 6e 4c 69 73 74 2c 20 26 70 4c 69 73 74 29 3b 0a  nList, &pList);.
13220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
13230 6f 6b 2d 3e 62 46 75 6c 6c 74 65 78 74 20 3d 20  ok->bFulltext = 
13240 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
13250 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
13260 4f 4b 20 7c 7c 20 70 43 73 72 2d 3e 65 45 76 61  OK || pCsr->eEva
13270 6c 6d 6f 64 65 20 7c 7c 20 70 54 6f 6b 2d 3e 70  lmode || pTok->p
13280 41 72 72 61 79 3d 3d 30 20 29 3b 0a 20 20 20 20  Array==0 );.    
13290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
132a0 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  K ) break;..    
132b0 69 66 28 20 69 73 46 69 72 73 74 20 29 7b 0a 20  if( isFirst ){. 
132c0 20 20 20 20 20 70 4f 75 74 20 3d 20 70 4c 69 73       pOut = pLis
132d0 74 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  t;.      nOut = 
132e0 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28  nList;.      if(
132f0 20 70 43 73 72 2d 3e 65 45 76 61 6c 6d 6f 64 65   pCsr->eEvalmode
13300 3d 3d 46 54 53 33 5f 45 56 41 4c 5f 46 49 4c 54  ==FTS3_EVAL_FILT
13310 45 52 20 26 26 20 70 50 68 72 61 73 65 2d 3e 6e  ER && pPhrase->n
13320 54 6f 6b 65 6e 3e 31 20 29 7b 0a 20 20 20 20 20  Token>1 ){.     
13330 20 20 20 6e 44 6f 63 20 3d 20 66 74 73 33 44 6f     nDoc = fts3Do
13340 63 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69 64 73  clistCountDocids
13350 28 31 2c 20 70 4f 75 74 2c 20 6e 4f 75 74 29 3b  (1, pOut, nOut);
13360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13370 73 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20  sFirst = 0;.    
13380 20 20 69 50 72 65 76 54 6f 6b 20 3d 20 69 54 6f    iPrevTok = iTo
13390 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
133a0 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65      /* Merge the
133b0 20 6e 65 77 20 74 65 72 6d 20 6c 69 73 74 20 61   new term list a
133c0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  nd the current o
133d0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
133e0 63 68 61 72 20 2a 61 4c 65 66 74 2c 20 2a 61 52  char *aLeft, *aR
133f0 69 67 68 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  ight;.      int 
13400 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 3b 0a 20  nLeft, nRight;. 
13410 20 20 20 20 20 69 6e 74 20 6e 44 69 73 74 3b 0a       int nDist;.
13420 20 20 20 20 20 20 69 6e 74 20 6d 74 3b 0a 0a 20        int mt;.. 
13430 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
13440 69 73 20 74 68 65 20 66 69 6e 61 6c 20 74 6f 6b  is the final tok
13450 65 6e 20 6f 66 20 74 68 65 20 70 68 72 61 73 65  en of the phrase
13460 2c 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 73 20  , and positions 
13470 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 2a  were not.      *
13480 2a 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74  * requested by t
13490 68 65 20 63 61 6c 6c 65 72 2c 20 75 73 65 20 4d  he caller, use M
134a0 45 52 47 45 5f 50 48 52 41 53 45 20 69 6e 73 74  ERGE_PHRASE inst
134b0 65 61 64 20 6f 66 20 50 4f 53 5f 50 48 52 41 53  ead of POS_PHRAS
134c0 45 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  E..      ** This
134d0 20 64 72 6f 70 73 20 74 68 65 20 70 6f 73 69 74   drops the posit
134e0 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
134f0 66 72 6f 6d 20 74 68 65 20 6f 75 74 70 75 74 20  from the output 
13500 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
13510 20 20 20 20 20 6d 74 20 3d 20 4d 45 52 47 45 5f       mt = MERGE_
13520 50 4f 53 5f 50 48 52 41 53 45 3b 0a 20 20 20 20  POS_PHRASE;.    
13530 20 20 69 66 28 20 69 69 3d 3d 70 50 68 72 61 73    if( ii==pPhras
13540 65 2d 3e 6e 54 6f 6b 65 6e 2d 31 20 26 26 20 21  e->nToken-1 && !
13550 69 73 52 65 71 50 6f 73 20 29 20 6d 74 20 3d 20  isReqPos ) mt = 
13560 4d 45 52 47 45 5f 50 48 52 41 53 45 3b 0a 0a 20  MERGE_PHRASE;.. 
13570 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50 72       assert( iPr
13580 65 76 54 6f 6b 21 3d 69 54 6f 6b 20 29 3b 0a 20  evTok!=iTok );. 
13590 20 20 20 20 20 69 66 28 20 69 50 72 65 76 54 6f       if( iPrevTo
135a0 6b 3c 69 54 6f 6b 20 29 7b 0a 20 20 20 20 20 20  k<iTok ){.      
135b0 20 20 61 4c 65 66 74 20 3d 20 70 4f 75 74 3b 0a    aLeft = pOut;.
135c0 20 20 20 20 20 20 20 20 6e 4c 65 66 74 20 3d 20          nLeft = 
135d0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 61 52  nOut;.        aR
135e0 69 67 68 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  ight = pList;.  
135f0 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 6e        nRight = n
13600 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 44  List;.        nD
13610 69 73 74 20 3d 20 69 54 6f 6b 2d 69 50 72 65 76  ist = iTok-iPrev
13620 54 6f 6b 3b 0a 20 20 20 20 20 20 20 20 69 50 72  Tok;.        iPr
13630 65 76 54 6f 6b 20 3d 20 69 54 6f 6b 3b 0a 20 20  evTok = iTok;.  
13640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13650 20 20 20 61 52 69 67 68 74 20 3d 20 70 4f 75 74     aRight = pOut
13660 3b 0a 20 20 20 20 20 20 20 20 6e 52 69 67 68 74  ;.        nRight
13670 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
13680 20 61 4c 65 66 74 20 3d 20 70 4c 69 73 74 3b 0a   aLeft = pList;.
13690 20 20 20 20 20 20 20 20 6e 4c 65 66 74 20 3d 20          nLeft = 
136a0 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 6e  nList;.        n
136b0 44 69 73 74 20 3d 20 69 50 72 65 76 54 6f 6b 2d  Dist = iPrevTok-
136c0 69 54 6f 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iTok;.      }.  
136d0 20 20 20 20 70 4f 75 74 20 3d 20 61 52 69 67 68      pOut = aRigh
136e0 74 3b 0a 20 20 20 20 20 20 66 74 73 33 44 6f 63  t;.      fts3Doc
136f0 6c 69 73 74 4d 65 72 67 65 28 0a 20 20 20 20 20  listMerge(.     
13700 20 20 20 20 20 6d 74 2c 20 6e 44 69 73 74 2c 20       mt, nDist, 
13710 30 2c 20 70 4f 75 74 2c 20 26 6e 4f 75 74 2c 20  0, pOut, &nOut, 
13720 61 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20 61 52  aLeft, nLeft, aR
13730 69 67 68 74 2c 20 6e 52 69 67 68 74 2c 20 26 6e  ight, nRight, &n
13740 44 6f 63 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Doc.      );.   
13750 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13760 61 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20  aLeft);.    }.  
13770 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d    assert( nOut==
13780 30 20 7c 7c 20 70 4f 75 74 21 3d 30 20 29 3b 0a  0 || pOut!=0 );.
13790 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
137a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
137b0 69 66 28 20 69 69 21 3d 70 50 68 72 61 73 65 2d  if( ii!=pPhrase-
137c0 3e 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  >nToken ){.     
137d0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65   assert( pCsr->e
137e0 45 76 61 6c 6d 6f 64 65 3d 3d 46 54 53 33 5f 45  Evalmode==FTS3_E
137f0 56 41 4c 5f 46 49 4c 54 45 52 20 26 26 20 69 73  VAL_FILTER && is
13800 52 65 71 50 6f 73 3d 3d 30 20 29 3b 0a 20 20 20  ReqPos==0 );.   
13810 20 20 20 66 74 73 33 44 6f 63 6c 69 73 74 53 74     fts3DoclistSt
13820 72 69 70 50 6f 73 69 74 69 6f 6e 73 28 70 4f 75  ripPositions(pOu
13830 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 7d  t, &nOut);.    }
13840 0a 20 20 20 20 2a 70 61 4f 75 74 20 3d 20 70 4f  .    *paOut = pO
13850 75 74 3b 0a 20 20 20 20 2a 70 6e 4f 75 74 20 3d  ut;.    *pnOut =
13860 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
13870 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13880 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (pOut);.  }.  re
13890 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
138a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
138b0 6d 65 72 67 65 73 20 74 77 6f 20 64 6f 63 6c 69  merges two docli
138c0 73 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  sts according to
138d0 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
138e0 73 20 6f 66 20 61 0a 2a 2a 20 4e 45 41 52 20 6f  s of a.** NEAR o
138f0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 42  perator..**.** B
13900 6f 74 68 20 69 6e 70 75 74 20 64 6f 63 6c 69 73  oth input doclis
13910 74 73 20 6d 75 73 74 20 69 6e 63 6c 75 64 65 20  ts must include 
13920 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  position informa
13930 74 69 6f 6e 2e 20 54 68 65 20 6f 75 74 70 75 74  tion. The output
13940 20 64 6f 63 6c 69 73 74 20 0a 2a 2a 20 69 6e 63   doclist .** inc
13950 6c 75 64 65 73 20 70 6f 73 69 74 69 6f 6e 20 69  ludes position i
13960 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 74 68  nformation if th
13970 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
13980 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
13990 6e 0a 2a 2a 20 69 73 20 4d 45 52 47 45 5f 50 4f  n.** is MERGE_PO
139a0 53 5f 4e 45 41 52 2c 20 6f 72 20 64 6f 65 73 20  S_NEAR, or does 
139b0 6e 6f 74 20 69 66 20 69 74 20 69 73 20 4d 45 52  not if it is MER
139c0 47 45 5f 4e 45 41 52 2e 0a 2a 2f 0a 73 74 61 74  GE_NEAR..*/.stat
139d0 69 63 20 69 6e 74 20 66 74 73 33 4e 65 61 72 4d  ic int fts3NearM
139e0 65 72 67 65 28 0a 20 20 69 6e 74 20 6d 65 72 67  erge(.  int merg
139f0 65 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  etype,          
13a00 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 52 47 45          /* MERGE
13a10 5f 50 4f 53 5f 4e 45 41 52 20 6f 72 20 4d 45 52  _POS_NEAR or MER
13a20 47 45 5f 4e 45 41 52 20 2a 2f 0a 20 20 69 6e 74  GE_NEAR */.  int
13a30 20 6e 4e 65 61 72 2c 20 20 20 20 20 20 20 20 20   nNear,         
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a50 50 61 72 61 6d 65 74 65 72 20 74 6f 20 4e 45 41  Parameter to NEA
13a60 52 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  R operator */.  
13a70 69 6e 74 20 6e 54 6f 6b 65 6e 4c 65 66 74 2c 20  int nTokenLeft, 
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  /* Number of tok
13aa0 65 6e 73 20 69 6e 20 4c 48 53 20 70 68 72 61 73  ens in LHS phras
13ab0 65 20 61 72 67 20 2a 2f 0a 20 20 63 68 61 72 20  e arg */.  char 
13ac0 2a 61 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *aLeft,         
13ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
13ae0 63 6c 69 73 74 20 66 6f 72 20 4c 48 53 20 28 69  clist for LHS (i
13af0 6e 63 6c 2e 20 70 6f 73 69 74 69 6f 6e 73 29 20  ncl. positions) 
13b00 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 20  */.  int nLeft, 
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
13b30 4c 48 53 20 64 6f 63 6c 69 73 74 20 69 6e 20 62  LHS doclist in b
13b40 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ytes */.  int nT
13b50 6f 6b 65 6e 52 69 67 68 74 2c 20 20 20 20 20 20  okenRight,      
13b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 20            /* As 
13b70 6e 54 6f 6b 65 6e 4c 65 66 74 20 2a 2f 0a 20 20  nTokenLeft */.  
13b80 63 68 61 72 20 2a 61 52 69 67 68 74 2c 20 20 20  char *aRight,   
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ba0 2f 2a 20 41 73 20 61 4c 65 66 74 20 2a 2f 0a 20  /* As aLeft */. 
13bb0 20 69 6e 74 20 6e 52 69 67 68 74 2c 20 20 20 20   int nRight,    
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 2f 2a 20 41 73 20 6e 52 69 67 68 74 20 2a 2f   /* As nRight */
13be0 0a 20 20 63 68 61 72 20 2a 2a 70 61 4f 75 74 2c  .  char **paOut,
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
13c10 74 73 20 6f 66 20 6d 65 72 67 65 20 28 6d 61 6c  ts of merge (mal
13c20 6c 6f 63 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20  loced) */.  int 
13c30 2a 70 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  *pnOut          
13c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13c50 55 54 3a 20 53 69 7a 65 64 20 6f 66 20 6f 75 74  UT: Sized of out
13c60 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
13c70 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 20 20  .  char *aOut;  
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
13ca0 77 72 69 74 65 20 6f 75 74 70 75 74 20 64 6f 63  write output doc
13cb0 6c 69 73 74 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  list to */.  int
13cc0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ce0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
13cf0 20 20 61 73 73 65 72 74 28 20 6d 65 72 67 65 74    assert( merget
13d00 79 70 65 3d 3d 4d 45 52 47 45 5f 50 4f 53 5f 4e  ype==MERGE_POS_N
13d10 45 41 52 20 7c 7c 20 4d 45 52 47 45 5f 4e 45 41  EAR || MERGE_NEA
13d20 52 20 29 3b 0a 0a 20 20 61 4f 75 74 20 3d 20 73  R );..  aOut = s
13d30 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4c  qlite3_malloc(nL
13d40 65 66 74 2b 6e 52 69 67 68 74 2b 31 29 3b 0a 20  eft+nRight+1);. 
13d50 20 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a   if( aOut==0 ){.
13d60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13d70 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
13d80 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 63      rc = fts3Doc
13d90 6c 69 73 74 4d 65 72 67 65 28 6d 65 72 67 65 74  listMerge(merget
13da0 79 70 65 2c 20 6e 4e 65 61 72 2b 6e 54 6f 6b 65  ype, nNear+nToke
13db0 6e 52 69 67 68 74 2c 20 6e 4e 65 61 72 2b 6e 54  nRight, nNear+nT
13dc0 6f 6b 65 6e 4c 65 66 74 2c 20 0a 20 20 20 20 20  okenLeft, .     
13dd0 20 61 4f 75 74 2c 20 70 6e 4f 75 74 2c 20 61 4c   aOut, pnOut, aL
13de0 65 66 74 2c 20 6e 4c 65 66 74 2c 20 61 52 69 67  eft, nLeft, aRig
13df0 68 74 2c 20 6e 52 69 67 68 74 2c 20 30 0a 20 20  ht, nRight, 0.  
13e00 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
13e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13e30 28 61 4f 75 74 29 3b 0a 20 20 20 20 20 20 61 4f  (aOut);.      aO
13e40 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
13e50 7d 0a 0a 20 20 2a 70 61 4f 75 74 20 3d 20 61 4f  }..  *paOut = aO
13e60 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
13e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
13e80 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
13e90 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  as part of the p
13ea0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
13eb0 65 20 73 6e 69 70 70 65 74 28 29 20 61 6e 64 0a  e snippet() and.
13ec0 2a 2a 20 6f 66 66 73 65 74 73 28 29 20 66 75 6e  ** offsets() fun
13ed0 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 42 6f  ctions..**.** Bo
13ee0 74 68 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  th pLeft and pRi
13ef0 67 68 74 20 61 72 65 20 65 78 70 72 65 73 73 69  ght are expressi
13f00 6f 6e 20 6e 6f 64 65 73 20 6f 66 20 74 79 70 65  on nodes of type
13f10 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45   FTSQUERY_PHRASE
13f20 2e 20 42 6f 74 68 0a 2a 2a 20 68 61 76 65 20 74  . Both.** have t
13f30 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
13f40 64 6f 63 6c 69 73 74 73 20 28 69 6e 63 6c 75 64  doclists (includ
13f50 69 6e 67 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ing position inf
13f60 6f 72 6d 61 74 69 6f 6e 29 20 6c 6f 61 64 65 64  ormation) loaded
13f70 0a 2a 2a 20 69 6e 20 46 74 73 33 45 78 70 72 2e  .** in Fts3Expr.
13f80 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73  aDoclist/nDoclis
13f90 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
13fa0 20 72 65 6d 6f 76 65 73 20 61 6c 6c 20 65 6e 74   removes all ent
13fb0 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 65 61 63  ries from.** eac
13fc0 68 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 61  h doclist that a
13fd0 72 65 20 6e 6f 74 20 77 69 74 68 69 6e 20 6e 4e  re not within nN
13fe0 65 61 72 20 74 6f 6b 65 6e 73 20 6f 66 20 61 20  ear tokens of a 
13ff0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e  corresponding en
14000 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 74  try.** in the ot
14010 68 65 72 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  her doclist..*/.
14020 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 45  int sqlite3Fts3E
14030 78 70 72 4e 65 61 72 54 72 69 6d 28 46 74 73 33  xprNearTrim(Fts3
14040 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 46 74 73  Expr *pLeft, Fts
14050 33 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 69  3Expr *pRight, i
14060 6e 74 20 6e 4e 65 61 72 29 7b 0a 20 20 69 6e 74  nt nNear){.  int
14070 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14090 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
140a0 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
140b0 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59  >eType==FTSQUERY
140c0 5f 50 48 52 41 53 45 20 29 3b 0a 20 20 61 73 73  _PHRASE );.  ass
140d0 65 72 74 28 20 70 52 69 67 68 74 2d 3e 65 54 79  ert( pRight->eTy
140e0 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52  pe==FTSQUERY_PHR
140f0 41 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ASE );.  assert(
14100 20 70 4c 65 66 74 2d 3e 69 73 4c 6f 61 64 65 64   pLeft->isLoaded
14110 20 26 26 20 70 52 69 67 68 74 2d 3e 69 73 4c 6f   && pRight->isLo
14120 61 64 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 70  aded );..  if( p
14130 4c 65 66 74 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d  Left->aDoclist==
14140 30 20 7c 7c 20 70 52 69 67 68 74 2d 3e 61 44 6f  0 || pRight->aDo
14150 63 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  clist==0 ){.    
14160 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 65  sqlite3_free(pLe
14170 66 74 2d 3e 61 44 6f 63 6c 69 73 74 29 3b 0a 20  ft->aDoclist);. 
14180 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14190 70 52 69 67 68 74 2d 3e 61 44 6f 63 6c 69 73 74  pRight->aDoclist
141a0 29 3b 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 61  );.    pRight->a
141b0 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Doclist = 0;.   
141c0 20 70 4c 65 66 74 2d 3e 61 44 6f 63 6c 69 73 74   pLeft->aDoclist
141d0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 0;.    rc = S
141e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
141f0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 61 4f 75  e{.    char *aOu
14200 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
14210 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69       /* Buffer i
14220 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d  n which to assem
14230 62 6c 65 20 6e 65 77 20 64 6f 63 6c 69 73 74 20  ble new doclist 
14240 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4f 75 74 3b  */.    int nOut;
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14270 62 75 66 66 65 72 20 61 4f 75 74 20 69 6e 20 62  buffer aOut in b
14280 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 72 63 20  ytes */..    rc 
14290 3d 20 66 74 73 33 4e 65 61 72 4d 65 72 67 65 28  = fts3NearMerge(
142a0 4d 45 52 47 45 5f 50 4f 53 5f 4e 45 41 52 2c 20  MERGE_POS_NEAR, 
142b0 6e 4e 65 61 72 2c 20 0a 20 20 20 20 20 20 20 20  nNear, .        
142c0 70 4c 65 66 74 2d 3e 70 50 68 72 61 73 65 2d 3e  pLeft->pPhrase->
142d0 6e 54 6f 6b 65 6e 2c 20 70 4c 65 66 74 2d 3e 61  nToken, pLeft->a
142e0 44 6f 63 6c 69 73 74 2c 20 70 4c 65 66 74 2d 3e  Doclist, pLeft->
142f0 6e 44 6f 63 6c 69 73 74 2c 0a 20 20 20 20 20 20  nDoclist,.      
14300 20 20 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73    pRight->pPhras
14310 65 2d 3e 6e 54 6f 6b 65 6e 2c 20 70 52 69 67 68  e->nToken, pRigh
14320 74 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 69  t->aDoclist, pRi
14330 67 68 74 2d 3e 6e 44 6f 63 6c 69 73 74 2c 0a 20  ght->nDoclist,. 
14340 20 20 20 20 20 20 20 26 61 4f 75 74 2c 20 26 6e         &aOut, &n
14350 4f 75 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Out.    );.    i
14360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14370 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14390 52 69 67 68 74 2d 3e 61 44 6f 63 6c 69 73 74 29  Right->aDoclist)
143a0 3b 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 61 44  ;.    pRight->aD
143b0 6f 63 6c 69 73 74 20 3d 20 61 4f 75 74 3b 0a 20  oclist = aOut;. 
143c0 20 20 20 70 52 69 67 68 74 2d 3e 6e 44 6f 63 6c     pRight->nDocl
143d0 69 73 74 20 3d 20 6e 4f 75 74 3b 0a 0a 20 20 20  ist = nOut;..   
143e0 20 72 63 20 3d 20 66 74 73 33 4e 65 61 72 4d 65   rc = fts3NearMe
143f0 72 67 65 28 4d 45 52 47 45 5f 50 4f 53 5f 4e 45  rge(MERGE_POS_NE
14400 41 52 2c 20 6e 4e 65 61 72 2c 20 0a 20 20 20 20  AR, nNear, .    
14410 20 20 20 20 70 52 69 67 68 74 2d 3e 70 50 68 72      pRight->pPhr
14420 61 73 65 2d 3e 6e 54 6f 6b 65 6e 2c 20 70 52 69  ase->nToken, pRi
14430 67 68 74 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70  ght->aDoclist, p
14440 52 69 67 68 74 2d 3e 6e 44 6f 63 6c 69 73 74 2c  Right->nDoclist,
14450 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e  .        pLeft->
14460 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 2c  pPhrase->nToken,
14470 20 70 4c 65 66 74 2d 3e 61 44 6f 63 6c 69 73 74   pLeft->aDoclist
14480 2c 20 70 4c 65 66 74 2d 3e 6e 44 6f 63 6c 69 73  , pLeft->nDoclis
14490 74 2c 0a 20 20 20 20 20 20 20 20 26 61 4f 75 74  t,.        &aOut
144a0 2c 20 26 6e 4f 75 74 0a 20 20 20 20 29 3b 0a 20  , &nOut.    );. 
144b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
144c0 70 4c 65 66 74 2d 3e 61 44 6f 63 6c 69 73 74 29  pLeft->aDoclist)
144d0 3b 0a 20 20 20 20 70 4c 65 66 74 2d 3e 61 44 6f  ;.    pLeft->aDo
144e0 63 6c 69 73 74 20 3d 20 61 4f 75 74 3b 0a 20 20  clist = aOut;.  
144f0 20 20 70 4c 65 66 74 2d 3e 6e 44 6f 63 6c 69 73    pLeft->nDoclis
14500 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 0a 20 20  t = nOut;.  }.  
14510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
14520 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
14530 20 46 74 73 33 53 65 67 52 65 61 64 65 72 41 72   Fts3SegReaderAr
14540 72 61 79 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  ray for each tok
14550 65 6e 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  en in the expres
14560 73 69 6f 6e 20 70 45 78 70 72 2e 20 0a 2a 2a 20  sion pExpr. .** 
14570 54 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62  The allocated ob
14580 6a 65 63 74 73 20 61 72 65 20 73 74 6f 72 65 64  jects are stored
14590 20 69 6e 20 74 68 65 20 46 74 73 33 50 68 72 61   in the Fts3Phra
145a0 73 65 54 6f 6b 65 6e 2e 70 41 72 72 61 79 20 6d  seToken.pArray m
145b0 65 6d 62 65 72 0a 2a 2a 20 76 61 72 69 61 62 6c  ember.** variabl
145c0 65 73 20 6f 66 20 65 61 63 68 20 74 6f 6b 65 6e  es of each token
145d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
145e0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 78  tatic int fts3Ex
145f0 70 72 41 6c 6c 6f 63 61 74 65 53 65 67 52 65 61  prAllocateSegRea
14600 64 65 72 73 28 0a 20 20 46 74 73 33 43 75 72 73  ders(.  Fts3Curs
14610 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
14620 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
14630 74 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45  table */.  Fts3E
14640 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
14650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
14660 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 72 65 61  pression to crea
14670 74 65 20 73 65 67 2d 72 65 61 64 65 72 73 20 66  te seg-readers f
14680 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  or */.  int *pnE
14690 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
146a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
146b0 4e 75 6d 62 65 72 20 6f 66 20 41 4e 44 27 64 20  Number of AND'd 
146c0 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
146d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
146e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
146f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14700 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
14710 20 70 43 73 72 2d 3e 65 45 76 61 6c 6d 6f 64 65   pCsr->eEvalmode
14720 3d 3d 46 54 53 33 5f 45 56 41 4c 5f 46 49 4c 54  ==FTS3_EVAL_FILT
14730 45 52 20 29 3b 0a 20 20 69 66 28 20 70 6e 45 78  ER );.  if( pnEx
14740 70 72 20 26 26 20 70 45 78 70 72 2d 3e 65 54 79  pr && pExpr->eTy
14750 70 65 21 3d 46 54 53 51 55 45 52 59 5f 41 4e 44  pe!=FTSQUERY_AND
14760 20 29 7b 0a 20 20 20 20 28 2a 70 6e 45 78 70 72   ){.    (*pnExpr
14770 29 2b 2b 3b 0a 20 20 20 20 70 6e 45 78 70 72 20  )++;.    pnExpr 
14780 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 0;.  }..  if( 
14790 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
147a0 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 7b  SQUERY_PHRASE ){
147b0 0a 20 20 20 20 46 74 73 33 50 68 72 61 73 65 20  .    Fts3Phrase 
147c0 2a 70 50 68 72 61 73 65 20 3d 20 70 45 78 70 72  *pPhrase = pExpr
147d0 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 20 20 69  ->pPhrase;.    i
147e0 6e 74 20 69 69 3b 0a 0a 20 20 20 20 66 6f 72 28  nt ii;..    for(
147f0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
14800 5f 4f 4b 20 26 26 20 69 69 3c 70 50 68 72 61 73  _OK && ii<pPhras
14810 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 69 2b 2b 29  e->nToken; ii++)
14820 7b 0a 20 20 20 20 20 20 46 74 73 33 50 68 72 61  {.      Fts3Phra
14830 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 20 3d 20  seToken *pTok = 
14840 26 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e  &pPhrase->aToken
14850 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  [ii];.      if( 
14860 70 54 6f 6b 2d 3e 70 41 72 72 61 79 3d 3d 30 20  pTok->pArray==0 
14870 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14880 66 74 73 33 54 65 72 6d 53 65 67 52 65 61 64 65  fts3TermSegReade
14890 72 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20  rArray(.        
148a0 20 20 20 20 70 43 73 72 2c 20 70 54 6f 6b 2d 3e      pCsr, pTok->
148b0 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 70 54 6f 6b  z, pTok->n, pTok
148c0 2d 3e 69 73 50 72 65 66 69 78 2c 20 26 70 54 6f  ->isPrefix, &pTo
148d0 6b 2d 3e 70 41 72 72 61 79 0a 20 20 20 20 20 20  k->pArray.      
148e0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
148f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20   }.  }else{ .   
14900 20 72 63 20 3d 20 66 74 73 33 45 78 70 72 41 6c   rc = fts3ExprAl
14910 6c 6f 63 61 74 65 53 65 67 52 65 61 64 65 72 73  locateSegReaders
14920 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c  (pCsr, pExpr->pL
14930 65 66 74 2c 20 70 6e 45 78 70 72 29 3b 0a 20 20  eft, pnExpr);.  
14940 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14950 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14960 3d 20 66 74 73 33 45 78 70 72 41 6c 6c 6f 63 61  = fts3ExprAlloca
14970 74 65 53 65 67 52 65 61 64 65 72 73 28 70 43 73  teSegReaders(pCs
14980 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
14990 2c 20 70 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d  , pnExpr);.    }
149a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
149b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
149c0 74 68 65 20 46 74 73 33 53 65 67 52 65 61 64 65  the Fts3SegReade
149d0 72 41 72 72 61 79 20 6f 62 6a 65 63 74 73 20 61  rArray objects a
149e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
149f0 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
14a00 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
14a10 45 78 70 72 2e 20 49 6e 20 6f 74 68 65 72 20 77  Expr. In other w
14a20 6f 72 64 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ords, this funct
14a30 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 72 65  ion frees the re
14a40 73 6f 75 72 63 65 73 0a 2a 2a 20 61 6c 6c 6f 63  sources.** alloc
14a50 61 74 65 64 20 62 79 20 66 74 73 33 45 78 70 72  ated by fts3Expr
14a60 41 6c 6c 6f 63 61 74 65 53 65 67 52 65 61 64 65  AllocateSegReade
14a70 72 73 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rs()..*/.static 
14a80 76 6f 69 64 20 66 74 73 33 45 78 70 72 46 72 65  void fts3ExprFre
14a90 65 53 65 67 52 65 61 64 65 72 73 28 46 74 73 33  eSegReaders(Fts3
14aa0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
14ab0 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
14ac0 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68   Fts3Phrase *pPh
14ad0 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70 50  rase = pExpr->pP
14ae0 68 72 61 73 65 3b 0a 20 20 20 20 69 66 28 20 70  hrase;.    if( p
14af0 50 68 72 61 73 65 20 29 7b 0a 20 20 20 20 20 20  Phrase ){.      
14b00 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20 20 66 6f  int kk;.      fo
14b10 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 50 68 72 61  r(kk=0; kk<pPhra
14b20 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 6b 6b 2b 2b  se->nToken; kk++
14b30 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53  ){.        fts3S
14b40 65 67 52 65 61 64 65 72 41 72 72 61 79 46 72 65  egReaderArrayFre
14b50 65 28 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  e(pPhrase->aToke
14b60 6e 5b 6b 6b 5d 2e 70 41 72 72 61 79 29 3b 0a 20  n[kk].pArray);. 
14b70 20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e         pPhrase->
14b80 61 54 6f 6b 65 6e 5b 6b 6b 5d 2e 70 41 72 72 61  aToken[kk].pArra
14b90 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
14ba0 20 20 20 7d 0a 20 20 20 20 66 74 73 33 45 78 70     }.    fts3Exp
14bb0 72 46 72 65 65 53 65 67 52 65 61 64 65 72 73 28  rFreeSegReaders(
14bc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
14bd0 20 20 20 66 74 73 33 45 78 70 72 46 72 65 65 53     fts3ExprFreeS
14be0 65 67 52 65 61 64 65 72 73 28 70 45 78 70 72 2d  egReaders(pExpr-
14bf0 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  >pRight);.  }.}.
14c00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
14c10 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73  e sum of the cos
14c20 74 73 20 6f 66 20 61 6c 6c 20 74 6f 6b 65 6e 73  ts of all tokens
14c30 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
14c40 6f 6e 20 70 45 78 70 72 2e 20 54 68 69 73 0a 2a  on pExpr. This.*
14c50 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  * function must 
14c60 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
14c70 46 74 73 33 53 65 67 52 65 61 64 65 72 41 72 72  Fts3SegReaderArr
14c80 61 79 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ays have been al
14c90 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 61  located.** for a
14ca0 6c 6c 20 74 6f 6b 65 6e 73 20 75 73 69 6e 67 20  ll tokens using 
14cb0 66 74 73 33 45 78 70 72 41 6c 6c 6f 63 61 74 65  fts3ExprAllocate
14cc0 53 65 67 52 65 61 64 65 72 73 28 29 2e 0a 2a 2f  SegReaders()..*/
14cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
14ce0 45 78 70 72 43 6f 73 74 28 46 74 73 33 45 78 70  ExprCost(Fts3Exp
14cf0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
14d00 20 6e 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   nCost;         
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14d20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
14d30 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65 54 79    if( pExpr->eTy
14d40 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52  pe==FTSQUERY_PHR
14d50 41 53 45 20 29 7b 0a 20 20 20 20 46 74 73 33 50  ASE ){.    Fts3P
14d60 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d  hrase *pPhrase =
14d70 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b   pExpr->pPhrase;
14d80 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
14d90 20 6e 43 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20   nCost = 0;.    
14da0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 68  for(ii=0; ii<pPh
14db0 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 69  rase->nToken; ii
14dc0 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53  ++){.      Fts3S
14dd0 65 67 52 65 61 64 65 72 41 72 72 61 79 20 2a 70  egReaderArray *p
14de0 41 72 72 61 79 20 3d 20 70 50 68 72 61 73 65 2d  Array = pPhrase-
14df0 3e 61 54 6f 6b 65 6e 5b 69 69 5d 2e 70 41 72 72  >aToken[ii].pArr
14e00 61 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ay;.      if( pA
14e10 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20 20  rray ){.        
14e20 6e 43 6f 73 74 20 2b 3d 20 70 50 68 72 61 73 65  nCost += pPhrase
14e30 2d 3e 61 54 6f 6b 65 6e 5b 69 69 5d 2e 70 41 72  ->aToken[ii].pAr
14e40 72 61 79 2d 3e 6e 43 6f 73 74 3b 0a 20 20 20 20  ray->nCost;.    
14e50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
14e60 65 7b 0a 20 20 20 20 6e 43 6f 73 74 20 3d 20 66  e{.    nCost = f
14e70 74 73 33 45 78 70 72 43 6f 73 74 28 70 45 78 70  ts3ExprCost(pExp
14e80 72 2d 3e 70 4c 65 66 74 29 20 2b 20 66 74 73 33  r->pLeft) + fts3
14e90 45 78 70 72 43 6f 73 74 28 70 45 78 70 72 2d 3e  ExprCost(pExpr->
14ea0 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  pRight);.  }.  r
14eb0 65 74 75 72 6e 20 6e 43 6f 73 74 3b 0a 7d 0a 0a  eturn nCost;.}..
14ec0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
14ed0 69 6e 67 20 69 73 20 61 20 68 65 6c 70 65 72 20  ing is a helper 
14ee0 66 75 6e 63 74 69 6f 6e 20 28 61 6e 64 20 74 79  function (and ty
14ef0 70 65 29 20 66 6f 72 20 66 74 73 33 45 76 61 6c  pe) for fts3Eval
14f00 45 78 70 72 28 29 2e 20 49 74 0a 2a 2a 20 6d 75  Expr(). It.** mu
14f10 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  st be called aft
14f20 65 72 20 46 74 73 33 53 65 67 52 65 61 64 65 72  er Fts3SegReader
14f30 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  s have been allo
14f40 63 61 74 65 64 20 66 6f 72 20 65 76 65 72 79 20  cated for every 
14f50 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
14f60 65 78 70 72 65 73 73 69 6f 6e 2e 20 53 65 65 20  expression. See 
14f70 74 68 65 20 63 6f 6e 74 65 78 74 20 69 74 20 69  the context it i
14f80 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 69 6e  s called from in
14f90 20 66 74 73 33 45 76 61 6c 45 78 70 72 28 29 0a   fts3EvalExpr().
14fa0 2a 2a 20 66 6f 72 20 66 75 72 74 68 65 72 20 65  ** for further e
14fb0 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 74  xplanation..*/.t
14fc0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78  ypedef struct Ex
14fd0 70 72 41 6e 64 43 6f 73 74 20 45 78 70 72 41 6e  prAndCost ExprAn
14fe0 64 43 6f 73 74 3b 0a 73 74 72 75 63 74 20 45 78  dCost;.struct Ex
14ff0 70 72 41 6e 64 43 6f 73 74 20 7b 0a 20 20 46 74  prAndCost {.  Ft
15000 73 33 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20  s3Expr *pExpr;. 
15010 20 69 6e 74 20 6e 43 6f 73 74 3b 0a 7d 3b 0a 73   int nCost;.};.s
15020 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45  tatic void fts3E
15030 78 70 72 41 73 73 69 67 6e 43 6f 73 74 73 28 0a  xprAssignCosts(.
15040 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70    Fts3Expr *pExp
15050 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
15060 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
15070 74 6f 20 63 72 65 61 74 65 20 73 65 67 2d 72 65  to create seg-re
15080 61 64 65 72 73 20 66 6f 72 20 2a 2f 0a 20 20 45  aders for */.  E
15090 78 70 72 41 6e 64 43 6f 73 74 20 2a 2a 70 70 45  xprAndCost **ppE
150a0 78 70 72 43 6f 73 74 20 20 20 20 20 20 20 20 2f  xprCost        /
150b0 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 74 6f 20  * OUT: Write to 
150c0 2a 70 70 45 78 70 72 43 6f 73 74 20 2a 2f 0a 29  *ppExprCost */.)
150d0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65  {.  if( pExpr->e
150e0 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 41  Type==FTSQUERY_A
150f0 4e 44 20 29 7b 0a 20 20 20 20 66 74 73 33 45 78  ND ){.    fts3Ex
15100 70 72 41 73 73 69 67 6e 43 6f 73 74 73 28 70 45  prAssignCosts(pE
15110 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 70 45 78  xpr->pLeft, ppEx
15120 70 72 43 6f 73 74 29 3b 0a 20 20 20 20 66 74 73  prCost);.    fts
15130 33 45 78 70 72 41 73 73 69 67 6e 43 6f 73 74 73  3ExprAssignCosts
15140 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
15150 70 70 45 78 70 72 43 6f 73 74 29 3b 0a 20 20 7d  ppExprCost);.  }
15160 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 70 45 78  else{.    (*ppEx
15170 70 72 43 6f 73 74 29 2d 3e 70 45 78 70 72 20 3d  prCost)->pExpr =
15180 20 70 45 78 70 72 3b 0a 20 20 20 20 28 2a 70 70   pExpr;.    (*pp
15190 45 78 70 72 43 6f 73 74 29 2d 3e 6e 43 6f 73 74  ExprCost)->nCost
151a0 20 3d 20 66 74 73 33 45 78 70 72 43 6f 73 74 28   = fts3ExprCost(
151b0 70 45 78 70 72 29 3b 0a 20 20 20 20 28 2a 70 70  pExpr);.    (*pp
151c0 45 78 70 72 43 6f 73 74 29 2b 2b 3b 0a 20 20 7d  ExprCost)++;.  }
151d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61  .}../*.** Evalua
151e0 74 65 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  te the full-text
151f0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
15200 72 20 61 67 61 69 6e 73 74 20 46 54 53 33 20 74  r against FTS3 t
15210 61 62 6c 65 20 70 54 61 62 2e 20 53 74 6f 72 65  able pTab. Store
15220 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 69 6e  .** the resultin
15230 67 20 64 6f 63 6c 69 73 74 20 69 6e 20 2a 70 61  g doclist in *pa
15240 4f 75 74 20 61 6e 64 20 2a 70 6e 4f 75 74 2e 20  Out and *pnOut. 
15250 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6c  This routine mal
15260 6c 6f 63 73 20 66 6f 72 0a 2a 2a 20 74 68 65 20  locs for.** the 
15270 73 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20  space needed to 
15280 73 74 6f 72 65 20 74 68 65 20 6f 75 74 70 75 74  store the output
15290 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  . The caller is 
152a0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
152b0 2a 2a 20 66 72 65 65 69 6e 67 20 74 68 65 20 73  ** freeing the s
152c0 70 61 63 65 20 77 68 65 6e 20 69 74 20 68 61 73  pace when it has
152d0 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 0a 2a 2a   finished..**.**
152e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
152f0 73 20 63 61 6c 6c 65 64 20 69 6e 20 74 77 6f 20  s called in two 
15300 64 69 73 74 69 6e 63 74 20 63 6f 6e 74 65 78 74  distinct context
15310 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 46 72 6f  s:.**.**   * Fro
15320 6d 20 77 69 74 68 69 6e 20 74 68 65 20 76 69 72  m within the vir
15330 74 75 61 6c 20 74 61 62 6c 65 20 78 46 69 6c 74  tual table xFilt
15340 65 72 28 29 20 6d 65 74 68 6f 64 2e 20 49 6e 20  er() method. In 
15350 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 0a 2a  this case, the.*
15360 2a 20 20 20 20 20 6f 75 74 70 75 74 20 64 6f 63  *     output doc
15370 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e  list contains en
15380 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 72 6f  tries for all ro
15390 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ws in the table,
153a0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 20 20 20   based on.**    
153b0 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d 20   data read from 
153c0 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
153d0 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  dex..**.**     I
153e0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 66 20  n this case, if 
153f0 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73  the query expres
15400 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  sion contains on
15410 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 73  e or more tokens
15420 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 61 72   that .**     ar
15430 65 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 20 74  e very common, t
15440 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
15450 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 63 6f 6e   doclist may con
15460 74 61 69 6e 20 61 20 73 75 70 65 72 73 65 74 20  tain a superset 
15470 6f 66 20 0a 2a 2a 20 20 20 20 20 74 68 65 20 64  of .**     the d
15480 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 61 63  ocuments that ac
15490 74 75 61 6c 6c 79 20 6d 61 74 63 68 20 74 68 65  tually match the
154a0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
154b0 2a 2a 20 20 20 2a 20 46 72 6f 6d 20 77 69 74 68  **   * From with
154c0 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  in the virtual t
154d0 61 62 6c 65 20 78 4e 65 78 74 28 29 20 6d 65 74  able xNext() met
154e0 68 6f 64 2e 20 54 68 69 73 20 63 61 6c 6c 20 69  hod. This call i
154f0 73 20 6f 6e 6c 79 20 6d 61 64 65 0a 2a 2a 20 20  s only made.**  
15500 20 20 20 69 66 20 74 68 65 20 63 61 6c 6c 20 66     if the call f
15510 72 6f 6d 20 77 69 74 68 69 6e 20 78 46 69 6c 74  rom within xFilt
15520 65 72 28 29 20 66 6f 75 6e 64 20 74 68 61 74 20  er() found that 
15530 74 68 65 72 65 20 77 65 72 65 20 76 65 72 79 20  there were very 
15540 63 6f 6d 6d 6f 6e 20 0a 2a 2a 20 20 20 20 20 74  common .**     t
15550 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 71 75 65  okens in the que
15560 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ry expression an
15570 64 20 64 69 64 20 72 65 74 75 72 6e 20 61 20 73  d did return a s
15580 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 0a  uperset of the .
15590 2a 2a 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20  **     matching 
155a0 64 6f 63 75 6d 65 6e 74 73 2e 20 49 6e 20 74 68  documents. In th
155b0 69 73 20 63 61 73 65 20 74 68 65 20 72 65 74 75  is case the retu
155c0 72 6e 65 64 20 64 6f 63 6c 69 73 74 20 63 6f 6e  rned doclist con
155d0 74 61 69 6e 73 20 6f 6e 6c 79 0a 2a 2a 20 20 20  tains only.**   
155e0 20 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 63    entries that c
155f0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
15600 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
15610 74 68 65 20 74 61 62 6c 65 2e 20 49 6e 73 74 65  the table. Inste
15620 61 64 20 6f 66 0a 2a 2a 20 20 20 20 20 72 65 61  ad of.**     rea
15630 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 6f  ding the data fo
15640 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 66 72 6f  r each token fro
15650 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  m the full-text 
15660 69 6e 64 65 78 2c 20 74 68 65 20 64 61 74 61 20  index, the data 
15670 69 73 0a 2a 2a 20 20 20 20 20 61 6c 72 65 61 64  is.**     alread
15680 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 2d 6d  y available in-m
15690 65 6d 6f 72 79 20 69 6e 20 74 68 65 20 46 74 73  emory in the Fts
156a0 33 50 68 72 61 73 65 54 6f 6b 65 6e 2e 70 44 65  3PhraseToken.pDe
156b0 66 65 72 72 65 64 20 73 74 72 75 63 74 75 72 65  ferred structure
156c0 73 2e 0a 2a 2a 20 20 20 20 20 53 65 65 20 66 74  s..**     See ft
156d0 73 33 45 76 61 6c 44 65 66 65 72 72 65 64 28 29  s3EvalDeferred()
156e0 20 66 6f 72 20 68 6f 77 20 69 74 20 67 65 74 73   for how it gets
156f0 20 74 68 65 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e   there..**.** In
15700 20 74 68 65 20 66 69 72 73 74 20 63 61 73 65 20   the first case 
15710 61 62 6f 76 65 2c 20 46 74 73 33 43 75 72 73 6f  above, Fts3Curso
15720 72 2e 64 6f 44 65 66 65 72 72 65 64 3d 3d 30 2e  r.doDeferred==0.
15730 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28   In the second (
15740 69 66 20 69 74 20 69 73 0a 2a 2a 20 72 65 71 75  if it is.** requ
15750 69 72 65 64 29 20 46 74 73 33 43 75 72 73 6f 72  ired) Fts3Cursor
15760 2e 64 6f 44 65 66 65 72 72 65 64 3d 3d 31 2e 0a  .doDeferred==1..
15770 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
15780 69 74 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ite invokes the 
15790 73 6e 69 70 70 65 74 28 29 2c 20 6f 66 66 73 65  snippet(), offse
157a0 74 73 28 29 20 6f 72 20 6d 61 74 63 68 69 6e 66  ts() or matchinf
157b0 6f 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  o() function.** 
157c0 61 73 20 70 61 72 74 20 6f 66 20 61 20 53 45 4c  as part of a SEL
157d0 45 43 54 20 6f 6e 20 61 6e 20 46 54 53 33 20 74  ECT on an FTS3 t
157e0 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  able, this funct
157f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ion is called on
15800 20 65 61 63 68 0a 2a 2a 20 69 6e 64 69 76 69 64   each.** individ
15810 75 61 6c 20 70 68 72 61 73 65 20 65 78 70 72 65  ual phrase expre
15820 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65  ssion in the que
15830 72 79 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  ry. If there wer
15840 65 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 20 74 6f  e very common to
15850 6b 65 6e 73 0a 2a 2a 20 66 6f 75 6e 64 20 69 6e  kens.** found in
15860 20 74 68 65 20 78 46 69 6c 74 65 72 28 29 20 63   the xFilter() c
15870 61 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  all, then this f
15880 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15890 64 20 6f 6e 63 65 20 66 6f 72 20 70 68 72 61 73  d once for phras
158a0 65 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 72 6f  e.** for each ro
158b0 77 20 76 69 73 69 74 65 64 2c 20 61 6e 64 20 74  w visited, and t
158c0 68 65 20 72 65 74 75 72 6e 65 64 20 64 6f 63 6c  he returned docl
158d0 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  ist contains ent
158e0 72 69 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ries for the.** 
158f0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 6e 6c 79  current row only
15900 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
15910 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 76 65  there were no ve
15920 72 79 20 63 6f 6d 6d 6f 6e 20 74 6f 6b 65 6e 73  ry common tokens
15930 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  , then this.** f
15940 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15950 64 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20  d once only for 
15960 65 61 63 68 20 70 68 72 61 73 65 20 69 6e 20 74  each phrase in t
15970 68 65 20 71 75 65 72 79 20 61 6e 64 20 74 68 65  he query and the
15980 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 64 6f 63   returned.** doc
15990 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e  list contains en
159a0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 72 6f  tries for all ro
159b0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ws of the table.
159c0 0a 2a 2a 0a 2a 2a 20 46 74 73 33 43 75 72 73 6f  .**.** Fts3Curso
159d0 72 2e 64 6f 44 65 66 65 72 72 65 64 3d 3d 31 20  r.doDeferred==1 
159e0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
159f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  on is called on 
15a00 70 68 72 61 73 65 73 20 61 73 20 61 0a 2a 2a 20  phrases as a.** 
15a10 72 65 73 75 6c 74 20 6f 66 20 61 20 73 6e 69 70  result of a snip
15a20 70 65 74 28 29 2c 20 6f 66 66 73 65 74 73 28 29  pet(), offsets()
15a30 20 6f 72 20 6d 61 74 63 68 69 6e 66 6f 28 29 20   or matchinfo() 
15a40 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  invocation..*/.s
15a50 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76  tatic int fts3Ev
15a60 61 6c 45 78 70 72 28 0a 20 20 46 74 73 33 43 75  alExpr(.  Fts3Cu
15a70 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
15a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
15a90 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
15aa0 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  r handle */.  Ft
15ab0 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s3Expr *pExpr,  
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ad0 20 50 61 72 73 65 64 20 66 74 73 33 20 65 78 70   Parsed fts3 exp
15ae0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  ression */.  cha
15af0 72 20 2a 2a 70 61 4f 75 74 2c 20 20 20 20 20 20  r **paOut,      
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15b10 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
15b20 6d 61 6c 6c 6f 63 27 64 20 72 65 73 75 6c 74 20  malloc'd result 
15b30 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
15b40 2a 70 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  *pnOut,         
15b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15b60 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66  UT: Size of buff
15b70 65 72 20 61 74 20 2a 70 61 4f 75 74 20 2a 2f 0a  er at *paOut */.
15b80 20 20 69 6e 74 20 69 73 52 65 71 50 6f 73 20 20    int isReqPos  
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 2f 2a 20 52 65 71 75 69 72 65 20 70 6f 73    /* Require pos
15bb0 69 74 69 6f 6e 73 20 69 6e 20 6f 75 74 70 75 74  itions in output
15bc0 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
15bd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15be0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
15bf0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
15c00 2f 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  /..  /* Zero the
15c10 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
15c20 72 73 2e 20 2a 2f 0a 20 20 2a 70 61 4f 75 74 20  rs. */.  *paOut 
15c30 3d 20 30 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20  = 0;.  *pnOut = 
15c40 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 20  0;..  if( pExpr 
15c50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15c60 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
15c70 51 55 45 52 59 5f 4e 45 41 52 20 20 20 7c 7c 20  QUERY_NEAR   || 
15c80 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
15c90 53 51 55 45 52 59 5f 4f 52 20 20 20 20 20 0a 20  SQUERY_OR     . 
15ca0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
15cb0 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
15cc0 59 5f 41 4e 44 20 20 20 20 7c 7c 20 70 45 78 70  Y_AND    || pExp
15cd0 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
15ce0 52 59 5f 4e 4f 54 0a 20 20 20 20 20 20 20 20 20  RY_NOT.         
15cf0 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  || pExpr->eType=
15d00 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45  =FTSQUERY_PHRASE
15d10 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
15d20 72 74 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65  rt( pExpr->eType
15d30 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  ==FTSQUERY_PHRAS
15d40 45 20 7c 7c 20 69 73 52 65 71 50 6f 73 3d 3d 30  E || isReqPos==0
15d50 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 45 78   );..    if( pEx
15d60 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55  pr->eType==FTSQU
15d70 45 52 59 5f 50 48 52 41 53 45 20 29 7b 0a 20 20  ERY_PHRASE ){.  
15d80 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 68 72      rc = fts3Phr
15d90 61 73 65 53 65 6c 65 63 74 28 70 2c 20 70 45 78  aseSelect(p, pEx
15da0 70 72 2d 3e 70 50 68 72 61 73 65 2c 0a 20 20 20  pr->pPhrase,.   
15db0 20 20 20 20 20 20 20 69 73 52 65 71 50 6f 73 20         isReqPos 
15dc0 7c 7c 20 28 70 45 78 70 72 2d 3e 70 50 61 72 65  || (pExpr->pPare
15dd0 6e 74 20 26 26 20 70 45 78 70 72 2d 3e 70 50 61  nt && pExpr->pPa
15de0 72 65 6e 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53  rent->eType==FTS
15df0 51 55 45 52 59 5f 4e 45 41 52 29 2c 0a 20 20 20  QUERY_NEAR),.   
15e00 20 20 20 20 20 20 20 70 61 4f 75 74 2c 20 70 6e         paOut, pn
15e10 4f 75 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Out.      );.   
15e20 20 20 20 66 74 73 33 45 78 70 72 46 72 65 65 53     fts3ExprFreeS
15e30 65 67 52 65 61 64 65 72 73 28 70 45 78 70 72 29  egReaders(pExpr)
15e40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15e50 70 2d 3e 65 45 76 61 6c 6d 6f 64 65 3d 3d 46 54  p->eEvalmode==FT
15e60 53 33 5f 45 56 41 4c 5f 46 49 4c 54 45 52 20 26  S3_EVAL_FILTER &
15e70 26 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d  & pExpr->eType==
15e80 46 54 53 51 55 45 52 59 5f 41 4e 44 20 29 7b 0a  FTSQUERY_AND ){.
15e90 20 20 20 20 20 20 45 78 70 72 41 6e 64 43 6f 73        ExprAndCos
15ea0 74 20 2a 61 45 78 70 72 20 3d 20 30 3b 20 20 20  t *aExpr = 0;   
15eb0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 41 4e    /* Array of AN
15ec0 44 27 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20  D'd expressions 
15ed0 61 6e 64 20 63 6f 73 74 73 20 2a 2f 0a 20 20 20  and costs */.   
15ee0 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 30     int nExpr = 0
15ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15f00 2a 20 53 69 7a 65 20 6f 66 20 61 45 78 70 72 5b  * Size of aExpr[
15f10 5d 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  ] */.      char 
15f20 2a 61 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *aRet = 0;      
15f30 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73         /* Doclis
15f40 74 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 63  t to return to c
15f50 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  aller */.      i
15f60 6e 74 20 6e 52 65 74 20 3d 20 30 3b 20 20 20 20  nt nRet = 0;    
15f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
15f80 6e 67 74 68 20 6f 66 20 61 52 65 74 5b 5d 20 69  ngth of aRet[] i
15f90 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
15fa0 20 69 6e 74 20 6e 44 6f 63 20 3d 20 30 78 37 46   int nDoc = 0x7F
15fb0 46 46 46 46 46 46 3b 0a 0a 20 20 20 20 20 20 61  FFFFFF;..      a
15fc0 73 73 65 72 74 28 20 21 69 73 52 65 71 50 6f 73  ssert( !isReqPos
15fd0 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   );..      rc = 
15fe0 66 74 73 33 45 78 70 72 41 6c 6c 6f 63 61 74 65  fts3ExprAllocate
15ff0 53 65 67 52 65 61 64 65 72 73 28 70 2c 20 70 45  SegReaders(p, pE
16000 78 70 72 2c 20 26 6e 45 78 70 72 29 3b 0a 20 20  xpr, &nExpr);.  
16010 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16030 20 61 73 73 65 72 74 28 20 6e 45 78 70 72 3e 31   assert( nExpr>1
16040 20 29 3b 0a 20 20 20 20 20 20 20 20 61 45 78 70   );.        aExp
16050 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
16060 6f 63 28 73 69 7a 65 6f 66 28 45 78 70 72 41 6e  oc(sizeof(ExprAn
16070 64 43 6f 73 74 29 20 2a 20 6e 45 78 70 72 29 3b  dCost) * nExpr);
16080 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 45  .        if( !aE
16090 78 70 72 20 29 20 72 63 20 3d 20 53 51 4c 49 54  xpr ) rc = SQLIT
160a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
160b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
160c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
160d0 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
160f0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
16100 20 74 68 72 6f 75 67 68 20 65 78 70 72 65 73 73   through express
16110 69 6f 6e 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ions */..       
16120 20 66 74 73 33 45 78 70 72 41 73 73 69 67 6e 43   fts3ExprAssignC
16130 6f 73 74 73 28 70 45 78 70 72 2c 20 26 61 45 78  osts(pExpr, &aEx
16140 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 45 78  pr);.        aEx
16150 70 72 20 2d 3d 20 6e 45 78 70 72 3b 0a 20 20 20  pr -= nExpr;.   
16160 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
16170 69 3c 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  i<nExpr; ii++){.
16180 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
16190 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  aNew;.          
161a0 69 6e 74 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  int nNew;.      
161b0 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
161c0 20 20 20 20 20 20 45 78 70 72 41 6e 64 43 6f 73        ExprAndCos
161d0 74 20 2a 70 42 65 73 74 20 3d 20 30 3b 0a 20 20  t *pBest = 0;.  
161e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
161f0 6a 3d 30 3b 20 6a 6a 3c 6e 45 78 70 72 3b 20 6a  j=0; jj<nExpr; j
16200 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
16210 20 20 45 78 70 72 41 6e 64 43 6f 73 74 20 2a 70    ExprAndCost *p
16220 43 61 6e 64 20 3d 20 26 61 45 78 70 72 5b 6a 6a  Cand = &aExpr[jj
16230 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
16240 66 28 20 70 43 61 6e 64 2d 3e 70 45 78 70 72 20  f( pCand->pExpr 
16250 26 26 20 28 70 42 65 73 74 3d 3d 30 20 7c 7c 20  && (pBest==0 || 
16260 70 43 61 6e 64 2d 3e 6e 43 6f 73 74 3c 70 42 65  pCand->nCost<pBe
16270 73 74 2d 3e 6e 43 6f 73 74 29 20 29 7b 0a 20 20  st->nCost) ){.  
16280 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
16290 74 20 3d 20 70 43 61 6e 64 3b 0a 20 20 20 20 20  t = pCand;.     
162a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
162b0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
162c0 20 20 69 66 28 20 70 42 65 73 74 2d 3e 6e 43 6f    if( pBest->nCo
162d0 73 74 3e 6e 44 6f 63 20 29 7b 0a 20 20 20 20 20  st>nDoc ){.     
162e0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
162f0 44 65 66 65 72 45 78 70 72 65 73 73 69 6f 6e 28  DeferExpression(
16300 70 2c 20 70 2d 3e 70 45 78 70 72 29 3b 0a 20 20  p, p->pExpr);.  
16310 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
16320 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
16330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
16340 20 3d 20 66 74 73 33 45 76 61 6c 45 78 70 72 28   = fts3EvalExpr(
16350 70 2c 20 70 42 65 73 74 2d 3e 70 45 78 70 72 2c  p, pBest->pExpr,
16360 20 26 61 4e 65 77 2c 20 26 6e 4e 65 77 2c 20 30   &aNew, &nNew, 0
16370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
16380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16390 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
163a0 20 20 20 20 20 20 70 42 65 73 74 2d 3e 70 45 78        pBest->pEx
163b0 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
163c0 20 20 20 20 69 66 28 20 69 69 3d 3d 30 20 29 7b      if( ii==0 ){
163d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
163e0 52 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Ret = aNew;.    
163f0 20 20 20 20 20 20 20 20 20 20 6e 52 65 74 20 3d            nRet =
16400 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   nNew;.         
16410 20 20 20 20 20 6e 44 6f 63 20 3d 20 66 74 73 33       nDoc = fts3
16420 44 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69  DoclistCountDoci
16430 64 73 28 30 2c 20 61 52 65 74 2c 20 6e 52 65 74  ds(0, aRet, nRet
16440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
16450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16460 20 20 20 20 66 74 73 33 44 6f 63 6c 69 73 74 4d      fts3DoclistM
16470 65 72 67 65 28 0a 20 20 20 20 20 20 20 20 20 20  erge(.          
16480 20 20 20 20 20 20 20 20 4d 45 52 47 45 5f 41 4e          MERGE_AN
16490 44 2c 20 30 2c 20 30 2c 20 61 52 65 74 2c 20 26  D, 0, 0, aRet, &
164a0 6e 52 65 74 2c 20 61 52 65 74 2c 20 6e 52 65 74  nRet, aRet, nRet
164b0 2c 20 61 4e 65 77 2c 20 6e 4e 65 77 2c 20 26 6e  , aNew, nNew, &n
164c0 44 6f 63 0a 20 20 20 20 20 20 20 20 20 20 20 20  Doc.            
164d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20    );.           
164e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
164f0 61 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  aNew);.         
16500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16520 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
16530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16540 20 20 20 20 20 20 20 2a 70 61 4f 75 74 20 3d 20         *paOut = 
16550 61 52 65 74 3b 0a 20 20 20 20 20 20 20 20 2a 70  aRet;.        *p
16560 6e 4f 75 74 20 3d 20 6e 52 65 74 3b 0a 20 20 20  nOut = nRet;.   
16570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16580 20 20 61 73 73 65 72 74 28 20 2a 70 61 4f 75 74    assert( *paOut
16590 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
165a0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 52 65 74  qlite3_free(aRet
165b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
165c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 45   sqlite3_free(aE
165d0 78 70 72 29 3b 0a 20 20 20 20 20 20 66 74 73 33  xpr);.      fts3
165e0 45 78 70 72 46 72 65 65 53 65 67 52 65 61 64 65  ExprFreeSegReade
165f0 72 73 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  rs(pExpr);..    
16600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
16610 72 20 2a 61 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *aLeft;.      
16620 63 68 61 72 20 2a 61 52 69 67 68 74 3b 0a 20 20  char *aRight;.  
16630 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 3b 0a 20      int nLeft;. 
16640 20 20 20 20 20 69 6e 74 20 6e 52 69 67 68 74 3b       int nRight;
16650 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
16660 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
16670 53 51 55 45 52 59 5f 4e 45 41 52 20 0a 20 20 20  SQUERY_NEAR .   
16680 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
16690 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
166a0 59 5f 4f 52 0a 20 20 20 20 20 20 20 20 20 20 20  Y_OR.           
166b0 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  || pExpr->eType=
166c0 3d 46 54 53 51 55 45 52 59 5f 4e 4f 54 0a 20 20  =FTSQUERY_NOT.  
166d0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
166e0 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55  pr->eType==FTSQU
166f0 45 52 59 5f 41 4e 44 20 26 26 20 70 2d 3e 65 45  ERY_AND && p->eE
16700 76 61 6c 6d 6f 64 65 3d 3d 46 54 53 33 5f 45 56  valmode==FTS3_EV
16710 41 4c 5f 4e 45 58 54 29 0a 20 20 20 20 20 20 29  AL_NEXT).      )
16720 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
16730 28 72 63 20 3d 20 66 74 73 33 45 76 61 6c 45 78  (rc = fts3EvalEx
16740 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69  pr(p, pExpr->pRi
16750 67 68 74 2c 20 26 61 52 69 67 68 74 2c 20 26 6e  ght, &aRight, &n
16760 52 69 67 68 74 2c 20 69 73 52 65 71 50 6f 73 29  Right, isReqPos)
16770 29 0a 20 20 20 20 20 20 20 26 26 20 30 3d 3d 28  ).       && 0==(
16780 72 63 20 3d 20 66 74 73 33 45 76 61 6c 45 78 70  rc = fts3EvalExp
16790 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  r(p, pExpr->pLef
167a0 74 2c 20 26 61 4c 65 66 74 2c 20 26 6e 4c 65 66  t, &aLeft, &nLef
167b0 74 2c 20 69 73 52 65 71 50 6f 73 29 29 0a 20 20  t, isReqPos)).  
167c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
167d0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54  witch( pExpr->eT
167e0 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ype ){.         
167f0 20 63 61 73 65 20 46 54 53 51 55 45 52 59 5f 4e   case FTSQUERY_N
16800 45 41 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  EAR: {.         
16810 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 4c 65     Fts3Expr *pLe
16820 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
16830 46 74 73 33 45 78 70 72 20 2a 70 52 69 67 68 74  Fts3Expr *pRight
16840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
16850 74 20 6d 65 72 67 65 74 79 70 65 20 3d 20 4d 45  t mergetype = ME
16860 52 47 45 5f 4e 45 41 52 3b 0a 20 20 20 20 20 20  RGE_NEAR;.      
16870 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16880 3e 70 50 61 72 65 6e 74 20 26 26 20 70 45 78 70  >pParent && pExp
16890 72 2d 3e 70 50 61 72 65 6e 74 2d 3e 65 54 79 70  r->pParent->eTyp
168a0 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52  e==FTSQUERY_NEAR
168b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
168c0 20 20 6d 65 72 67 65 74 79 70 65 20 3d 20 4d 45    mergetype = ME
168d0 52 47 45 5f 50 4f 53 5f 4e 45 41 52 3b 0a 20 20  RGE_POS_NEAR;.  
168e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
168f0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
16900 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
16910 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
16920 20 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46   pLeft->eType==F
16930 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29 7b 20  TSQUERY_NEAR ){ 
16940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
16950 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 52 69 67  Left=pLeft->pRig
16960 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
16970 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
16980 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
16990 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
169a0 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
169b0 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
169c0 59 5f 50 48 52 41 53 45 20 29 3b 0a 20 20 20 20  Y_PHRASE );.    
169d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
169e0 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54  pLeft->eType==FT
169f0 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 3b  SQUERY_PHRASE );
16a00 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ..            rc
16a10 20 3d 20 66 74 73 33 4e 65 61 72 4d 65 72 67 65   = fts3NearMerge
16a20 28 6d 65 72 67 65 74 79 70 65 2c 20 70 45 78 70  (mergetype, pExp
16a30 72 2d 3e 6e 4e 65 61 72 2c 20 0a 20 20 20 20 20  r->nNear, .     
16a40 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
16a50 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65  ->pPhrase->nToke
16a60 6e 2c 20 61 4c 65 66 74 2c 20 6e 4c 65 66 74 2c  n, aLeft, nLeft,
16a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a80 20 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65   pRight->pPhrase
16a90 2d 3e 6e 54 6f 6b 65 6e 2c 20 61 52 69 67 68 74  ->nToken, aRight
16aa0 2c 20 6e 52 69 67 68 74 2c 0a 20 20 20 20 20 20  , nRight,.      
16ab0 20 20 20 20 20 20 20 20 20 20 70 61 4f 75 74 2c            paOut,
16ac0 20 70 6e 4f 75 74 0a 20 20 20 20 20 20 20 20 20   pnOut.         
16ad0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
16ae0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
16af0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
16b00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16b10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
16b20 20 63 61 73 65 20 46 54 53 51 55 45 52 59 5f 4f   case FTSQUERY_O
16b30 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
16b40 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
16b50 75 66 66 65 72 20 66 6f 72 20 74 68 65 20 6f 75  uffer for the ou
16b60 74 70 75 74 2e 20 54 68 65 20 6d 61 78 69 6d 75  tput. The maximu
16b70 6d 20 73 69 7a 65 20 69 73 20 74 68 65 0a 20 20  m size is the.  
16b80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 75 6d            ** sum
16b90 20 6f 66 20 74 68 65 20 73 69 7a 65 73 20 6f 66   of the sizes of
16ba0 20 74 68 65 20 74 77 6f 20 69 6e 70 75 74 20 62   the two input b
16bb0 75 66 66 65 72 73 2e 20 54 68 65 20 2b 31 20 74  uffers. The +1 t
16bc0 65 72 6d 20 69 73 0a 20 20 20 20 20 20 20 20 20  erm is.         
16bd0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 61 20     ** so that a 
16be0 62 75 66 66 65 72 20 6f 66 20 7a 65 72 6f 20 62  buffer of zero b
16bf0 79 74 65 73 20 69 73 20 6e 65 76 65 72 20 61 6c  ytes is never al
16c00 6c 6f 63 61 74 65 64 20 2d 20 74 68 69 73 20 63  located - this c
16c10 61 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  an.            *
16c20 2a 20 63 61 75 73 65 20 66 74 73 33 44 6f 63 6c  * cause fts3Docl
16c30 69 73 74 4d 65 72 67 65 28 29 20 74 6f 20 69 6e  istMerge() to in
16c40 63 6f 72 72 65 63 74 6c 79 20 72 65 74 75 72 6e  correctly return
16c50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20   SQLITE_NOMEM.. 
16c60 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
16c70 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
16c80 61 42 75 66 66 65 72 20 3d 20 73 71 6c 69 74 65  aBuffer = sqlite
16c90 33 5f 6d 61 6c 6c 6f 63 28 6e 52 69 67 68 74 2b  3_malloc(nRight+
16ca0 6e 4c 65 66 74 2b 31 29 3b 0a 20 20 20 20 20 20  nLeft+1);.      
16cb0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44        rc = fts3D
16cc0 6f 63 6c 69 73 74 4d 65 72 67 65 28 4d 45 52 47  oclistMerge(MERG
16cd0 45 5f 4f 52 2c 20 30 2c 20 30 2c 20 61 42 75 66  E_OR, 0, 0, aBuf
16ce0 66 65 72 2c 20 70 6e 4f 75 74 2c 0a 20 20 20 20  fer, pnOut,.    
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 61 4c 65 66              aLef
16d00 74 2c 20 6e 4c 65 66 74 2c 20 61 52 69 67 68 74  t, nLeft, aRight
16d10 2c 20 6e 52 69 67 68 74 2c 20 30 0a 20 20 20 20  , nRight, 0.    
16d20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
16d30 20 20 20 20 20 20 20 2a 70 61 4f 75 74 20 3d 20         *paOut = 
16d40 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20  aBuffer;.       
16d50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16d60 65 28 61 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  e(aLeft);.      
16d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16d80 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
16d90 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
16da0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
16db0 74 28 20 46 54 53 51 55 45 52 59 5f 4e 4f 54 3d  t( FTSQUERY_NOT=
16dc0 3d 4d 45 52 47 45 5f 4e 4f 54 20 26 26 20 46 54  =MERGE_NOT && FT
16dd0 53 51 55 45 52 59 5f 41 4e 44 3d 3d 4d 45 52 47  SQUERY_AND==MERG
16de0 45 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 20  E_AND );.       
16df0 20 20 20 20 20 66 74 73 33 44 6f 63 6c 69 73 74       fts3Doclist
16e00 4d 65 72 67 65 28 70 45 78 70 72 2d 3e 65 54 79  Merge(pExpr->eTy
16e10 70 65 2c 20 30 2c 20 30 2c 20 61 4c 65 66 74 2c  pe, 0, 0, aLeft,
16e20 20 70 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20   pnOut,.        
16e30 20 20 20 20 20 20 20 20 61 4c 65 66 74 2c 20 6e          aLeft, n
16e40 4c 65 66 74 2c 20 61 52 69 67 68 74 2c 20 6e 52  Left, aRight, nR
16e50 69 67 68 74 2c 20 30 0a 20 20 20 20 20 20 20 20  ight, 0.        
16e60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
16e70 20 20 20 2a 70 61 4f 75 74 20 3d 20 61 4c 65 66     *paOut = aLef
16e80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  t;.            b
16e90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
16ea0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
16eb0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16ec0 33 5f 66 72 65 65 28 61 52 69 67 68 74 29 3b 0a  3_free(aRight);.
16ed0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
16ee0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
16ef0 4f 4b 20 7c 7c 20 2a 70 61 4f 75 74 3d 3d 30 20  OK || *paOut==0 
16f00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16f10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
16f20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
16f30 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65   from within xNe
16f40 78 74 28 29 20 66 6f 72 20 65 61 63 68 20 72 6f  xt() for each ro
16f50 77 20 76 69 73 69 74 65 64 20 62 79 0a 2a 2a 20  w visited by.** 
16f60 61 6e 20 46 54 53 33 20 71 75 65 72 79 2e 20 49  an FTS3 query. I
16f70 66 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  f evaluating the
16f80 20 46 54 53 33 20 71 75 65 72 79 20 65 78 70 72   FTS3 query expr
16f90 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 78 46  ession within xF
16fa0 69 6c 74 65 72 28 29 0a 2a 2a 20 77 61 73 20 61  ilter().** was a
16fb0 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
16fc0 20 74 68 65 20 65 78 61 63 74 20 73 65 74 20 6f   the exact set o
16fd0 66 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 73 2c  f matching rows,
16fe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
16ff0 65 74 73 0a 2a 2a 20 2a 70 62 52 65 73 20 74 6f  ets.** *pbRes to
17000 20 74 72 75 65 20 61 6e 64 20 72 65 74 75 72 6e   true and return
17010 73 20 53 51 4c 49 54 45 5f 49 4f 20 69 6d 6d 65  s SQLITE_IO imme
17020 64 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  diately..**.** O
17030 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76 61  therwise, if eva
17040 6c 75 61 74 69 6e 67 20 74 68 65 20 71 75 65 72  luating the quer
17050 79 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  y expression wit
17060 68 69 6e 20 78 46 69 6c 74 65 72 28 29 20 72 65  hin xFilter() re
17070 74 75 72 6e 65 64 20 61 0a 2a 2a 20 73 75 70 65  turned a.** supe
17080 72 73 65 74 20 6f 66 20 74 68 65 20 6d 61 74 63  rset of the matc
17090 68 69 6e 67 20 64 6f 63 75 6d 65 6e 74 73 20 69  hing documents i
170a0 6e 73 74 65 61 64 20 6f 66 20 61 6e 20 65 78 61  nstead of an exa
170b0 63 74 20 73 65 74 20 28 74 68 69 73 20 68 61 70  ct set (this hap
170c0 70 65 6e 73 0a 2a 2a 20 77 68 65 6e 20 74 68 65  pens.** when the
170d0 20 71 75 65 72 79 20 69 6e 63 6c 75 64 65 73 20   query includes 
170e0 76 65 72 79 20 63 6f 6d 6d 6f 6e 20 74 6f 6b 65  very common toke
170f0 6e 73 20 61 6e 64 20 69 74 20 69 73 20 64 65 65  ns and it is dee
17100 6d 65 64 20 74 6f 6f 20 65 78 70 65 6e 73 69 76  med too expensiv
17110 65 20 74 6f 0a 2a 2a 20 6c 6f 61 64 20 74 68 65  e to.** load the
17120 69 72 20 64 6f 63 6c 69 73 74 73 20 66 72 6f 6d  ir doclists from
17130 20 64 69 73 6b 29 2c 20 74 68 69 73 20 66 75 6e   disk), this fun
17140 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
17150 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 2a  he current row.*
17160 2a 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6d 61  * really does ma
17170 74 63 68 20 74 68 65 20 46 54 53 33 20 71 75 65  tch the FTS3 que
17180 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ry..**.** If an 
17190 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
171a0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
171b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
171c0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
171d0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
171e0 6e 65 64 20 61 6e 64 20 2a 70 62 52 65 73 20 69  ned and *pbRes i
171f0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
17200 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
17210 20 6d 61 74 63 68 65 73 20 74 68 65 0a 2a 2a 20   matches the.** 
17220 46 54 53 33 20 71 75 65 72 79 20 28 61 6e 64 20  FTS3 query (and 
17230 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64  should be includ
17240 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
17250 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  s returned to SQ
17260 4c 69 74 65 29 2c 20 6f 72 0a 2a 2a 20 66 61 6c  Lite), or.** fal
17270 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
17280 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
17290 45 76 61 6c 44 65 66 65 72 72 65 64 28 0a 20 20  EvalDeferred(.  
172a0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
172b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
172c0 2f 2a 20 46 54 53 33 20 63 75 72 73 6f 72 20 70  /* FTS3 cursor p
172d0 6f 69 6e 74 69 6e 67 20 61 74 20 72 6f 77 20 74  ointing at row t
172e0 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
172f0 2a 70 62 52 65 73 20 20 20 20 20 20 20 20 20 20  *pbRes          
17300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17310 55 54 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20  UT: Set to true 
17320 69 66 20 72 6f 77 20 69 73 20 61 20 6d 61 74 63  if row is a matc
17330 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  h */.){.  int rc
17340 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17350 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72  if( pCsr->pDefer
17360 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  red==0 ){.    *p
17370 62 52 65 73 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  bRes = 1;.  }els
17380 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  e{.    rc = fts3
17390 43 75 72 73 6f 72 53 65 65 6b 28 30 2c 20 70 43  CursorSeek(0, pC
173a0 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  sr);.    if( rc=
173b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
173c0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 46      sqlite3Fts3F
173d0 72 65 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69  reeDeferredDocli
173e0 73 74 73 28 70 43 73 72 29 3b 0a 20 20 20 20 20  sts(pCsr);.     
173f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
17400 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f  3CacheDeferredDo
17410 63 6c 69 73 74 73 28 70 43 73 72 29 3b 0a 20 20  clists(pCsr);.  
17420 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
17430 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17440 20 20 20 63 68 61 72 20 2a 61 20 3d 20 30 3b 0a     char *a = 0;.
17450 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
17460 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
17470 45 76 61 6c 45 78 70 72 28 70 43 73 72 2c 20 70  EvalExpr(pCsr, p
17480 43 73 72 2d 3e 70 45 78 70 72 2c 20 26 61 2c 20  Csr->pExpr, &a, 
17490 26 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  &n, 0);.      as
174a0 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
174b0 20 20 20 20 2a 70 62 52 65 73 20 3d 20 28 6e 3e      *pbRes = (n>
174c0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
174d0 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20 7d  3_free(a);.    }
174e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
174f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
17500 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
17510 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
17520 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
17530 61 62 6c 65 20 74 68 61 74 0a 2a 2a 20 6d 61 74  able that.** mat
17540 63 68 65 73 20 74 68 65 20 73 65 61 72 63 68 20  ches the search 
17550 63 72 69 74 65 72 69 61 2e 20 20 46 6f 72 20 61  criteria.  For a
17560 20 4d 41 54 43 48 20 73 65 61 72 63 68 2c 20 74   MATCH search, t
17570 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74  his will be.** t
17580 68 65 20 6e 65 78 74 20 72 6f 77 20 74 68 61 74  he next row that
17590 20 6d 61 74 63 68 65 73 2e 20 46 6f 72 20 61 20   matches. For a 
175a0 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 2c  full-table scan,
175b0 20 74 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a   this will be.**
175c0 20 73 69 6d 70 6c 79 20 74 68 65 20 6e 65 78 74   simply the next
175d0 20 72 6f 77 20 69 6e 20 74 68 65 20 25 5f 63 6f   row in the %_co
175e0 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 20 46 6f  ntent table.  Fo
175f0 72 20 61 20 64 6f 63 69 64 20 6c 6f 6f 6b 75 70  r a docid lookup
17600 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
17610 65 20 73 69 6d 70 6c 79 20 73 65 74 73 20 74 68  e simply sets th
17620 65 20 45 4f 46 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  e EOF flag..**.*
17630 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
17640 4f 4b 20 69 66 20 6e 6f 74 68 69 6e 67 20 67 6f  OK if nothing go
17650 65 73 20 77 72 6f 6e 67 2e 20 20 53 51 4c 49 54  es wrong.  SQLIT
17660 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17670 0a 2a 2a 20 65 76 65 6e 20 69 66 20 77 65 20 72  .** even if we r
17680 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  each end-of-file
17690 2e 20 20 54 68 65 20 66 74 73 33 45 6f 66 4d 65  .  The fts3EofMe
176a0 74 68 6f 64 28 29 20 77 69 6c 6c 20 62 65 20 63  thod() will be c
176b0 61 6c 6c 65 64 0a 2a 2a 20 73 75 62 73 65 71 75  alled.** subsequ
176c0 65 6e 74 6c 79 20 74 6f 20 64 65 74 65 72 6d 69  ently to determi
176d0 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
176e0 74 20 61 6e 20 45 4f 46 20 77 61 73 20 68 69 74  t an EOF was hit
176f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17700 66 74 73 33 4e 65 78 74 4d 65 74 68 6f 64 28 73  fts3NextMethod(s
17710 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
17720 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20  or *pCursor){.  
17730 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  int res;.  int r
17740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
17750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17760 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
17770 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts3Cursor *pCsr 
17780 3d 20 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29  = (Fts3Cursor *)
17790 70 43 75 72 73 6f 72 3b 0a 0a 20 20 70 43 73 72  pCursor;..  pCsr
177a0 2d 3e 65 45 76 61 6c 6d 6f 64 65 20 3d 20 46 54  ->eEvalmode = FT
177b0 53 33 5f 45 56 41 4c 5f 4e 45 58 54 3b 0a 20 20  S3_EVAL_NEXT;.  
177c0 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 43 73  do {.    if( pCs
177d0 72 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20 29  r->aDoclist==0 )
177e0 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
177f0 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f  TE_ROW!=sqlite3_
17800 73 74 65 70 28 70 43 73 72 2d 3e 70 53 74 6d 74  step(pCsr->pStmt
17810 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73  ) ){.        pCs
17820 72 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20  r->isEof = 1;.  
17830 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17840 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70  e3_reset(pCsr->p
17850 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
17860 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17870 20 20 20 20 70 43 73 72 2d 3e 69 50 72 65 76 49      pCsr->iPrevI
17880 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
17890 6d 6e 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e 70  mn_int64(pCsr->p
178a0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Stmt, 0);.    }e
178b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
178c0 43 73 72 2d 3e 70 4e 65 78 74 49 64 3e 3d 26 70  Csr->pNextId>=&p
178d0 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 43  Csr->aDoclist[pC
178e0 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 20 29 7b  sr->nDoclist] ){
178f0 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69  .        pCsr->i
17900 73 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  sEof = 1;.      
17910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
17920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
17930 65 73 65 74 28 70 43 73 72 2d 3e 70 53 74 6d 74  eset(pCsr->pStmt
17940 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  );.      fts3Get
17950 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 43 73  DeltaVarint(&pCs
17960 72 2d 3e 70 4e 65 78 74 49 64 2c 20 26 70 43 73  r->pNextId, &pCs
17970 72 2d 3e 69 50 72 65 76 49 64 29 3b 0a 20 20 20  r->iPrevId);.   
17980 20 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69     pCsr->isRequi
17990 72 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20 20 20  reSeek = 1;.    
179a0 20 20 70 43 73 72 2d 3e 69 73 4d 61 74 63 68 69    pCsr->isMatchi
179b0 6e 66 6f 4e 65 65 64 65 64 20 3d 20 31 3b 0a 20  nfoNeeded = 1;. 
179c0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 53     }.  }while( S
179d0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
179e0 66 74 73 33 45 76 61 6c 44 65 66 65 72 72 65 64  fts3EvalDeferred
179f0 28 70 43 73 72 2c 20 26 72 65 73 29 29 20 26 26  (pCsr, &res)) &&
17a00 20 72 65 73 3d 3d 30 20 29 3b 0a 0a 20 20 72 65   res==0 );..  re
17a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17a20 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 46  * This is the xF
17a30 69 6c 74 65 72 20 69 6e 74 65 72 66 61 63 65 20  ilter interface 
17a40 66 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20  for the virtual 
17a50 74 61 62 6c 65 2e 20 20 53 65 65 0a 2a 2a 20 74  table.  See.** t
17a60 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
17a70 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20   xFilter method 
17a80 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
17a90 72 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  r additional.** 
17aa0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
17ab0 2a 2a 20 49 66 20 69 64 78 4e 75 6d 3d 3d 46 54  ** If idxNum==FT
17ac0 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45 41 52  S3_FULLSCAN_SEAR
17ad0 43 48 20 74 68 65 6e 20 64 6f 20 61 20 66 75 6c  CH then do a ful
17ae0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 61 67 61  l table scan aga
17af0 69 6e 73 74 0a 2a 2a 20 74 68 65 20 25 5f 63 6f  inst.** the %_co
17b00 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a  ntent table..**.
17b10 2a 2a 20 49 66 20 69 64 78 4e 75 6d 3d 3d 46 54  ** If idxNum==FT
17b20 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20  S3_DOCID_SEARCH 
17b30 74 68 65 6e 20 64 6f 20 61 20 64 6f 63 69 64 20  then do a docid 
17b40 6c 6f 6f 6b 75 70 20 66 6f 72 20 61 20 73 69 6e  lookup for a sin
17b50 67 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  gle entry.** in 
17b60 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
17b70 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 64  ble..**.** If id
17b80 78 4e 75 6d 3e 3d 46 54 53 33 5f 46 55 4c 4c 54  xNum>=FTS3_FULLT
17b90 45 58 54 5f 53 45 41 52 43 48 20 74 68 65 6e 20  EXT_SEARCH then 
17ba0 75 73 65 20 74 68 65 20 66 75 6c 6c 20 74 65 78  use the full tex
17bb0 74 20 69 6e 64 65 78 2e 20 20 54 68 65 0a 2a 2a  t index.  The.**
17bc0 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c   column on the l
17bd0 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
17be0 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61   the MATCH opera
17bf0 74 6f 72 20 69 73 20 63 6f 6c 75 6d 6e 0a 2a 2a  tor is column.**
17c00 20 6e 75 6d 62 65 72 20 69 64 78 4e 75 6d 2d 46   number idxNum-F
17c10 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41  TS3_FULLTEXT_SEA
17c20 52 43 48 2c 20 30 20 69 6e 64 65 78 65 64 2e 20  RCH, 0 indexed. 
17c30 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65 20   argv[0] is the 
17c40 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69  right-hand.** si
17c50 64 65 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20  de of the MATCH 
17c60 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
17c70 74 69 63 20 69 6e 74 20 66 74 73 33 46 69 6c 74  tic int fts3Filt
17c80 65 72 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  erMethod(.  sqli
17c90 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
17ca0 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 54  *pCursor,   /* T
17cb0 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  he cursor used f
17cc0 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
17cd0 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 20  .  int idxNum,  
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 2f 2a 20 53 74 72 61 74 65 67 79 20 69     /* Strategy i
17d00 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
17d10 63 68 61 72 20 2a 69 64 78 53 74 72 2c 20 20 20  char *idxStr,   
17d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
17d30 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  sed */.  int nVa
17d40 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
17d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17d60 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
17d70 6e 20 61 70 56 61 6c 20 2a 2f 0a 20 20 73 71 6c  n apVal */.  sql
17d80 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
17d90 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
17da0 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68  Arguments for th
17db0 65 20 69 6e 64 65 78 69 6e 67 20 73 63 68 65 6d  e indexing schem
17dc0 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
17dd0 63 68 61 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20  char *azSql[] = 
17de0 7b 0a 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20  {.    "SELECT * 
17df0 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74  FROM %Q.'%q_cont
17e00 65 6e 74 27 20 57 48 45 52 45 20 64 6f 63 69 64  ent' WHERE docid
17e10 20 3d 20 3f 22 2c 20 2f 2a 20 6e 6f 6e 2d 66 75   = ?", /* non-fu
17e20 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 2a 2f  ll-table-scan */
17e30 0a 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46  .    "SELECT * F
17e40 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  ROM %Q.'%q_conte
17e50 6e 74 27 22 2c 20 20 20 20 20 20 20 20 20 20 20  nt'",           
17e60 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 2d 74 61        /* full-ta
17e70 62 6c 65 2d 73 63 61 6e 20 2a 2f 0a 20 20 7d 3b  ble-scan */.  };
17e80 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ea0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
17eb0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  e */.  char *zSq
17ec0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
17ed0 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
17ee0 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
17ef0 61 63 63 65 73 73 20 25 5f 63 6f 6e 74 65 6e 74  access %_content
17f00 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
17f10 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
17f20 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  *)pCursor->pVtab
17f30 3b 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  ;.  Fts3Cursor *
17f40 70 43 73 72 20 3d 20 28 46 74 73 33 43 75 72 73  pCsr = (Fts3Curs
17f50 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a 20  or *)pCursor;.. 
17f60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17f70 52 28 69 64 78 53 74 72 29 3b 0a 20 20 55 4e 55  R(idxStr);.  UNU
17f80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 56  SED_PARAMETER(nV
17f90 61 6c 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  al);..  assert( 
17fa0 69 64 78 4e 75 6d 3e 3d 30 20 26 26 20 69 64 78  idxNum>=0 && idx
17fb0 4e 75 6d 3c 3d 28 46 54 53 33 5f 46 55 4c 4c 54  Num<=(FTS3_FULLT
17fc0 45 58 54 5f 53 45 41 52 43 48 2b 70 2d 3e 6e 43  EXT_SEARCH+p->nC
17fd0 6f 6c 75 6d 6e 29 20 29 3b 0a 20 20 61 73 73 65  olumn) );.  asse
17fe0 72 74 28 20 6e 56 61 6c 3d 3d 30 20 7c 7c 20 6e  rt( nVal==0 || n
17ff0 56 61 6c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Val==1 );.  asse
18000 72 74 28 20 28 6e 56 61 6c 3d 3d 30 29 3d 3d 28  rt( (nVal==0)==(
18010 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 46 55 4c  idxNum==FTS3_FUL
18020 4c 53 43 41 4e 5f 53 45 41 52 43 48 29 20 29 3b  LSCAN_SEARCH) );
18030 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
18040 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a 20  egments==0 );.. 
18050 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65 20   /* In case the 
18060 63 75 72 73 6f 72 20 68 61 73 20 62 65 65 6e 20  cursor has been 
18070 75 73 65 64 20 62 65 66 6f 72 65 2c 20 63 6c 65  used before, cle
18080 61 72 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  ar it now. */.  
18090 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
180a0 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20  (pCsr->pStmt);. 
180b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
180c0 73 72 2d 3e 61 44 6f 63 6c 69 73 74 29 3b 0a 20  sr->aDoclist);. 
180d0 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
180e0 46 72 65 65 28 70 43 73 72 2d 3e 70 45 78 70 72  Free(pCsr->pExpr
180f0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 43 75  );.  memset(&pCu
18100 72 73 6f 72 5b 31 5d 2c 20 30 2c 20 73 69 7a 65  rsor[1], 0, size
18110 6f 66 28 46 74 73 33 43 75 72 73 6f 72 29 2d 73  of(Fts3Cursor)-s
18120 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  izeof(sqlite3_vt
18130 61 62 5f 63 75 72 73 6f 72 29 29 3b 0a 0a 20 20  ab_cursor));..  
18140 69 66 28 20 69 64 78 4e 75 6d 21 3d 46 54 53 33  if( idxNum!=FTS3
18150 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20 26 26  _DOCID_SEARCH &&
18160 20 69 64 78 4e 75 6d 21 3d 46 54 53 33 5f 46 55   idxNum!=FTS3_FU
18170 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 29 7b  LLSCAN_SEARCH ){
18180 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
18190 69 64 78 4e 75 6d 2d 46 54 53 33 5f 46 55 4c 4c  idxNum-FTS3_FULL
181a0 54 45 58 54 5f 53 45 41 52 43 48 3b 0a 20 20 20  TEXT_SEARCH;.   
181b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75   const char *zQu
181c0 65 72 79 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ery = (const cha
181d0 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
181e0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
181f0 3b 0a 0a 20 20 20 20 69 66 28 20 7a 51 75 65 72  ;..    if( zQuer
18200 79 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f  y==0 && sqlite3_
18210 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
18220 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])!=SQLITE_NUL
18230 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  L ){.      retur
18240 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18250 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
18260 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 50  sqlite3Fts3ExprP
18270 61 72 73 65 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a  arse(p->pTokeniz
18280 65 72 2c 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 2c  er, p->azColumn,
18290 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 0a 20 20   p->nColumn, .  
182a0 20 20 20 20 20 20 69 43 6f 6c 2c 20 7a 51 75 65        iCol, zQue
182b0 72 79 2c 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70  ry, -1, &pCsr->p
182c0 45 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 20 20  Expr.    );.    
182d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
182e0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
182f0 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
18300 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 61  ){.        p->ba
18310 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
18320 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61  ite3_mprintf("ma
18330 6c 66 6f 72 6d 65 64 20 4d 41 54 43 48 20 65 78  lformed MATCH ex
18340 70 72 65 73 73 69 6f 6e 3a 20 5b 25 73 5d 22 2c  pression: [%s]",
18350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18370 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
18380 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
18390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
183a0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   }..    rc = sql
183b0 69 74 65 33 46 74 73 33 52 65 61 64 4c 6f 63 6b  ite3Fts3ReadLock
183c0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
183d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
183e0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 72 63 20  urn rc;..    rc 
183f0 3d 20 66 74 73 33 45 76 61 6c 45 78 70 72 28 70  = fts3EvalExpr(p
18400 43 73 72 2c 20 70 43 73 72 2d 3e 70 45 78 70 72  Csr, pCsr->pExpr
18410 2c 20 26 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73  , &pCsr->aDoclis
18420 74 2c 20 26 70 43 73 72 2d 3e 6e 44 6f 63 6c 69  t, &pCsr->nDocli
18430 73 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  st, 0);.    sqli
18440 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
18450 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 69 66 28  lose(p);.    if(
18460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18470 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18480 70 43 73 72 2d 3e 70 4e 65 78 74 49 64 20 3d 20  pCsr->pNextId = 
18490 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 3b 0a  pCsr->aDoclist;.
184a0 20 20 20 20 70 43 73 72 2d 3e 69 50 72 65 76 49      pCsr->iPrevI
184b0 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 0;.  }..  /*
184c0 20 43 6f 6d 70 69 6c 65 20 61 20 53 45 4c 45 43   Compile a SELEC
184d0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
184e0 74 68 69 73 20 63 75 72 73 6f 72 2e 20 46 6f 72  this cursor. For
184f0 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63   a full-table-sc
18500 61 6e 2c 20 74 68 65 0a 20 20 2a 2a 20 73 74 61  an, the.  ** sta
18510 74 65 6d 65 6e 74 20 6c 6f 6f 70 73 20 74 68 72  tement loops thr
18520 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
18530 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
18540 61 62 6c 65 2e 20 46 6f 72 20 61 0a 20 20 2a 2a  able. For a.  **
18550 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
18560 20 6f 72 20 64 6f 63 69 64 20 6c 6f 6f 6b 75 70   or docid lookup
18570 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  , the statement 
18580 72 65 74 72 69 65 76 65 73 20 61 20 73 69 6e 67  retrieves a sing
18590 6c 65 0a 20 20 2a 2a 20 72 6f 77 20 62 79 20 64  le.  ** row by d
185a0 6f 63 69 64 2e 0a 20 20 2a 2f 0a 20 20 7a 53 71  ocid..  */.  zSq
185b0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
185c0 6e 74 66 28 61 7a 53 71 6c 5b 69 64 78 4e 75 6d  ntf(azSql[idxNum
185d0 3d 3d 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f  ==FTS3_FULLSCAN_
185e0 53 45 41 52 43 48 5d 2c 20 70 2d 3e 7a 44 62 2c  SEARCH], p->zDb,
185f0 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66   p->zName);.  if
18600 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72  ( !zSql ){.    r
18610 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18620 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
18630 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
18640 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
18650 71 6c 2c 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70  ql, -1, &pCsr->p
18660 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
18670 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
18680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
18690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 64 78  SQLITE_OK && idx
186a0 4e 75 6d 3d 3d 46 54 53 33 5f 44 4f 43 49 44 5f  Num==FTS3_DOCID_
186b0 53 45 41 52 43 48 20 29 7b 0a 20 20 20 20 72 63  SEARCH ){.    rc
186c0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
186d0 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 53 74 6d  value(pCsr->pStm
186e0 74 2c 20 31 2c 20 61 70 56 61 6c 5b 30 5d 29 3b  t, 1, apVal[0]);
186f0 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 65 53 65  .  }.  pCsr->eSe
18700 61 72 63 68 20 3d 20 28 69 31 36 29 69 64 78 4e  arch = (i16)idxN
18710 75 6d 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  um;..  if( rc!=S
18720 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
18730 6e 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 66  n rc;.  return f
18740 74 73 33 4e 65 78 74 4d 65 74 68 6f 64 28 70 43  ts3NextMethod(pC
18750 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ursor);.}../* .*
18760 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
18770 6f 66 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  of method of the
18780 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
18790 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
187a0 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  s .** routine to
187b0 20 66 69 6e 64 20 6f 75 74 20 69 66 20 69 74 20   find out if it 
187c0 68 61 73 20 72 65 61 63 68 65 64 20 74 68 65 20  has reached the 
187d0 65 6e 64 20 6f 66 20 61 20 72 65 73 75 6c 74 20  end of a result 
187e0 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
187f0 6e 74 20 66 74 73 33 45 6f 66 4d 65 74 68 6f 64  nt fts3EofMethod
18800 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
18810 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a  rsor *pCursor){.
18820 20 20 72 65 74 75 72 6e 20 28 28 46 74 73 33 43    return ((Fts3C
18830 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 29  ursor *)pCursor)
18840 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a 2f 2a 20 0a  ->isEof;.}../* .
18850 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
18860 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 20 54 68  Rowid method. Th
18870 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63 61  e SQLite core ca
18880 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
18890 20 74 6f 0a 2a 2a 20 72 65 74 72 69 65 76 65 20   to.** retrieve 
188a0 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  the rowid for th
188b0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
188c0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
188d0 20 66 74 73 33 0a 2a 2a 20 65 78 70 6f 73 65 73   fts3.** exposes
188e0 20 25 5f 63 6f 6e 74 65 6e 74 2e 64 6f 63 69 64   %_content.docid
188f0 20 61 73 20 74 68 65 20 72 6f 77 69 64 20 66 6f   as the rowid fo
18900 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  r the virtual ta
18910 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 77 69  ble. The.** rowi
18920 64 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  d should be writ
18930 74 65 6e 20 74 6f 20 2a 70 52 6f 77 69 64 2e 0a  ten to *pRowid..
18940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
18950 73 33 52 6f 77 69 64 4d 65 74 68 6f 64 28 73 71  s3RowidMethod(sq
18960 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
18970 72 20 2a 70 43 75 72 73 6f 72 2c 20 73 71 6c 69  r *pCursor, sqli
18980 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64  te_int64 *pRowid
18990 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  ){.  Fts3Cursor 
189a0 2a 70 43 73 72 20 3d 20 28 46 74 73 33 43 75 72  *pCsr = (Fts3Cur
189b0 73 6f 72 20 2a 29 20 70 43 75 72 73 6f 72 3b 0a  sor *) pCursor;.
189c0 20 20 69 66 28 20 70 43 73 72 2d 3e 61 44 6f 63    if( pCsr->aDoc
189d0 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 52 6f  list ){.    *pRo
189e0 77 69 64 20 3d 20 70 43 73 72 2d 3e 69 50 72 65  wid = pCsr->iPre
189f0 76 49 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  vId;.  }else{.  
18a00 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
18a10 20 72 75 6e 73 20 69 66 20 74 68 65 20 71 75 65   runs if the que
18a20 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ry is implemente
18a30 64 20 75 73 69 6e 67 20 61 20 66 75 6c 6c 2d 74  d using a full-t
18a40 61 62 6c 65 20 73 63 61 6e 0a 20 20 20 20 2a 2a  able scan.    **
18a50 20 28 6e 6f 74 20 75 73 69 6e 67 20 74 68 65 20   (not using the 
18a60 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 29  full-text index)
18a70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 67  . In this case g
18a80 72 61 62 20 74 68 65 20 72 6f 77 69 64 20 66 72  rab the rowid fr
18a90 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  om the.    ** SE
18aa0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
18ab0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18ac0 74 28 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69  t( pCsr->isRequi
18ad0 72 65 53 65 65 6b 3d 3d 30 20 29 3b 0a 20 20 20  reSeek==0 );.   
18ae0 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74   *pRowid = sqlit
18af0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
18b00 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b  pCsr->pStmt, 0);
18b10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
18b20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
18b30 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
18b40 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 2c 20 63  Column method, c
18b50 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65 20  alled by SQLite 
18b60 74 6f 20 72 65 71 75 65 73 74 20 61 20 76 61 6c  to request a val
18b70 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 72  ue from.** the r
18b80 6f 77 20 74 68 61 74 20 74 68 65 20 73 75 70 70  ow that the supp
18b90 6c 69 65 64 20 63 75 72 73 6f 72 20 63 75 72 72  lied cursor curr
18ba0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
18bb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
18bc0 74 73 33 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28  ts3ColumnMethod(
18bd0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
18be0 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c  cursor *pCursor,
18bf0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
18c00 72 65 74 72 69 65 76 65 20 76 61 6c 75 65 20 66  retrieve value f
18c10 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rom */.  sqlite3
18c20 5f 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65  _context *pConte
18c30 78 74 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  xt,      /* Cont
18c40 65 78 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ext for sqlite3_
18c50 72 65 73 75 6c 74 5f 78 78 78 28 29 20 63 61 6c  result_xxx() cal
18c60 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ls */.  int iCol
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18c90 20 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65   of column to re
18ca0 61 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f  ad value from */
18cb0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
18ce0 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 43 75  Code */.  Fts3Cu
18cf0 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
18d00 73 33 43 75 72 73 6f 72 20 2a 29 20 70 43 75 72  s3Cursor *) pCur
18d10 73 6f 72 3b 0a 20 20 46 74 73 33 54 61 62 6c 65  sor;.  Fts3Table
18d20 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
18d30 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61   *)pCursor->pVta
18d40 62 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6c  b;..  /* The col
18d50 75 6d 6e 20 76 61 6c 75 65 20 73 75 70 70 6c 69  umn value suppli
18d60 65 64 20 62 79 20 53 51 4c 69 74 65 20 6d 75 73  ed by SQLite mus
18d70 74 20 62 65 20 69 6e 20 72 61 6e 67 65 2e 20 2a  t be in range. *
18d80 2f 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  /.  assert( iCol
18d90 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 3d 70 2d 3e  >=0 && iCol<=p->
18da0 6e 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 0a 20 20  nColumn+1 );..  
18db0 69 66 28 20 69 43 6f 6c 3d 3d 70 2d 3e 6e 43 6f  if( iCol==p->nCo
18dc0 6c 75 6d 6e 2b 31 20 29 7b 0a 20 20 20 20 2f 2a  lumn+1 ){.    /*
18dd0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
18de0 72 65 71 75 65 73 74 20 66 6f 72 20 74 68 65 20  request for the 
18df0 22 64 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 2e 20  "docid" column. 
18e00 53 69 6e 63 65 20 22 64 6f 63 69 64 22 20 69 73  Since "docid" is
18e10 20 61 6e 20 0a 20 20 20 20 2a 2a 20 61 6c 69 61   an .    ** alia
18e20 73 20 66 6f 72 20 22 72 6f 77 69 64 22 2c 20 75  s for "rowid", u
18e30 73 65 20 74 68 65 20 78 52 6f 77 69 64 28 29 20  se the xRowid() 
18e40 6d 65 74 68 6f 64 20 74 6f 20 6f 62 74 61 69 6e  method to obtain
18e50 20 74 68 65 20 76 61 6c 75 65 2e 0a 20 20 20 20   the value..    
18e60 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
18e70 6e 74 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20  nt64 iRowid;.   
18e80 20 72 63 20 3d 20 66 74 73 33 52 6f 77 69 64 4d   rc = fts3RowidM
18e90 65 74 68 6f 64 28 70 43 75 72 73 6f 72 2c 20 26  ethod(pCursor, &
18ea0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  iRowid);.    sql
18eb0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
18ec0 34 28 70 43 6f 6e 74 65 78 74 2c 20 69 52 6f 77  4(pContext, iRow
18ed0 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  id);.  }else if(
18ee0 20 69 43 6f 6c 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d   iCol==p->nColum
18ef0 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  n ){.    /* The 
18f00 65 78 74 72 61 20 63 6f 6c 75 6d 6e 20 77 68 6f  extra column who
18f10 73 65 20 6e 61 6d 65 20 69 73 20 74 68 65 20 73  se name is the s
18f20 61 6d 65 20 61 73 20 74 68 65 20 74 61 62 6c 65  ame as the table
18f30 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  ..    ** Return 
18f40 61 20 62 6c 6f 62 20 77 68 69 63 68 20 69 73 20  a blob which is 
18f50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
18f60 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
18f70 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
18f80 6c 74 5f 62 6c 6f 62 28 70 43 6f 6e 74 65 78 74  lt_blob(pContext
18f90 2c 20 26 70 43 73 72 2c 20 73 69 7a 65 6f 66 28  , &pCsr, sizeof(
18fa0 70 43 73 72 29 2c 20 53 51 4c 49 54 45 5f 54 52  pCsr), SQLITE_TR
18fb0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 72 63  ANSIENT);.    rc
18fc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
18fe0 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 30  fts3CursorSeek(0
18ff0 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 69 66 28  , pCsr);.    if(
19000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
19020 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 6f  result_value(pCo
19030 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
19040 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72  olumn_value(pCsr
19050 2d 3e 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29  ->pStmt, iCol+1)
19060 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
19070 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
19080 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19090 6e 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  n is the impleme
190a0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
190b0 55 70 64 61 74 65 20 63 61 6c 6c 62 61 63 6b 20  Update callback 
190c0 75 73 65 64 20 62 79 20 0a 2a 2a 20 46 54 53 33  used by .** FTS3
190d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
190e0 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 62   It is invoked b
190f0 79 20 53 51 4c 69 74 65 20 65 61 63 68 20 74 69  y SQLite each ti
19100 6d 65 20 61 20 72 6f 77 20 69 73 20 74 6f 20 62  me a row is to b
19110 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2c 20 75  e.** inserted, u
19120 70 64 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65  pdated or delete
19130 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
19140 20 66 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f   fts3UpdateMetho
19150 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  d(.  sqlite3_vta
19160 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20 20  b *pVtab,       
19170 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
19180 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
19190 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67    /* Size of arg
191c0 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
191d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
191e0 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20  *apVal,         
191f0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
19200 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  uments */.  sqli
19210 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64  te_int64 *pRowid
19220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19230 55 54 3a 20 54 68 65 20 61 66 66 65 63 74 65 64  UT: The affected
19240 20 28 6f 72 20 65 66 66 65 63 74 65 64 29 20 72   (or effected) r
19250 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  owid */.){.  ret
19260 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 33 55  urn sqlite3Fts3U
19270 70 64 61 74 65 4d 65 74 68 6f 64 28 70 56 74 61  pdateMethod(pVta
19280 62 2c 20 6e 41 72 67 2c 20 61 70 56 61 6c 2c 20  b, nArg, apVal, 
19290 70 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pRowid);.}../*.*
192a0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
192b0 20 6f 66 20 78 53 79 6e 63 28 29 20 6d 65 74 68   of xSync() meth
192c0 6f 64 2e 20 46 6c 75 73 68 20 74 68 65 20 63 6f  od. Flush the co
192d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65  ntents of the pe
192e0 6e 64 69 6e 67 2d 74 65 72 6d 73 0a 2a 2a 20 68  nding-terms.** h
192f0 61 73 68 2d 74 61 62 6c 65 20 74 6f 20 74 68 65  ash-table to the
19300 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
19310 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 79 6e  atic int fts3Syn
19320 63 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  cMethod(sqlite3_
19330 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
19340 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
19350 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
19360 46 6c 75 73 68 28 28 46 74 73 33 54 61 62 6c 65  Flush((Fts3Table
19370 20 2a 29 70 56 74 61 62 29 3b 0a 20 20 73 71 6c   *)pVtab);.  sql
19380 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
19390 43 6c 6f 73 65 28 28 46 74 73 33 54 61 62 6c 65  Close((Fts3Table
193a0 20 2a 29 70 56 74 61 62 29 3b 0a 20 20 72 65 74   *)pVtab);.  ret
193b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
193c0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
193d0 6f 66 20 78 42 65 67 69 6e 28 29 20 6d 65 74 68  of xBegin() meth
193e0 6f 64 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  od. This is a no
193f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
19400 6e 74 20 66 74 73 33 42 65 67 69 6e 4d 65 74 68  nt fts3BeginMeth
19410 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
19420 2a 70 56 74 61 62 29 7b 0a 20 20 55 4e 55 53 45  *pVtab){.  UNUSE
19430 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61  D_PARAMETER(pVta
19440 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  b);.  assert( ((
19450 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61  Fts3Table *)pVta
19460 62 29 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  b)->nPendingData
19470 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
19480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19490 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
194a0 6f 6e 20 6f 66 20 78 43 6f 6d 6d 69 74 28 29 20  on of xCommit() 
194b0 6d 65 74 68 6f 64 2e 20 54 68 69 73 20 69 73 20  method. This is 
194c0 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 63 6f 6e  a no-op. The con
194d0 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tents of.** the 
194e0 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61  pending-terms ha
194f0 73 68 2d 74 61 62 6c 65 20 68 61 76 65 20 61 6c  sh-table have al
19500 72 65 61 64 79 20 62 65 65 6e 20 66 6c 75 73 68  ready been flush
19510 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ed into the data
19520 62 61 73 65 0a 2a 2a 20 62 79 20 66 74 73 33 53  base.** by fts3S
19530 79 6e 63 4d 65 74 68 6f 64 28 29 2e 0a 2a 2f 0a  yncMethod()..*/.
19540 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 43  static int fts3C
19550 6f 6d 6d 69 74 4d 65 74 68 6f 64 28 73 71 6c 69  ommitMethod(sqli
19560 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
19570 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
19580 45 54 45 52 28 70 56 74 61 62 29 3b 0a 20 20 61  ETER(pVtab);.  a
19590 73 73 65 72 74 28 20 28 28 46 74 73 33 54 61 62  ssert( ((Fts3Tab
195a0 6c 65 20 2a 29 70 56 74 61 62 29 2d 3e 6e 50 65  le *)pVtab)->nPe
195b0 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a  ndingData==0 );.
195c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
195d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  OK;.}../*.** Imp
195e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
195f0 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 44 69 73 63  Rollback(). Disc
19600 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
19610 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   of the pending-
19620 74 65 72 6d 73 0a 2a 2a 20 68 61 73 68 2d 74 61  terms.** hash-ta
19630 62 6c 65 2e 20 41 6e 79 20 63 68 61 6e 67 65 73  ble. Any changes
19640 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
19650 61 62 61 73 65 20 61 72 65 20 72 65 76 65 72 74  abase are revert
19660 65 64 20 62 79 20 53 51 4c 69 74 65 2e 0a 2a 2f  ed by SQLite..*/
19670 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
19680 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 28 73  RollbackMethod(s
19690 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
196a0 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 46 74  ab){.  sqlite3Ft
196b0 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c  s3PendingTermsCl
196c0 65 61 72 28 28 46 74 73 33 54 61 62 6c 65 20 2a  ear((Fts3Table *
196d0 29 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75 72  )pVtab);.  retur
196e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
196f0 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 64  /*.** Load the d
19700 6f 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65  oclist associate
19710 64 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  d with expressio
19720 6e 20 70 45 78 70 72 20 74 6f 20 70 45 78 70 72  n pExpr to pExpr
19730 2d 3e 61 44 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54  ->aDoclist..** T
19740 68 65 20 6c 6f 61 64 65 64 20 64 6f 63 6c 69 73  he loaded doclis
19750 74 20 63 6f 6e 74 61 69 6e 73 20 70 6f 73 69 74  t contains posit
19760 69 6f 6e 73 20 61 73 20 77 65 6c 6c 20 61 73 20  ions as well as 
19770 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 69 64 73  the document ids
19780 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  ..** This is use
19790 64 20 62 79 20 74 68 65 20 6d 61 74 63 68 69 6e  d by the matchin
197a0 66 6f 28 29 2c 20 73 6e 69 70 70 65 74 28 29 20  fo(), snippet() 
197b0 61 6e 64 20 6f 66 66 73 65 74 73 28 29 20 61 75  and offsets() au
197c0 78 69 6c 6c 61 72 79 0a 2a 2a 20 66 75 6e 63 74  xillary.** funct
197d0 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
197e0 69 74 65 33 46 74 73 33 45 78 70 72 4c 6f 61 64  ite3Fts3ExprLoad
197f0 44 6f 63 6c 69 73 74 28 46 74 73 33 43 75 72 73  Doclist(Fts3Curs
19800 6f 72 20 2a 70 43 73 72 2c 20 46 74 73 33 45 78  or *pCsr, Fts3Ex
19810 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
19820 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
19830 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
19840 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 26 26  SQUERY_PHRASE &&
19850 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 20   pExpr->pPhrase 
19860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  );.  assert( pCs
19870 72 2d 3e 65 45 76 61 6c 6d 6f 64 65 3d 3d 46 54  r->eEvalmode==FT
19880 53 33 5f 45 56 41 4c 5f 4e 45 58 54 20 29 3b 0a  S3_EVAL_NEXT );.
19890 20 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c 45    rc = fts3EvalE
198a0 78 70 72 28 70 43 73 72 2c 20 70 45 78 70 72 2c  xpr(pCsr, pExpr,
198b0 20 26 70 45 78 70 72 2d 3e 61 44 6f 63 6c 69 73   &pExpr->aDoclis
198c0 74 2c 20 26 70 45 78 70 72 2d 3e 6e 44 6f 63 6c  t, &pExpr->nDocl
198d0 69 73 74 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ist, 1);.  retur
198e0 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  n rc;.}..int sql
198f0 69 74 65 33 46 74 73 33 45 78 70 72 4c 6f 61 64  ite3Fts3ExprLoad
19900 46 74 44 6f 63 6c 69 73 74 28 0a 20 20 46 74 73  FtDoclist(.  Fts
19910 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a  3Cursor *pCsr, .
19920 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70    Fts3Expr *pExp
19930 72 2c 0a 20 20 63 68 61 72 20 2a 2a 70 61 44 6f  r,.  char **paDo
19940 63 6c 69 73 74 2c 0a 20 20 69 6e 74 20 2a 70 6e  clist,.  int *pn
19950 44 6f 63 6c 69 73 74 0a 29 7b 0a 20 20 69 6e 74  Doclist.){.  int
19960 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
19970 43 73 72 2d 3e 65 45 76 61 6c 6d 6f 64 65 3d 3d  Csr->eEvalmode==
19980 46 54 53 33 5f 45 56 41 4c 5f 4e 45 58 54 20 29  FTS3_EVAL_NEXT )
19990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
199a0 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
199b0 52 59 5f 50 48 52 41 53 45 20 26 26 20 70 45 78  RY_PHRASE && pEx
199c0 70 72 2d 3e 70 50 68 72 61 73 65 20 29 3b 0a 20  pr->pPhrase );. 
199d0 20 70 43 73 72 2d 3e 65 45 76 61 6c 6d 6f 64 65   pCsr->eEvalmode
199e0 20 3d 20 46 54 53 33 5f 45 56 41 4c 5f 4d 41 54   = FTS3_EVAL_MAT
199f0 43 48 49 4e 46 4f 3b 0a 20 20 72 63 20 3d 20 66  CHINFO;.  rc = f
19a00 74 73 33 45 76 61 6c 45 78 70 72 28 70 43 73 72  ts3EvalExpr(pCsr
19a10 2c 20 70 45 78 70 72 2c 20 70 61 44 6f 63 6c 69  , pExpr, paDocli
19a20 73 74 2c 20 70 6e 44 6f 63 6c 69 73 74 2c 20 31  st, pnDoclist, 1
19a30 29 3b 0a 20 20 70 43 73 72 2d 3e 65 45 76 61 6c  );.  pCsr->eEval
19a40 6d 6f 64 65 20 3d 20 46 54 53 33 5f 45 56 41 4c  mode = FTS3_EVAL
19a50 5f 4e 45 58 54 3b 0a 20 20 72 65 74 75 72 6e 20  _NEXT;.  return 
19a60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 66 74  rc;.}../*.** Aft
19a70 65 72 20 45 78 70 72 4c 6f 61 64 44 6f 63 6c 69  er ExprLoadDocli
19a80 73 74 28 29 20 28 73 65 65 20 61 62 6f 76 65 29  st() (see above)
19a90 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
19aa0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
19ab0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 74  is.** used to it
19ac0 65 72 61 74 65 2f 73 65 61 72 63 68 20 74 68 72  erate/search thr
19ad0 6f 75 67 68 20 74 68 65 20 70 6f 73 69 74 69 6f  ough the positio
19ae0 6e 20 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b  n lists that mak
19af0 65 20 75 70 20 74 68 65 20 64 6f 63 6c 69 73 74  e up the doclist
19b00 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 70 45  .** stored in pE
19b10 78 70 72 2d 3e 61 44 6f 63 6c 69 73 74 2e 0a 2a  xpr->aDoclist..*
19b20 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  /.char *sqlite3F
19b30 74 73 33 46 69 6e 64 50 6f 73 69 74 69 6f 6e 73  ts3FindPositions
19b40 28 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 45  (.  Fts3Expr *pE
19b50 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
19b60 20 20 20 20 2f 2a 20 41 63 63 65 73 73 20 74 68      /* Access th
19b70 69 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20 64  is expressions d
19b80 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  oclist */.  sqli
19b90 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
19ba0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
19bb0 6f 63 69 64 20 61 73 73 6f 63 69 61 74 65 64 20  ocid associated 
19bc0 77 69 74 68 20 72 65 71 75 65 73 74 65 64 20 70  with requested p
19bd0 6f 73 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  os-list */.  int
19be0 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c00 43 6f 6c 75 6d 6e 20 6f 66 20 72 65 71 75 65 73  Column of reques
19c10 74 65 64 20 70 6f 73 2d 6c 69 73 74 20 2a 2f 0a  ted pos-list */.
19c20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ){.  assert( pEx
19c30 70 72 2d 3e 69 73 4c 6f 61 64 65 64 20 29 3b 0a  pr->isLoaded );.
19c40 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 44 6f    if( pExpr->aDo
19c50 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 63 68 61  clist ){.    cha
19c60 72 20 2a 70 45 6e 64 20 3d 20 26 70 45 78 70 72  r *pEnd = &pExpr
19c70 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 45 78 70 72  ->aDoclist[pExpr
19c80 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 20  ->nDoclist];.   
19c90 20 63 68 61 72 20 2a 70 43 73 72 20 3d 20 70 45   char *pCsr = pE
19ca0 78 70 72 2d 3e 70 43 75 72 72 65 6e 74 3b 0a 0a  xpr->pCurrent;..
19cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
19cc0 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   );.    while( p
19cd0 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  Csr<pEnd ){.    
19ce0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 75    if( pExpr->iCu
19cf0 72 72 65 6e 74 3c 69 44 6f 63 69 64 20 29 7b 0a  rrent<iDocid ){.
19d00 20 20 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c          fts3Posl
19d10 69 73 74 43 6f 70 79 28 30 2c 20 26 70 43 73 72  istCopy(0, &pCsr
19d20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19d30 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  Csr<pEnd ){.    
19d40 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c        fts3GetDel
19d50 74 61 56 61 72 69 6e 74 28 26 70 43 73 72 2c 20  taVarint(&pCsr, 
19d60 26 70 45 78 70 72 2d 3e 69 43 75 72 72 65 6e 74  &pExpr->iCurrent
19d70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19d80 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 75 72       pExpr->pCur
19d90 72 65 6e 74 20 3d 20 70 43 73 72 3b 0a 20 20 20  rent = pCsr;.   
19da0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19db0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 75    if( pExpr->iCu
19dc0 72 72 65 6e 74 3d 3d 69 44 6f 63 69 64 20 29 7b  rrent==iDocid ){
19dd0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
19de0 54 68 69 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  This = 0;.      
19df0 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
19e00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
19e10 20 49 66 20 69 43 6f 6c 20 69 73 20 6e 65 67 61   If iCol is nega
19e20 74 69 76 65 2c 20 72 65 74 75 72 6e 20 61 20 70  tive, return a p
19e30 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74  ointer to the st
19e40 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
19e50 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 69 74 69         ** positi
19e60 6f 6e 2d 6c 69 73 74 20 28 69 6e 73 74 65 61 64  on-list (instead
19e70 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
19e80 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
19e90 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  list.           
19ea0 20 2a 2a 20 6f 66 20 6f 66 66 73 65 74 73 20 61   ** of offsets a
19eb0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
19ec0 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
19ed0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
19ee0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  /.            re
19ef0 74 75 72 6e 20 70 43 73 72 3b 0a 20 20 20 20 20  turn pCsr;.     
19f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19f10 20 77 68 69 6c 65 28 20 69 54 68 69 73 3c 69 43   while( iThis<iC
19f20 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
19f30 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74    fts3Columnlist
19f40 43 6f 70 79 28 30 2c 20 26 70 43 73 72 29 3b 0a  Copy(0, &pCsr);.
19f50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
19f60 2a 70 43 73 72 3d 3d 30 78 30 30 20 29 20 72 65  *pCsr==0x00 ) re
19f70 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
19f80 20 20 20 20 70 43 73 72 2b 2b 3b 0a 20 20 20 20      pCsr++;.    
19f90 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20          pCsr += 
19fa0 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
19fb0 72 69 6e 74 33 32 28 70 43 73 72 2c 20 26 69 54  rint32(pCsr, &iT
19fc0 68 69 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  his);.          
19fd0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
19fe0 69 43 6f 6c 3d 3d 69 54 68 69 73 20 26 26 20 28  iCol==iThis && (
19ff0 2a 70 43 73 72 26 30 78 46 45 29 20 29 20 72 65  *pCsr&0xFE) ) re
1a000 74 75 72 6e 20 70 43 73 72 3b 0a 20 20 20 20 20  turn pCsr;.     
1a010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
1a020 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1a030 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1a040 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  rn 0;.}../*.** H
1a050 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 75  elper function u
1a060 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
1a070 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1a080 20 6f 76 65 72 6c 6f 61 64 65 64 20 73 6e 69 70   overloaded snip
1a090 70 65 74 28 29 2c 0a 2a 2a 20 6f 66 66 73 65 74  pet(),.** offset
1a0a0 73 28 29 20 61 6e 64 20 6f 70 74 69 6d 69 7a 65  s() and optimize
1a0b0 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  () SQL functions
1a0c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76  ..**.** If the v
1a0d0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
1a0e0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
1a0f0 74 20 69 73 20 61 20 62 6c 6f 62 20 6f 66 20 73  t is a blob of s
1a100 69 7a 65 0a 2a 2a 20 73 69 7a 65 6f 66 28 46 74  ize.** sizeof(Ft
1a110 73 33 43 75 72 73 6f 72 2a 29 2c 20 74 68 65 6e  s3Cursor*), then
1a120 20 74 68 65 20 62 6c 6f 62 20 63 6f 6e 74 65 6e   the blob conten
1a130 74 73 20 61 72 65 20 63 6f 70 69 65 64 20 74 6f  ts are copied to
1a140 20 74 68 65 20 0a 2a 2a 20 6f 75 74 70 75 74 20   the .** output 
1a150 76 61 72 69 61 62 6c 65 20 2a 70 70 43 73 72 20  variable *ppCsr 
1a160 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
1a170 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1a180 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 0a 2a  wise, an error.*
1a190 2a 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  * message is wri
1a1a0 74 74 65 6e 20 74 6f 20 63 6f 6e 74 65 78 74 20  tten to context 
1a1b0 70 43 6f 6e 74 65 78 74 20 61 6e 64 20 53 51 4c  pContext and SQL
1a1c0 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e  ITE_ERROR return
1a1d0 65 64 2e 20 54 68 65 0a 2a 2a 20 73 74 72 69 6e  ed. The.** strin
1a1e0 67 20 70 61 73 73 65 64 20 76 69 61 20 7a 46 75  g passed via zFu
1a1f0 6e 63 20 69 73 20 75 73 65 64 20 61 73 20 70 61  nc is used as pa
1a200 72 74 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  rt of the error 
1a210 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  message..*/.stat
1a220 69 63 20 69 6e 74 20 66 74 73 33 46 75 6e 63 74  ic int fts3Funct
1a230 69 6f 6e 41 72 67 28 0a 20 20 73 71 6c 69 74 65  ionArg(.  sqlite
1a240 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74  3_context *pCont
1a250 65 78 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c  ext,      /* SQL
1a260 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   function call c
1a270 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
1a280 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
1a290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a2a0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1a2b0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1a2c0 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20  *pVal,          
1a2d0 20 20 2f 2a 20 61 72 67 76 5b 30 5d 20 70 61 73    /* argv[0] pas
1a2e0 73 65 64 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20  sed to function 
1a2f0 2a 2f 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  */.  Fts3Cursor 
1a300 2a 2a 70 70 43 73 72 20 20 20 20 20 20 20 20 20  **ppCsr         
1a310 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 6f       /* OUT: Sto
1a320 72 65 20 63 75 72 73 6f 72 20 68 61 6e 64 6c 65  re cursor handle
1a330 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   here */.){.  Ft
1a340 73 33 43 75 72 73 6f 72 20 2a 70 52 65 74 3b 0a  s3Cursor *pRet;.
1a350 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
1a360 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 21 3d  lue_type(pVal)!=
1a370 53 51 4c 49 54 45 5f 42 4c 4f 42 20 0a 20 20 20  SQLITE_BLOB .   
1a380 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  || sqlite3_value
1a390 5f 62 79 74 65 73 28 70 56 61 6c 29 21 3d 73 69  _bytes(pVal)!=si
1a3a0 7a 65 6f 66 28 46 74 73 33 43 75 72 73 6f 72 20  zeof(Fts3Cursor 
1a3b0 2a 29 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  *).  ){.    char
1a3c0 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33   *zErr = sqlite3
1a3d0 5f 6d 70 72 69 6e 74 66 28 22 69 6c 6c 65 67 61  _mprintf("illega
1a3e0 6c 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  l first argument
1a3f0 20 74 6f 20 25 73 22 2c 20 7a 46 75 6e 63 29 3b   to %s", zFunc);
1a400 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
1a410 75 6c 74 5f 65 72 72 6f 72 28 70 43 6f 6e 74 65  ult_error(pConte
1a420 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20  xt, zErr, -1);. 
1a430 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a440 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 74 75 72  zErr);.    retur
1a450 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1a460 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 52    }.  memcpy(&pR
1a470 65 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  et, sqlite3_valu
1a480 65 5f 62 6c 6f 62 28 70 56 61 6c 29 2c 20 73 69  e_blob(pVal), si
1a490 7a 65 6f 66 28 46 74 73 33 43 75 72 73 6f 72 20  zeof(Fts3Cursor 
1a4a0 2a 29 29 3b 0a 20 20 2a 70 70 43 73 72 20 3d 20  *));.  *ppCsr = 
1a4b0 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  pRet;.  return S
1a4c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a4d0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1a4e0 6e 20 6f 66 20 74 68 65 20 73 6e 69 70 70 65 74  n of the snippet
1a4f0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
1a500 46 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FTS3.*/.static v
1a510 6f 69 64 20 66 74 73 33 53 6e 69 70 70 65 74 46  oid fts3SnippetF
1a520 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1a530 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78 74  ontext *pContext
1a540 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65  ,      /* SQLite
1a550 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   function call c
1a560 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
1a570 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nVal,           
1a580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a590 69 7a 65 20 6f 66 20 61 70 56 61 6c 5b 5d 20 61  ize of apVal[] a
1a5a0 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rray */.  sqlite
1a5b0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
1a5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
1a5d0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
1a5e0 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43 75 72 73  */.){.  Fts3Curs
1a5f0 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20  or *pCsr;       
1a600 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1a610 72 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  r handle passed 
1a620 74 68 72 6f 75 67 68 20 61 70 56 61 6c 5b 30 5d  through apVal[0]
1a630 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a640 20 2a 7a 53 74 61 72 74 20 3d 20 22 3c 62 3e 22   *zStart = "<b>"
1a650 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1a660 7a 45 6e 64 20 3d 20 22 3c 2f 62 3e 22 3b 0a 20  zEnd = "</b>";. 
1a670 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6c   const char *zEl
1a680 6c 69 70 73 69 73 20 3d 20 22 3c 62 3e 2e 2e 2e  lipsis = "<b>...
1a690 3c 2f 62 3e 22 3b 0a 20 20 69 6e 74 20 69 43 6f  </b>";.  int iCo
1a6a0 6c 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 54  l = -1;.  int nT
1a6b0 6f 6b 65 6e 20 3d 20 31 35 3b 20 20 20 20 20 20  oken = 15;      
1a6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66            /* Def
1a6d0 61 75 6c 74 20 6e 75 6d 62 65 72 20 6f 66 20 74  ault number of t
1a6e0 6f 6b 65 6e 73 20 69 6e 20 73 6e 69 70 70 65 74  okens in snippet
1a6f0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   */..  /* There 
1a700 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
1a710 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 70 61   one argument pa
1a720 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1a730 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69 73 65  ction (otherwise
1a740 0a 20 20 2a 2a 20 74 68 65 20 6e 6f 6e 2d 6f 76  .  ** the non-ov
1a750 65 72 6c 6f 61 64 65 64 20 76 65 72 73 69 6f 6e  erloaded version
1a760 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
1a770 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
1a780 6f 66 20 74 68 69 73 20 6f 6e 65 29 2e 0a 20 20  of this one)..  
1a790 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61  */.  assert( nVa
1a7a0 6c 3e 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 6e  l>=1 );..  if( n
1a7b0 56 61 6c 3e 36 20 29 7b 0a 20 20 20 20 73 71 6c  Val>6 ){.    sql
1a7c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1a7d0 72 28 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  r(pContext, .   
1a7e0 20 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62       "wrong numb
1a7f0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1a800 74 6f 20 66 75 6e 63 74 69 6f 6e 20 73 6e 69 70  to function snip
1a810 70 65 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20  pet()", -1);.   
1a820 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
1a830 66 28 20 66 74 73 33 46 75 6e 63 74 69 6f 6e 41  f( fts3FunctionA
1a840 72 67 28 70 43 6f 6e 74 65 78 74 2c 20 22 73 6e  rg(pContext, "sn
1a850 69 70 70 65 74 22 2c 20 61 70 56 61 6c 5b 30 5d  ippet", apVal[0]
1a860 2c 20 26 70 43 73 72 29 20 29 20 72 65 74 75 72  , &pCsr) ) retur
1a870 6e 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 6e 56  n;..  switch( nV
1a880 61 6c 20 29 7b 0a 20 20 20 20 63 61 73 65 20 36  al ){.    case 6
1a890 3a 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74  : nToken = sqlit
1a8a0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
1a8b0 61 6c 5b 35 5d 29 3b 0a 20 20 20 20 63 61 73 65  al[5]);.    case
1a8c0 20 35 3a 20 69 43 6f 6c 20 3d 20 73 71 6c 69 74   5: iCol = sqlit
1a8d0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
1a8e0 61 6c 5b 34 5d 29 3b 0a 20 20 20 20 63 61 73 65  al[4]);.    case
1a8f0 20 34 3a 20 7a 45 6c 6c 69 70 73 69 73 20 3d 20   4: zEllipsis = 
1a900 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1a910 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1a920 61 70 56 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 63  apVal[3]);.    c
1a930 61 73 65 20 33 3a 20 7a 45 6e 64 20 3d 20 28 63  ase 3: zEnd = (c
1a940 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1a950 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
1a960 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 63 61 73  Val[2]);.    cas
1a970 65 20 32 3a 20 7a 53 74 61 72 74 20 3d 20 28 63  e 2: zStart = (c
1a980 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1a990 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
1a9a0 56 61 6c 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 69  Val[1]);.  }.  i
1a9b0 66 28 20 21 7a 45 6c 6c 69 70 73 69 73 20 7c 7c  f( !zEllipsis ||
1a9c0 20 21 7a 45 6e 64 20 7c 7c 20 21 7a 53 74 61 72   !zEnd || !zStar
1a9d0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1a9e0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
1a9f0 6d 65 6d 28 70 43 6f 6e 74 65 78 74 29 3b 0a 20  mem(pContext);. 
1aa00 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
1aa10 45 5f 4f 4b 3d 3d 66 74 73 33 43 75 72 73 6f 72  E_OK==fts3Cursor
1aa20 53 65 65 6b 28 70 43 6f 6e 74 65 78 74 2c 20 70  Seek(pContext, p
1aa30 43 73 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Csr) ){.    sqli
1aa40 74 65 33 46 74 73 33 53 6e 69 70 70 65 74 28 70  te3Fts3Snippet(p
1aa50 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20 7a  Context, pCsr, z
1aa60 53 74 61 72 74 2c 20 7a 45 6e 64 2c 20 7a 45 6c  Start, zEnd, zEl
1aa70 6c 69 70 73 69 73 2c 20 69 43 6f 6c 2c 20 6e 54  lipsis, iCol, nT
1aa80 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  oken);.  }.}../*
1aa90 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1aaa0 6f 6e 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  on of the offset
1aab0 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  s() function for
1aac0 20 46 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63 20   FTS3.*/.static 
1aad0 76 6f 69 64 20 66 74 73 33 4f 66 66 73 65 74 73  void fts3Offsets
1aae0 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1aaf0 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
1ab00 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74  t,      /* SQLit
1ab10 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
1ab20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1ab30 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   nVal,          
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab50 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74  Size of argument
1ab60 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
1ab70 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
1ab80 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
1ab90 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
1aba0 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43 75  s */.){.  Fts3Cu
1abb0 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20  rsor *pCsr;     
1abc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1abd0 73 6f 72 20 68 61 6e 64 6c 65 20 70 61 73 73 65  sor handle passe
1abe0 64 20 74 68 72 6f 75 67 68 20 61 70 56 61 6c 5b  d through apVal[
1abf0 30 5d 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f  0] */..  UNUSED_
1ac00 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b  PARAMETER(nVal);
1ac10 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
1ac20 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 66 74 73  ==1 );.  if( fts
1ac30 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70 43 6f  3FunctionArg(pCo
1ac40 6e 74 65 78 74 2c 20 22 6f 66 66 73 65 74 73 22  ntext, "offsets"
1ac50 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26 70 43 73  , apVal[0], &pCs
1ac60 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  r) ) return;.  a
1ac70 73 73 65 72 74 28 20 70 43 73 72 20 29 3b 0a 20  ssert( pCsr );. 
1ac80 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
1ac90 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 70  fts3CursorSeek(p
1aca0 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 29 20 29  Context, pCsr) )
1acb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1acc0 33 4f 66 66 73 65 74 73 28 70 43 6f 6e 74 65 78  3Offsets(pContex
1acd0 74 2c 20 70 43 73 72 29 3b 0a 20 20 7d 0a 7d 0a  t, pCsr);.  }.}.
1ace0 0a 2f 2a 20 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ./* .** Implemen
1acf0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 70  tation of the sp
1ad00 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a 65 28 29  ecial optimize()
1ad10 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54   function for FT
1ad20 53 33 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  S3. This .** fun
1ad30 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 61 6c 6c  ction merges all
1ad40 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
1ad50 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 73   database to a s
1ad60 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  ingle segment..*
1ad70 2a 20 45 78 61 6d 70 6c 65 20 75 73 61 67 65 20  * Example usage 
1ad80 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  is:.**.**   SELE
1ad90 43 54 20 6f 70 74 69 6d 69 7a 65 28 74 29 20 46  CT optimize(t) F
1ada0 52 4f 4d 20 74 20 4c 49 4d 49 54 20 31 3b 0a 2a  ROM t LIMIT 1;.*
1adb0 2a 0a 2a 2a 20 77 68 65 72 65 20 27 74 27 20 69  *.** where 't' i
1adc0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  s the name of an
1add0 20 46 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2f 0a   FTS3 table..*/.
1ade0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1adf0 4f 70 74 69 6d 69 7a 65 46 75 6e 63 28 0a 20 20  OptimizeFunc(.  
1ae00 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1ae10 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1ae20 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1ae30 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1ae40 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ae70 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1ae80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1ae90 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1aea0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1aeb0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1aec0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1aef0 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
1af00 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1af10 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
1af20 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1af30 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
1af40 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
1af50 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e     /* Cursor han
1af60 64 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  dle passed throu
1af70 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 0a  gh apVal[0] */..
1af80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1af90 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61 73 73  ER(nVal);..  ass
1afa0 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  ert( nVal==1 );.
1afb0 20 20 69 66 28 20 66 74 73 33 46 75 6e 63 74 69    if( fts3Functi
1afc0 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74 2c 20  onArg(pContext, 
1afd0 22 6f 70 74 69 6d 69 7a 65 22 2c 20 61 70 56 61  "optimize", apVa
1afe0 6c 5b 30 5d 2c 20 26 70 43 75 72 73 6f 72 29 20  l[0], &pCursor) 
1aff0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
1b000 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 75  (Fts3Table *)pCu
1b010 72 73 6f 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  rsor->base.pVtab
1b020 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
1b030 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1b040 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 70 29 3b  Fts3Optimize(p);
1b050 0a 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29  ..  switch( rc )
1b060 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1b070 45 5f 4f 4b 3a 0a 20 20 20 20 20 20 73 71 6c 69  E_OK:.      sqli
1b080 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1b090 70 43 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78  pContext, "Index
1b0a0 20 6f 70 74 69 6d 69 7a 65 64 22 2c 20 2d 31 2c   optimized", -1,
1b0b0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1b0c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b0d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
1b0e0 4e 45 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NE:.      sqlite
1b0f0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
1b100 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78 20 61  ontext, "Index a
1b110 6c 72 65 61 64 79 20 6f 70 74 69 6d 61 6c 22 2c  lready optimal",
1b120 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1b130 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
1b140 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1b150 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1b160 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
1b170 43 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20 20  Context, rc);.  
1b180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d      break;.  }.}
1b190 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b1a0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  tation of the ma
1b1b0 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69  tchinfo() functi
1b1c0 6f 6e 20 66 6f 72 20 46 54 53 33 0a 2a 2f 0a 73  on for FTS3.*/.s
1b1d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4d  tatic void fts3M
1b1e0 61 74 63 68 69 6e 66 6f 46 75 6e 63 28 0a 20 20  atchinfoFunc(.  
1b1f0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1b200 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1b210 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1b220 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1b230 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b260 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1b270 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1b280 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1b290 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1b2a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1b2b0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1b2c0 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sr;             
1b2d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e 64    /* Cursor hand
1b2e0 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  le passed throug
1b2f0 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 20 20  h apVal[0] */.  
1b300 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20  assert( nVal==1 
1b310 7c 7c 20 6e 56 61 6c 3d 3d 32 20 29 3b 0a 20 20  || nVal==2 );.  
1b320 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 66  if( SQLITE_OK==f
1b330 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70  ts3FunctionArg(p
1b340 43 6f 6e 74 65 78 74 2c 20 22 6d 61 74 63 68 69  Context, "matchi
1b350 6e 66 6f 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20  nfo", apVal[0], 
1b360 26 70 43 73 72 29 20 29 7b 0a 20 20 20 20 63 6f  &pCsr) ){.    co
1b370 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
1b380 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 56 61 6c   0;.    if( nVal
1b390 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 41 72 67  >1 ){.      zArg
1b3a0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
1b3b0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1b3c0 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
1b3d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b3e0 46 74 73 33 4d 61 74 63 68 69 6e 66 6f 28 70 43  Fts3Matchinfo(pC
1b3f0 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20 7a 41  ontext, pCsr, zA
1b400 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
1b410 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b420 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 78 46  mplements the xF
1b430 69 6e 64 46 75 6e 63 74 69 6f 6e 20 6d 65 74 68  indFunction meth
1b440 6f 64 20 66 6f 72 20 74 68 65 20 46 54 53 33 0a  od for the FTS3.
1b450 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1b460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b470 66 74 73 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  fts3FindFunction
1b480 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
1b490 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20  3_vtab *pVtab,  
1b4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
1b4b0 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
1b4c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b4f0 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
1b500 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1b510 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1b520 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1b530 2f 2a 20 4e 61 6d 65 20 6f 66 20 53 51 4c 20 66  /* Name of SQL f
1b540 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
1b550 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c  d (**pxFunc)(sql
1b560 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
1b570 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
1b580 2a 29 2c 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75  *), /* OUT: Resu
1b590 6c 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  lt */.  void **p
1b5a0 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
1b5b0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
1b5c0 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  d */.){.  struct
1b5d0 20 4f 76 65 72 6c 6f 61 64 65 64 20 7b 0a 20 20   Overloaded {.  
1b5e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1b5f0 61 6d 65 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a  ame;.    void (*
1b600 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
1b610 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
1b620 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20  te3_value**);.  
1b630 7d 20 61 4f 76 65 72 6c 6f 61 64 5b 5d 20 3d 20  } aOverload[] = 
1b640 7b 0a 20 20 20 20 7b 20 22 73 6e 69 70 70 65 74  {.    { "snippet
1b650 22 2c 20 66 74 73 33 53 6e 69 70 70 65 74 46 75  ", fts3SnippetFu
1b660 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 66 66  nc },.    { "off
1b670 73 65 74 73 22 2c 20 66 74 73 33 4f 66 66 73 65  sets", fts3Offse
1b680 74 73 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  tsFunc },.    { 
1b690 22 6f 70 74 69 6d 69 7a 65 22 2c 20 66 74 73 33  "optimize", fts3
1b6a0 4f 70 74 69 6d 69 7a 65 46 75 6e 63 20 7d 2c 0a  OptimizeFunc },.
1b6b0 20 20 20 20 7b 20 22 6d 61 74 63 68 69 6e 66 6f      { "matchinfo
1b6c0 22 2c 20 66 74 73 33 4d 61 74 63 68 69 6e 66 6f  ", fts3Matchinfo
1b6d0 46 75 6e 63 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  Func },.  };.  i
1b6e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b700 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
1b710 62 6c 65 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44  ble */..  UNUSED
1b720 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61 62  _PARAMETER(pVtab
1b730 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1b740 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1b750 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b760 70 70 41 72 67 29 3b 0a 0a 20 20 66 6f 72 28 69  ppArg);..  for(i
1b770 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72 61  =0; i<SizeofArra
1b780 79 28 61 4f 76 65 72 6c 6f 61 64 29 3b 20 69 2b  y(aOverload); i+
1b790 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
1b7a0 6d 70 28 7a 4e 61 6d 65 2c 20 61 4f 76 65 72 6c  mp(zName, aOverl
1b7b0 6f 61 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  oad[i].zName)==0
1b7c0 20 29 7b 0a 20 20 20 20 20 20 2a 70 78 46 75 6e   ){.      *pxFun
1b7d0 63 20 3d 20 61 4f 76 65 72 6c 6f 61 64 5b 69 5d  c = aOverload[i]
1b7e0 2e 78 46 75 6e 63 3b 0a 20 20 20 20 20 20 72 65  .xFunc;.      re
1b7f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1b800 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 66 75 6e 63 74  }..  /* No funct
1b810 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69  ion of the speci
1b820 66 69 65 64 20 6e 61 6d 65 20 77 61 73 20 66 6f  fied name was fo
1b830 75 6e 64 2e 20 52 65 74 75 72 6e 20 30 2e 20 2a  und. Return 0. *
1b840 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1b850 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1b860 61 74 69 6f 6e 20 6f 66 20 46 54 53 33 20 78 52  ation of FTS3 xR
1b870 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 52 65  ename method. Re
1b880 6e 61 6d 65 20 61 6e 20 66 74 73 33 20 74 61 62  name an fts3 tab
1b890 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1b8a0 74 20 66 74 73 33 52 65 6e 61 6d 65 4d 65 74 68  t fts3RenameMeth
1b8b0 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
1b8c0 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20  ab *pVtab,      
1b8d0 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
1b8e0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1b8f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b900 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
1b910 20 20 20 2f 2a 20 4e 65 77 20 6e 61 6d 65 20 6f     /* New name o
1b920 66 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  f table */.){.  
1b930 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28  Fts3Table *p = (
1b940 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61  Fts3Table *)pVta
1b950 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
1b960 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
1b970 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1b980 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1b990 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1b9c0 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  */..  rc = sqlit
1b9d0 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72  e3Fts3PendingTer
1b9e0 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66  msFlush(p);.  if
1b9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ba00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1ba10 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 33 44 62 45  ;.  }..  fts3DbE
1ba20 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20  xec(&rc, db,.   
1ba30 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51   "ALTER TABLE %Q
1ba40 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 20 52  .'%q_content'  R
1ba50 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 63 6f 6e  ENAME TO '%q_con
1ba60 74 65 6e 74 27 3b 22 2c 0a 20 20 20 20 70 2d 3e  tent';",.    p->
1ba70 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  zDb, p->zName, z
1ba80 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28 20  Name.  );.  if( 
1ba90 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29  p->bHasDocsize )
1baa0 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78 65 63  {.    fts3DbExec
1bab0 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20  (&rc, db,.      
1bac0 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e  "ALTER TABLE %Q.
1bad0 27 25 71 5f 64 6f 63 73 69 7a 65 27 20 20 52 45  '%q_docsize'  RE
1bae0 4e 41 4d 45 20 54 4f 20 27 25 71 5f 64 6f 63 73  NAME TO '%q_docs
1baf0 69 7a 65 27 3b 22 2c 0a 20 20 20 20 20 20 70 2d  ize';",.      p-
1bb00 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  >zDb, p->zName, 
1bb10 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
1bb20 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73 53 74  .  if( p->bHasSt
1bb30 61 74 20 29 7b 0a 20 20 20 20 66 74 73 33 44 62  at ){.    fts3Db
1bb40 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20  Exec(&rc, db,.  
1bb50 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45      "ALTER TABLE
1bb60 20 25 51 2e 27 25 71 5f 73 74 61 74 27 20 20 52   %Q.'%q_stat'  R
1bb70 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 73 74 61  ENAME TO '%q_sta
1bb80 74 27 3b 22 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  t';",.      p->z
1bb90 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Db, p->zName, zN
1bba0 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  ame.    );.  }. 
1bbb0 20 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c   fts3DbExec(&rc,
1bbc0 20 64 62 2c 0a 20 20 20 20 22 41 4c 54 45 52 20   db,.    "ALTER 
1bbd0 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73 65 67  TABLE %Q.'%q_seg
1bbe0 6d 65 6e 74 73 27 20 52 45 4e 41 4d 45 20 54 4f  ments' RENAME TO
1bbf0 20 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 3b 22   '%q_segments';"
1bc00 2c 0a 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d  ,.    p->zDb, p-
1bc10 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20  >zName, zName.  
1bc20 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65 63 28  );.  fts3DbExec(
1bc30 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 22 41 4c  &rc, db,.    "AL
1bc40 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25 71  TER TABLE %Q.'%q
1bc50 5f 73 65 67 64 69 72 27 20 20 20 52 45 4e 41 4d  _segdir'   RENAM
1bc60 45 20 54 4f 20 27 25 71 5f 73 65 67 64 69 72 27  E TO '%q_segdir'
1bc70 3b 22 2c 0a 20 20 20 20 70 2d 3e 7a 44 62 2c 20  ;",.    p->zDb, 
1bc80 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a  p->zName, zName.
1bc90 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63    );.  return rc
1bca0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
1bcb0 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
1bcc0 20 66 74 73 33 4d 6f 64 75 6c 65 20 3d 20 7b 0a   fts3Module = {.
1bcd0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 20 20    /* iVersion   
1bce0 20 20 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78 43     */ 0,.  /* xC
1bcf0 72 65 61 74 65 20 20 20 20 20 20 20 2a 2f 20 66  reate       */ f
1bd00 74 73 33 43 72 65 61 74 65 4d 65 74 68 6f 64 2c  ts3CreateMethod,
1bd10 0a 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 20  .  /* xConnect  
1bd20 20 20 20 20 2a 2f 20 66 74 73 33 43 6f 6e 6e 65      */ fts3Conne
1bd30 63 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  ctMethod,.  /* x
1bd40 42 65 73 74 49 6e 64 65 78 20 20 20 20 2a 2f 20  BestIndex    */ 
1bd50 66 74 73 33 42 65 73 74 49 6e 64 65 78 4d 65 74  fts3BestIndexMet
1bd60 68 6f 64 2c 0a 20 20 2f 2a 20 78 44 69 73 63 6f  hod,.  /* xDisco
1bd70 6e 6e 65 63 74 20 20 20 2a 2f 20 66 74 73 33 44  nnect   */ fts3D
1bd80 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c  isconnectMethod,
1bd90 0a 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 20  .  /* xDestroy  
1bda0 20 20 20 20 2a 2f 20 66 74 73 33 44 65 73 74 72      */ fts3Destr
1bdb0 6f 79 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  oyMethod,.  /* x
1bdc0 4f 70 65 6e 20 20 20 20 20 20 20 20 20 2a 2f 20  Open         */ 
1bdd0 66 74 73 33 4f 70 65 6e 4d 65 74 68 6f 64 2c 0a  fts3OpenMethod,.
1bde0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20 20 20    /* xClose     
1bdf0 20 20 20 2a 2f 20 66 74 73 33 43 6c 6f 73 65 4d     */ fts3CloseM
1be00 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 46 69 6c  ethod,.  /* xFil
1be10 74 65 72 20 20 20 20 20 20 20 2a 2f 20 66 74 73  ter       */ fts
1be20 33 46 69 6c 74 65 72 4d 65 74 68 6f 64 2c 0a 20  3FilterMethod,. 
1be30 20 2f 2a 20 78 4e 65 78 74 20 20 20 20 20 20 20   /* xNext       
1be40 20 20 2a 2f 20 66 74 73 33 4e 65 78 74 4d 65 74    */ fts3NextMet
1be50 68 6f 64 2c 0a 20 20 2f 2a 20 78 45 6f 66 20 20  hod,.  /* xEof  
1be60 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 45          */ fts3E
1be70 6f 66 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  ofMethod,.  /* x
1be80 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f 20  Column       */ 
1be90 66 74 73 33 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64  fts3ColumnMethod
1bea0 2c 0a 20 20 2f 2a 20 78 52 6f 77 69 64 20 20 20  ,.  /* xRowid   
1beb0 20 20 20 20 20 2a 2f 20 66 74 73 33 52 6f 77 69       */ fts3Rowi
1bec0 64 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 55  dMethod,.  /* xU
1bed0 70 64 61 74 65 20 20 20 20 20 20 20 2a 2f 20 66  pdate       */ f
1bee0 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 2c  ts3UpdateMethod,
1bef0 0a 20 20 2f 2a 20 78 42 65 67 69 6e 20 20 20 20  .  /* xBegin    
1bf00 20 20 20 20 2a 2f 20 66 74 73 33 42 65 67 69 6e      */ fts3Begin
1bf10 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 53 79  Method,.  /* xSy
1bf20 6e 63 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74  nc         */ ft
1bf30 73 33 53 79 6e 63 4d 65 74 68 6f 64 2c 0a 20 20  s3SyncMethod,.  
1bf40 2f 2a 20 78 43 6f 6d 6d 69 74 20 20 20 20 20 20  /* xCommit      
1bf50 20 2a 2f 20 66 74 73 33 43 6f 6d 6d 69 74 4d 65   */ fts3CommitMe
1bf60 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52 6f 6c 6c  thod,.  /* xRoll
1bf70 62 61 63 6b 20 20 20 20 20 2a 2f 20 66 74 73 33  back     */ fts3
1bf80 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 2c 0a  RollbackMethod,.
1bf90 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
1bfa0 6f 6e 20 2a 2f 20 66 74 73 33 46 69 6e 64 46 75  on */ fts3FindFu
1bfb0 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 2c 0a 20 20  nctionMethod,.  
1bfc0 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 20 20 20  /* xRename */   
1bfd0 20 20 20 20 66 74 73 33 52 65 6e 61 6d 65 4d 65      fts3RenameMe
1bfe0 74 68 6f 64 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  thod,.};../*.** 
1bff0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c000 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20 74   registered as t
1c010 68 65 20 6d 6f 64 75 6c 65 20 64 65 73 74 72 75  he module destru
1c020 63 74 6f 72 20 28 63 61 6c 6c 65 64 20 77 68 65  ctor (called whe
1c030 6e 20 61 6e 0a 2a 2a 20 46 54 53 33 20 65 6e 61  n an.** FTS3 ena
1c040 62 6c 65 64 20 64 61 74 61 62 61 73 65 20 63 6f  bled database co
1c050 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nnection is clos
1c060 65 64 29 2e 20 49 74 20 66 72 65 65 73 20 74 68  ed). It frees th
1c070 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  e memory.** allo
1c080 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 74 6f  cated for the to
1c090 6b 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61 62  kenizer hash tab
1c0a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1c0b0 69 64 20 68 61 73 68 44 65 73 74 72 6f 79 28 76  id hashDestroy(v
1c0c0 6f 69 64 20 2a 70 29 7b 0a 20 20 46 74 73 33 48  oid *p){.  Fts3H
1c0d0 61 73 68 20 2a 70 48 61 73 68 20 3d 20 28 46 74  ash *pHash = (Ft
1c0e0 73 33 48 61 73 68 20 2a 29 70 3b 0a 20 20 73 71  s3Hash *)p;.  sq
1c0f0 6c 69 74 65 33 46 74 73 33 48 61 73 68 43 6c 65  lite3Fts3HashCle
1c100 61 72 28 70 48 61 73 68 29 3b 0a 20 20 73 71 6c  ar(pHash);.  sql
1c110 69 74 65 33 5f 66 72 65 65 28 70 48 61 73 68 29  ite3_free(pHash)
1c120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
1c130 74 73 33 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b  ts3 built-in tok
1c140 65 6e 69 7a 65 72 73 20 2d 20 22 73 69 6d 70 6c  enizers - "simpl
1c150 65 22 2c 20 22 70 6f 72 74 65 72 22 20 61 6e 64  e", "porter" and
1c160 20 22 69 63 75 22 2d 20 61 72 65 20 0a 2a 2a 20   "icu"- are .** 
1c170 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 66  implemented in f
1c180 69 6c 65 73 20 66 74 73 33 5f 74 6f 6b 65 6e 69  iles fts3_tokeni
1c190 7a 65 72 31 2e 63 2c 20 66 74 73 33 5f 70 6f 72  zer1.c, fts3_por
1c1a0 74 65 72 2e 63 20 61 6e 64 20 66 74 73 33 5f 69  ter.c and fts3_i
1c1b0 63 75 2e 63 0a 2a 2a 20 72 65 73 70 65 63 74 69  cu.c.** respecti
1c1c0 76 65 6c 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  vely. The follow
1c1d0 69 6e 67 20 74 68 72 65 65 20 66 6f 72 77 61 72  ing three forwar
1c1e0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61  d declarations a
1c1f0 72 65 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 73  re for functions
1c200 0a 2a 2a 20 64 65 63 6c 61 72 65 64 20 69 6e 20  .** declared in 
1c210 74 68 65 73 65 20 66 69 6c 65 73 20 75 73 65 64  these files used
1c220 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
1c230 20 72 65 73 70 65 63 74 69 76 65 20 69 6d 70 6c   respective impl
1c240 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2a 0a  ementations..**.
1c250 2a 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74  ** Calling sqlit
1c260 65 33 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b 65  e3Fts3SimpleToke
1c270 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 29 20 73 65  nizerModule() se
1c280 74 73 20 74 68 65 20 76 61 6c 75 65 20 70 6f 69  ts the value poi
1c290 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 74 68  nted.** to by th
1c2a0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 6f  e argument to po
1c2b0 69 6e 74 20 74 6f 20 74 68 65 20 22 73 69 6d 70  int to the "simp
1c2c0 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d  le" tokenizer im
1c2d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a  plementation..**
1c2e0 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2f 0a 76   And so on..*/.v
1c2f0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53  oid sqlite3Fts3S
1c300 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d 6f  impleTokenizerMo
1c310 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74 6f 6b  dule(sqlite3_tok
1c320 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f  enizer_module co
1c330 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b 0a  nst**ppModule);.
1c340 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
1c350 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 4d  PorterTokenizerM
1c360 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74 6f  odule(sqlite3_to
1c370 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63  kenizer_module c
1c380 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b  onst**ppModule);
1c390 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1c3a0 4e 41 42 4c 45 5f 49 43 55 0a 76 6f 69 64 20 73  NABLE_ICU.void s
1c3b0 71 6c 69 74 65 33 46 74 73 33 49 63 75 54 6f 6b  qlite3Fts3IcuTok
1c3c0 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73 71 6c  enizerModule(sql
1c3d0 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
1c3e0 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70 4d  odule const**ppM
1c3f0 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
1c400 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 73 65  /*.** Initialise
1c410 20 74 68 65 20 66 74 73 33 20 65 78 74 65 6e 73   the fts3 extens
1c420 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 65 78 74  ion. If this ext
1c430 65 6e 73 69 6f 6e 20 69 73 20 62 75 69 6c 74 20  ension is built 
1c440 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  as part.** of th
1c450 65 20 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79  e sqlite library
1c460 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1c470 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 64  tion is called d
1c480 69 72 65 63 74 6c 79 20 62 79 0a 2a 2a 20 53 51  irectly by.** SQ
1c490 4c 69 74 65 2e 20 49 66 20 66 74 73 33 20 69 73  Lite. If fts3 is
1c4a0 20 62 75 69 6c 74 20 61 73 20 61 20 64 79 6e 61   built as a dyna
1c4b0 6d 69 63 61 6c 6c 79 20 6c 6f 61 64 61 62 6c 65  mically loadable
1c4c0 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 69 73   extension, this
1c4d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
1c4e0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 73 71  called by the sq
1c4f0 6c 69 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e 5f  lite3_extension_
1c500 69 6e 69 74 28 29 20 65 6e 74 72 79 20 70 6f 69  init() entry poi
1c510 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1c520 65 33 46 74 73 33 49 6e 69 74 28 73 71 6c 69 74  e3Fts3Init(sqlit
1c530 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
1c540 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c550 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
1c560 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71   = 0;.  const sq
1c570 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
1c580 6d 6f 64 75 6c 65 20 2a 70 53 69 6d 70 6c 65 20  module *pSimple 
1c590 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  = 0;.  const sql
1c5a0 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
1c5b0 6f 64 75 6c 65 20 2a 70 50 6f 72 74 65 72 20 3d  odule *pPorter =
1c5c0 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
1c5d0 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20  TE_ENABLE_ICU.  
1c5e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74 6f  const sqlite3_to
1c5f0 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a  kenizer_module *
1c600 70 49 63 75 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pIcu = 0;.  sqli
1c610 74 65 33 46 74 73 33 49 63 75 54 6f 6b 65 6e 69  te3Fts3IcuTokeni
1c620 7a 65 72 4d 6f 64 75 6c 65 28 26 70 49 63 75 29  zerModule(&pIcu)
1c630 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
1c640 74 65 33 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b  te3Fts3SimpleTok
1c650 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70 53  enizerModule(&pS
1c660 69 6d 70 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  imple);.  sqlite
1c670 33 46 74 73 33 50 6f 72 74 65 72 54 6f 6b 65 6e  3Fts3PorterToken
1c680 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70 50 6f 72  izerModule(&pPor
1c690 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ter);..  /* Allo
1c6a0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
1c6b0 69 73 65 20 74 68 65 20 68 61 73 68 2d 74 61 62  ise the hash-tab
1c6c0 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  le used to store
1c6d0 20 74 6f 6b 65 6e 69 7a 65 72 73 2e 20 2a 2f 0a   tokenizers. */.
1c6e0 20 20 70 48 61 73 68 20 3d 20 73 71 6c 69 74 65    pHash = sqlite
1c6f0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
1c700 46 74 73 33 48 61 73 68 29 29 3b 0a 20 20 69 66  Fts3Hash));.  if
1c710 28 20 21 70 48 61 73 68 20 29 7b 0a 20 20 20 20  ( !pHash ){.    
1c720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c730 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
1c740 73 71 6c 69 74 65 33 46 74 73 33 48 61 73 68 49  sqlite3Fts3HashI
1c750 6e 69 74 28 70 48 61 73 68 2c 20 46 54 53 33 5f  nit(pHash, FTS3_
1c760 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b  HASH_STRING, 1);
1c770 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  .  }..  /* Load 
1c780 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b  the built-in tok
1c790 65 6e 69 7a 65 72 73 20 69 6e 74 6f 20 74 68 65  enizers into the
1c7a0 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
1c7b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c7c0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
1c7d0 6c 69 74 65 33 46 74 73 33 48 61 73 68 49 6e 73  lite3Fts3HashIns
1c7e0 65 72 74 28 70 48 61 73 68 2c 20 22 73 69 6d 70  ert(pHash, "simp
1c7f0 6c 65 22 2c 20 37 2c 20 28 76 6f 69 64 20 2a 29  le", 7, (void *)
1c800 70 53 69 6d 70 6c 65 29 0a 20 20 20 20 20 7c 7c  pSimple).     ||
1c810 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73 68   sqlite3Fts3Hash
1c820 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 22 70  Insert(pHash, "p
1c830 6f 72 74 65 72 22 2c 20 37 2c 20 28 76 6f 69 64  orter", 7, (void
1c840 20 2a 29 70 50 6f 72 74 65 72 29 20 0a 23 69 66   *)pPorter) .#if
1c850 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1c860 45 5f 49 43 55 0a 20 20 20 20 20 7c 7c 20 28 70  E_ICU.     || (p
1c870 49 63 75 20 26 26 20 73 71 6c 69 74 65 33 46 74  Icu && sqlite3Ft
1c880 73 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  s3HashInsert(pHa
1c890 73 68 2c 20 22 69 63 75 22 2c 20 34 2c 20 28 76  sh, "icu", 4, (v
1c8a0 6f 69 64 20 2a 29 70 49 63 75 29 29 0a 23 65 6e  oid *)pIcu)).#en
1c8b0 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
1c8c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c8d0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  EM;.    }.  }..#
1c8e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1c8f0 54 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  T.  if( rc==SQLI
1c900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1c910 3d 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70  = sqlite3Fts3Exp
1c920 72 49 6e 69 74 54 65 73 74 49 6e 74 65 72 66 61  rInitTestInterfa
1c930 63 65 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  ce(db);.  }.#end
1c940 69 66 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  if..  /* Create 
1c950 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1c960 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
1c970 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 20   the hash-table 
1c980 61 6e 64 20 6f 76 65 72 6c 6f 61 64 20 0a 20 20  and overload .  
1c990 2a 2a 20 74 68 65 20 74 77 6f 20 73 63 61 6c 61  ** the two scala
1c9a0 72 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 66 20  r functions. If 
1c9b0 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
1c9c0 75 6c 2c 20 72 65 67 69 73 74 65 72 20 74 68 65  ul, register the
1c9d0 0a 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 77 69 74  .  ** module wit
1c9e0 68 20 73 71 6c 69 74 65 2e 0a 20 20 2a 2f 0a 20  h sqlite..  */. 
1c9f0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
1ca00 72 63 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45  rc .   && SQLITE
1ca10 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
1ca20 65 33 46 74 73 33 49 6e 69 74 48 61 73 68 54 61  e3Fts3InitHashTa
1ca30 62 6c 65 28 64 62 2c 20 70 48 61 73 68 2c 20 22  ble(db, pHash, "
1ca40 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 29  fts3_tokenizer")
1ca50 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f  ).   && SQLITE_O
1ca60 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
1ca70 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
1ca80 6f 6e 28 64 62 2c 20 22 73 6e 69 70 70 65 74 22  on(db, "snippet"
1ca90 2c 20 2d 31 29 29 0a 20 20 20 26 26 20 53 51 4c  , -1)).   && SQL
1caa0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
1cab0 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
1cac0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6f 66 66  unction(db, "off
1cad0 73 65 74 73 22 2c 20 31 29 29 0a 20 20 20 26 26  sets", 1)).   &&
1cae0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
1caf0 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  = sqlite3_overlo
1cb00 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ad_function(db, 
1cb10 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 31 29 29  "matchinfo", 1))
1cb20 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  .   && SQLITE_OK
1cb30 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ==(rc = sqlite3_
1cb40 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
1cb50 6e 28 64 62 2c 20 22 6d 61 74 63 68 69 6e 66 6f  n(db, "matchinfo
1cb60 22 2c 20 32 29 29 0a 20 20 20 26 26 20 53 51 4c  ", 2)).   && SQL
1cb70 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
1cb80 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
1cb90 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6f 70 74  unction(db, "opt
1cba0 69 6d 69 7a 65 22 2c 20 31 29 29 0a 20 20 29 7b  imize", 1)).  ){
1cbb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1cbc0 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f  3_create_module_
1cbd0 76 32 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  v2(.        db, 
1cbe0 22 66 74 73 33 22 2c 20 26 66 74 73 33 4d 6f 64  "fts3", &fts3Mod
1cbf0 75 6c 65 2c 20 28 76 6f 69 64 20 2a 29 70 48 61  ule, (void *)pHa
1cc00 73 68 2c 20 68 61 73 68 44 65 73 74 72 6f 79 0a  sh, hashDestroy.
1cc10 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
1cc20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cc30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1cc40 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
1cc50 5f 76 32 28 0a 20 20 20 20 20 20 20 20 20 20 64  _v2(.          d
1cc60 62 2c 20 22 66 74 73 34 22 2c 20 26 66 74 73 33  b, "fts4", &fts3
1cc70 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 20 2a 29  Module, (void *)
1cc80 70 48 61 73 68 2c 20 30 0a 20 20 20 20 20 20 29  pHash, 0.      )
1cc90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1cca0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1ccb0 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
1ccc0 63 75 72 72 65 64 2e 20 44 65 6c 65 74 65 20 74  curred. Delete t
1ccd0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  he hash table an
1cce0 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1ccf0 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 61 73  or code. */.  as
1cd00 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1cd10 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 48 61  _OK );.  if( pHa
1cd20 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sh ){.    sqlite
1cd30 33 46 74 73 33 48 61 73 68 43 6c 65 61 72 28 70  3Fts3HashClear(p
1cd40 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Hash);.    sqlit
1cd50 65 33 5f 66 72 65 65 28 70 48 61 73 68 29 3b 0a  e3_free(pHash);.
1cd60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1cd70 0a 7d 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .}..#if !SQLITE_
1cd80 43 4f 52 45 0a 69 6e 74 20 73 71 6c 69 74 65 33  CORE.int sqlite3
1cd90 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 28  _extension_init(
1cda0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1cdb0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
1cdc0 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  sg,.  const sqli
1cdd0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
1cde0 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49   *pApi.){.  SQLI
1cdf0 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
1ce00 54 32 28 70 41 70 69 29 0a 20 20 72 65 74 75 72  T2(pApi).  retur
1ce10 6e 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  n sqlite3Fts3Ini
1ce20 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  t(db);.}.#endif.
1ce30 0a 23 65 6e 64 69 66 0a                          .#endif.