/ Hex Artifact Content
Login

Artifact 51948505e018316cf0b76d249cdd87e409254e8f:


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 0a 20 20 2f 2a 20 46 72 65 65  =0 );..  /* Free
40a0: 20 61 6e 79 20 70 72 65 70 61 72 65 64 20 73 74   any prepared st
40b0: 61 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 2a 2f  atements held */
40c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 69  .  for(i=0; i<Si
40d0: 7a 65 6f 66 41 72 72 61 79 28 70 2d 3e 61 53 74  zeofArray(p->aSt
40e0: 6d 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  mt); i++){.    s
40f0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
4100: 70 2d 3e 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20  p->aStmt[i]);.  
4110: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
4120: 2d 3e 6e 4c 65 61 76 65 73 53 74 6d 74 3b 20 69  ->nLeavesStmt; i
4130: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4140: 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 61 4c 65  _finalize(p->aLe
4150: 61 76 65 73 53 74 6d 74 5b 69 5d 29 3b 0a 20 20  avesStmt[i]);.  
4160: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
4170: 28 70 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76 65  (p->zSelectLeave
4180: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  s);.  sqlite3_fr
4190: 65 65 28 70 2d 3e 61 4c 65 61 76 65 73 53 74 6d  ee(p->aLeavesStm
41a0: 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  t);..  /* Invoke
41b0: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 64   the tokenizer d
41c0: 65 73 74 72 75 63 74 6f 72 20 74 6f 20 66 72 65  estructor to fre
41d0: 65 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 2e  e the tokenizer.
41e0: 20 2a 2f 0a 20 20 70 2d 3e 70 54 6f 6b 65 6e 69   */.  p->pTokeni
41f0: 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44  zer->pModule->xD
4200: 65 73 74 72 6f 79 28 70 2d 3e 70 54 6f 6b 65 6e  estroy(p->pToken
4210: 69 7a 65 72 29 3b 0a 0a 20 20 73 71 6c 69 74 65  izer);..  sqlite
4220: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
4230: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4240: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
4250: 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53 51  t one or more SQ
4260: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f  L statements fro
4270: 6d 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  m the format str
4280: 69 6e 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e 64  ing given.** and
4290: 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74   then evaluate t
42a0: 68 6f 73 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  hose statements.
42b0: 20 20 54 68 65 20 73 75 63 63 65 73 73 20 63 6f    The success co
42c0: 64 65 20 69 73 20 77 72 69 74 74 69 6e 67 0a 2a  de is writting.*
42d0: 2a 20 69 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a  * into *pRc..**.
42e0: 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 69 6e  ** If *pRc is in
42f0: 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f  itially non-zero
4300: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
4310: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
4320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
4330: 73 33 44 62 45 78 65 63 28 0a 20 20 69 6e 74 20  s3DbExec(.  int 
4340: 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
4350: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
4360: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  de */.  sqlite3 
4370: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
4380: 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68  * Database in wh
4390: 69 63 68 20 74 6f 20 72 75 6e 20 53 51 4c 20 2a  ich to run SQL *
43a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
43b0: 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a 20 46 6f  zFormat,   /* Fo
43c0: 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72 20  rmat string for 
43d0: 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20  SQL */.  ...    
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
4400: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
4410: 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69 73  g */.){.  va_lis
4420: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
4430: 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52 63 20 29  ql;.  if( *pRc )
4440: 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74   return;.  va_st
4450: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
4460: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
4470: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
4480: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
4490: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53  nd(ap);.  if( zS
44a0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ql==0 ){.    *pR
44b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
44c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
44d0: 70 52 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  pRc = sqlite3_ex
44e0: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  ec(db, zSql, 0, 
44f0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4500: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
4510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
4520: 78 44 65 73 74 72 6f 79 28 29 20 76 69 72 74 75  xDestroy() virtu
4530: 61 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e  al table method.
4540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
4550: 74 73 33 44 65 73 74 72 6f 79 4d 65 74 68 6f 64  ts3DestroyMethod
4560: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
4570: 56 74 61 62 29 7b 0a 20 20 69 6e 74 20 72 63 20  Vtab){.  int rc 
4580: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
4590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
45a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
45b0: 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
45c0: 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b  s3Table *)pVtab;
45d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
45e0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 44 72   p->db;..  /* Dr
45f0: 6f 70 20 74 68 65 20 73 68 61 64 6f 77 20 74 61  op the shadow ta
4600: 62 6c 65 73 20 2a 2f 0a 20 20 66 74 73 33 44 62  bles */.  fts3Db
4610: 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 22 44  Exec(&rc, db, "D
4620: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
4630: 53 54 53 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  STS %Q.'%q_conte
4640: 6e 74 27 22 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d  nt'", p->zDb, p-
4650: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73 33 44  >zName);.  fts3D
4660: 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 22  bExec(&rc, db, "
4670: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
4680: 49 53 54 53 20 25 51 2e 27 25 71 5f 73 65 67 6d  ISTS %Q.'%q_segm
4690: 65 6e 74 73 27 22 2c 20 70 2d 3e 7a 44 62 2c 70  ents'", p->zDb,p
46a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73 33  ->zName);.  fts3
46b0: 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20  DbExec(&rc, db, 
46c0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
46d0: 58 49 53 54 53 20 25 51 2e 27 25 71 5f 73 65 67  XISTS %Q.'%q_seg
46e0: 64 69 72 27 22 2c 20 70 2d 3e 7a 44 62 2c 20 70  dir'", p->zDb, p
46f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73 33  ->zName);.  fts3
4700: 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20  DbExec(&rc, db, 
4710: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
4720: 58 49 53 54 53 20 25 51 2e 27 25 71 5f 64 6f 63  XISTS %Q.'%q_doc
4730: 73 69 7a 65 27 22 2c 20 70 2d 3e 7a 44 62 2c 20  size'", p->zDb, 
4740: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73  p->zName);.  fts
4750: 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  3DbExec(&rc, db,
4760: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
4770: 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 73 74  EXISTS %Q.'%q_st
4780: 61 74 27 22 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d  at'", p->zDb, p-
4790: 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49  >zName);..  /* I
47a0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 68 61 73  f everything has
47b0: 20 77 6f 72 6b 65 64 2c 20 69 6e 76 6f 6b 65 20   worked, invoke 
47c0: 66 74 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d 65  fts3DisconnectMe
47d0: 74 68 6f 64 28 29 20 74 6f 20 66 72 65 65 20 74  thod() to free t
47e0: 68 65 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61  he.  ** memory a
47f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4800: 68 65 20 46 74 73 33 54 61 62 6c 65 20 73 74 72  he Fts3Table str
4810: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
4820: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
4830: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
4840: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
4850: 72 6f 72 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ror code..  */. 
4860: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
4870: 49 54 45 5f 4f 4b 20 3f 20 66 74 73 33 44 69 73  ITE_OK ? fts3Dis
4880: 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 70 56  connectMethod(pV
4890: 74 61 62 29 20 3a 20 72 63 29 3b 0a 7d 0a 0a 0a  tab) : rc);.}...
48a0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  /*.** Invoke sql
48b0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
48c0: 62 28 29 20 74 6f 20 64 65 63 6c 61 72 65 20 74  b() to declare t
48d0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
48e0: 65 20 46 54 53 33 20 74 61 62 6c 65 0a 2a 2a 20  e FTS3 table.** 
48f0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
4900: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
4910: 69 73 20 69 73 20 64 6f 6e 65 20 61 73 20 70 61  is is done as pa
4920: 72 74 20 6f 66 20 74 68 65 20 78 43 6f 6e 6e 65  rt of the xConne
4930: 63 74 28 29 0a 2a 2a 20 61 6e 64 20 78 43 72 65  ct().** and xCre
4940: 61 74 65 28 29 20 6d 65 74 68 6f 64 73 2e 0a 2a  ate() methods..*
4950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
4960: 33 44 65 63 6c 61 72 65 56 74 61 62 28 46 74 73  3DeclareVtab(Fts
4970: 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  3Table *p){.  in
4980: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
49a0: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
49b0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
49e0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  n code */.  char
49f0: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4a10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  QL statement pas
4a20: 73 65 64 20 74 6f 20 64 65 63 6c 61 72 65 5f 76  sed to declare_v
4a30: 74 61 62 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  tab() */.  char 
4a40: 2a 7a 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  *zCols;         
4a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
4a60: 73 74 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e  st of user defin
4a70: 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  ed columns */.. 
4a80: 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 69 73   /* Create a lis
4a90: 74 20 6f 66 20 75 73 65 72 20 63 6f 6c 75 6d 6e  t of user column
4aa0: 73 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61  s for the virtua
4ab0: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7a 43 6f  l table */.  zCo
4ac0: 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ls = sqlite3_mpr
4ad0: 69 6e 74 66 28 22 25 51 2c 20 22 2c 20 70 2d 3e  intf("%Q, ", p->
4ae0: 61 7a 43 6f 6c 75 6d 6e 5b 30 5d 29 3b 0a 20 20  azColumn[0]);.  
4af0: 66 6f 72 28 69 3d 31 3b 20 7a 43 6f 6c 73 20 26  for(i=1; zCols &
4b00: 26 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  & i<p->nColumn; 
4b10: 69 2b 2b 29 7b 0a 20 20 20 20 7a 43 6f 6c 73 20  i++){.    zCols 
4b20: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4b30: 66 28 22 25 7a 25 51 2c 20 22 2c 20 7a 43 6f 6c  f("%z%Q, ", zCol
4b40: 73 2c 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 69  s, p->azColumn[i
4b50: 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72  ]);.  }..  /* Cr
4b60: 65 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20 22  eate the whole "
4b70: 43 52 45 41 54 45 20 54 41 42 4c 45 22 20 73 74  CREATE TABLE" st
4b80: 61 74 65 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  atement to pass 
4b90: 74 6f 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 7a  to SQLite */.  z
4ba0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
4bb0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 52  rintf(.      "CR
4bc0: 45 41 54 45 20 54 41 42 4c 45 20 78 28 25 73 20  EATE TABLE x(%s 
4bd0: 25 51 20 48 49 44 44 45 4e 2c 20 64 6f 63 69 64  %Q HIDDEN, docid
4be0: 20 48 49 44 44 45 4e 29 22 2c 20 7a 43 6f 6c 73   HIDDEN)", zCols
4bf0: 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a  , p->zName.  );.
4c00: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 73 20 7c 7c  .  if( !zCols ||
4c10: 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 63   !zSql ){.    rc
4c20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4c30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
4c40: 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61   = sqlite3_decla
4c50: 72 65 5f 76 74 61 62 28 70 2d 3e 64 62 2c 20 7a  re_vtab(p->db, z
4c60: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  Sql);.  }..  sql
4c70: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
4c80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4c90: 7a 43 6f 6c 73 29 3b 0a 20 20 72 65 74 75 72 6e  zCols);.  return
4ca0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
4cb0: 65 61 74 65 20 74 68 65 20 62 61 63 6b 69 6e 67  eate the backing
4cc0: 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 28 25   store tables (%
4cd0: 5f 63 6f 6e 74 65 6e 74 2c 20 25 5f 73 65 67 6d  _content, %_segm
4ce0: 65 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69  ents and %_segdi
4cf0: 72 29 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 62  r).** required b
4d00: 79 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  y the FTS3 table
4d10: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
4d20: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  nly argument. Th
4d30: 69 73 20 69 73 20 64 6f 6e 65 0a 2a 2a 20 61 73  is is done.** as
4d40: 20 70 61 72 74 20 6f 66 20 74 68 65 20 76 74 61   part of the vta
4d50: 62 20 78 43 72 65 61 74 65 28 29 20 6d 65 74 68  b xCreate() meth
4d60: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  od..**.** If the
4d70: 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20   p->bHasDocsize 
4d80: 62 6f 6f 6c 65 61 6e 20 69 73 20 74 72 75 65 20  boolean is true 
4d90: 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74  (indicating that
4da0: 20 74 68 69 73 20 69 73 20 61 6e 0a 2a 2a 20 46   this is an.** F
4db0: 54 53 34 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  TS4 table, not a
4dc0: 6e 20 46 54 53 33 20 74 61 62 6c 65 29 20 74 68  n FTS3 table) th
4dd0: 65 6e 20 61 6c 73 6f 20 63 72 65 61 74 65 20 74  en also create t
4de0: 68 65 20 25 5f 64 6f 63 73 69 7a 65 20 61 6e 64  he %_docsize and
4df0: 0a 2a 2a 20 25 5f 73 74 61 74 20 74 61 62 6c 65  .** %_stat table
4e00: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 46 54  s required by FT
4e10: 53 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  S4..*/.static in
4e20: 74 20 66 74 73 33 43 72 65 61 74 65 54 61 62 6c  t fts3CreateTabl
4e30: 65 73 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  es(Fts3Table *p)
4e40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4e50: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
4e60: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
4e70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
4ea0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
4eb0: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74    char *zContent
4ec0: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  Cols;           
4ed0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20    /* Columns of 
4ee0: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  %_content table 
4ef0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4f00: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
4f10: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
4f20: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
4f30: 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  */..  /* Create 
4f40: 61 20 6c 69 73 74 20 6f 66 20 75 73 65 72 20 63  a list of user c
4f50: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20 63  olumns for the c
4f60: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  ontent table */.
4f70: 20 20 69 66 28 20 70 2d 3e 62 48 61 73 43 6f 6e    if( p->bHasCon
4f80: 74 65 6e 74 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  tent ){.    zCon
4f90: 74 65 6e 74 43 6f 6c 73 20 3d 20 73 71 6c 69 74  tentCols = sqlit
4fa0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 6f 63 69  e3_mprintf("doci
4fb0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
4fc0: 59 20 4b 45 59 22 29 3b 0a 20 20 20 20 66 6f 72  Y KEY");.    for
4fd0: 28 69 3d 30 3b 20 7a 43 6f 6e 74 65 6e 74 43 6f  (i=0; zContentCo
4fe0: 6c 73 20 26 26 20 69 3c 70 2d 3e 6e 43 6f 6c 75  ls && i<p->nColu
4ff0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5000: 63 68 61 72 20 2a 7a 20 3d 20 70 2d 3e 61 7a 43  char *z = p->azC
5010: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
5020: 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 20 3d 20 73  zContentCols = s
5030: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5040: 25 7a 2c 20 27 63 25 64 25 71 27 22 2c 20 7a 43  %z, 'c%d%q'", zC
5050: 6f 6e 74 65 6e 74 43 6f 6c 73 2c 20 69 2c 20 7a  ontentCols, i, z
5060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5070: 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 3d 3d 30   zContentCols==0
5080: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
5090: 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  OMEM;..    /* Cr
50a0: 65 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  eate the content
50b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 74   table */.    ft
50c0: 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  s3DbExec(&rc, db
50d0: 2c 20 0a 20 20 20 20 20 20 20 22 43 52 45 41 54  , .       "CREAT
50e0: 45 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 63  E TABLE %Q.'%q_c
50f0: 6f 6e 74 65 6e 74 27 28 25 73 29 22 2c 0a 20 20  ontent'(%s)",.  
5100: 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e       p->zDb, p->
5110: 7a 4e 61 6d 65 2c 20 7a 43 6f 6e 74 65 6e 74 43  zName, zContentC
5120: 6f 6c 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ols.    );.    s
5130: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
5140: 74 65 6e 74 43 6f 6c 73 29 3b 0a 20 20 7d 0a 20  tentCols);.  }. 
5150: 20 2f 2a 20 43 72 65 61 74 65 20 6f 74 68 65 72   /* Create other
5160: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 66 74 73   tables */.  fts
5170: 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  3DbExec(&rc, db,
5180: 20 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20   .      "CREATE 
5190: 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73 65 67  TABLE %Q.'%q_seg
51a0: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49  ments'(blockid I
51b0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
51c0: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
51d0: 22 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c  ",.      p->zDb,
51e0: 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20   p->zName.  );. 
51f0: 20 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c   fts3DbExec(&rc,
5200: 20 64 62 2c 20 0a 20 20 20 20 20 20 22 43 52 45   db, .      "CRE
5210: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 27 25 71  ATE TABLE %Q.'%q
5220: 5f 73 65 67 64 69 72 27 28 22 0a 20 20 20 20 20  _segdir'(".     
5230: 20 20 20 22 6c 65 76 65 6c 20 49 4e 54 45 47 45     "level INTEGE
5240: 52 2c 22 0a 20 20 20 20 20 20 20 20 22 69 64 78  R,".        "idx
5250: 20 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20   INTEGER,".     
5260: 20 20 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 20     "start_block 
5270: 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20  INTEGER,".      
5280: 20 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c    "leaves_end_bl
5290: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 22 0a 20 20  ock INTEGER,".  
52a0: 20 20 20 20 20 20 22 65 6e 64 5f 62 6c 6f 63 6b        "end_block
52b0: 20 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20   INTEGER,".     
52c0: 20 20 20 22 72 6f 6f 74 20 42 4c 4f 42 2c 22 0a     "root BLOB,".
52d0: 20 20 20 20 20 20 20 20 22 50 52 49 4d 41 52 59          "PRIMARY
52e0: 20 4b 45 59 28 6c 65 76 65 6c 2c 20 69 64 78 29   KEY(level, idx)
52f0: 22 0a 20 20 20 20 20 20 22 29 3b 22 2c 0a 20 20  ".      ");",.  
5300: 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a      p->zDb, p->z
5310: 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28 20  Name.  );.  if( 
5320: 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29  p->bHasDocsize )
5330: 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78 65 63  {.    fts3DbExec
5340: 28 26 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20  (&rc, db, .     
5350: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
5360: 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27   %Q.'%q_docsize'
5370: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50  (docid INTEGER P
5380: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65  RIMARY KEY, size
5390: 20 42 4c 4f 42 29 3b 22 2c 0a 20 20 20 20 20 20   BLOB);",.      
53a0: 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
53b0: 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 74  me.    );.    ft
53c0: 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  s3DbExec(&rc, db
53d0: 2c 20 0a 20 20 20 20 20 20 20 20 22 43 52 45 41  , .        "CREA
53e0: 54 45 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f  TE TABLE %Q.'%q_
53f0: 73 74 61 74 27 28 69 64 20 49 4e 54 45 47 45 52  stat'(id INTEGER
5400: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 61   PRIMARY KEY, va
5410: 6c 75 65 20 42 4c 4f 42 29 3b 22 2c 0a 20 20 20  lue BLOB);",.   
5420: 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e       p->zDb, p->
5430: 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
5440: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5450: 0a 2f 2a 0a 2a 2a 20 41 6e 20 73 71 6c 69 74 65  ./*.** An sqlite
5460: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 62 61 63  3_exec() callbac
5470: 6b 20 66 6f 72 20 66 74 73 33 54 61 62 6c 65 45  k for fts3TableE
5480: 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  xists..*/.static
5490: 20 69 6e 74 20 66 74 73 33 54 61 62 6c 65 45 78   int fts3TableEx
54a0: 69 73 74 73 43 61 6c 6c 62 61 63 6b 28 76 6f 69  istsCallback(voi
54b0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 2c 20  d *pArg, int n, 
54c0: 63 68 61 72 20 2a 2a 70 70 31 2c 20 63 68 61 72  char **pp1, char
54d0: 20 2a 2a 70 70 32 29 7b 0a 20 20 55 4e 55 53 45   **pp2){.  UNUSE
54e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 0a  D_PARAMETER(n);.
54f0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
5500: 45 52 28 70 70 31 29 3b 0a 20 20 55 4e 55 53 45  ER(pp1);.  UNUSE
5510: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 70 32 29  D_PARAMETER(pp2)
5520: 3b 0a 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20  ;.  *(int*)pArg 
5530: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  = 1;.  return 1;
5540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
5550: 69 6e 65 20 69 66 20 61 20 74 61 62 6c 65 20 63  ine if a table c
5560: 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20  urrently exists 
5570: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
5580: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5590: 66 74 73 33 54 61 62 6c 65 45 78 69 73 74 73 28  fts3TableExists(
55a0: 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
55b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63           /* Succ
55c0: 65 73 73 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  ess code */.  sq
55d0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
55e0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
55f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
5600: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 63 6f 6e 73  o test */.  cons
5610: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
5620: 20 20 2f 2a 20 41 54 54 41 43 48 65 64 20 64 61    /* ATTACHed da
5630: 74 61 62 61 73 65 20 77 69 74 68 69 6e 20 74 68  tabase within th
5640: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
5650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5660: 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame,    /* Name 
5670: 6f 66 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  of the FTS3 tabl
5680: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
5690: 72 20 2a 7a 53 75 66 66 69 78 2c 20 20 2f 2a 20  r *zSuffix,  /* 
56a0: 53 68 61 64 6f 77 20 74 61 62 6c 65 20 65 78 74  Shadow table ext
56b0: 65 6e 73 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a  ension */.  u8 *
56c0: 70 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20  pResult         
56d0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
56e0: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
56f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5700: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  OK;.  int res = 
5710: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  0;.  char *zSql;
5720: 0a 20 20 69 66 28 20 2a 70 52 63 20 29 20 72 65  .  if( *pRc ) re
5730: 74 75 72 6e 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  turn;.  zSql = s
5740: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
5750: 20 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 52      "SELECT 1 FR
5760: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 6d 61 73  OM %Q.sqlite_mas
5770: 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 3d 27  ter WHERE name='
5780: 25 71 25 73 27 22 2c 0a 20 20 20 20 7a 44 62 2c  %q%s'",.    zDb,
5790: 20 7a 4e 61 6d 65 2c 20 7a 53 75 66 66 69 78 0a   zName, zSuffix.
57a0: 20 20 29 3b 20 20 20 20 0a 20 20 72 63 20 3d 20    );    .  rc = 
57b0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
57c0: 20 7a 53 71 6c 2c 20 66 74 73 33 54 61 62 6c 65   zSql, fts3Table
57d0: 45 78 69 73 74 73 43 61 6c 6c 62 61 63 6b 2c 20  ExistsCallback, 
57e0: 26 72 65 73 2c 20 30 29 3b 0a 20 20 73 71 6c 69  &res, 0);.  sqli
57f0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
5800: 20 20 2a 70 52 65 73 75 6c 74 20 3d 20 28 75 38    *pResult = (u8
5810: 29 28 72 65 73 20 26 20 30 78 66 66 29 3b 0a 20  )(res & 0xff);. 
5820: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5830: 41 42 4f 52 54 20 29 20 2a 70 52 63 20 3d 20 72  ABORT ) *pRc = r
5840: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
5850: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
5860: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
5870: 6f 66 20 62 6f 74 68 20 74 68 65 20 78 43 6f 6e  of both the xCon
5880: 6e 65 63 74 20 61 6e 64 20 78 43 72 65 61 74 65  nect and xCreate
5890: 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  .** methods of t
58a0: 68 65 20 46 54 53 33 20 76 69 72 74 75 61 6c 20  he FTS3 virtual 
58b0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
58c0: 20 61 72 67 76 5b 5d 20 61 72 72 61 79 20 63 6f   argv[] array co
58d0: 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f  ntains the follo
58e0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72  wing:.**.**   ar
58f0: 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c  gv[0]   -> modul
5900: 65 20 6e 61 6d 65 20 20 28 22 66 74 73 33 22 20  e name  ("fts3" 
5910: 6f 72 20 22 66 74 73 34 22 29 0a 2a 2a 20 20 20  or "fts4").**   
5920: 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74  argv[1]   -> dat
5930: 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  abase name.**   
5940: 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62  argv[2]   -> tab
5950: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67  le name.**   arg
5960: 76 5b 2e 2e 2e 5d 20 2d 3e 20 22 63 6f 6c 75 6d  v[...] -> "colum
5970: 6e 20 6e 61 6d 65 22 20 61 6e 64 20 6f 74 68 65  n name" and othe
5980: 72 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e  r module argumen
5990: 74 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 61  t fields..*/.sta
59a0: 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 69 74  tic int fts3Init
59b0: 56 74 61 62 28 0a 20 20 69 6e 74 20 69 73 43 72  Vtab(.  int isCr
59c0: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
59d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
59e0: 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66 61 6c  for xCreate, fal
59f0: 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63 74 20  se for xConnect 
5a00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5a20: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 51 4c 69       /* The SQLi
5a30: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
5a40: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  ection */.  void
5a50: 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20 20   *pAux,         
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
5a70: 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ash table contai
5a80: 6e 69 6e 67 20 74 6f 6b 65 6e 69 7a 65 72 73 20  ning tokenizers 
5a90: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5ac0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72  f elements in ar
5ad0: 67 76 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 6f  gv array */.  co
5ae0: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
5af0: 20 2a 61 72 67 76 2c 20 20 20 20 20 20 20 2f 2a   *argv,       /*
5b00: 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63   xCreate/xConnec
5b10: 74 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79  t argument array
5b20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   */.  sqlite3_vt
5b30: 61 62 20 2a 2a 70 70 56 54 61 62 2c 20 20 20 20  ab **ppVTab,    
5b40: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
5b50: 68 65 20 72 65 73 75 6c 74 69 6e 67 20 76 74 61  he resulting vta
5b60: 62 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  b structure here
5b70: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
5b80: 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
5b90: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61        /* Write a
5ba0: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
5bb0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   here */.){.  Ft
5bc0: 73 33 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s3Hash *pHash = 
5bd0: 28 46 74 73 33 48 61 73 68 20 2a 29 70 41 75 78  (Fts3Hash *)pAux
5be0: 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  ;.  Fts3Table *p
5bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5c00: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
5c10: 6f 20 61 6c 6c 6f 63 61 74 65 64 20 76 74 61 62  o allocated vtab
5c20: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
5c50: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
5c80: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
5c90: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
5cc0: 6c 6c 6f 63 61 74 69 6f 6e 20 75 73 65 64 20 66  llocation used f
5cd0: 6f 72 20 2a 70 20 2a 2f 0a 20 20 69 6e 74 20 69  or *p */.  int i
5ce0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
5cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
5d00: 6c 75 6d 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  lumn index */.  
5d10: 69 6e 74 20 6e 53 74 72 69 6e 67 20 3d 20 30 3b  int nString = 0;
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 2f 2a 20 42 79 74 65 73 20 72 65 71 75 69 72 65  /* Bytes require
5d40: 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 63 6f  d to hold all co
5d50: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
5d60: 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 20 20 20  int nCol = 0;   
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
5d90: 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20  umns in the FTS 
5da0: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  table */.  char 
5db0: 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *zCsr;          
5dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
5dd0: 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
5de0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
5df0: 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 2f 2a 20 42 79 74 65 73 20 72 65 71 75 69    /* Bytes requi
5e20: 72 65 64 20 74 6f 20 68 6f 6c 64 20 64 61 74 61  red to hold data
5e30: 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  base name */.  i
5e40: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e60: 2a 20 42 79 74 65 73 20 72 65 71 75 69 72 65 64  * Bytes required
5e70: 20 74 6f 20 68 6f 6c 64 20 74 61 62 6c 65 20 6e   to hold table n
5e80: 61 6d 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20  ame */..  const 
5e90: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 69 7a 65 72  char *zTokenizer
5ea0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5eb0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5ec0: 6f 6b 65 6e 69 7a 65 72 20 74 6f 20 75 73 65 20  okenizer to use 
5ed0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  */.  sqlite3_tok
5ee0: 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a  enizer *pTokeniz
5ef0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  er = 0;        /
5f00: 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 66 6f 72 20  * Tokenizer for 
5f10: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  this table */.. 
5f20: 20 6e 44 62 20 3d 20 28 69 6e 74 29 73 74 72 6c   nDb = (int)strl
5f30: 65 6e 28 61 72 67 76 5b 31 5d 29 20 2b 20 31 3b  en(argv[1]) + 1;
5f40: 0a 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29  .  nName = (int)
5f50: 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d 29 20  strlen(argv[2]) 
5f60: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 33 3b 20  + 1;.  for(i=3; 
5f70: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
5f80: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 20    char const *z 
5f90: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 72  = argv[i];.    r
5fa0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
5fb0: 6e 69 74 54 6f 6b 65 6e 69 7a 65 72 28 70 48 61  nitTokenizer(pHa
5fc0: 73 68 2c 20 7a 2c 20 26 70 54 6f 6b 65 6e 69 7a  sh, z, &pTokeniz
5fd0: 65 72 2c 20 26 7a 54 6f 6b 65 6e 69 7a 65 72 2c  er, &zTokenizer,
5fe0: 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   pzErr);.    if(
5ff0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6000: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
6010: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
6020: 20 7a 21 3d 7a 54 6f 6b 65 6e 69 7a 65 72 20 29   z!=zTokenizer )
6030: 7b 0a 20 20 20 20 20 20 6e 53 74 72 69 6e 67 20  {.      nString 
6040: 2b 3d 20 28 69 6e 74 29 28 73 74 72 6c 65 6e 28  += (int)(strlen(
6050: 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20  z) + 1);.    }. 
6060: 20 7d 0a 20 20 6e 43 6f 6c 20 3d 20 61 72 67 63   }.  nCol = argc
6070: 20 2d 20 33 20 2d 20 28 7a 54 6f 6b 65 6e 69 7a   - 3 - (zTokeniz
6080: 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 7a 54  er!=0);.  if( zT
6090: 6f 6b 65 6e 69 7a 65 72 3d 3d 30 20 29 7b 0a 20  okenizer==0 ){. 
60a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
60b0: 74 73 33 49 6e 69 74 54 6f 6b 65 6e 69 7a 65 72  ts3InitTokenizer
60c0: 28 70 48 61 73 68 2c 20 30 2c 20 26 70 54 6f 6b  (pHash, 0, &pTok
60d0: 65 6e 69 7a 65 72 2c 20 30 2c 20 70 7a 45 72 72  enizer, 0, pzErr
60e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
60f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6100: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6110: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
6120: 54 6f 6b 65 6e 69 7a 65 72 20 29 3b 0a 20 20 7d  Tokenizer );.  }
6130: 0a 0a 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20  ..  if( nCol==0 
6140: 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b  ){.    nCol = 1;
6150: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
6160: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
6170: 20 74 68 65 20 46 74 73 33 54 61 62 6c 65 20 73   the Fts3Table s
6180: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 6e  tructure. */.  n
6190: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
61a0: 73 33 54 61 62 6c 65 29 20 2b 20 20 20 20 20 20  s3Table) +      
61b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 54          /* Fts3T
61c0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
61d0: 20 20 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66 28    nCol * sizeof(
61e0: 63 68 61 72 20 2a 29 20 2b 20 20 20 20 20 20 20  char *) +       
61f0: 20 20 20 20 20 20 20 2f 2a 20 61 7a 43 6f 6c 75         /* azColu
6200: 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  mn */.          
6210: 6e 4e 61 6d 65 20 2b 20 20 20 20 20 20 20 20 20  nName +         
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
6240: 0a 20 20 20 20 20 20 20 20 20 20 6e 44 62 20 2b  .          nDb +
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 2f 2a 20 7a 44 62 20 2a 2f 0a 20 20 20 20 20 20  /* zDb */.      
6280: 20 20 20 20 6e 53 74 72 69 6e 67 3b 20 20 20 20      nString;    
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
62b0: 65 20 66 6f 72 20 61 7a 43 6f 6c 75 6d 6e 20 73  e for azColumn s
62c0: 74 72 69 6e 67 73 20 2a 2f 0a 20 20 70 20 3d 20  trings */.  p = 
62d0: 28 46 74 73 33 54 61 62 6c 65 2a 29 73 71 6c 69  (Fts3Table*)sqli
62e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
62f0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
6300: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6310: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
6320: 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a   fts3_init_out;.
6330: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
6340: 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 70 2d  0, nByte);..  p-
6350: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 2d 3e 6e  >db = db;.  p->n
6360: 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
6370: 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
6380: 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c   = 0;.  p->azCol
6390: 75 6d 6e 20 3d 20 28 63 68 61 72 20 2a 2a 29 26  umn = (char **)&
63a0: 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 54 6f 6b 65  p[1];.  p->pToke
63b0: 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69 7a  nizer = pTokeniz
63c0: 65 72 3b 0a 20 20 70 2d 3e 6e 4e 6f 64 65 53 69  er;.  p->nNodeSi
63d0: 7a 65 20 3d 20 31 30 30 30 3b 0a 20 20 70 2d 3e  ze = 1000;.  p->
63e0: 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20  nMaxPendingData 
63f0: 3d 20 46 54 53 33 5f 4d 41 58 5f 50 45 4e 44 49  = FTS3_MAX_PENDI
6400: 4e 47 5f 44 41 54 41 3b 0a 20 20 7a 43 73 72 20  NG_DATA;.  zCsr 
6410: 3d 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 61 7a  = (char *)&p->az
6420: 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 3b 0a 0a 20  Column[nCol];.. 
6430: 20 66 74 73 33 48 61 73 68 49 6e 69 74 28 26 70   fts3HashInit(&p
6440: 2d 3e 70 65 6e 64 69 6e 67 54 65 72 6d 73 2c 20  ->pendingTerms, 
6450: 46 54 53 33 5f 48 41 53 48 5f 53 54 52 49 4e 47  FTS3_HASH_STRING
6460: 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  , 1);..  /* Fill
6470: 20 69 6e 20 74 68 65 20 7a 4e 61 6d 65 20 61 6e   in the zName an
6480: 64 20 7a 44 62 20 66 69 65 6c 64 73 20 6f 66 20  d zDb fields of 
6490: 74 68 65 20 76 74 61 62 20 73 74 72 75 63 74 75  the vtab structu
64a0: 72 65 2e 20 2a 2f 0a 20 20 70 2d 3e 7a 4e 61 6d  re. */.  p->zNam
64b0: 65 20 3d 20 7a 43 73 72 3b 0a 20 20 6d 65 6d 63  e = zCsr;.  memc
64c0: 70 79 28 7a 43 73 72 2c 20 61 72 67 76 5b 32 5d  py(zCsr, argv[2]
64d0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 7a 43 73 72  , nName);.  zCsr
64e0: 20 2b 3d 20 6e 4e 61 6d 65 3b 0a 20 20 70 2d 3e   += nName;.  p->
64f0: 7a 44 62 20 3d 20 7a 43 73 72 3b 0a 20 20 6d 65  zDb = zCsr;.  me
6500: 6d 63 70 79 28 7a 43 73 72 2c 20 61 72 67 76 5b  mcpy(zCsr, argv[
6510: 31 5d 2c 20 6e 44 62 29 3b 0a 20 20 7a 43 73 72  1], nDb);.  zCsr
6520: 20 2b 3d 20 6e 44 62 3b 0a 0a 20 20 2f 2a 20 46   += nDb;..  /* F
6530: 69 6c 6c 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  ill in the azCol
6540: 75 6d 6e 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  umn array */.  i
6550: 43 6f 6c 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Col = 0;.  for(i
6560: 3d 33 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =3; i<argc; i++)
6570: 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b 69  {.    if( argv[i
6580: 5d 21 3d 7a 54 6f 6b 65 6e 69 7a 65 72 20 29 7b  ]!=zTokenizer ){
6590: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 20  .      char *z; 
65a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
65b0: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
65c0: 73 71 6c 69 74 65 33 46 74 73 33 4e 65 78 74 54  sqlite3Fts3NextT
65d0: 6f 6b 65 6e 28 61 72 67 76 5b 69 5d 2c 20 26 6e  oken(argv[i], &n
65e0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
65f0: 7a 43 73 72 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  zCsr, z, n);.   
6600: 20 20 20 7a 43 73 72 5b 6e 5d 20 3d 20 27 5c 30     zCsr[n] = '\0
6610: 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ';.      sqlite3
6620: 46 74 73 33 44 65 71 75 6f 74 65 28 7a 43 73 72  Fts3Dequote(zCsr
6630: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 43 6f  );.      p->azCo
6640: 6c 75 6d 6e 5b 69 43 6f 6c 2b 2b 5d 20 3d 20 7a  lumn[iCol++] = z
6650: 43 73 72 3b 0a 20 20 20 20 20 20 7a 43 73 72 20  Csr;.      zCsr 
6660: 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  += n+1;.      as
6670: 73 65 72 74 28 20 7a 43 73 72 20 3c 3d 20 26 28  sert( zCsr <= &(
6680: 28 63 68 61 72 20 2a 29 70 29 5b 6e 42 79 74 65  (char *)p)[nByte
6690: 5d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ] );.    }.  }. 
66a0: 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 0a   if( iCol==0 ){.
66b0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
66c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  ==1 );.    p->az
66d0: 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 22 63 6f 6e  Column[0] = "con
66e0: 74 65 6e 74 22 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tent";.  }..  /*
66f0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 78   If this is an x
6700: 43 72 65 61 74 65 20 63 61 6c 6c 2c 20 63 72 65  Create call, cre
6710: 61 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ate the underlyi
6720: 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
6730: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e   .  ** database.
6740: 20 54 4f 44 4f 3a 20 46 6f 72 20 78 43 6f 6e 6e   TODO: For xConn
6750: 65 63 74 28 29 2c 20 69 74 20 63 6f 75 6c 64 20  ect(), it could 
6760: 76 65 72 69 66 79 20 74 68 61 74 20 73 61 69 64  verify that said
6770: 20 74 61 62 6c 65 73 20 65 78 69 73 74 2e 0a 20   tables exist.. 
6780: 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 72 65 61   */.  if( isCrea
6790: 74 65 20 29 7b 0a 20 20 20 20 70 2d 3e 62 48 61  te ){.    p->bHa
67a0: 73 43 6f 6e 74 65 6e 74 20 3d 20 31 3b 0a 20 20  sContent = 1;.  
67b0: 20 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65    p->bHasDocsize
67c0: 20 3d 20 61 72 67 76 5b 30 5d 5b 33 5d 3d 3d 27   = argv[0][3]=='
67d0: 34 27 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  4';.    rc = fts
67e0: 33 43 72 65 61 74 65 54 61 62 6c 65 73 28 70 29  3CreateTables(p)
67f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6800: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6810: 20 20 20 66 74 73 33 54 61 62 6c 65 45 78 69 73     fts3TableExis
6820: 74 73 28 26 72 63 2c 20 64 62 2c 20 61 72 67 76  ts(&rc, db, argv
6830: 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 2c 20 22 5f  [1], argv[2], "_
6840: 63 6f 6e 74 65 6e 74 22 2c 20 26 70 2d 3e 62 48  content", &p->bH
6850: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  asContent);.    
6860: 66 74 73 33 54 61 62 6c 65 45 78 69 73 74 73 28  fts3TableExists(
6870: 26 72 63 2c 20 64 62 2c 20 61 72 67 76 5b 31 5d  &rc, db, argv[1]
6880: 2c 20 61 72 67 76 5b 32 5d 2c 20 22 5f 64 6f 63  , argv[2], "_doc
6890: 73 69 7a 65 22 2c 20 26 70 2d 3e 62 48 61 73 44  size", &p->bHasD
68a0: 6f 63 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69  ocsize);.  }.  i
68b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
68c0: 20 29 20 67 6f 74 6f 20 66 74 73 33 5f 69 6e 69   ) goto fts3_ini
68d0: 74 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 66  t_out;..  rc = f
68e0: 74 73 33 44 65 63 6c 61 72 65 56 74 61 62 28 70  ts3DeclareVtab(p
68f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6900: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 74  ITE_OK ) goto ft
6910: 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 0a 20 20  s3_init_out;..  
6920: 2a 70 70 56 54 61 62 20 3d 20 26 70 2d 3e 62 61  *ppVTab = &p->ba
6930: 73 65 3b 0a 0a 66 74 73 33 5f 69 6e 69 74 5f 6f  se;..fts3_init_o
6940: 75 74 3a 0a 20 20 61 73 73 65 72 74 28 20 70 20  ut:.  assert( p 
6950: 7c 7c 20 28 70 54 6f 6b 65 6e 69 7a 65 72 20 26  || (pTokenizer &
6960: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc!=SQLITE_OK)
6970: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
6980: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
6990: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 66 74  f( p ){.      ft
69a0: 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68  s3DisconnectMeth
69b0: 6f 64 28 28 73 71 6c 69 74 65 33 5f 76 74 61 62  od((sqlite3_vtab
69c0: 20 2a 29 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65   *)p);.    }else
69d0: 7b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 69 7a  {.      pTokeniz
69e0: 65 72 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65  er->pModule->xDe
69f0: 73 74 72 6f 79 28 70 54 6f 6b 65 6e 69 7a 65 72  stroy(pTokenizer
6a00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6a10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6a20: 2a 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 28  ** The xConnect(
6a30: 29 20 61 6e 64 20 78 43 72 65 61 74 65 28 29 20  ) and xCreate() 
6a40: 6d 65 74 68 6f 64 73 20 66 6f 72 20 74 68 65 20  methods for the 
6a50: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 41  virtual table. A
6a60: 6c 6c 20 74 68 65 0a 2a 2a 20 77 6f 72 6b 20 69  ll the.** work i
6a70: 73 20 64 6f 6e 65 20 69 6e 20 66 75 6e 63 74 69  s done in functi
6a80: 6f 6e 20 66 74 73 33 49 6e 69 74 56 74 61 62 28  on fts3InitVtab(
6a90: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
6aa0: 20 66 74 73 33 43 6f 6e 6e 65 63 74 4d 65 74 68   fts3ConnectMeth
6ab0: 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  od(.  sqlite3 *d
6ac0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
6ad0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6ae0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
6af0: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20 20    void *pAux,   
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
6b20: 74 6f 6b 65 6e 69 7a 65 72 20 68 61 73 68 20 74  tokenizer hash t
6b30: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 72  able */.  int ar
6b40: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
6b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6b60: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6b70: 69 6e 20 61 72 67 76 20 61 72 72 61 79 20 2a 2f  in argv array */
6b80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  .  const char * 
6b90: 63 6f 6e 73 74 20 2a 61 72 67 76 2c 20 20 20 20  const *argv,    
6ba0: 20 20 20 2f 2a 20 78 43 72 65 61 74 65 2f 78 43     /* xCreate/xC
6bb0: 6f 6e 6e 65 63 74 20 61 72 67 75 6d 65 6e 74 20  onnect argument 
6bc0: 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74  array */.  sqlit
6bd0: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
6be0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ,          /* OU
6bf0: 54 3a 20 4e 65 77 20 73 71 6c 69 74 65 33 5f 76  T: New sqlite3_v
6c00: 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tab object */.  
6c10: 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20  char **pzErr    
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c30: 2f 2a 20 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f  /* OUT: sqlite3_
6c40: 6d 61 6c 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d  malloc'd error m
6c50: 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 72  essage */.){.  r
6c60: 65 74 75 72 6e 20 66 74 73 33 49 6e 69 74 56 74  eturn fts3InitVt
6c70: 61 62 28 30 2c 20 64 62 2c 20 70 41 75 78 2c 20  ab(0, db, pAux, 
6c80: 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 74  argc, argv, ppVt
6c90: 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 73 74  ab, pzErr);.}.st
6ca0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 72 65  atic int fts3Cre
6cb0: 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c  ateMethod(.  sql
6cc0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ce0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
6cf0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
6d00: 41 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Aux,            
6d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
6d20: 74 65 72 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72  ter to tokenizer
6d30: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
6d40: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
6d70: 65 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61  ements in argv a
6d80: 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rray */.  const 
6d90: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72  char * const *ar
6da0: 67 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72  gv,       /* xCr
6db0: 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72  eate/xConnect ar
6dc0: 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  gument array */.
6dd0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
6de0: 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20  *ppVtab,        
6df0: 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71    /* OUT: New sq
6e00: 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63  lite3_vtab objec
6e10: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t */.  char **pz
6e20: 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
6e30: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
6e40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20  qlite3_malloc'd 
6e50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  error message */
6e60: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  .){.  return fts
6e70: 33 49 6e 69 74 56 74 61 62 28 31 2c 20 64 62 2c  3InitVtab(1, db,
6e80: 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67   pAux, argc, arg
6e90: 76 2c 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72  v, ppVtab, pzErr
6ea0: 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6d 70  );.}../* .** Imp
6eb0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
6ec0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
6ed0: 74 68 6f 64 20 66 6f 72 20 46 54 53 33 20 74 61  thod for FTS3 ta
6ee0: 62 6c 65 73 2e 20 54 68 65 72 65 0a 2a 2a 20 61  bles. There.** a
6ef0: 72 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c  re three possibl
6f00: 65 20 73 74 72 61 74 65 67 69 65 73 2c 20 69 6e  e strategies, in
6f10: 20 6f 72 64 65 72 20 6f 66 20 70 72 65 66 65 72   order of prefer
6f20: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  ence:.**.**   1.
6f30: 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62   Direct lookup b
6f40: 79 20 72 6f 77 69 64 20 6f 72 20 64 6f 63 69 64  y rowid or docid
6f50: 2e 20 0a 2a 2a 20 20 20 32 2e 20 46 75 6c 6c 2d  . .**   2. Full-
6f60: 74 65 78 74 20 73 65 61 72 63 68 20 75 73 69 6e  text search usin
6f70: 67 20 61 20 4d 41 54 43 48 20 6f 70 65 72 61 74  g a MATCH operat
6f80: 6f 72 20 6f 6e 20 61 20 6e 6f 6e 2d 64 6f 63 69  or on a non-doci
6f90: 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 33  d column..**   3
6fa0: 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  . Linear scan of
6fb0: 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
6fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6fd0: 66 74 73 33 42 65 73 74 49 6e 64 65 78 4d 65 74  fts3BestIndexMet
6fe0: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
6ff0: 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33   *pVTab, sqlite3
7000: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
7010: 66 6f 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  fo){.  Fts3Table
7020: 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
7030: 20 2a 29 70 56 54 61 62 3b 0a 20 20 69 6e 74 20   *)pVTab;.  int 
7040: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
7050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7060: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
7070: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 73 20   */.  int iCons 
7080: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
7090: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
70a0: 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  f constraint to 
70b0: 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 42 79 20  use */..  /* By 
70c0: 64 65 66 61 75 6c 74 20 75 73 65 20 61 20 66 75  default use a fu
70d0: 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 54  ll table scan. T
70e0: 68 69 73 20 69 73 20 61 6e 20 65 78 70 65 6e 73  his is an expens
70f0: 69 76 65 20 6f 70 74 69 6f 6e 2c 0a 20 20 2a 2a  ive option,.  **
7100: 20 73 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75   so search throu
7110: 67 68 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  gh the constrain
7120: 74 73 20 74 6f 20 73 65 65 20 69 66 20 61 20 6d  ts to see if a m
7130: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 0a 20  ore efficient . 
7140: 20 2a 2a 20 73 74 72 61 74 65 67 79 20 69 73 20   ** strategy is 
7150: 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
7160: 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d   pInfo->idxNum =
7170: 20 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53   FTS3_FULLSCAN_S
7180: 45 41 52 43 48 3b 0a 20 20 70 49 6e 66 6f 2d 3e  EARCH;.  pInfo->
7190: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
71a0: 35 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d  500000;.  for(i=
71b0: 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e 6e 43 6f 6e  0; i<pInfo->nCon
71c0: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
71d0: 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
71e0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
71f0: 6e 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49 6e  nt *pCons = &pIn
7200: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
7210: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  i];.    if( pCon
7220: 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63  s->usable==0 ) c
7230: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
7240: 20 41 20 64 69 72 65 63 74 20 6c 6f 6f 6b 75 70   A direct lookup
7250: 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 72   on the rowid or
7260: 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 20 41   docid column. A
7270: 73 73 69 67 6e 20 61 20 63 6f 73 74 20 6f 66 20  ssign a cost of 
7280: 31 2e 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  1.0. */.    if( 
7290: 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54  pCons->op==SQLIT
72a0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
72b0: 4e 54 5f 45 51 20 0a 20 20 20 20 20 26 26 20 28  NT_EQ .     && (
72c0: 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pCons->iColumn<0
72d0: 20 7c 7c 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75   || pCons->iColu
72e0: 6d 6e 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  mn==p->nColumn+1
72f0: 20 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20   ).    ){.      
7300: 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  pInfo->idxNum = 
7310: 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43  FTS3_DOCID_SEARC
7320: 48 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  H;.      pInfo->
7330: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
7340: 31 2e 30 3b 0a 20 20 20 20 20 20 69 43 6f 6e 73  1.0;.      iCons
7350: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = i;.    }..   
7360: 20 2f 2a 20 41 20 4d 41 54 43 48 20 63 6f 6e 73   /* A MATCH cons
7370: 74 72 61 69 6e 74 2e 20 55 73 65 20 61 20 66 75  traint. Use a fu
7380: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 2e 0a  ll-text search..
7390: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
73a0: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
73b0: 68 61 6e 20 6f 6e 65 20 4d 41 54 43 48 20 63 6f  han one MATCH co
73c0: 6e 73 74 72 61 69 6e 74 20 61 76 61 69 6c 61 62  nstraint availab
73d0: 6c 65 2c 20 75 73 65 20 74 68 65 20 66 69 72 73  le, use the firs
73e0: 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 63  t.    ** one enc
73f0: 6f 75 6e 74 65 72 65 64 2e 20 49 66 20 74 68 65  ountered. If the
7400: 72 65 20 69 73 20 62 6f 74 68 20 61 20 4d 41 54  re is both a MAT
7410: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  CH constraint an
7420: 64 20 61 20 64 69 72 65 63 74 0a 20 20 20 20 2a  d a direct.    *
7430: 2a 20 72 6f 77 69 64 2f 64 6f 63 69 64 20 6c 6f  * rowid/docid lo
7440: 6f 6b 75 70 2c 20 70 72 65 66 65 72 20 74 68 65  okup, prefer the
7450: 20 4d 41 54 43 48 20 73 74 72 61 74 65 67 79 2e   MATCH strategy.
7460: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 65 76   This is done ev
7470: 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67  en .    ** thoug
7480: 68 20 74 68 65 20 72 6f 77 69 64 2f 64 6f 63 69  h the rowid/doci
7490: 64 20 6c 6f 6f 6b 75 70 20 69 73 20 66 61 73 74  d lookup is fast
74a0: 65 72 20 74 68 61 6e 20 61 20 4d 41 54 43 48 20  er than a MATCH 
74b0: 71 75 65 72 79 2c 20 73 65 6c 65 63 74 69 6e 67  query, selecting
74c0: 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64  .    ** it would
74d0: 20 6c 65 61 64 20 74 6f 20 61 6e 20 22 75 6e 61   lead to an "una
74e0: 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74  ble to use funct
74f0: 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65  ion MATCH in the
7500: 20 72 65 71 75 65 73 74 65 64 20 0a 20 20 20 20   requested .    
7510: 2a 2a 20 63 6f 6e 74 65 78 74 22 20 65 72 72 6f  ** context" erro
7520: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
7530: 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51 4c  ( pCons->op==SQL
7540: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
7550: 41 49 4e 54 5f 4d 41 54 43 48 20 0a 20 20 20 20  AINT_MATCH .    
7560: 20 26 26 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75   && pCons->iColu
7570: 6d 6e 3e 3d 30 20 26 26 20 70 43 6f 6e 73 2d 3e  mn>=0 && pCons->
7580: 69 43 6f 6c 75 6d 6e 3c 3d 70 2d 3e 6e 43 6f 6c  iColumn<=p->nCol
7590: 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  umn.    ){.     
75a0: 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d   pInfo->idxNum =
75b0: 20 46 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53   FTS3_FULLTEXT_S
75c0: 45 41 52 43 48 20 2b 20 70 43 6f 6e 73 2d 3e 69  EARCH + pCons->i
75d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49  Column;.      pI
75e0: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
75f0: 73 74 20 3d 20 32 2e 30 3b 0a 20 20 20 20 20 20  st = 2.0;.      
7600: 69 43 6f 6e 73 20 3d 20 69 3b 0a 20 20 20 20 20  iCons = i;.     
7610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7620: 7d 0a 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d  }..  if( iCons>=
7630: 30 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  0 ){.    pInfo->
7640: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
7650: 5b 69 43 6f 6e 73 5d 2e 61 72 67 76 49 6e 64 65  [iCons].argvInde
7660: 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 66 6f  x = 1;.    pInfo
7670: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
7680: 67 65 5b 69 43 6f 6e 73 5d 2e 6f 6d 69 74 20 3d  ge[iCons].omit =
7690: 20 31 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72   1;.  } .  retur
76a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
76b0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
76c0: 74 69 6f 6e 20 6f 66 20 78 4f 70 65 6e 20 6d 65  tion of xOpen me
76d0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
76e0: 69 6e 74 20 66 74 73 33 4f 70 65 6e 4d 65 74 68  int fts3OpenMeth
76f0: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
7700: 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVTab, sqlite3_
7710: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
7720: 43 73 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Csr){.  sqlite3_
7730: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 73  vtab_cursor *pCs
7740: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7750: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 63 75   /* Allocated cu
7760: 72 73 6f 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45  rsor */..  UNUSE
7770: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 54 61  D_PARAMETER(pVTa
7780: 62 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  b);..  /* Alloca
7790: 74 65 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  te a buffer larg
77a0: 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6e 20  e enough for an 
77b0: 46 74 73 33 43 75 72 73 6f 72 20 73 74 72 75 63  Fts3Cursor struc
77c0: 74 75 72 65 2e 20 49 66 20 74 68 65 0a 20 20 2a  ture. If the.  *
77d0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63  * allocation suc
77e0: 63 65 65 64 73 2c 20 7a 65 72 6f 20 69 74 20 61  ceeds, zero it a
77f0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
7800: 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
7810: 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c  .  ** if the all
7820: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 72  ocation fails, r
7830: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
7840: 45 4d 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 43 73  EM..  */.  *ppCs
7850: 72 20 3d 20 70 43 73 72 20 3d 20 28 73 71 6c 69  r = pCsr = (sqli
7860: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
7870: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
7880: 28 73 69 7a 65 6f 66 28 46 74 73 33 43 75 72 73  (sizeof(Fts3Curs
7890: 6f 72 29 29 3b 0a 20 20 69 66 28 20 21 70 43 73  or));.  if( !pCs
78a0: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
78b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
78c0: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c  }.  memset(pCsr,
78d0: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 43   0, sizeof(Fts3C
78e0: 75 72 73 6f 72 29 29 3b 0a 20 20 72 65 74 75 72  ursor));.  retur
78f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7900: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
7910: 63 75 72 73 6f 72 2e 20 20 46 6f 72 20 61 64 64  cursor.  For add
7920: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
7930: 69 6f 6e 20 73 65 65 20 74 68 65 20 64 6f 63 75  ion see the docu
7940: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  mentation.** on 
7950: 74 68 65 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f  the xClose metho
7960: 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
7970: 20 74 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65   table interface
7980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7990: 66 75 6c 6c 74 65 78 74 43 6c 6f 73 65 28 73 71  fulltextClose(sq
79a0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
79b0: 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 46  r *pCursor){.  F
79c0: 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts3Cursor *pCsr 
79d0: 3d 20 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29  = (Fts3Cursor *)
79e0: 70 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74  pCursor;.  sqlit
79f0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72  e3_finalize(pCsr
7a00: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  ->pStmt);.  sqli
7a10: 74 65 33 46 74 73 33 45 78 70 72 46 72 65 65 28  te3Fts3ExprFree(
7a20: 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20  pCsr->pExpr);.  
7a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
7a40: 72 2d 3e 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20  r->aDoclist);.  
7a50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
7a60: 72 2d 3e 61 4d 61 74 63 68 69 6e 66 6f 29 3b 0a  r->aMatchinfo);.
7a70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7a80: 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Csr);.  return S
7a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7aa0: 2a 2a 20 50 6f 73 69 74 69 6f 6e 20 74 68 65 20  ** Position the 
7ab0: 70 43 73 72 2d 3e 70 53 74 6d 74 20 73 74 61 74  pCsr->pStmt stat
7ac0: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 69 74  ement so that it
7ad0: 20 69 73 20 6f 6e 20 74 68 65 20 72 6f 77 0a 2a   is on the row.*
7ae0: 2a 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65  * of the %_conte
7af0: 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  nt table that co
7b00: 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 20  ntains the last 
7b10: 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 0a 2a  match.  Return.*
7b20: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  * SQLITE_OK on s
7b30: 75 63 63 65 73 73 2e 20 20 0a 2a 2f 0a 73 74 61  uccess.  .*/.sta
7b40: 74 69 63 20 69 6e 74 20 66 74 73 33 43 75 72 73  tic int fts3Curs
7b50: 6f 72 53 65 65 6b 28 73 71 6c 69 74 65 33 5f 63  orSeek(sqlite3_c
7b60: 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78 74  ontext *pContext
7b70: 2c 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43  , Fts3Cursor *pC
7b80: 73 72 29 7b 0a 20 20 69 66 28 20 70 43 73 72 2d  sr){.  if( pCsr-
7b90: 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b 20 29  >isRequireSeek )
7ba0: 7b 0a 20 20 20 20 70 43 73 72 2d 3e 69 73 52 65  {.    pCsr->isRe
7bb0: 71 75 69 72 65 53 65 65 6b 20 3d 20 30 3b 0a 20  quireSeek = 0;. 
7bc0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
7bd0: 69 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d  int64(pCsr->pStm
7be0: 74 2c 20 31 2c 20 70 43 73 72 2d 3e 69 50 72 65  t, 1, pCsr->iPre
7bf0: 76 49 64 29 3b 0a 20 20 20 20 69 66 28 20 53 51  vId);.    if( SQ
7c00: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
7c10: 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 53 74  3_step(pCsr->pSt
7c20: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  mt) ){.      ret
7c30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7c40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7c50: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
7c60: 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70 53 74  _reset(pCsr->pSt
7c70: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
7c80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
7ca0: 20 72 6f 77 20 77 61 73 20 66 6f 75 6e 64 20 61   row was found a
7cb0: 6e 64 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20  nd no error has 
7cc0: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
7cd0: 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 20 20  e %_content.    
7ce0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 73 20      ** table is 
7cf0: 6d 69 73 73 69 6e 67 20 61 20 72 6f 77 20 74 68  missing a row th
7d00: 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  at is present in
7d10: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
7d20: 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
7d30: 20 54 68 65 20 64 61 74 61 20 73 74 72 75 63 74   The data struct
7d40: 75 72 65 73 20 61 72 65 20 63 6f 72 72 75 70 74  ures are corrupt
7d50: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7d60: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
7d70: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7d80: 7d 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 69 73  }.      pCsr->is
7d90: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Eof = 1;.      i
7da0: 66 28 20 70 43 6f 6e 74 65 78 74 20 29 7b 0a 20  f( pContext ){. 
7db0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7dc0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
7dd0: 28 70 43 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a  (pContext, rc);.
7de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
7df0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
7e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
7e10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7e20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  }.}../*.** Advan
7e30: 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
7e40: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
7e50: 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
7e60: 61 62 6c 65 20 74 68 61 74 0a 2a 2a 20 6d 61 74  able that.** mat
7e70: 63 68 65 73 20 74 68 65 20 73 65 61 72 63 68 20  ches the search 
7e80: 63 72 69 74 65 72 69 61 2e 20 20 46 6f 72 20 61  criteria.  For a
7e90: 20 4d 41 54 43 48 20 73 65 61 72 63 68 2c 20 74   MATCH search, t
7ea0: 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74  his will be.** t
7eb0: 68 65 20 6e 65 78 74 20 72 6f 77 20 74 68 61 74  he next row that
7ec0: 20 6d 61 74 63 68 65 73 2e 20 20 46 6f 72 20 61   matches.  For a
7ed0: 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
7ee0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a  , this will be.*
7ef0: 2a 20 73 69 6d 70 6c 79 20 74 68 65 20 6e 65 78  * simply the nex
7f00: 74 20 72 6f 77 20 69 6e 20 74 68 65 20 25 5f 63  t row in the %_c
7f10: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 20 46  ontent table.  F
7f20: 6f 72 20 61 20 64 6f 63 69 64 20 6c 6f 6f 6b 75  or a docid looku
7f30: 70 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  p,.** this routi
7f40: 6e 65 20 73 69 6d 70 6c 79 20 73 65 74 73 20 74  ne simply sets t
7f50: 68 65 20 45 4f 46 20 66 6c 61 67 2e 0a 2a 2a 0a  he EOF flag..**.
7f60: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
7f70: 5f 4f 4b 20 69 66 20 6e 6f 74 68 69 6e 67 20 67  _OK if nothing g
7f80: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 53 51 4c 49  oes wrong.  SQLI
7f90: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
7fa0: 64 0a 2a 2a 20 65 76 65 6e 20 69 66 20 77 65 20  d.** even if we 
7fb0: 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c  reach end-of-fil
7fc0: 65 2e 20 20 54 68 65 20 66 74 73 33 45 6f 66 4d  e.  The fts3EofM
7fd0: 65 74 68 6f 64 28 29 20 77 69 6c 6c 20 62 65 20  ethod() will be 
7fe0: 63 61 6c 6c 65 64 0a 2a 2a 20 73 75 62 73 65 71  called.** subseq
7ff0: 75 65 6e 74 6c 79 20 74 6f 20 64 65 74 65 72 6d  uently to determ
8000: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
8010: 6f 74 20 61 6e 20 45 4f 46 20 77 61 73 20 68 69  ot an EOF was hi
8020: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
8030: 20 66 74 73 33 4e 65 78 74 4d 65 74 68 6f 64 28   fts3NextMethod(
8040: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
8050: 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20  sor *pCursor){. 
8060: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8070: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
8080: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8090: 2a 2f 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  */.  Fts3Cursor 
80a0: 2a 70 43 73 72 20 3d 20 28 46 74 73 33 43 75 72  *pCsr = (Fts3Cur
80b0: 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a  sor *)pCursor;..
80c0: 20 20 69 66 28 20 70 43 73 72 2d 3e 61 44 6f 63    if( pCsr->aDoc
80d0: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
80e0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73  f( SQLITE_ROW!=s
80f0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72  qlite3_step(pCsr
8100: 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  ->pStmt) ){.    
8110: 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
8120: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
8130: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72  lite3_reset(pCsr
8140: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  ->pStmt);.    }.
8150: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 73 72    }else if( pCsr
8160: 2d 3e 70 4e 65 78 74 49 64 3e 3d 26 70 43 73 72  ->pNextId>=&pCsr
8170: 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 43 73 72 2d  ->aDoclist[pCsr-
8180: 3e 6e 44 6f 63 6c 69 73 74 5d 20 29 7b 0a 20 20  >nDoclist] ){.  
8190: 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
81a0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
81b0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
81c0: 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  sr->pStmt);.    
81d0: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
81e0: 6e 74 28 26 70 43 73 72 2d 3e 70 4e 65 78 74 49  nt(&pCsr->pNextI
81f0: 64 2c 20 26 70 43 73 72 2d 3e 69 50 72 65 76 49  d, &pCsr->iPrevI
8200: 64 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69 73  d);.    pCsr->is
8210: 52 65 71 75 69 72 65 53 65 65 6b 20 3d 20 31 3b  RequireSeek = 1;
8220: 0a 20 20 20 20 70 43 73 72 2d 3e 69 73 4d 61 74  .    pCsr->isMat
8230: 63 68 69 6e 66 6f 4e 65 65 64 65 64 20 3d 20 31  chinfoNeeded = 1
8240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8250: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  c;.}.../*.** The
8260: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
8270: 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 7a  to by argument z
8280: 4e 6f 64 65 20 28 73 69 7a 65 20 6e 4e 6f 64 65  Node (size nNode
8290: 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69 6e 73   bytes) contains
82a0: 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6e 6f 64   the.** root nod
82b0: 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 65  e of a b-tree se
82c0: 67 6d 65 6e 74 2e 20 54 68 65 20 73 65 67 6d 65  gment. The segme
82d0: 6e 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  nt is guaranteed
82e0: 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 0a   to be at least.
82f0: 2a 2a 20 6f 6e 65 20 6c 65 76 65 6c 20 68 69 67  ** one level hig
8300: 68 20 28 69 2e 65 2e 20 74 68 65 20 72 6f 6f 74  h (i.e. the root
8310: 20 6e 6f 64 65 20 69 73 20 6e 6f 74 20 61 6c 73   node is not als
8320: 6f 20 61 20 6c 65 61 66 29 2e 20 49 66 20 73 75  o a leaf). If su
8330: 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 74 68 69  ccessful,.** thi
8340: 73 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 61 74  s function locat
8350: 65 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  es the leaf node
8360: 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   of the segment 
8370: 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  that may contain
8380: 20 74 68 65 20 0a 2a 2a 20 74 65 72 6d 20 73 70   the .** term sp
8390: 65 63 69 66 69 65 64 20 62 79 20 61 72 67 75 6d  ecified by argum
83a0: 65 6e 74 73 20 7a 54 65 72 6d 20 61 6e 64 20 6e  ents zTerm and n
83b0: 54 65 72 6d 20 61 6e 64 20 77 72 69 74 65 73 20  Term and writes 
83c0: 69 74 73 20 62 6c 6f 63 6b 20 6e 75 6d 62 65 72  its block number
83d0: 20 0a 2a 2a 20 74 6f 20 2a 70 69 4c 65 61 66 2e   .** to *piLeaf.
83e0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f 73  .**.** It is pos
83f0: 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 72  sible that the r
8400: 65 74 75 72 6e 65 64 20 6c 65 61 66 20 6e 6f 64  eturned leaf nod
8410: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
8420: 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
8430: 0a 2a 2a 20 74 65 72 6d 2e 20 48 6f 77 65 76 65  .** term. Howeve
8440: 72 2c 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e  r, if the segmen
8450: 74 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 73  t does contain s
8460: 61 69 64 20 74 65 72 6d 2c 20 69 74 20 69 73 20  aid term, it is 
8470: 73 74 6f 72 65 64 20 6f 6e 0a 2a 2a 20 74 68 65  stored on.** the
8480: 20 69 64 65 6e 74 69 66 69 65 64 20 6c 65 61 66   identified leaf
8490: 20 6e 6f 64 65 2e 20 42 65 63 61 75 73 65 20 74   node. Because t
84a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
84b0: 79 20 69 6e 73 70 65 63 74 73 20 69 6e 74 65 72  y inspects inter
84c0: 69 6f 72 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e  ior.** segment n
84d0: 6f 64 65 73 20 28 61 6e 64 20 6e 65 76 65 72 20  odes (and never 
84e0: 6c 6f 61 64 73 20 6c 65 61 66 20 6e 6f 64 65 73  loads leaf nodes
84f0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 29 2c 20 69   into memory), i
8500: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
8510: 65 0a 2a 2a 20 74 6f 20 62 65 20 73 75 72 65 2e  e.** to be sure.
8520: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
8530: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
8540: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
8550: 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  han SQLITE_OK is
8560: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73   returned..*/ .s
8570: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
8580: 6c 65 63 74 4c 65 61 66 28 0a 20 20 46 74 73 33  lectLeaf(.  Fts3
8590: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
85b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
85c0: 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
85d0: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
85e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
85f0: 20 74 6f 20 73 65 6c 65 63 74 20 6c 65 61 76 65   to select leave
8600: 73 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  s for */.  int n
8610: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
8620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
8630: 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d  ze of term zTerm
8640: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
8650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f 64 65  onst char *zNode
8660: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8670: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
8680: 69 6e 67 20 73 65 67 6d 65 6e 74 20 69 6e 74 65  ing segment inte
8690: 72 69 6f 72 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  rior node */.  i
86a0: 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20  nt nNode,       
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86c0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
86d0: 20 61 74 20 7a 4e 6f 64 65 20 2a 2f 0a 20 20 73   at zNode */.  s
86e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
86f0: 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 2f  Leaf           /
8700: 2a 20 53 65 6c 65 63 74 65 64 20 6c 65 61 66 20  * Selected leaf 
8710: 6e 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  node */.){.  int
8720: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8740: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
8750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 73   const char *zCs
8760: 72 20 3d 20 7a 4e 6f 64 65 3b 20 20 20 20 20 20  r = zNode;      
8770: 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 69 74   /* Cursor to it
8780: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f  erate through no
8790: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
87a0: 61 72 20 2a 7a 45 6e 64 20 3d 20 26 7a 43 73 72  ar *zEnd = &zCsr
87b0: 5b 6e 4e 6f 64 65 5d 3b 2f 2a 20 45 6e 64 20 6f  [nNode];/* End o
87c0: 66 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20  f interior node 
87d0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72  buffer */.  char
87e0: 20 2a 7a 42 75 66 66 65 72 20 3d 20 30 3b 20 20   *zBuffer = 0;  
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
8800: 75 66 66 65 72 20 74 6f 20 6c 6f 61 64 20 74 65  uffer to load te
8810: 72 6d 73 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e  rms into */.  in
8820: 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20  t nAlloc = 0;   
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8840: 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74   Size of allocat
8850: 65 64 20 62 75 66 66 65 72 20 2a 2f 0a 0a 20 20  ed buffer */..  
8860: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
8870: 69 6e 74 20 69 73 46 69 72 73 74 54 65 72 6d 20  int isFirstTerm 
8880: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
8890: 20 54 72 75 65 20 77 68 65 6e 20 70 72 6f 63 65   True when proce
88a0: 73 73 69 6e 67 20 66 69 72 73 74 20 74 65 72 6d  ssing first term
88b0: 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
88c0: 69 6e 74 20 69 48 65 69 67 68 74 3b 20 20 20 20  int iHeight;    
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
88e0: 20 48 65 69 67 68 74 20 6f 66 20 74 68 69 73 20   Height of this 
88f0: 6e 6f 64 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a  node in tree */.
8900: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
8910: 34 20 69 43 68 69 6c 64 3b 20 20 20 20 20 20 20  4 iChild;       
8920: 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66    /* Block id of
8930: 20 63 68 69 6c 64 20 6e 6f 64 65 20 74 6f 20 64   child node to d
8940: 65 73 63 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 20  escend to */.   
8950: 20 69 6e 74 20 6e 42 6c 6f 63 6b 3b 20 20 20 20   int nBlock;    
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8970: 2a 20 53 69 7a 65 20 6f 66 20 63 68 69 6c 64 20  * Size of child 
8980: 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  node in bytes */
8990: 0a 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71  ..    zCsr += sq
89a0: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
89b0: 6e 74 33 32 28 7a 43 73 72 2c 20 26 69 48 65 69  nt32(zCsr, &iHei
89c0: 67 68 74 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b  ght);.    zCsr +
89d0: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
89e0: 56 61 72 69 6e 74 28 7a 43 73 72 2c 20 26 69 43  Varint(zCsr, &iC
89f0: 68 69 6c 64 29 3b 0a 20 20 0a 20 20 20 20 77 68  hild);.  .    wh
8a00: 69 6c 65 28 20 7a 43 73 72 3c 7a 45 6e 64 20 29  ile( zCsr<zEnd )
8a10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6d 70 3b  {.      int cmp;
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 2f 2a 20 6d 65 6d 63 6d 70 28 29 20      /* memcmp() 
8a40: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
8a50: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8a70: 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66  ize of term suff
8a80: 69 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ix */.      int 
8a90: 6e 50 72 65 66 69 78 20 3d 20 30 3b 20 20 20 20  nPrefix = 0;    
8aa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8ab0: 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a  of term prefix *
8ac0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 75 66  /.      int nBuf
8ad0: 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  fer;            
8ae0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 65 72      /* Total ter
8af0: 6d 20 73 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20  m size */.  .   
8b00: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6e     /* Load the n
8b10: 65 78 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  ext term on the 
8b20: 6e 6f 64 65 20 69 6e 74 6f 20 7a 42 75 66 66 65  node into zBuffe
8b30: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  r */.      if( !
8b40: 69 73 46 69 72 73 74 54 65 72 6d 20 29 7b 0a 20  isFirstTerm ){. 
8b50: 20 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73         zCsr += s
8b60: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
8b70: 69 6e 74 33 32 28 7a 43 73 72 2c 20 26 6e 50 72  int32(zCsr, &nPr
8b80: 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  efix);.      }. 
8b90: 20 20 20 20 20 69 73 46 69 72 73 74 54 65 72 6d       isFirstTerm
8ba0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 73 72   = 0;.      zCsr
8bb0: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
8bc0: 65 74 56 61 72 69 6e 74 33 32 28 7a 43 73 72 2c  etVarint32(zCsr,
8bd0: 20 26 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20   &nSuffix);.    
8be0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 2b 6e 53    if( nPrefix+nS
8bf0: 75 66 66 69 78 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  uffix>nAlloc ){.
8c00: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8c10: 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c  ew;.        nAll
8c20: 6f 63 20 3d 20 28 6e 50 72 65 66 69 78 2b 6e 53  oc = (nPrefix+nS
8c30: 75 66 66 69 78 29 20 2a 20 32 3b 0a 20 20 20 20  uffix) * 2;.    
8c40: 20 20 20 20 7a 4e 65 77 20 3d 20 28 63 68 61 72      zNew = (char
8c50: 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   *)sqlite3_reall
8c60: 6f 63 28 7a 42 75 66 66 65 72 2c 20 6e 41 6c 6c  oc(zBuffer, nAll
8c70: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oc);.        if(
8c80: 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !zNew ){.      
8c90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8ca0: 28 7a 42 75 66 66 65 72 29 3b 0a 20 20 20 20 20  (zBuffer);.     
8cb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8cc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8cd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 42 75 66    }.        zBuf
8ce0: 66 65 72 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  fer = zNew;.    
8cf0: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
8d00: 28 26 7a 42 75 66 66 65 72 5b 6e 50 72 65 66 69  (&zBuffer[nPrefi
8d10: 78 5d 2c 20 7a 43 73 72 2c 20 6e 53 75 66 66 69  x], zCsr, nSuffi
8d20: 78 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 66 65  x);.      nBuffe
8d30: 72 20 3d 20 6e 50 72 65 66 69 78 20 2b 20 6e 53  r = nPrefix + nS
8d40: 75 66 66 69 78 3b 0a 20 20 20 20 20 20 7a 43 73  uffix;.      zCs
8d50: 72 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20  r += nSuffix;.  
8d60: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72  .      /* Compar
8d70: 65 20 74 68 65 20 74 65 72 6d 20 77 65 20 61 72  e the term we ar
8d80: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
8d90: 77 69 74 68 20 74 68 65 20 74 65 72 6d 20 6a 75  with the term ju
8da0: 73 74 20 6c 6f 61 64 65 64 20 66 72 6f 6d 0a 20  st loaded from. 
8db0: 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 74 65       ** the inte
8dc0: 72 69 6f 72 20 6e 6f 64 65 2e 20 49 66 20 74 68  rior node. If th
8dd0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
8de0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
8df0: 20 6f 72 20 65 71 75 61 6c 0a 20 20 20 20 20 20   or equal.      
8e00: 2a 2a 20 74 6f 20 74 68 65 20 74 65 72 6d 20 66  ** to the term f
8e10: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 69 6f 72  rom the interior
8e20: 20 6e 6f 64 65 2c 20 74 68 65 6e 20 61 6c 6c 20   node, then all 
8e30: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 75 62  terms on the sub
8e40: 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20  -tree .      ** 
8e50: 68 65 61 64 65 64 20 62 79 20 6e 6f 64 65 20 69  headed by node i
8e60: 43 68 69 6c 64 20 61 72 65 20 73 6d 61 6c 6c 65  Child are smalle
8e70: 72 20 74 68 61 6e 20 7a 54 65 72 6d 2e 20 4e 6f  r than zTerm. No
8e80: 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63 68 20   need to search 
8e90: 0a 20 20 20 20 20 20 2a 2a 20 69 43 68 69 6c 64  .      ** iChild
8ea0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
8eb0: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 74 65 72   ** If the inter
8ec0: 69 6f 72 20 6e 6f 64 65 20 74 65 72 6d 20 69 73  ior node term is
8ed0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
8ee0: 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c   specified term,
8ef0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   then.      ** t
8f00: 68 65 20 74 72 65 65 20 68 65 61 64 65 64 20 62  he tree headed b
8f10: 79 20 69 43 68 69 6c 64 20 6d 61 79 20 63 6f 6e  y iChild may con
8f20: 74 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  tain the specifi
8f30: 65 64 20 74 65 72 6d 2e 0a 20 20 20 20 20 20 2a  ed term..      *
8f40: 2f 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 6d 65  /.      cmp = me
8f50: 6d 63 6d 70 28 7a 54 65 72 6d 2c 20 7a 42 75 66  mcmp(zTerm, zBuf
8f60: 66 65 72 2c 20 28 6e 42 75 66 66 65 72 3e 6e 54  fer, (nBuffer>nT
8f70: 65 72 6d 20 3f 20 6e 54 65 72 6d 20 3a 20 6e 42  erm ? nTerm : nB
8f80: 75 66 66 65 72 29 29 3b 0a 20 20 20 20 20 20 69  uffer));.      i
8f90: 66 28 20 63 6d 70 3c 30 20 7c 7c 20 28 63 6d 70  f( cmp<0 || (cmp
8fa0: 3d 3d 30 20 26 26 20 6e 42 75 66 66 65 72 3e 6e  ==0 && nBuffer>n
8fb0: 54 65 72 6d 29 20 29 20 62 72 65 61 6b 3b 0a 20  Term) ) break;. 
8fc0: 20 20 20 20 20 69 43 68 69 6c 64 2b 2b 3b 0a 20       iChild++;. 
8fd0: 20 20 20 7d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66     };..    /* If
8fe0: 20 28 69 48 65 69 67 68 74 3d 3d 31 29 2c 20 74   (iHeight==1), t
8ff0: 68 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  he children of t
9000: 68 69 73 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  his interior nod
9010: 65 20 61 72 65 20 6c 65 61 76 65 73 2e 20 54 68  e are leaves. Th
9020: 65 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  e.    ** specifi
9030: 65 64 20 74 65 72 6d 20 6d 61 79 20 62 65 20 70  ed term may be p
9040: 72 65 73 65 6e 74 20 6f 6e 20 6c 65 61 66 20 6e  resent on leaf n
9050: 6f 64 65 20 69 43 68 69 6c 64 2e 0a 20 20 20 20  ode iChild..    
9060: 2a 2f 0a 20 20 20 20 69 66 28 20 69 48 65 69 67  */.    if( iHeig
9070: 68 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 2a  ht==1 ){.      *
9080: 70 69 4c 65 61 66 20 3d 20 69 43 68 69 6c 64 3b  piLeaf = iChild;
9090: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
90a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 73 63    }..    /* Desc
90b0: 65 6e 64 20 74 6f 20 69 6e 74 65 72 69 6f 72 20  end to interior 
90c0: 6e 6f 64 65 20 69 43 68 69 6c 64 2e 20 2a 2f 0a  node iChild. */.
90d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
90e0: 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c  Fts3ReadBlock(p,
90f0: 20 69 43 68 69 6c 64 2c 20 26 7a 43 73 72 2c 20   iChild, &zCsr, 
9100: 26 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  &nBlock);.    if
9110: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9120: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 45 6e  ) break;.    zEn
9130: 64 20 3d 20 26 7a 43 73 72 5b 6e 42 6c 6f 63 6b  d = &zCsr[nBlock
9140: 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  ];.  }.  sqlite3
9150: 5f 66 72 65 65 28 7a 42 75 66 66 65 72 29 3b 0a  _free(zBuffer);.
9160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9180: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
9190: 72 65 61 74 65 20 64 65 6c 74 61 2d 65 6e 63 6f  reate delta-enco
91a0: 64 65 64 20 73 65 72 69 61 6c 69 7a 65 64 20 6c  ded serialized l
91b0: 69 73 74 73 20 6f 66 20 46 54 53 33 20 0a 2a 2a  ists of FTS3 .**
91c0: 20 76 61 72 69 6e 74 73 2e 20 45 61 63 68 20 63   varints. Each c
91d0: 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63  all to this func
91e0: 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 73  tion appends a s
91f0: 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20  ingle varint to 
9200: 61 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  a list..*/.stati
9210: 63 20 76 6f 69 64 20 66 74 73 33 50 75 74 44 65  c void fts3PutDe
9220: 6c 74 61 56 61 72 69 6e 74 28 0a 20 20 63 68 61  ltaVarint(.  cha
9230: 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20  r **pp,         
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9250: 49 4e 2f 4f 55 54 3a 20 4f 75 74 70 75 74 20 70  IN/OUT: Output p
9260: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ointer */.  sqli
9270: 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 50 72 65  te3_int64 *piPre
9280: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  v,          /* I
9290: 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20  N/OUT: Previous 
92a0: 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f  value written to
92b0: 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
92c0: 65 33 5f 69 6e 74 36 34 20 69 56 61 6c 20 20 20  e3_int64 iVal   
92d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
92e0: 69 74 65 20 74 68 69 73 20 76 61 6c 75 65 20 74  ite this value t
92f0: 6f 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 29 7b  o the list */.){
9300: 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 6c 2d  .  assert( iVal-
9310: 2a 70 69 50 72 65 76 20 3e 20 30 20 7c 7c 20 28  *piPrev > 0 || (
9320: 2a 70 69 50 72 65 76 3d 3d 30 20 26 26 20 69 56  *piPrev==0 && iV
9330: 61 6c 3d 3d 30 29 20 29 3b 0a 20 20 2a 70 70 20  al==0) );.  *pp 
9340: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
9350: 74 56 61 72 69 6e 74 28 2a 70 70 2c 20 69 56 61  tVarint(*pp, iVa
9360: 6c 2d 2a 70 69 50 72 65 76 29 3b 0a 20 20 2a 70  l-*piPrev);.  *p
9370: 69 50 72 65 76 20 3d 20 69 56 61 6c 3b 0a 7d 0a  iPrev = iVal;.}.
9380: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
9390: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
93a0: 6c 65 64 2c 20 2a 70 70 50 6f 73 6c 69 73 74 20  led, *ppPoslist 
93b0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f  is assumed to po
93c0: 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73  int to the .** s
93d0: 74 61 72 74 20 6f 66 20 61 20 70 6f 73 69 74 69  tart of a positi
93e0: 6f 6e 2d 6c 69 73 74 2e 20 41 66 74 65 72 20 69  on-list. After i
93f0: 74 20 72 65 74 75 72 6e 73 2c 20 2a 70 70 50 6f  t returns, *ppPo
9400: 73 6c 69 73 74 20 70 6f 69 6e 74 73 20 74 6f 20  slist points to 
9410: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 62 79 74  the.** first byt
9420: 65 20 61 66 74 65 72 20 74 68 65 20 70 6f 73 69  e after the posi
9430: 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  tion-list..**.**
9440: 20 41 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74   A position list
9450: 20 69 73 20 6c 69 73 74 20 6f 66 20 70 6f 73 69   is list of posi
9460: 74 69 6f 6e 73 20 28 64 65 6c 74 61 20 65 6e 63  tions (delta enc
9470: 6f 64 65 64 29 20 61 6e 64 20 63 6f 6c 75 6d 6e  oded) and column
9480: 73 20 66 6f 72 20 0a 2a 2a 20 61 20 73 69 6e 67  s for .** a sing
9490: 6c 65 20 64 6f 63 75 6d 65 6e 74 20 72 65 63 6f  le document reco
94a0: 72 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e  rd of a doclist.
94b0: 20 20 53 6f 2c 20 69 6e 20 6f 74 68 65 72 20 77    So, in other w
94c0: 6f 72 64 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f  ords, this.** ro
94d0: 75 74 69 6e 65 20 61 64 76 61 6e 63 65 73 20 2a  utine advances *
94e0: 70 70 50 6f 73 6c 69 73 74 20 73 6f 20 74 68 61  ppPoslist so tha
94f0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
9500: 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20 69 6e  he next docid in
9510: 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2c  .** the doclist,
9520: 20 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74   or to the first
9530: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
9540: 6e 64 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73  nd of the doclis
9550: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69  t..**.** If pp i
9560: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
9570: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
9580: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
9590: 73 74 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  st are copied.**
95a0: 20 74 6f 20 2a 70 70 2e 20 2a 70 70 20 69 73 20   to *pp. *pp is 
95b0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
95c0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
95d0: 61 73 74 20 74 68 65 20 6c 61 73 74 20 62 79 74  ast the last byt
95e0: 65 20 63 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f  e copied.** befo
95f0: 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
9600: 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61   returns..*/.sta
9610: 74 69 63 20 76 6f 69 64 20 66 74 73 33 50 6f 73  tic void fts3Pos
9620: 6c 69 73 74 43 6f 70 79 28 63 68 61 72 20 2a 2a  listCopy(char **
9630: 70 70 2c 20 63 68 61 72 20 2a 2a 70 70 50 6f 73  pp, char **ppPos
9640: 6c 69 73 74 29 7b 0a 20 20 63 68 61 72 20 2a 70  list){.  char *p
9650: 45 6e 64 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74  End = *ppPoslist
9660: 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a  ;.  char c = 0;.
9670: 0a 20 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66  .  /* The end of
9680: 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74   a position list
9690: 20 69 73 20 6d 61 72 6b 65 64 20 62 79 20 61 20   is marked by a 
96a0: 7a 65 72 6f 20 65 6e 63 6f 64 65 64 20 61 73 20  zero encoded as 
96b0: 61 6e 20 46 54 53 33 20 0a 20 20 2a 2a 20 76 61  an FTS3 .  ** va
96c0: 72 69 6e 74 2e 20 41 20 73 69 6e 67 6c 65 20 50  rint. A single P
96d0: 4f 53 5f 45 4e 44 20 28 30 29 20 62 79 74 65 2e  OS_END (0) byte.
96e0: 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
96f0: 30 20 62 79 74 65 20 69 73 20 70 72 65 63 65 64  0 byte is preced
9700: 65 64 20 62 79 0a 20 20 2a 2a 20 61 20 62 79 74  ed by.  ** a byt
9710: 65 20 77 69 74 68 20 74 68 65 20 30 78 38 30 20  e with the 0x80 
9720: 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20 69 74  bit set, then it
9730: 20 69 73 20 6e 6f 74 20 61 20 76 61 72 69 6e 74   is not a varint
9740: 20 30 2c 20 62 75 74 20 74 68 65 20 74 61 69 6c   0, but the tail
9750: 0a 20 20 2a 2a 20 6f 66 20 73 6f 6d 65 20 6f 74  .  ** of some ot
9760: 68 65 72 2c 20 6d 75 6c 74 69 2d 62 79 74 65 2c  her, multi-byte,
9770: 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a   value..  **.  *
9780: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9790: 77 68 69 6c 65 2d 6c 6f 6f 70 20 6d 6f 76 65 73  while-loop moves
97a0: 20 70 45 6e 64 20 74 6f 20 70 6f 69 6e 74 20 74   pEnd to point t
97b0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
97c0: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 0a 20 20   that is not .  
97d0: 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70  ** immediately p
97e0: 72 65 63 65 64 65 64 20 62 79 20 61 20 62 79 74  receded by a byt
97f0: 65 20 77 69 74 68 20 74 68 65 20 30 78 38 30 20  e with the 0x80 
9800: 62 69 74 20 73 65 74 2e 20 54 68 65 6e 20 69 6e  bit set. Then in
9810: 63 72 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 70 45  crements.  ** pE
9820: 6e 64 20 6f 6e 63 65 20 6d 6f 72 65 20 73 6f 20  nd once more so 
9830: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
9840: 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64  o the byte immed
9850: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
9860: 20 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 62   the.  ** last b
9870: 79 74 65 20 69 6e 20 74 68 65 20 70 6f 73 69 74  yte in the posit
9880: 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ion-list..  */. 
9890: 20 77 68 69 6c 65 28 20 2a 70 45 6e 64 20 7c 20   while( *pEnd | 
98a0: 63 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45  c ){.    c = *pE
98b0: 6e 64 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20  nd++ & 0x80;.   
98c0: 20 74 65 73 74 63 61 73 65 28 20 63 21 3d 30 20   testcase( c!=0 
98d0: 26 26 20 28 2a 70 45 6e 64 29 3d 3d 30 20 29 3b  && (*pEnd)==0 );
98e0: 0a 20 20 7d 0a 20 20 70 45 6e 64 2b 2b 3b 20 20  .  }.  pEnd++;  
98f0: 2f 2a 20 41 64 76 61 6e 63 65 20 70 61 73 74 20  /* Advance past 
9900: 74 68 65 20 50 4f 53 5f 45 4e 44 20 74 65 72 6d  the POS_END term
9910: 69 6e 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 0a  inator byte */..
9920: 20 20 69 66 28 20 70 70 20 29 7b 0a 20 20 20 20    if( pp ){.    
9930: 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 45  int n = (int)(pE
9940: 6e 64 20 2d 20 2a 70 70 50 6f 73 6c 69 73 74 29  nd - *ppPoslist)
9950: 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
9960: 2a 70 70 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *pp;.    memcpy(
9970: 70 2c 20 2a 70 70 50 6f 73 6c 69 73 74 2c 20 6e  p, *ppPoslist, n
9980: 29 3b 0a 20 20 20 20 70 20 2b 3d 20 6e 3b 0a 20  );.    p += n;. 
9990: 20 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 7d 0a     *pp = p;.  }.
99a0: 20 20 2a 70 70 50 6f 73 6c 69 73 74 20 3d 20 70    *ppPoslist = p
99b0: 45 6e 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  End;.}../*.** Wh
99c0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
99d0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 50   is called, *ppP
99e0: 6f 73 6c 69 73 74 20 69 73 20 61 73 73 75 6d 65  oslist is assume
99f0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
9a00: 65 20 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20 61  e .** start of a
9a10: 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 20 41 66   column-list. Af
9a20: 74 65 72 20 69 74 20 72 65 74 75 72 6e 73 2c 20  ter it returns, 
9a30: 2a 70 70 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74  *ppPoslist point
9a40: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 74 6f 20 74  s to the.** to t
9a50: 68 65 20 74 65 72 6d 69 6e 61 74 6f 72 20 28 50  he terminator (P
9a60: 4f 53 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53  OS_COLUMN or POS
9a70: 5f 45 4e 44 29 20 62 79 74 65 20 6f 66 20 74 68  _END) byte of th
9a80: 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 0a 2a  e column-list..*
9a90: 2a 0a 2a 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69  *.** A column-li
9aa0: 73 74 20 69 73 20 6c 69 73 74 20 6f 66 20 64 65  st is list of de
9ab0: 6c 74 61 2d 65 6e 63 6f 64 65 64 20 70 6f 73 69  lta-encoded posi
9ac0: 74 69 6f 6e 73 20 66 6f 72 20 61 20 73 69 6e 67  tions for a sing
9ad0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 77 69 74  le column.** wit
9ae0: 68 69 6e 20 61 20 73 69 6e 67 6c 65 20 64 6f 63  hin a single doc
9af0: 75 6d 65 6e 74 20 77 69 74 68 69 6e 20 61 20 64  ument within a d
9b00: 6f 63 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  oclist..**.** Th
9b10: 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73  e column-list is
9b20: 20 74 65 72 6d 69 6e 61 74 65 64 20 65 69 74 68   terminated eith
9b30: 65 72 20 62 79 20 61 20 50 4f 53 5f 43 4f 4c 55  er by a POS_COLU
9b40: 4d 4e 20 76 61 72 69 6e 74 20 28 31 29 20 6f 72  MN varint (1) or
9b50: 0a 2a 2a 20 61 20 50 4f 53 5f 45 4e 44 20 76 61  .** a POS_END va
9b60: 72 69 6e 74 20 28 30 29 2e 20 20 54 68 69 73 20  rint (0).  This 
9b70: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 2a  routine leaves *
9b80: 70 70 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 69  ppPoslist pointi
9b90: 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 50 4f 53  ng to.** the POS
9ba0: 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45  _COLUMN or POS_E
9bb0: 4e 44 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  ND that terminat
9bc0: 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69  es the column-li
9bd0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20  st..**.** If pp 
9be0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
9bf0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
9c00: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73  f the column-lis
9c10: 74 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  t are copied.** 
9c20: 74 6f 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 73  to *pp. *pp is s
9c30: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
9c40: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
9c50: 73 74 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  st the last byte
9c60: 20 63 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72   copied.** befor
9c70: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
9c80: 72 65 74 75 72 6e 73 2e 20 20 54 68 65 20 50 4f  returns.  The PO
9c90: 53 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f  S_COLUMN or POS_
9ca0: 45 4e 44 20 74 65 72 6d 69 6e 61 74 6f 72 0a 2a  END terminator.*
9cb0: 2a 20 69 73 20 6e 6f 74 20 63 6f 70 69 65 64 20  * is not copied 
9cc0: 69 6e 74 6f 20 2a 70 70 2e 0a 2a 2f 0a 73 74 61  into *pp..*/.sta
9cd0: 74 69 63 20 76 6f 69 64 20 66 74 73 33 43 6f 6c  tic void fts3Col
9ce0: 75 6d 6e 6c 69 73 74 43 6f 70 79 28 63 68 61 72  umnlistCopy(char
9cf0: 20 2a 2a 70 70 2c 20 63 68 61 72 20 2a 2a 70 70   **pp, char **pp
9d00: 50 6f 73 6c 69 73 74 29 7b 0a 20 20 63 68 61 72  Poslist){.  char
9d10: 20 2a 70 45 6e 64 20 3d 20 2a 70 70 50 6f 73 6c   *pEnd = *ppPosl
9d20: 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20 3d 20  ist;.  char c = 
9d30: 30 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6c 75 6d  0;..  /* A colum
9d40: 6e 2d 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e  n-list is termin
9d50: 61 74 65 64 20 62 79 20 65 69 74 68 65 72 20 61  ated by either a
9d60: 20 30 78 30 31 20 6f 72 20 30 78 30 30 20 62 79   0x01 or 0x00 by
9d70: 74 65 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  te that is.  ** 
9d80: 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
9d90: 6c 74 69 2d 62 79 74 65 20 76 61 72 69 6e 74 2e  lti-byte varint.
9da0: 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 30  .  */.  while( 0
9db0: 78 46 45 20 26 20 28 2a 70 45 6e 64 20 7c 20 63  xFE & (*pEnd | c
9dc0: 29 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45  ) ){.    c = *pE
9dd0: 6e 64 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20  nd++ & 0x80;.   
9de0: 20 74 65 73 74 63 61 73 65 28 20 63 21 3d 30 20   testcase( c!=0 
9df0: 26 26 20 28 28 2a 70 45 6e 64 29 26 30 78 66 65  && ((*pEnd)&0xfe
9e00: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  )==0 );.  }.  if
9e10: 28 20 70 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  ( pp ){.    int 
9e20: 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 20 2d  n = (int)(pEnd -
9e30: 20 2a 70 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20   *ppPoslist);.  
9e40: 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b    char *p = *pp;
9e50: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 2a  .    memcpy(p, *
9e60: 70 70 50 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a 20  ppPoslist, n);. 
9e70: 20 20 20 70 20 2b 3d 20 6e 3b 0a 20 20 20 20 2a     p += n;.    *
9e80: 70 70 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a 70  pp = p;.  }.  *p
9e90: 70 50 6f 73 6c 69 73 74 20 3d 20 70 45 6e 64 3b  pPoslist = pEnd;
9ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20  .}../*.** Value 
9eb0: 75 73 65 64 20 74 6f 20 73 69 67 6e 69 66 79 20  used to signify 
9ec0: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 70 6f  the end of an po
9ed0: 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 54 68 69  sition-list. Thi
9ee0: 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
9ef0: 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70  e.** it is not p
9f00: 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20  ossible to have 
9f10: 61 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  a document with 
9f20: 32 5e 33 31 20 74 65 72 6d 73 2e 0a 2a 2f 0a 23  2^31 terms..*/.#
9f30: 64 65 66 69 6e 65 20 50 4f 53 49 54 49 4f 4e 5f  define POSITION_
9f40: 4c 49 53 54 5f 45 4e 44 20 30 78 37 66 66 66 66  LIST_END 0x7ffff
9f50: 66 66 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  fff../*.** This 
9f60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
9f70: 20 74 6f 20 68 65 6c 70 20 70 61 72 73 65 20 70   to help parse p
9f80: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 73 2e 20 57  osition-lists. W
9f90: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
9fa0: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
9fb0: 2a 70 70 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  *pp may point to
9fc0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
9fd0: 65 20 6e 65 78 74 20 76 61 72 69 6e 74 20 69 6e  e next varint in
9fe0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
9ff0: 73 74 0a 2a 2a 20 62 65 69 6e 67 20 70 61 72 73  st.** being pars
a000: 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f  ed, or it may po
a010: 69 6e 74 20 74 6f 20 31 20 62 79 74 65 20 70 61  int to 1 byte pa
a020: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
a030: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a  e position-list.
a040: 2a 2a 20 28 69 6e 20 77 68 69 63 68 20 63 61 73  ** (in which cas
a050: 65 20 2a 2a 70 70 20 77 69 6c 6c 20 62 65 20 61  e **pp will be a
a060: 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
a070: 73 20 50 4f 53 5f 45 4e 44 20 28 30 29 20 6f 72  s POS_END (0) or
a080: 0a 2a 2a 20 28 31 29 29 2e 0a 2a 2a 0a 2a 2a 20  .** (1))..**.** 
a090: 49 66 20 2a 70 70 20 70 6f 69 6e 74 73 20 70 61  If *pp points pa
a0a0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
a0b0: 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
a0c0: 6f 6e 2d 6c 69 73 74 2c 20 73 65 74 20 2a 70 69  on-list, set *pi
a0d0: 20 74 6f 20 0a 2a 2a 20 50 4f 53 49 54 49 4f 4e   to .** POSITION
a0e0: 5f 4c 49 53 54 5f 45 4e 44 20 61 6e 64 20 72 65  _LIST_END and re
a0f0: 74 75 72 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  turn. Otherwise,
a100: 20 72 65 61 64 20 74 68 65 20 6e 65 78 74 20 76   read the next v
a110: 61 72 69 6e 74 20 66 72 6f 6d 20 2a 70 70 2c 0a  arint from *pp,.
a120: 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** increment the
a130: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
a140: 66 20 2a 70 69 20 62 79 20 74 68 65 20 76 61 6c  f *pi by the val
a150: 75 65 20 72 65 61 64 2c 20 61 6e 64 20 73 65 74  ue read, and set
a160: 20 2a 70 70 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74   *pp to.** point
a170: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c   to the next val
a180: 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
a190: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ing..**.** Befor
a1a0: 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  e calling this r
a1b0: 6f 75 74 69 6e 65 20 2a 70 69 20 6d 75 73 74 20  outine *pi must 
a1c0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
a1d0: 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  o the value of.*
a1e0: 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  * the previous p
a1f0: 6f 73 69 74 69 6f 6e 2c 20 6f 72 20 7a 65 72 6f  osition, or zero
a200: 20 69 66 20 77 65 20 61 72 65 20 72 65 61 64 69   if we are readi
a210: 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 73  ng the first pos
a220: 69 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ition.** in the 
a230: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 20  position-list.  
a240: 42 65 63 61 75 73 65 20 70 6f 73 69 74 69 6f 6e  Because position
a250: 73 20 61 72 65 20 64 65 6c 74 61 2d 65 6e 63 6f  s are delta-enco
a260: 64 65 64 2c 20 74 68 65 20 76 61 6c 75 65 0a 2a  ded, the value.*
a270: 2a 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  * of the previou
a280: 73 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 6e 65  s position is ne
a290: 65 64 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  eded in order to
a2a0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c   compute the val
a2b0: 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 78  ue of.** the nex
a2c0: 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  t position..*/.s
a2d0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 52  tatic void fts3R
a2e0: 65 61 64 4e 65 78 74 50 6f 73 28 0a 20 20 63 68  eadNextPos(.  ch
a2f0: 61 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  ar **pp,        
a300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a310: 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 69  N/OUT: Pointer i
a320: 6e 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  nto position-lis
a330: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 73 71  t buffer */.  sq
a340: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 20  lite3_int64 *pi 
a350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a360: 4e 2f 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  N/OUT: Value rea
a370: 64 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 2d  d from position-
a380: 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  list */.){.  if(
a390: 20 28 2a 2a 70 70 29 26 30 78 46 45 20 29 7b 0a   (**pp)&0xFE ){.
a3a0: 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61      fts3GetDelta
a3b0: 56 61 72 69 6e 74 28 70 70 2c 20 70 69 29 3b 0a  Varint(pp, pi);.
a3c0: 20 20 20 20 2a 70 69 20 2d 3d 20 32 3b 0a 20 20      *pi -= 2;.  
a3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 20 3d  }else{.    *pi =
a3e0: 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45   POSITION_LIST_E
a3f0: 4e 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ND;.  }.}../*.**
a400: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 43   If parameter iC
a410: 6f 6c 20 69 73 20 6e 6f 74 20 30 2c 20 77 72 69  ol is not 0, wri
a420: 74 65 20 61 6e 20 50 4f 53 5f 43 4f 4c 55 4d 4e  te an POS_COLUMN
a430: 20 28 31 29 20 62 79 74 65 20 66 6f 6c 6c 6f 77   (1) byte follow
a440: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 61 6c  ed by.** the val
a450: 75 65 20 6f 66 20 69 43 6f 6c 20 65 6e 63 6f 64  ue of iCol encod
a460: 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 20 74  ed as a varint t
a470: 6f 20 2a 70 70 2e 20 20 20 54 68 69 73 20 77 69  o *pp.   This wi
a480: 6c 6c 20 73 74 61 72 74 20 61 20 6e 65 77 0a 2a  ll start a new.*
a490: 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 2a  * column list..*
a4a0: 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 20 74 6f 20  *.** Set *pp to 
a4b0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 79 74  point to the byt
a4c0: 65 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  e just after the
a4d0: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
a4e0: 65 6e 20 62 65 66 6f 72 65 20 0a 2a 2a 20 72 65  en before .** re
a4f0: 74 75 72 6e 69 6e 67 20 28 64 6f 20 6e 6f 74 20  turning (do not 
a500: 6d 6f 64 69 66 79 20 69 74 20 69 66 20 69 43 6f  modify it if iCo
a510: 6c 3d 3d 30 29 2e 20 52 65 74 75 72 6e 20 74 68  l==0). Return th
a520: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a530: 66 20 62 79 74 65 73 0a 2a 2a 20 77 72 69 74 74  f bytes.** writt
a540: 65 6e 20 28 30 20 69 66 20 69 43 6f 6c 3d 3d 30  en (0 if iCol==0
a550: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
a560: 20 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65   fts3PutColNumbe
a570: 72 28 63 68 61 72 20 2a 2a 70 70 2c 20 69 6e 74  r(char **pp, int
a580: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 20   iCol){.  int n 
a590: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a5b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
a5c0: 74 74 65 6e 20 2a 2f 0a 20 20 69 66 28 20 69 43  tten */.  if( iC
a5d0: 6f 6c 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ol ){.    char *
a5e0: 70 20 3d 20 2a 70 70 3b 20 20 20 20 20 20 20 20  p = *pp;        
a5f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
a600: 74 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  t pointer */.   
a610: 20 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33   n = 1 + sqlite3
a620: 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
a630: 5b 31 5d 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  [1], iCol);.    
a640: 2a 70 20 3d 20 30 78 30 31 3b 0a 20 20 20 20 2a  *p = 0x01;.    *
a650: 70 70 20 3d 20 26 70 5b 6e 5d 3b 0a 20 20 7d 0a  pp = &p[n];.  }.
a660: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
a670: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
a680: 20 75 6e 69 6f 6e 20 6f 66 20 74 77 6f 20 70 6f   union of two po
a690: 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 20 54  sition lists.  T
a6a0: 68 65 20 6f 75 74 70 75 74 20 77 72 69 74 74 65  he output writte
a6b0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 70 20 63 6f  n.** into *pp co
a6c0: 6e 74 61 69 6e 73 20 61 6c 6c 20 70 6f 73 69 74  ntains all posit
a6d0: 69 6f 6e 73 20 6f 66 20 62 6f 74 68 20 2a 70 70  ions of both *pp
a6e0: 31 20 61 6e 64 20 2a 70 70 32 20 69 6e 20 73 6f  1 and *pp2 in so
a6f0: 72 74 65 64 0a 2a 2a 20 6f 72 64 65 72 20 61 6e  rted.** order an
a700: 64 20 77 69 74 68 20 61 6e 79 20 64 75 70 6c 69  d with any dupli
a710: 63 61 74 65 73 20 72 65 6d 6f 76 65 64 2e 20 20  cates removed.  
a720: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  All pointers are
a730: 0a 2a 2a 20 75 70 64 61 74 65 64 20 61 70 70 72  .** updated appr
a740: 6f 70 72 69 61 74 65 6c 79 2e 20 20 20 54 68 65  opriately.   The
a750: 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
a760: 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 73 75 72  nsible for insur
a770: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 72  ing.** that ther
a780: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
a790: 65 20 69 6e 20 2a 70 70 20 74 6f 20 68 6f 6c 64  e in *pp to hold
a7a0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6f 75   the complete ou
a7b0: 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tput..*/.static 
a7c0: 76 6f 69 64 20 66 74 73 33 50 6f 73 6c 69 73 74  void fts3Poslist
a7d0: 4d 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a 2a  Merge(.  char **
a7e0: 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pp,             
a7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
a800: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 63  ut buffer */.  c
a810: 68 61 72 20 2a 2a 70 70 31 2c 20 20 20 20 20 20  har **pp1,      
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a830: 2a 20 4c 65 66 74 20 69 6e 70 75 74 20 6c 69 73  * Left input lis
a840: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  t */.  char **pp
a850: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
a860: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
a870: 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a 29 7b  input list */.){
a880: 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70  .  char *p = *pp
a890: 3b 0a 20 20 63 68 61 72 20 2a 70 31 20 3d 20 2a  ;.  char *p1 = *
a8a0: 70 70 31 3b 0a 20 20 63 68 61 72 20 2a 70 32 20  pp1;.  char *p2 
a8b0: 3d 20 2a 70 70 32 3b 0a 0a 20 20 77 68 69 6c 65  = *pp2;..  while
a8c0: 28 20 2a 70 31 20 7c 7c 20 2a 70 32 20 29 7b 0a  ( *p1 || *p2 ){.
a8d0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 31 3b 20 20      int iCol1;  
a8e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
a8f0: 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e 64  rrent column ind
a900: 65 78 20 69 6e 20 70 70 31 20 2a 2f 0a 20 20 20  ex in pp1 */.   
a910: 20 69 6e 74 20 69 43 6f 6c 32 3b 20 20 20 20 20   int iCol2;     
a920: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
a930: 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  nt column index 
a940: 69 6e 20 70 70 32 20 2a 2f 0a 0a 20 20 20 20 69  in pp2 */..    i
a950: 66 28 20 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c 55  f( *p1==POS_COLU
a960: 4d 4e 20 29 20 73 71 6c 69 74 65 33 46 74 73 33  MN ) sqlite3Fts3
a970: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 31 5b  GetVarint32(&p1[
a980: 31 5d 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20  1], &iCol1);.   
a990: 20 65 6c 73 65 20 69 66 28 20 2a 70 31 3d 3d 50   else if( *p1==P
a9a0: 4f 53 5f 45 4e 44 20 29 20 69 43 6f 6c 31 20 3d  OS_END ) iCol1 =
a9b0: 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45   POSITION_LIST_E
a9c0: 4e 44 3b 0a 20 20 20 20 65 6c 73 65 20 69 43 6f  ND;.    else iCo
a9d0: 6c 31 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  l1 = 0;..    if(
a9e0: 20 2a 70 32 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e   *p2==POS_COLUMN
a9f0: 20 29 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   ) sqlite3Fts3Ge
aa00: 74 56 61 72 69 6e 74 33 32 28 26 70 32 5b 31 5d  tVarint32(&p2[1]
aa10: 2c 20 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20 65  , &iCol2);.    e
aa20: 6c 73 65 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53  lse if( *p2==POS
aa30: 5f 45 4e 44 20 29 20 69 43 6f 6c 32 20 3d 20 50  _END ) iCol2 = P
aa40: 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44  OSITION_LIST_END
aa50: 3b 0a 20 20 20 20 65 6c 73 65 20 69 43 6f 6c 32  ;.    else iCol2
aa60: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
aa70: 43 6f 6c 31 3d 3d 69 43 6f 6c 32 20 29 7b 0a 20  Col1==iCol2 ){. 
aa80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
aa90: 36 34 20 69 31 20 3d 20 30 3b 20 20 20 20 20 20  64 i1 = 0;      
aaa0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f   /* Last positio
aab0: 6e 20 66 72 6f 6d 20 70 70 31 20 2a 2f 0a 20 20  n from pp1 */.  
aac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
aad0: 34 20 69 32 20 3d 20 30 3b 20 20 20 20 20 20 20  4 i2 = 0;       
aae0: 2f 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e  /* Last position
aaf0: 20 66 72 6f 6d 20 70 70 32 20 2a 2f 0a 20 20 20   from pp2 */.   
ab00: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
ab10: 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   iPrev = 0;.    
ab20: 20 20 69 6e 74 20 6e 20 3d 20 66 74 73 33 50 75    int n = fts3Pu
ab30: 74 43 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69  tColNumber(&p, i
ab40: 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20 70 31 20  Col1);.      p1 
ab50: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 70 32 20 2b  += n;.      p2 +
ab60: 3d 20 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41  = n;..      /* A
ab70: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 6f  t this point, bo
ab80: 74 68 20 70 31 20 61 6e 64 20 70 32 20 70 6f 69  th p1 and p2 poi
ab90: 6e 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  nt to the start 
aba0: 6f 66 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 73 0a  of column-lists.
abb0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
abc0: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 74 68   same column (th
abd0: 65 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 69 6e  e column with in
abe0: 64 65 78 20 69 43 6f 6c 31 20 61 6e 64 20 69 43  dex iCol1 and iC
abf0: 6f 6c 32 29 2e 0a 20 20 20 20 20 20 2a 2a 20 41  ol2)..      ** A
ac00: 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20   column-list is 
ac10: 61 20 6c 69 73 74 20 6f 66 20 6e 6f 6e 2d 6e 65  a list of non-ne
ac20: 67 61 74 69 76 65 20 64 65 6c 74 61 2d 65 6e 63  gative delta-enc
ac30: 6f 64 65 64 20 76 61 72 69 6e 74 73 2c 20 65 61  oded varints, ea
ac40: 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ch .      ** inc
ac50: 72 65 6d 65 6e 74 65 64 20 62 79 20 32 20 62 65  remented by 2 be
ac60: 66 6f 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65  fore being store
ac70: 64 2e 20 45 61 63 68 20 6c 69 73 74 20 69 73 20  d. Each list is 
ac80: 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 0a  terminated by a.
ac90: 20 20 20 20 20 20 2a 2a 20 50 4f 53 5f 45 4e 44        ** POS_END
aca0: 20 28 30 29 20 6f 72 20 50 4f 53 5f 43 4f 4c 55   (0) or POS_COLU
acb0: 4d 4e 20 28 31 29 2e 20 54 68 65 20 66 6f 6c 6c  MN (1). The foll
acc0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 65 72 67  owing block merg
acd0: 65 73 20 74 68 65 20 74 77 6f 20 6c 69 73 74 73  es the two lists
ace0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77 72  .      ** and wr
acf0: 69 74 65 73 20 74 68 65 20 72 65 73 75 6c 74 73  ites the results
ad00: 20 74 6f 20 62 75 66 66 65 72 20 70 2e 20 70 20   to buffer p. p 
ad10: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
ad20: 20 74 6f 20 74 68 65 20 62 79 74 65 0a 20 20 20   to the byte.   
ad30: 20 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20     ** after the 
ad40: 6c 69 73 74 20 77 72 69 74 74 65 6e 2e 20 4e 6f  list written. No
ad50: 20 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53   terminator (POS
ad60: 5f 45 4e 44 20 6f 72 20 50 4f 53 5f 43 4f 4c 55  _END or POS_COLU
ad70: 4d 4e 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  MN) is.      ** 
ad80: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
ad90: 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  utput..      */.
ada0: 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c        fts3GetDel
adb0: 74 61 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69  taVarint(&p1, &i
adc0: 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65  1);.      fts3Ge
add0: 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32  tDeltaVarint(&p2
ade0: 2c 20 26 69 32 29 3b 0a 20 20 20 20 20 20 64 6f  , &i2);.      do
adf0: 20 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 50   {.        fts3P
ae00: 75 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70  utDeltaVarint(&p
ae10: 2c 20 26 69 50 72 65 76 2c 20 28 69 31 3c 69 32  , &iPrev, (i1<i2
ae20: 29 20 3f 20 69 31 20 3a 20 69 32 29 3b 20 0a 20  ) ? i1 : i2); . 
ae30: 20 20 20 20 20 20 20 69 50 72 65 76 20 2d 3d 20         iPrev -= 
ae40: 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  2;.        if( i
ae50: 31 3d 3d 69 32 20 29 7b 0a 20 20 20 20 20 20 20  1==i2 ){.       
ae60: 20 20 20 66 74 73 33 52 65 61 64 4e 65 78 74 50     fts3ReadNextP
ae70: 6f 73 28 26 70 31 2c 20 26 69 31 29 3b 0a 20 20  os(&p1, &i1);.  
ae80: 20 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64          fts3Read
ae90: 4e 65 78 74 50 6f 73 28 26 70 32 2c 20 26 69 32  NextPos(&p2, &i2
aea0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
aeb0: 20 69 66 28 20 69 31 3c 69 32 20 29 7b 0a 20 20   if( i1<i2 ){.  
aec0: 20 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64          fts3Read
aed0: 4e 65 78 74 50 6f 73 28 26 70 31 2c 20 26 69 31  NextPos(&p1, &i1
aee0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
aef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
af00: 52 65 61 64 4e 65 78 74 50 6f 73 28 26 70 32 2c  ReadNextPos(&p2,
af10: 20 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d   &i2);.        }
af20: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 69  .      }while( i
af30: 31 21 3d 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54  1!=POSITION_LIST
af40: 5f 45 4e 44 20 7c 7c 20 69 32 21 3d 50 4f 53 49  _END || i2!=POSI
af50: 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 20 29 3b  TION_LIST_END );
af60: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
af70: 43 6f 6c 31 3c 69 43 6f 6c 32 20 29 7b 0a 20 20  Col1<iCol2 ){.  
af80: 20 20 20 20 70 31 20 2b 3d 20 66 74 73 33 50 75      p1 += fts3Pu
af90: 74 43 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69  tColNumber(&p, i
afa0: 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20 66 74 73  Col1);.      fts
afb0: 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28  3ColumnlistCopy(
afc0: 26 70 2c 20 26 70 31 29 3b 0a 20 20 20 20 7d 65  &p, &p1);.    }e
afd0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d  lse{.      p2 +=
afe0: 20 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65   fts3PutColNumbe
aff0: 72 28 26 70 2c 20 69 43 6f 6c 32 29 3b 0a 20 20  r(&p, iCol2);.  
b000: 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69      fts3Columnli
b010: 73 74 43 6f 70 79 28 26 70 2c 20 26 70 32 29 3b  stCopy(&p, &p2);
b020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
b030: 2b 2b 20 3d 20 50 4f 53 5f 45 4e 44 3b 0a 20 20  ++ = POS_END;.  
b040: 2a 70 70 20 3d 20 70 3b 0a 20 20 2a 70 70 31 20  *pp = p;.  *pp1 
b050: 3d 20 70 31 20 2b 20 31 3b 0a 20 20 2a 70 70 32  = p1 + 1;.  *pp2
b060: 20 3d 20 70 32 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a   = p2 + 1;.}../*
b070: 0a 2a 2a 20 6e 54 6f 6b 65 6e 3d 3d 31 20 73 65  .** nToken==1 se
b080: 61 72 63 68 65 73 20 66 6f 72 20 61 64 6a 61 63  arches for adjac
b090: 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 2e 0a 2a  ent positions..*
b0a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b0b0: 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65  3PoslistPhraseMe
b0c0: 72 67 65 28 0a 20 20 63 68 61 72 20 2a 2a 70 70  rge(.  char **pp
b0d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b0e0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
b0f0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
b100: 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20   nToken,        
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b120: 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72 65 6e  Maximum differen
b130: 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f 73 69  ce in token posi
b140: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
b150: 73 53 61 76 65 4c 65 66 74 2c 20 20 20 20 20 20  sSaveLeft,      
b160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
b170: 76 65 20 74 68 65 20 6c 65 66 74 20 70 6f 73 69  ve the left posi
b180: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
b190: 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  *pp1,           
b1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
b1b0: 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a  t input list */.
b1c0: 20 20 63 68 61 72 20 2a 2a 70 70 32 20 20 20 20    char **pp2    
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1e0: 20 20 2f 2a 20 52 69 67 68 74 20 69 6e 70 75 74    /* Right input
b1f0: 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 68   list */.){.  ch
b200: 61 72 20 2a 70 20 3d 20 28 70 70 20 3f 20 2a 70  ar *p = (pp ? *p
b210: 70 20 3a 20 30 29 3b 0a 20 20 63 68 61 72 20 2a  p : 0);.  char *
b220: 70 31 20 3d 20 2a 70 70 31 3b 0a 20 20 63 68 61  p1 = *pp1;.  cha
b230: 72 20 2a 70 32 20 3d 20 2a 70 70 32 3b 0a 0a 20  r *p2 = *pp2;.. 
b240: 20 69 6e 74 20 69 43 6f 6c 31 20 3d 20 30 3b 0a   int iCol1 = 0;.
b250: 20 20 69 6e 74 20 69 43 6f 6c 32 20 3d 20 30 3b    int iCol2 = 0;
b260: 0a 20 20 61 73 73 65 72 74 28 20 2a 70 31 21 3d  .  assert( *p1!=
b270: 30 20 26 26 20 2a 70 32 21 3d 30 20 29 3b 0a 20  0 && *p2!=0 );. 
b280: 20 69 66 28 20 2a 70 31 3d 3d 50 4f 53 5f 43 4f   if( *p1==POS_CO
b290: 4c 55 4d 4e 20 29 7b 20 0a 20 20 20 20 70 31 2b  LUMN ){ .    p1+
b2a0: 2b 3b 0a 20 20 20 20 70 31 20 2b 3d 20 73 71 6c  +;.    p1 += sql
b2b0: 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
b2c0: 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31 29 3b  t32(p1, &iCol1);
b2d0: 0a 20 20 7d 0a 20 20 69 66 28 20 2a 70 32 3d 3d  .  }.  if( *p2==
b2e0: 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 7b 20 0a 20  POS_COLUMN ){ . 
b2f0: 20 20 20 70 32 2b 2b 3b 0a 20 20 20 20 70 32 20     p2++;.    p2 
b300: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
b310: 74 56 61 72 69 6e 74 33 32 28 70 32 2c 20 26 69  tVarint32(p2, &i
b320: 43 6f 6c 32 29 3b 0a 20 20 7d 0a 0a 20 20 77 68  Col2);.  }..  wh
b330: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
b340: 28 20 69 43 6f 6c 31 3d 3d 69 43 6f 6c 32 20 29  ( iCol1==iCol2 )
b350: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 53  {.      char *pS
b360: 61 76 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 73  ave = p;.      s
b370: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72  qlite3_int64 iPr
b380: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ev = 0;.      sq
b390: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f 73  lite3_int64 iPos
b3a0: 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  1 = 0;.      sql
b3b0: 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f 73 32  ite3_int64 iPos2
b3c0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
b3d0: 20 70 70 20 26 26 20 69 43 6f 6c 31 20 29 7b 0a   pp && iCol1 ){.
b3e0: 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 50          *p++ = P
b3f0: 4f 53 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  OS_COLUMN;.     
b400: 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46     p += sqlite3F
b410: 74 73 33 50 75 74 56 61 72 69 6e 74 28 70 2c 20  ts3PutVarint(p, 
b420: 69 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20 7d 0a  iCol1);.      }.
b430: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
b440: 70 31 21 3d 50 4f 53 5f 45 4e 44 20 26 26 20 2a  p1!=POS_END && *
b450: 70 31 21 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29  p1!=POS_COLUMN )
b460: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b470: 2a 70 32 21 3d 50 4f 53 5f 45 4e 44 20 26 26 20  *p2!=POS_END && 
b480: 2a 70 32 21 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20  *p2!=POS_COLUMN 
b490: 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  );.      fts3Get
b4a0: 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 31 2c  DeltaVarint(&p1,
b4b0: 20 26 69 50 6f 73 31 29 3b 20 69 50 6f 73 31 20   &iPos1); iPos1 
b4c0: 2d 3d 20 32 3b 0a 20 20 20 20 20 20 66 74 73 33  -= 2;.      fts3
b4d0: 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26  GetDeltaVarint(&
b4e0: 70 32 2c 20 26 69 50 6f 73 32 29 3b 20 69 50 6f  p2, &iPos2); iPo
b4f0: 73 32 20 2d 3d 20 32 3b 0a 0a 20 20 20 20 20 20  s2 -= 2;..      
b500: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
b510: 20 20 20 20 69 66 28 20 69 50 6f 73 32 3e 69 50      if( iPos2>iP
b520: 6f 73 31 20 26 26 20 69 50 6f 73 32 3c 3d 69 50  os1 && iPos2<=iP
b530: 6f 73 31 2b 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  os1+nToken ){.  
b540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b550: 69 6e 74 36 34 20 69 53 61 76 65 3b 0a 20 20 20  int64 iSave;.   
b560: 20 20 20 20 20 20 20 69 66 28 20 21 70 70 20 29         if( !pp )
b570: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
b580: 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c  s3PoslistCopy(0,
b590: 20 26 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20   &p2);.         
b5a0: 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f     fts3PoslistCo
b5b0: 70 79 28 30 2c 20 26 70 31 29 3b 0a 20 20 20 20  py(0, &p1);.    
b5c0: 20 20 20 20 20 20 20 20 2a 70 70 31 20 3d 20 70          *pp1 = p
b5d0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  1;.            *
b5e0: 70 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20  pp2 = p2;.      
b5f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b600: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b610: 20 20 20 20 20 20 69 53 61 76 65 20 3d 20 69 73        iSave = is
b620: 53 61 76 65 4c 65 66 74 20 3f 20 69 50 6f 73 31  SaveLeft ? iPos1
b630: 20 3a 20 69 50 6f 73 32 3b 0a 20 20 20 20 20 20   : iPos2;.      
b640: 20 20 20 20 66 74 73 33 50 75 74 44 65 6c 74 61      fts3PutDelta
b650: 56 61 72 69 6e 74 28 26 70 2c 20 26 69 50 72 65  Varint(&p, &iPre
b660: 76 2c 20 69 53 61 76 65 2b 32 29 3b 20 69 50 72  v, iSave+2); iPr
b670: 65 76 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20  ev -= 2;.       
b680: 20 20 20 70 53 61 76 65 20 3d 20 30 3b 0a 20 20     pSave = 0;.  
b690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b6a0: 69 66 28 20 28 21 69 73 53 61 76 65 4c 65 66 74  if( (!isSaveLeft
b6b0: 20 26 26 20 69 50 6f 73 32 3c 3d 28 69 50 6f 73   && iPos2<=(iPos
b6c0: 31 2b 6e 54 6f 6b 65 6e 29 29 20 7c 7c 20 69 50  1+nToken)) || iP
b6d0: 6f 73 32 3c 3d 69 50 6f 73 31 20 29 7b 0a 20 20  os2<=iPos1 ){.  
b6e0: 20 20 20 20 20 20 20 20 69 66 28 20 28 2a 70 32          if( (*p2
b6f0: 26 30 78 46 45 29 3d 3d 30 20 29 20 62 72 65 61  &0xFE)==0 ) brea
b700: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  k;.          fts
b710: 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28  3GetDeltaVarint(
b720: 26 70 32 2c 20 26 69 50 6f 73 32 29 3b 20 69 50  &p2, &iPos2); iP
b730: 6f 73 32 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20  os2 -= 2;.      
b740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b750: 20 20 20 69 66 28 20 28 2a 70 31 26 30 78 46 45     if( (*p1&0xFE
b760: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
b770: 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74 44          fts3GetD
b780: 65 6c 74 61 56 61 72 69 6e 74 28 26 70 31 2c 20  eltaVarint(&p1, 
b790: 26 69 50 6f 73 31 29 3b 20 69 50 6f 73 31 20 2d  &iPos1); iPos1 -
b7a0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 2;.        }. 
b7b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
b7c0: 28 20 70 53 61 76 65 20 29 7b 0a 20 20 20 20 20  ( pSave ){.     
b7d0: 20 20 20 61 73 73 65 72 74 28 20 70 70 20 26 26     assert( pp &&
b7e0: 20 70 20 29 3b 0a 20 20 20 20 20 20 20 20 70 20   p );.        p 
b7f0: 3d 20 70 53 61 76 65 3b 0a 20 20 20 20 20 20 7d  = pSave;.      }
b800: 0a 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75  ..      fts3Colu
b810: 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  mnlistCopy(0, &p
b820: 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33 43 6f  1);.      fts3Co
b830: 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20  lumnlistCopy(0, 
b840: 26 70 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  &p2);.      asse
b850: 72 74 28 20 28 2a 70 31 26 30 78 46 45 29 3d 3d  rt( (*p1&0xFE)==
b860: 30 20 26 26 20 28 2a 70 32 26 30 78 46 45 29 3d  0 && (*p2&0xFE)=
b870: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
b880: 30 3d 3d 2a 70 31 20 7c 7c 20 30 3d 3d 2a 70 32  0==*p1 || 0==*p2
b890: 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
b8a0: 20 70 31 2b 2b 3b 0a 20 20 20 20 20 20 70 31 20   p1++;.      p1 
b8b0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
b8c0: 74 56 61 72 69 6e 74 33 32 28 70 31 2c 20 26 69  tVarint32(p1, &i
b8d0: 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20 70 32 2b  Col1);.      p2+
b8e0: 2b 3b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 73  +;.      p2 += s
b8f0: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
b900: 69 6e 74 33 32 28 70 32 2c 20 26 69 43 6f 6c 32  int32(p2, &iCol2
b910: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
b920: 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72   Advance pointer
b930: 20 70 31 20 6f 72 20 70 32 20 28 77 68 69 63 68   p1 or p2 (which
b940: 65 76 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  ever corresponds
b950: 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72 20   to the smaller 
b960: 6f 66 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 31 20  of.    ** iCol1 
b970: 61 6e 64 20 69 43 6f 6c 32 29 20 73 6f 20 74 68  and iCol2) so th
b980: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
b990: 65 69 74 68 65 72 20 74 68 65 20 30 78 30 30 20  either the 0x00 
b9a0: 74 68 61 74 20 6d 61 72 6b 73 20 74 68 65 0a 20  that marks the. 
b9b0: 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
b9c0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20   position list, 
b9d0: 6f 72 20 74 68 65 20 30 78 30 31 20 74 68 61 74  or the 0x01 that
b9e0: 20 70 72 65 63 65 64 65 73 20 74 68 65 20 6e 65   precedes the ne
b9f0: 78 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  xt .    ** colum
ba00: 6e 2d 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n-number in the 
ba10: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 0a  position list. .
ba20: 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20      */.    else 
ba30: 69 66 28 20 69 43 6f 6c 31 3c 69 43 6f 6c 32 20  if( iCol1<iCol2 
ba40: 29 7b 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c  ){.      fts3Col
ba50: 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  umnlistCopy(0, &
ba60: 70 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  p1);.      if( 0
ba70: 3d 3d 2a 70 31 20 29 20 62 72 65 61 6b 3b 0a 20  ==*p1 ) break;. 
ba80: 20 20 20 20 20 70 31 2b 2b 3b 0a 20 20 20 20 20       p1++;.     
ba90: 20 70 31 20 2b 3d 20 73 71 6c 69 74 65 33 46 74   p1 += sqlite3Ft
baa0: 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 31  s3GetVarint32(p1
bab0: 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20 20 7d  , &iCol1);.    }
bac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 33  else{.      fts3
bad0: 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30  ColumnlistCopy(0
bae0: 2c 20 26 70 32 29 3b 0a 20 20 20 20 20 20 69 66  , &p2);.      if
baf0: 28 20 30 3d 3d 2a 70 32 20 29 20 62 72 65 61 6b  ( 0==*p2 ) break
bb00: 3b 0a 20 20 20 20 20 20 70 32 2b 2b 3b 0a 20 20  ;.      p2++;.  
bb10: 20 20 20 20 70 32 20 2b 3d 20 73 71 6c 69 74 65      p2 += sqlite
bb20: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
bb30: 28 70 32 2c 20 26 69 43 6f 6c 32 29 3b 0a 20 20  (p2, &iCol2);.  
bb40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 33 50    }.  }..  fts3P
bb50: 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  oslistCopy(0, &p
bb60: 32 29 3b 0a 20 20 66 74 73 33 50 6f 73 6c 69 73  2);.  fts3Poslis
bb70: 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b 0a 20  tCopy(0, &p1);. 
bb80: 20 2a 70 70 31 20 3d 20 70 31 3b 0a 20 20 2a 70   *pp1 = p1;.  *p
bb90: 70 32 20 3d 20 70 32 3b 0a 20 20 69 66 28 20 21  p2 = p2;.  if( !
bba0: 70 70 20 7c 7c 20 2a 70 70 3d 3d 70 20 29 7b 0a  pp || *pp==p ){.
bbb0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bbc0: 7d 0a 20 20 2a 70 2b 2b 20 3d 20 30 78 30 30 3b  }.  *p++ = 0x00;
bbd0: 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65  .  *pp = p;.  re
bbe0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
bbf0: 20 4d 65 72 67 65 20 74 77 6f 20 70 6f 73 69 74   Merge two posit
bc00: 69 6f 6e 2d 6c 69 73 74 73 20 61 73 20 72 65 71  ion-lists as req
bc10: 75 69 72 65 64 20 62 79 20 74 68 65 20 4e 45 41  uired by the NEA
bc20: 52 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  R operator..*/.s
bc30: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 6f  tatic int fts3Po
bc40: 73 6c 69 73 74 4e 65 61 72 4d 65 72 67 65 28 0a  slistNearMerge(.
bc50: 20 20 63 68 61 72 20 2a 2a 70 70 2c 20 20 20 20    char **pp,    
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
bc80: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 54  er */.  char *aT
bc90: 6d 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mp,             
bca0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
bcb0: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
bcc0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 69 67 68  e */.  int nRigh
bcd0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
bce0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
bcf0: 6d 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  m difference in 
bd00: 74 6f 6b 65 6e 20 70 6f 73 69 74 69 6f 6e 73 20  token positions 
bd10: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 20  */.  int nLeft, 
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
bd40: 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 6f  difference in to
bd50: 6b 65 6e 20 70 6f 73 69 74 69 6f 6e 73 20 2a 2f  ken positions */
bd60: 0a 20 20 63 68 61 72 20 2a 2a 70 70 31 2c 20 20  .  char **pp1,  
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 65     /* IN/OUT: Le
bd90: 66 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f  ft input list */
bda0: 0a 20 20 63 68 61 72 20 2a 2a 70 70 32 20 20 20  .  char **pp2   
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 69     /* IN/OUT: Ri
bdd0: 67 68 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a  ght input list *
bde0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 31 20  /.){.  char *p1 
bdf0: 3d 20 2a 70 70 31 3b 0a 20 20 63 68 61 72 20 2a  = *pp1;.  char *
be00: 70 32 20 3d 20 2a 70 70 32 3b 0a 0a 20 20 69 66  p2 = *pp2;..  if
be10: 28 20 21 70 70 20 29 7b 0a 20 20 20 20 69 66 28  ( !pp ){.    if(
be20: 20 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61   fts3PoslistPhra
be30: 73 65 4d 65 72 67 65 28 30 2c 20 6e 52 69 67 68  seMerge(0, nRigh
be40: 74 2c 20 30 2c 20 70 70 31 2c 20 70 70 32 29 20  t, 0, pp1, pp2) 
be50: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
be60: 2a 70 70 31 20 3d 20 70 31 3b 0a 20 20 20 20 2a  *pp1 = p1;.    *
be70: 70 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 72 65  pp2 = p2;.    re
be80: 74 75 72 6e 20 66 74 73 33 50 6f 73 6c 69 73 74  turn fts3Poslist
be90: 50 68 72 61 73 65 4d 65 72 67 65 28 30 2c 20 6e  PhraseMerge(0, n
bea0: 4c 65 66 74 2c 20 30 2c 20 70 70 32 2c 20 70 70  Left, 0, pp2, pp
beb0: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
bec0: 20 63 68 61 72 20 2a 70 54 6d 70 31 20 3d 20 61   char *pTmp1 = a
bed0: 54 6d 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  Tmp;.    char *p
bee0: 54 6d 70 32 3b 0a 20 20 20 20 63 68 61 72 20 2a  Tmp2;.    char *
bef0: 61 54 6d 70 32 3b 0a 20 20 20 20 69 6e 74 20 72  aTmp2;.    int r
bf00: 65 73 20 3d 20 31 3b 0a 0a 20 20 20 20 66 74 73  es = 1;..    fts
bf10: 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65  3PoslistPhraseMe
bf20: 72 67 65 28 26 70 54 6d 70 31 2c 20 6e 52 69 67  rge(&pTmp1, nRig
bf30: 68 74 2c 20 30 2c 20 70 70 31 2c 20 70 70 32 29  ht, 0, pp1, pp2)
bf40: 3b 0a 20 20 20 20 61 54 6d 70 32 20 3d 20 70 54  ;.    aTmp2 = pT
bf50: 6d 70 32 20 3d 20 70 54 6d 70 31 3b 0a 20 20 20  mp2 = pTmp1;.   
bf60: 20 2a 70 70 31 20 3d 20 70 31 3b 0a 20 20 20 20   *pp1 = p1;.    
bf70: 2a 70 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 66  *pp2 = p2;.    f
bf80: 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65  ts3PoslistPhrase
bf90: 4d 65 72 67 65 28 26 70 54 6d 70 32 2c 20 6e 4c  Merge(&pTmp2, nL
bfa0: 65 66 74 2c 20 31 2c 20 70 70 32 2c 20 70 70 31  eft, 1, pp2, pp1
bfb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 31  );.    if( pTmp1
bfc0: 21 3d 61 54 6d 70 20 26 26 20 70 54 6d 70 32 21  !=aTmp && pTmp2!
bfd0: 3d 61 54 6d 70 32 20 29 7b 0a 20 20 20 20 20 20  =aTmp2 ){.      
bfe0: 66 74 73 33 50 6f 73 6c 69 73 74 4d 65 72 67 65  fts3PoslistMerge
bff0: 28 70 70 2c 20 26 61 54 6d 70 2c 20 26 61 54 6d  (pp, &aTmp, &aTm
c000: 70 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  p2);.    }else i
c010: 66 28 20 70 54 6d 70 31 21 3d 61 54 6d 70 20 29  f( pTmp1!=aTmp )
c020: 7b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  {.      fts3Posl
c030: 69 73 74 43 6f 70 79 28 70 70 2c 20 26 61 54 6d  istCopy(pp, &aTm
c040: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  p);.    }else if
c050: 28 20 70 54 6d 70 32 21 3d 61 54 6d 70 32 20 29  ( pTmp2!=aTmp2 )
c060: 7b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  {.      fts3Posl
c070: 69 73 74 43 6f 70 79 28 70 70 2c 20 26 61 54 6d  istCopy(pp, &aTm
c080: 70 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  p2);.    }else{.
c090: 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
c0a0: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
c0b0: 20 72 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   res;.  }.}../*.
c0c0: 2a 2a 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d  ** Values that m
c0d0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 74 68  ay be used as th
c0e0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
c0f0: 72 20 74 6f 20 66 74 73 33 44 6f 63 6c 69 73 74  r to fts3Doclist
c100: 4d 65 72 67 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  Merge()..*/.#def
c110: 69 6e 65 20 4d 45 52 47 45 5f 4e 4f 54 20 20 20  ine MERGE_NOT   
c120: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 2f 2a       2        /*
c130: 20 44 20 2b 20 44 20 2d 3e 20 44 20 2a 2f 0a 23   D + D -> D */.#
c140: 64 65 66 69 6e 65 20 4d 45 52 47 45 5f 41 4e 44  define MERGE_AND
c150: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
c160: 20 2f 2a 20 44 20 2b 20 44 20 2d 3e 20 44 20 2a   /* D + D -> D *
c170: 2f 0a 23 64 65 66 69 6e 65 20 4d 45 52 47 45 5f  /.#define MERGE_
c180: 4f 52 20 20 20 20 20 20 20 20 20 34 20 20 20 20  OR         4    
c190: 20 20 20 20 2f 2a 20 44 20 2b 20 44 20 2d 3e 20      /* D + D -> 
c1a0: 44 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 45 52  D */.#define MER
c1b0: 47 45 5f 50 4f 53 5f 4f 52 20 20 20 20 20 35 20  GE_POS_OR     5 
c1c0: 20 20 20 20 20 20 20 2f 2a 20 50 20 2b 20 50 20         /* P + P 
c1d0: 2d 3e 20 50 20 2a 2f 0a 23 64 65 66 69 6e 65 20  -> P */.#define 
c1e0: 4d 45 52 47 45 5f 50 48 52 41 53 45 20 20 20 20  MERGE_PHRASE    
c1f0: 20 36 20 20 20 20 20 20 20 20 2f 2a 20 50 20 2b   6        /* P +
c200: 20 50 20 2d 3e 20 44 20 2a 2f 0a 23 64 65 66 69   P -> D */.#defi
c210: 6e 65 20 4d 45 52 47 45 5f 50 4f 53 5f 50 48 52  ne MERGE_POS_PHR
c220: 41 53 45 20 37 20 20 20 20 20 20 20 20 2f 2a 20  ASE 7        /* 
c230: 50 20 2b 20 50 20 2d 3e 20 50 20 2a 2f 0a 23 64  P + P -> P */.#d
c240: 65 66 69 6e 65 20 4d 45 52 47 45 5f 4e 45 41 52  efine MERGE_NEAR
c250: 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
c260: 2f 2a 20 50 20 2b 20 50 20 2d 3e 20 44 20 2a 2f  /* P + P -> D */
c270: 0a 23 64 65 66 69 6e 65 20 4d 45 52 47 45 5f 50  .#define MERGE_P
c280: 4f 53 5f 4e 45 41 52 20 20 20 39 20 20 20 20 20  OS_NEAR   9     
c290: 20 20 20 2f 2a 20 50 20 2b 20 50 20 2d 3e 20 50     /* P + P -> P
c2a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65   */../*.** Merge
c2b0: 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74   the two doclist
c2c0: 73 20 70 61 73 73 65 64 20 69 6e 20 62 75 66 66  s passed in buff
c2d0: 65 72 20 61 31 20 28 73 69 7a 65 20 6e 31 20 62  er a1 (size n1 b
c2e0: 79 74 65 73 29 20 61 6e 64 20 61 32 0a 2a 2a 20  ytes) and a2.** 
c2f0: 28 73 69 7a 65 20 6e 32 20 62 79 74 65 73 29 2e  (size n2 bytes).
c300: 20 54 68 65 20 6f 75 74 70 75 74 20 69 73 20 77   The output is w
c310: 72 69 74 74 65 6e 20 74 6f 20 70 72 65 2d 61 6c  ritten to pre-al
c320: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 61  located buffer a
c330: 42 75 66 66 65 72 2c 0a 2a 2a 20 77 68 69 63 68  Buffer,.** which
c340: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
c350: 6f 20 62 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  o be large enoug
c360: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  h to hold the re
c370: 73 75 6c 74 73 2e 20 54 68 65 20 6e 75 6d 62 65  sults. The numbe
c380: 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 77 72  r.** of bytes wr
c390: 69 74 74 65 6e 20 74 6f 20 61 42 75 66 66 65 72  itten to aBuffer
c3a0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
c3b0: 6e 42 75 66 66 65 72 20 62 65 66 6f 72 65 20 72  nBuffer before r
c3c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
c3d0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
c3e0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c3f0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
c400: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72   if a malloc err
c410: 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  or.** occurs whi
c420: 6c 65 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  le allocating a 
c430: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
c440: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
c450: 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2c  merge operation,
c460: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
c470: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c480: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
c490: 44 6f 63 6c 69 73 74 4d 65 72 67 65 28 0a 20 20  DoclistMerge(.  
c4a0: 69 6e 74 20 6d 65 72 67 65 74 79 70 65 2c 20 20  int mergetype,  
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 4d 45  /* One of the ME
c4d0: 52 47 45 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74  RGE_XXX constant
c4e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 61  s */.  int nPara
c4f0: 6d 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  m1,             
c500: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
c510: 79 20 4d 45 52 47 45 5f 4e 45 41 52 20 61 6e 64  y MERGE_NEAR and
c520: 20 4d 45 52 47 45 5f 50 4f 53 5f 4e 45 41 52 20   MERGE_POS_NEAR 
c530: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d 32  */.  int nParam2
c540: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c550: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
c560: 4d 45 52 47 45 5f 4e 45 41 52 20 61 6e 64 20 4d  MERGE_NEAR and M
c570: 45 52 47 45 5f 50 4f 53 5f 4e 45 41 52 20 2a 2f  ERGE_POS_NEAR */
c580: 0a 20 20 63 68 61 72 20 2a 61 42 75 66 66 65 72  .  char *aBuffer
c590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c5a0: 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61     /* Pre-alloca
c5b0: 74 65 64 20 6f 75 74 70 75 74 20 62 75 66 66 65  ted output buffe
c5c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 75  r */.  int *pnBu
c5d0: 66 66 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ffer,           
c5e0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
c5f0: 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ytes written to 
c600: 61 42 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61  aBuffer */.  cha
c610: 72 20 2a 61 31 2c 20 20 20 20 20 20 20 20 20 20  r *a1,          
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c630: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
c640: 67 20 66 69 72 73 74 20 64 6f 63 6c 69 73 74 20  g first doclist 
c650: 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 20 20 20  */.  int n1,    
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
c680: 62 75 66 66 65 72 20 61 31 20 2a 2f 0a 20 20 63  buffer a1 */.  c
c690: 68 61 72 20 2a 61 32 2c 20 20 20 20 20 20 20 20  har *a2,        
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c6b0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
c6c0: 69 6e 67 20 73 65 63 6f 6e 64 20 64 6f 63 6c 69  ing second docli
c6d0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 20 20  st */.  int n2  
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
c700: 6f 66 20 62 75 66 66 65 72 20 61 32 20 2a 2f 0a  of buffer a2 */.
c710: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
c720: 36 34 20 69 31 20 3d 20 30 3b 0a 20 20 73 71 6c  64 i1 = 0;.  sql
c730: 69 74 65 33 5f 69 6e 74 36 34 20 69 32 20 3d 20  ite3_int64 i2 = 
c740: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
c750: 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 0a 20  64 iPrev = 0;.. 
c760: 20 63 68 61 72 20 2a 70 20 3d 20 61 42 75 66 66   char *p = aBuff
c770: 65 72 3b 0a 20 20 63 68 61 72 20 2a 70 31 20 3d  er;.  char *p1 =
c780: 20 61 31 3b 0a 20 20 63 68 61 72 20 2a 70 32 20   a1;.  char *p2 
c790: 3d 20 61 32 3b 0a 20 20 63 68 61 72 20 2a 70 45  = a2;.  char *pE
c7a0: 6e 64 31 20 3d 20 26 61 31 5b 6e 31 5d 3b 0a 20  nd1 = &a1[n1];. 
c7b0: 20 63 68 61 72 20 2a 70 45 6e 64 32 20 3d 20 26   char *pEnd2 = &
c7c0: 61 32 5b 6e 32 5d 3b 0a 0a 20 20 61 73 73 65 72  a2[n2];..  asser
c7d0: 74 28 20 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45  t( mergetype==ME
c7e0: 52 47 45 5f 4f 52 20 20 20 20 20 7c 7c 20 6d 65  RGE_OR     || me
c7f0: 72 67 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 50  rgetype==MERGE_P
c800: 4f 53 5f 4f 52 20 0a 20 20 20 20 20 20 20 7c 7c  OS_OR .       ||
c810: 20 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45 52 47   mergetype==MERG
c820: 45 5f 41 4e 44 20 20 20 20 7c 7c 20 6d 65 72 67  E_AND    || merg
c830: 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 4e 4f 54  etype==MERGE_NOT
c840: 0a 20 20 20 20 20 20 20 7c 7c 20 6d 65 72 67 65  .       || merge
c850: 74 79 70 65 3d 3d 4d 45 52 47 45 5f 50 48 52 41  type==MERGE_PHRA
c860: 53 45 20 7c 7c 20 6d 65 72 67 65 74 79 70 65 3d  SE || mergetype=
c870: 3d 4d 45 52 47 45 5f 50 4f 53 5f 50 48 52 41 53  =MERGE_POS_PHRAS
c880: 45 0a 20 20 20 20 20 20 20 7c 7c 20 6d 65 72 67  E.       || merg
c890: 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 4e 45 41  etype==MERGE_NEA
c8a0: 52 20 20 20 7c 7c 20 6d 65 72 67 65 74 79 70 65  R   || mergetype
c8b0: 3d 3d 4d 45 52 47 45 5f 50 4f 53 5f 4e 45 41 52  ==MERGE_POS_NEAR
c8c0: 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 42  .  );..  if( !aB
c8d0: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 2a 70 6e  uffer ){.    *pn
c8e0: 42 75 66 66 65 72 20 3d 20 30 3b 0a 20 20 20 20  Buffer = 0;.    
c8f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c900: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  MEM;.  }..  /* R
c910: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 64 6f  ead the first do
c920: 63 69 64 20 66 72 6f 6d 20 65 61 63 68 20 64 6f  cid from each do
c930: 63 6c 69 73 74 20 2a 2f 0a 20 20 66 74 73 33 47  clist */.  fts3G
c940: 65 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26  etDeltaVarint2(&
c950: 70 31 2c 20 70 45 6e 64 31 2c 20 26 69 31 29 3b  p1, pEnd1, &i1);
c960: 0a 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56  .  fts3GetDeltaV
c970: 61 72 69 6e 74 32 28 26 70 32 2c 20 70 45 6e 64  arint2(&p2, pEnd
c980: 32 2c 20 26 69 32 29 3b 0a 0a 20 20 73 77 69 74  2, &i2);..  swit
c990: 63 68 28 20 6d 65 72 67 65 74 79 70 65 20 29 7b  ch( mergetype ){
c9a0: 0a 20 20 20 20 63 61 73 65 20 4d 45 52 47 45 5f  .    case MERGE_
c9b0: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 4d 45 52  OR:.    case MER
c9c0: 47 45 5f 50 4f 53 5f 4f 52 3a 0a 20 20 20 20 20  GE_POS_OR:.     
c9d0: 20 77 68 69 6c 65 28 20 70 31 20 7c 7c 20 70 32   while( p1 || p2
c9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c9f0: 70 32 20 26 26 20 70 31 20 26 26 20 69 31 3d 3d  p2 && p1 && i1==
ca00: 69 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i2 ){.          
ca10: 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69  fts3PutDeltaVari
ca20: 6e 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20 69  nt(&p, &iPrev, i
ca30: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
ca40: 28 20 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45 52  ( mergetype==MER
ca50: 47 45 5f 50 4f 53 5f 4f 52 20 29 20 66 74 73 33  GE_POS_OR ) fts3
ca60: 50 6f 73 6c 69 73 74 4d 65 72 67 65 28 26 70 2c  PoslistMerge(&p,
ca70: 20 26 70 31 2c 20 26 70 32 29 3b 0a 20 20 20 20   &p1, &p2);.    
ca80: 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c        fts3GetDel
ca90: 74 61 56 61 72 69 6e 74 32 28 26 70 31 2c 20 70  taVarint2(&p1, p
caa0: 45 6e 64 31 2c 20 26 69 31 29 3b 0a 20 20 20 20  End1, &i1);.    
cab0: 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c        fts3GetDel
cac0: 74 61 56 61 72 69 6e 74 32 28 26 70 32 2c 20 70  taVarint2(&p2, p
cad0: 45 6e 64 32 2c 20 26 69 32 29 3b 0a 20 20 20 20  End2, &i2);.    
cae0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
caf0: 32 20 7c 7c 20 28 70 31 20 26 26 20 69 31 3c 69  2 || (p1 && i1<i
cb00: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
cb10: 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69  fts3PutDeltaVari
cb20: 6e 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20 69  nt(&p, &iPrev, i
cb30: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
cb40: 28 20 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45 52  ( mergetype==MER
cb50: 47 45 5f 50 4f 53 5f 4f 52 20 29 20 66 74 73 33  GE_POS_OR ) fts3
cb60: 50 6f 73 6c 69 73 74 43 6f 70 79 28 26 70 2c 20  PoslistCopy(&p, 
cb70: 26 70 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &p1);.          
cb80: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
cb90: 6e 74 32 28 26 70 31 2c 20 70 45 6e 64 31 2c 20  nt2(&p1, pEnd1, 
cba0: 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  &i1);.        }e
cbb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
cbc0: 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e  ts3PutDeltaVarin
cbd0: 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20 69 32  t(&p, &iPrev, i2
cbe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
cbf0: 20 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45 52 47   mergetype==MERG
cc00: 45 5f 50 4f 53 5f 4f 52 20 29 20 66 74 73 33 50  E_POS_OR ) fts3P
cc10: 6f 73 6c 69 73 74 43 6f 70 79 28 26 70 2c 20 26  oslistCopy(&p, &
cc20: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  p2);.          f
cc30: 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
cc40: 74 32 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 26  t2(&p2, pEnd2, &
cc50: 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i2);.        }. 
cc60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
cc70: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 4d 45  ak;..    case ME
cc80: 52 47 45 5f 41 4e 44 3a 0a 20 20 20 20 20 20 77  RGE_AND:.      w
cc90: 68 69 6c 65 28 20 70 31 20 26 26 20 70 32 20 29  hile( p1 && p2 )
cca0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  {.        if( i1
ccb0: 3d 3d 69 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==i2 ){.        
ccc0: 20 20 66 74 73 33 50 75 74 44 65 6c 74 61 56 61    fts3PutDeltaVa
ccd0: 72 69 6e 74 28 26 70 2c 20 26 69 50 72 65 76 2c  rint(&p, &iPrev,
cce0: 20 69 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i1);.          
ccf0: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
cd00: 6e 74 32 28 26 70 31 2c 20 70 45 6e 64 31 2c 20  nt2(&p1, pEnd1, 
cd10: 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &i1);.          
cd20: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
cd30: 6e 74 32 28 26 70 32 2c 20 70 45 6e 64 32 2c 20  nt2(&p2, pEnd2, 
cd40: 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  &i2);.        }e
cd50: 6c 73 65 20 69 66 28 20 69 31 3c 69 32 20 29 7b  lse if( i1<i2 ){
cd60: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47  .          fts3G
cd70: 65 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26  etDeltaVarint2(&
cd80: 70 31 2c 20 70 45 6e 64 31 2c 20 26 69 31 29 3b  p1, pEnd1, &i1);
cd90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
cda0: 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
cdb0: 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28 26 70  tDeltaVarint2(&p
cdc0: 32 2c 20 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a  2, pEnd2, &i2);.
cdd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cde0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  }.      break;..
cdf0: 20 20 20 20 63 61 73 65 20 4d 45 52 47 45 5f 4e      case MERGE_N
ce00: 4f 54 3a 0a 20 20 20 20 20 20 77 68 69 6c 65 28  OT:.      while(
ce10: 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p1 ){.        i
ce20: 66 28 20 70 32 20 26 26 20 69 31 3d 3d 69 32 20  f( p2 && i1==i2 
ce30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
ce40: 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 32  3GetDeltaVarint2
ce50: 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 26 69 31  (&p1, pEnd1, &i1
ce60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
ce70: 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 32  3GetDeltaVarint2
ce80: 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 26 69 32  (&p2, pEnd2, &i2
ce90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
cea0: 20 69 66 28 20 21 70 32 20 7c 7c 20 69 31 3c 69   if( !p2 || i1<i
ceb0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  2 ){.          f
cec0: 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e  ts3PutDeltaVarin
ced0: 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20 69 31  t(&p, &iPrev, i1
cee0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
cef0: 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 32  3GetDeltaVarint2
cf00: 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 26 69 31  (&p1, pEnd1, &i1
cf10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
cf20: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
cf30: 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 32 28  GetDeltaVarint2(
cf40: 26 70 32 2c 20 70 45 6e 64 32 2c 20 26 69 32 29  &p2, pEnd2, &i2)
cf50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cf60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
cf70: 0a 0a 20 20 20 20 63 61 73 65 20 4d 45 52 47 45  ..    case MERGE
cf80: 5f 50 4f 53 5f 50 48 52 41 53 45 3a 0a 20 20 20  _POS_PHRASE:.   
cf90: 20 63 61 73 65 20 4d 45 52 47 45 5f 50 48 52 41   case MERGE_PHRA
cfa0: 53 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  SE: {.      char
cfb0: 20 2a 2a 70 70 50 6f 73 20 3d 20 28 6d 65 72 67   **ppPos = (merg
cfc0: 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 50 48 52  etype==MERGE_PHR
cfd0: 41 53 45 20 3f 20 30 20 3a 20 26 70 29 3b 0a 20  ASE ? 0 : &p);. 
cfe0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 31 20 26       while( p1 &
cff0: 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20  & p2 ){.        
d000: 69 66 28 20 69 31 3d 3d 69 32 20 29 7b 0a 20 20  if( i1==i2 ){.  
d010: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 53          char *pS
d020: 61 76 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ave = p;.       
d030: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
d040: 20 69 50 72 65 76 53 61 76 65 20 3d 20 69 50 72   iPrevSave = iPr
d050: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  ev;.          ft
d060: 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e 74  s3PutDeltaVarint
d070: 28 26 70 2c 20 26 69 50 72 65 76 2c 20 69 31 29  (&p, &iPrev, i1)
d080: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d090: 30 3d 3d 66 74 73 33 50 6f 73 6c 69 73 74 50 68  0==fts3PoslistPh
d0a0: 72 61 73 65 4d 65 72 67 65 28 70 70 50 6f 73 2c  raseMerge(ppPos,
d0b0: 20 31 2c 20 30 2c 20 26 70 31 2c 20 26 70 32 29   1, 0, &p1, &p2)
d0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d0d0: 70 20 3d 20 70 53 61 76 65 3b 0a 20 20 20 20 20  p = pSave;.     
d0e0: 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
d0f0: 50 72 65 76 53 61 76 65 3b 0a 20 20 20 20 20 20  PrevSave;.      
d100: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d110: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
d120: 6e 74 32 28 26 70 31 2c 20 70 45 6e 64 31 2c 20  nt2(&p1, pEnd1, 
d130: 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &i1);.          
d140: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
d150: 6e 74 32 28 26 70 32 2c 20 70 45 6e 64 32 2c 20  nt2(&p2, pEnd2, 
d160: 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  &i2);.        }e
d170: 6c 73 65 20 69 66 28 20 69 31 3c 69 32 20 29 7b  lse if( i1<i2 ){
d180: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50  .          fts3P
d190: 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  oslistCopy(0, &p
d1a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  1);.          ft
d1b0: 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
d1c0: 32 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 26 69  2(&p1, pEnd1, &i
d1d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
d1e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  e{.          fts
d1f0: 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20  3PoslistCopy(0, 
d200: 26 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &p2);.          
d210: 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
d220: 6e 74 32 28 26 70 32 2c 20 70 45 6e 64 32 2c 20  nt2(&p2, pEnd2, 
d230: 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &i2);.        }.
d240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d250: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
d260: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
d270: 20 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45 52 47   mergetype==MERG
d280: 45 5f 50 4f 53 5f 4e 45 41 52 20 7c 7c 20 6d 65  E_POS_NEAR || me
d290: 72 67 65 74 79 70 65 3d 3d 4d 45 52 47 45 5f 4e  rgetype==MERGE_N
d2a0: 45 41 52 20 29 3b 20 7b 0a 20 20 20 20 20 20 63  EAR ); {.      c
d2b0: 68 61 72 20 2a 61 54 6d 70 20 3d 20 30 3b 0a 20  har *aTmp = 0;. 
d2c0: 20 20 20 20 20 63 68 61 72 20 2a 2a 70 70 50 6f       char **ppPo
d2d0: 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  s = 0;..      if
d2e0: 28 20 6d 65 72 67 65 74 79 70 65 3d 3d 4d 45 52  ( mergetype==MER
d2f0: 47 45 5f 50 4f 53 5f 4e 45 41 52 20 29 7b 0a 20  GE_POS_NEAR ){. 
d300: 20 20 20 20 20 20 20 70 70 50 6f 73 20 3d 20 26         ppPos = &
d310: 70 3b 0a 20 20 20 20 20 20 20 20 61 54 6d 70 20  p;.        aTmp 
d320: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
d330: 28 32 2a 28 6e 31 2b 6e 32 2b 31 29 29 3b 0a 20  (2*(n1+n2+1));. 
d340: 20 20 20 20 20 20 20 69 66 28 20 21 61 54 6d 70         if( !aTmp
d350: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
d360: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d370: 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
d380: 20 20 20 7d 0a 0a 20 20 20 20 20 20 77 68 69 6c     }..      whil
d390: 65 28 20 70 31 20 26 26 20 70 32 20 29 7b 0a 20  e( p1 && p2 ){. 
d3a0: 20 20 20 20 20 20 20 69 66 28 20 69 31 3d 3d 69         if( i1==i
d3b0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  2 ){.          c
d3c0: 68 61 72 20 2a 70 53 61 76 65 20 3d 20 70 3b 0a  har *pSave = p;.
d3d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d3e0: 33 5f 69 6e 74 36 34 20 69 50 72 65 76 53 61 76  3_int64 iPrevSav
d3f0: 65 20 3d 20 69 50 72 65 76 3b 0a 20 20 20 20 20  e = iPrev;.     
d400: 20 20 20 20 20 66 74 73 33 50 75 74 44 65 6c 74       fts3PutDelt
d410: 61 56 61 72 69 6e 74 28 26 70 2c 20 26 69 50 72  aVarint(&p, &iPr
d420: 65 76 2c 20 69 31 29 3b 0a 0a 20 20 20 20 20 20  ev, i1);..      
d430: 20 20 20 20 69 66 28 20 21 66 74 73 33 50 6f 73      if( !fts3Pos
d440: 6c 69 73 74 4e 65 61 72 4d 65 72 67 65 28 70 70  listNearMerge(pp
d450: 50 6f 73 2c 20 61 54 6d 70 2c 20 6e 50 61 72 61  Pos, aTmp, nPara
d460: 6d 31 2c 20 6e 50 61 72 61 6d 32 2c 20 26 70 31  m1, nParam2, &p1
d470: 2c 20 26 70 32 29 20 29 7b 0a 20 20 20 20 20 20  , &p2) ){.      
d480: 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 50        iPrev = iP
d490: 72 65 76 53 61 76 65 3b 0a 20 20 20 20 20 20 20  revSave;.       
d4a0: 20 20 20 20 20 70 20 3d 20 70 53 61 76 65 3b 0a       p = pSave;.
d4b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
d4c0: 20 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65         fts3GetDe
d4d0: 6c 74 61 56 61 72 69 6e 74 32 28 26 70 31 2c 20  ltaVarint2(&p1, 
d4e0: 70 45 6e 64 31 2c 20 26 69 31 29 3b 0a 20 20 20  pEnd1, &i1);.   
d4f0: 20 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65         fts3GetDe
d500: 6c 74 61 56 61 72 69 6e 74 32 28 26 70 32 2c 20  ltaVarint2(&p2, 
d510: 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a 20 20 20  pEnd2, &i2);.   
d520: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
d530: 31 3c 69 32 20 29 7b 0a 20 20 20 20 20 20 20 20  1<i2 ){.        
d540: 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70    fts3PoslistCop
d550: 79 28 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20  y(0, &p1);.     
d560: 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
d570: 61 56 61 72 69 6e 74 32 28 26 70 31 2c 20 70 45  aVarint2(&p1, pE
d580: 6e 64 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 20  nd1, &i1);.     
d590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5a0: 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43      fts3PoslistC
d5b0: 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a 20 20 20  opy(0, &p2);.   
d5c0: 20 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65         fts3GetDe
d5d0: 6c 74 61 56 61 72 69 6e 74 32 28 26 70 32 2c 20  ltaVarint2(&p2, 
d5e0: 70 45 6e 64 32 2c 20 26 69 32 29 3b 0a 20 20 20  pEnd2, &i2);.   
d5f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d600: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
d610: 65 28 61 54 6d 70 29 3b 0a 20 20 20 20 20 20 62  e(aTmp);.      b
d620: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
d630: 0a 20 20 2a 70 6e 42 75 66 66 65 72 20 3d 20 28  .  *pnBuffer = (
d640: 69 6e 74 29 28 70 2d 61 42 75 66 66 65 72 29 3b  int)(p-aBuffer);
d650: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d660: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  _OK;.}../* .** A
d670: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
d680: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
d690: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
d6a0: 64 20 61 73 20 74 68 65 20 63 6f 6e 74 65 78 74  d as the context
d6b0: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f   .** argument to
d6c0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
d6d0: 65 61 64 65 72 49 74 65 72 61 74 65 28 29 0a 2a  eaderIterate().*
d6e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
d6f0: 20 54 65 72 6d 53 65 6c 65 63 74 20 54 65 72 6d   TermSelect Term
d700: 53 65 6c 65 63 74 3b 0a 73 74 72 75 63 74 20 54  Select;.struct T
d710: 65 72 6d 53 65 6c 65 63 74 20 7b 0a 20 20 69 6e  ermSelect {.  in
d720: 74 20 69 73 52 65 71 50 6f 73 3b 0a 20 20 63 68  t isReqPos;.  ch
d730: 61 72 20 2a 61 4f 75 74 70 75 74 3b 20 20 20 20  ar *aOutput;    
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d750: 20 4d 61 6c 6c 6f 63 27 64 20 6f 75 74 70 75 74   Malloc'd output
d760: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
d770: 20 6e 4f 75 74 70 75 74 3b 20 20 20 20 20 20 20   nOutput;       
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d790: 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 69  Size of output i
d7a0: 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  n bytes */.};../
d7b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d7c0: 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
d7d0: 65 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  e sqlite3Fts3Seg
d7e0: 52 65 61 64 65 72 49 74 65 72 61 74 65 28 29 20  ReaderIterate() 
d7f0: 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 0a 2a 2a  callback when.**
d800: 20 71 75 65 72 79 69 6e 67 20 74 68 65 20 66 75   querying the fu
d810: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66 6f  ll-text index fo
d820: 72 20 61 20 64 6f 63 6c 69 73 74 20 61 73 73 6f  r a doclist asso
d830: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 74 65  ciated with a te
d840: 72 6d 20 6f 72 0a 2a 2a 20 74 65 72 6d 2d 70 72  rm or.** term-pr
d850: 65 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  efix..*/.static 
d860: 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65 6c 65  int fts3TermSele
d870: 63 74 43 62 28 0a 20 20 46 74 73 33 54 61 62 6c  ctCb(.  Fts3Tabl
d880: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
d890: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
d8a0: 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  al table object 
d8b0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  */.  void *pCont
d8c0: 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
d8d0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
d8e0: 74 6f 20 54 65 72 6d 53 65 6c 65 63 74 20 73 74  to TermSelect st
d8f0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 63 68 61  ructure */.  cha
d900: 72 20 2a 7a 54 65 72 6d 2c 0a 20 20 69 6e 74 20  r *zTerm,.  int 
d910: 6e 54 65 72 6d 2c 0a 20 20 63 68 61 72 20 2a 61  nTerm,.  char *a
d920: 44 6f 63 6c 69 73 74 2c 0a 20 20 69 6e 74 20 6e  Doclist,.  int n
d930: 44 6f 63 6c 69 73 74 0a 29 7b 0a 20 20 54 65 72  Doclist.){.  Ter
d940: 6d 53 65 6c 65 63 74 20 2a 70 54 53 20 3d 20 28  mSelect *pTS = (
d950: 54 65 72 6d 53 65 6c 65 63 74 20 2a 29 70 43 6f  TermSelect *)pCo
d960: 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 6e 4e 65  ntext;.  int nNe
d970: 77 20 3d 20 70 54 53 2d 3e 6e 4f 75 74 70 75 74  w = pTS->nOutput
d980: 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 63   + nDoclist;.  c
d990: 68 61 72 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69  har *aNew = sqli
d9a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4e 65 77 29  te3_malloc(nNew)
d9b0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
d9c0: 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53  METER(p);.  UNUS
d9d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 54 65  ED_PARAMETER(zTe
d9e0: 72 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  rm);.  UNUSED_PA
d9f0: 52 41 4d 45 54 45 52 28 6e 54 65 72 6d 29 3b 0a  RAMETER(nTerm);.
da00: 0a 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a  .  if( !aNew ){.
da10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
da20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
da30: 69 66 28 20 70 54 53 2d 3e 6e 4f 75 74 70 75 74  if( pTS->nOutput
da40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
da50: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
da60: 73 74 20 74 65 72 6d 20 73 65 6c 65 63 74 65 64  st term selected
da70: 2c 20 63 6f 70 79 20 74 68 65 20 64 6f 63 6c 69  , copy the docli
da80: 73 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  st to the output
da90: 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 75  .    ** buffer u
daa0: 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 54  sing memcpy(). T
dab0: 4f 44 4f 3a 20 41 64 64 20 61 20 77 61 79 20 74  ODO: Add a way t
dac0: 6f 20 74 72 61 6e 73 66 65 72 20 63 6f 6e 74 72  o transfer contr
dad0: 6f 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ol of the.    **
dae0: 20 61 44 6f 63 6c 69 73 74 20 62 75 66 66 65 72   aDoclist buffer
daf0: 20 66 72 6f 6d 20 74 68 65 20 63 61 6c 6c 65 72   from the caller
db00: 20 73 6f 20 61 73 20 74 6f 20 61 76 6f 69 64 20   so as to avoid 
db10: 74 68 65 20 6d 65 6d 63 70 79 28 29 2e 0a 20 20  the memcpy()..  
db20: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28    */.    memcpy(
db30: 61 4e 65 77 2c 20 61 44 6f 63 6c 69 73 74 2c 20  aNew, aDoclist, 
db40: 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 65 6c  nDoclist);.  }el
db50: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f  se{.    /* The o
db60: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
db70: 6e 6f 74 20 65 6d 70 74 79 2e 20 4d 65 72 67 65  not empty. Merge
db80: 20 64 6f 63 6c 69 73 74 20 61 44 6f 63 6c 69 73   doclist aDoclis
db90: 74 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a  t with the.    *
dba0: 2a 20 65 78 69 73 74 69 6e 67 20 6f 75 74 70 75  * existing outpu
dbb0: 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  t. This can only
dbc0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 70 72 65   happen with pre
dbd0: 66 69 78 2d 73 65 61 72 63 68 65 73 20 28 61 73  fix-searches (as
dbe0: 0a 20 20 20 20 2a 2a 20 73 65 61 72 63 68 65 73  .    ** searches
dbf0: 20 66 6f 72 20 65 78 61 63 74 20 74 65 72 6d 73   for exact terms
dc00: 20 72 65 74 75 72 6e 20 65 78 61 63 74 6c 79 20   return exactly 
dc10: 6f 6e 65 20 64 6f 63 6c 69 73 74 29 2e 0a 20 20  one doclist)..  
dc20: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 65 72    */.    int mer
dc30: 67 65 74 79 70 65 20 3d 20 28 70 54 53 2d 3e 69  getype = (pTS->i
dc40: 73 52 65 71 50 6f 73 20 3f 20 4d 45 52 47 45 5f  sReqPos ? MERGE_
dc50: 50 4f 53 5f 4f 52 20 3a 20 4d 45 52 47 45 5f 4f  POS_OR : MERGE_O
dc60: 52 29 3b 0a 20 20 20 20 66 74 73 33 44 6f 63 6c  R);.    fts3Docl
dc70: 69 73 74 4d 65 72 67 65 28 6d 65 72 67 65 74 79  istMerge(mergety
dc80: 70 65 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pe, 0, 0,.      
dc90: 20 20 61 4e 65 77 2c 20 26 6e 4e 65 77 2c 20 70    aNew, &nNew, p
dca0: 54 53 2d 3e 61 4f 75 74 70 75 74 2c 20 70 54 53  TS->aOutput, pTS
dcb0: 2d 3e 6e 4f 75 74 70 75 74 2c 20 61 44 6f 63 6c  ->nOutput, aDocl
dcc0: 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 0a 20 20  ist, nDoclist.  
dcd0: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69    );.  }..  sqli
dce0: 74 65 33 5f 66 72 65 65 28 70 54 53 2d 3e 61 4f  te3_free(pTS->aO
dcf0: 75 74 70 75 74 29 3b 0a 20 20 70 54 53 2d 3e 61  utput);.  pTS->a
dd00: 4f 75 74 70 75 74 20 3d 20 61 4e 65 77 3b 0a 20  Output = aNew;. 
dd10: 20 70 54 53 2d 3e 6e 4f 75 74 70 75 74 20 3d 20   pTS->nOutput = 
dd20: 6e 4e 65 77 3b 0a 0a 20 20 72 65 74 75 72 6e 20  nNew;..  return 
dd30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
dd40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
dd50: 6e 20 72 65 74 72 65 69 76 65 73 20 74 68 65 20  n retreives the 
dd60: 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20  doclist for the 
dd70: 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 28  specified term (
dd80: 6f 72 20 74 65 72 6d 0a 2a 2a 20 70 72 65 66 69  or term.** prefi
dd90: 78 29 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  x) from the data
dda0: 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  base. .**.** The
ddb0: 20 72 65 74 75 72 6e 65 64 20 64 6f 63 6c 69 73   returned doclis
ddc0: 74 20 6d 61 79 20 62 65 20 69 6e 20 6f 6e 65 20  t may be in one 
ddd0: 6f 66 20 74 77 6f 20 66 6f 72 6d 61 74 73 2c 20  of two formats, 
dde0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
ddf0: 20 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 70 61   .** value of pa
de00: 72 61 6d 65 74 65 72 20 69 73 52 65 71 50 6f 73  rameter isReqPos
de10: 2e 20 49 66 20 69 73 52 65 71 50 6f 73 20 69 73  . If isReqPos is
de20: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
de30: 64 6f 63 6c 69 73 74 20 69 73 0a 2a 2a 20 61 20  doclist is.** a 
de40: 73 6f 72 74 65 64 20 6c 69 73 74 20 6f 66 20 64  sorted list of d
de50: 65 6c 74 61 2d 63 6f 6d 70 72 65 73 73 65 64 20  elta-compressed 
de60: 64 6f 63 69 64 73 20 28 61 20 62 61 72 65 20 64  docids (a bare d
de70: 6f 63 6c 69 73 74 29 2e 20 49 66 20 69 73 52 65  oclist). If isRe
de80: 71 50 6f 73 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  qPos.** is non-z
de90: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
dea0: 74 75 72 6e 65 64 20 6c 69 73 74 20 69 73 20 69  turned list is i
deb0: 6e 20 74 68 65 20 73 61 6d 65 20 66 6f 72 6d 61  n the same forma
dec0: 74 20 61 73 20 69 73 20 73 74 6f 72 65 64 20 0a  t as is stored .
ded0: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
dee0: 73 65 20 77 69 74 68 6f 75 74 20 74 68 65 20 66  se without the f
def0: 6f 75 6e 64 20 6c 65 6e 67 74 68 20 73 70 65 63  ound length spec
df00: 69 66 69 65 72 20 61 74 20 74 68 65 20 73 74 61  ifier at the sta
df10: 72 74 20 6f 66 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  rt of on-disk.**
df20: 20 64 6f 63 6c 69 73 74 73 2e 0a 2a 2f 0a 73 74   doclists..*/.st
df30: 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 65 72  atic int fts3Ter
df40: 6d 53 65 6c 65 63 74 28 0a 20 20 46 74 73 33 54  mSelect(.  Fts3T
df50: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
df60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
df70: 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
df80: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  le */.  int iCol
df90: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
dfa0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
dfb0: 6e 20 74 6f 20 71 75 65 72 79 20 28 6f 72 20 2d  n to query (or -
dfc0: 76 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d  ve for all colum
dfd0: 6e 73 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ns) */.  const c
dfe0: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
dff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
e000: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
e010: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
e040: 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
e050: 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 2c 20    int isPrefix, 
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
e080: 70 72 65 66 69 78 20 73 65 61 72 63 68 20 2a 2f  prefix search */
e090: 0a 20 20 69 6e 74 20 69 73 52 65 71 50 6f 73 2c  .  int isReqPos,
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
e0c0: 63 6c 75 64 65 20 70 6f 73 69 74 69 6f 6e 20 6c  clude position l
e0d0: 69 73 74 73 20 69 6e 20 6f 75 74 70 75 74 20 2a  ists in output *
e0e0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20  /.  int *pnOut, 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
e110: 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 2a 70   of buffer at *p
e120: 70 4f 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  pOut */.  char *
e130: 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
e140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
e150: 3a 20 4d 61 6c 6c 6f 63 65 64 20 72 65 73 75 6c  : Malloced resul
e160: 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  t buffer */.){. 
e170: 20 69 6e 74 20 69 3b 0a 20 20 54 65 72 6d 53 65   int i;.  TermSe
e180: 6c 65 63 74 20 74 73 63 3b 0a 20 20 46 74 73 33  lect tsc;.  Fts3
e190: 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72  SegFilter filter
e1a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
e1b0: 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74  egment term filt
e1c0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
e1d0: 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61   */.  Fts3SegRea
e1e0: 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 3b  der **apSegment;
e1f0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
e200: 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 72 65  f segments to re
e210: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
e220: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
e230: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e240: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53    /* Size of apS
e250: 65 67 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  egment array */.
e260: 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 31    int nAlloc = 1
e270: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6;              
e280: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
e290: 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 61  ize of segment a
e2a0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  rray */.  int rc
e2b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e2d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
e2e0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
e2f0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
e300: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
e310: 6f 20 73 63 61 6e 20 25 5f 73 65 67 64 69 72 20  o scan %_segdir 
e320: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
e330: 41 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Age = 0;        
e340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
e350: 65 64 20 74 6f 20 61 73 73 69 67 6e 20 61 67 65  ed to assign age
e360: 73 20 74 6f 20 73 65 67 6d 65 6e 74 73 20 2a 2f  s to segments */
e370: 0a 0a 20 20 61 70 53 65 67 6d 65 6e 74 20 3d 20  ..  apSegment = 
e380: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
e390: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
e3a0: 28 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52  (sizeof(Fts3SegR
e3b0: 65 61 64 65 72 2a 29 2a 6e 41 6c 6c 6f 63 29 3b  eader*)*nAlloc);
e3c0: 0a 20 20 69 66 28 20 21 61 70 53 65 67 6d 65 6e  .  if( !apSegmen
e3d0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
e3e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
e3f0: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
e400: 61 64 65 72 50 65 6e 64 69 6e 67 28 70 2c 20 7a  aderPending(p, z
e410: 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 69 73 50  Term, nTerm, isP
e420: 72 65 66 69 78 2c 20 26 61 70 53 65 67 6d 65 6e  refix, &apSegmen
e430: 74 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72 63 21  t[0]);.  if( rc!
e440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
e450: 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 69 66  o finished;.  if
e460: 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 29  ( apSegment[0] )
e470: 7b 0a 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 3d  {.    nSegment =
e480: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f   1;.  }..  /* Lo
e490: 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  op through the e
e4a0: 6e 74 69 72 65 20 25 5f 73 65 67 64 69 72 20 74  ntire %_segdir t
e4b0: 61 62 6c 65 2e 20 46 6f 72 20 65 61 63 68 20 73  able. For each s
e4c0: 65 67 6d 65 6e 74 2c 20 63 72 65 61 74 65 20 61  egment, create a
e4d0: 0a 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61  .  ** Fts3SegRea
e4e0: 64 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  der to iterate t
e4f0: 68 72 6f 75 67 68 20 74 68 65 20 73 75 62 73 65  hrough the subse
e500: 74 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74  t of the segment
e510: 20 6c 65 61 76 65 73 0a 20 20 2a 2a 20 74 68 61   leaves.  ** tha
e520: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  t may contain a 
e530: 74 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65  term that matche
e540: 73 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46  s zTerm/nTerm. F
e550: 6f 72 20 6e 6f 6e 2d 70 72 65 66 69 78 0a 20 20  or non-prefix.  
e560: 2a 2a 20 73 65 61 72 63 68 65 73 2c 20 74 68 69  ** searches, thi
e570: 73 20 69 73 20 61 6c 77 61 79 73 20 61 20 73 69  s is always a si
e580: 6e 67 6c 65 20 6c 65 61 66 2e 20 46 6f 72 20 70  ngle leaf. For p
e590: 72 65 66 69 78 20 73 65 61 72 63 68 65 73 2c 20  refix searches, 
e5a0: 74 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20 62 65  this.  ** may be
e5b0: 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c   a contiguous bl
e5c0: 6f 63 6b 20 6f 66 20 6c 65 61 76 65 73 2e 0a 20  ock of leaves.. 
e5d0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
e5e0: 65 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 64  e in this loop d
e5f0: 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
e600: 20 6c 6f 61 64 20 61 6e 79 20 6c 65 61 76 65 73   load any leaves
e610: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 20 20 2a   into memory.  *
e620: 2a 20 28 75 6e 6c 65 73 73 20 74 68 65 20 72 6f  * (unless the ro
e630: 6f 74 20 6e 6f 64 65 20 68 61 70 70 65 6e 73 20  ot node happens 
e640: 74 6f 20 62 65 20 61 20 6c 65 61 66 29 2e 20 49  to be a leaf). I
e650: 74 20 73 69 6d 70 6c 79 20 65 78 61 6d 69 6e 65  t simply examine
e660: 73 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65  s the.  ** b-tre
e670: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
e680: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 6c  etermine which l
e690: 65 61 76 65 73 20 6e 65 65 64 20 74 6f 20 62 65  eaves need to be
e6a0: 20 69 6e 73 70 65 63 74 65 64 2e 0a 20 20 2a 2f   inspected..  */
e6b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
e6c0: 74 73 33 41 6c 6c 53 65 67 64 69 72 73 28 70 2c  ts3AllSegdirs(p,
e6d0: 20 26 70 53 74 6d 74 29 3b 0a 20 20 77 68 69 6c   &pStmt);.  whil
e6e0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
e6f0: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
e700: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
e710: 65 70 28 70 53 74 6d 74 29 29 20 29 7b 0a 20 20  ep(pStmt)) ){.  
e720: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
e730: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
e740: 6e 74 20 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74  nt nRoot = sqlit
e750: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
e760: 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20 63  pStmt, 4);.    c
e770: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 52 6f 6f 74  har const *zRoot
e780: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e790: 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29  n_blob(pStmt, 4)
e7a0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e7b0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
e7c0: 53 74 6d 74 2c 20 31 29 3d 3d 30 20 29 7b 0a 20  Stmt, 1)==0 ){. 
e7d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
e7e0: 72 65 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74  re segment is st
e7f0: 6f 72 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ored on the root
e800: 20 6e 6f 64 65 20 28 77 68 69 63 68 20 6d 75 73   node (which mus
e810: 74 20 62 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  t be a.      ** 
e820: 6c 65 61 66 29 2e 20 44 6f 20 6e 6f 74 20 62 6f  leaf). Do not bo
e830: 74 68 65 72 20 69 6e 73 70 65 63 74 69 6e 67 20  ther inspecting 
e840: 61 6e 79 20 64 61 74 61 20 69 6e 20 74 68 69 73  any data in this
e850: 20 63 61 73 65 2c 20 6a 75 73 74 0a 20 20 20 20   case, just.    
e860: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 46 74    ** create a Ft
e870: 73 33 53 65 67 52 65 61 64 65 72 20 74 6f 20 73  s3SegReader to s
e880: 63 61 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 6c  can the single l
e890: 65 61 66 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  eaf. .      */. 
e8a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e8b0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65  3Fts3SegReaderNe
e8c0: 77 28 70 2c 20 69 41 67 65 2c 20 30 2c 20 30 2c  w(p, iAge, 0, 0,
e8d0: 20 30 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74   0, zRoot, nRoot
e8e0: 2c 20 26 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  , &pNew);.    }e
e8f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
e900: 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  c2;             
e910: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e920: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
e930: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 29  3Fts3ReadBlock()
e940: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
e950: 33 5f 69 6e 74 36 34 20 69 31 3b 20 20 20 20 20  3_int64 i1;     
e960: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 69 64        /* Blockid
e970: 20 6f 66 20 6c 65 61 66 20 74 68 61 74 20 6d 61   of leaf that ma
e980: 79 20 63 6f 6e 74 61 69 6e 20 7a 54 65 72 6d 20  y contain zTerm 
e990: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  */.      rc = ft
e9a0: 73 33 53 65 6c 65 63 74 4c 65 61 66 28 70 2c 20  s3SelectLeaf(p, 
e9b0: 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a 52  zTerm, nTerm, zR
e9c0: 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 69 31 29  oot, nRoot, &i1)
e9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
e9e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
ea00: 36 34 20 69 32 20 3d 20 73 71 6c 69 74 65 33 5f  64 i2 = sqlite3_
ea10: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
ea20: 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  mt, 2);.        
ea30: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
ea40: 53 65 67 52 65 61 64 65 72 4e 65 77 28 70 2c 20  SegReaderNew(p, 
ea50: 69 41 67 65 2c 20 69 31 2c 20 69 32 2c 20 30 2c  iAge, i1, i2, 0,
ea60: 20 30 2c 20 30 2c 20 26 70 4e 65 77 29 3b 0a 20   0, 0, &pNew);. 
ea70: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ea80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
ea90: 61 6c 6c 20 74 6f 20 52 65 61 64 42 6c 6f 63 6b  all to ReadBlock
eaa0: 28 29 20 73 65 72 76 65 73 20 74 6f 20 72 65 73  () serves to res
eab0: 65 74 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  et the SQL state
eac0: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 75 73  ment.      ** us
ead0: 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 62  ed to retrieve b
eae0: 6c 6f 63 6b 73 20 6f 66 20 64 61 74 61 20 66 72  locks of data fr
eaf0: 6f 6d 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  om the %_segment
eb00: 73 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69  s table. If it i
eb10: 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 72  s.      ** not r
eb20: 65 73 65 74 20 68 65 72 65 2c 20 74 68 65 6e 20  eset here, then 
eb30: 69 74 20 6d 61 79 20 72 65 6d 61 69 6e 20 63 6c  it may remain cl
eb40: 61 73 73 69 66 69 65 64 20 61 73 20 61 6e 20 61  assified as an a
eb50: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20  ctive statement 
eb60: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 53 51 4c  .      ** by SQL
eb70: 69 74 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6c  ite, which may l
eb80: 65 61 64 20 74 6f 20 22 44 52 4f 50 20 54 41 42  ead to "DROP TAB
eb90: 4c 45 22 20 6f 72 20 22 44 45 54 41 43 48 22 20  LE" or "DETACH" 
eba0: 63 6f 6d 6d 61 6e 64 73 20 0a 20 20 20 20 20 20  commands .      
ebb0: 2a 2a 20 66 61 69 6c 69 6e 67 2e 0a 20 20 20 20  ** failing..    
ebc0: 20 20 2a 2f 20 0a 20 20 20 20 20 20 72 63 32 20    */ .      rc2 
ebd0: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
ebe0: 64 42 6c 6f 63 6b 28 70 2c 20 30 2c 20 30 2c 20  dBlock(p, 0, 0, 
ebf0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
ec00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ec10: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
ec20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ec30: 20 20 20 69 41 67 65 2b 2b 3b 0a 0a 20 20 20 20     iAge++;..    
ec40: 2f 2a 20 49 66 20 61 20 6e 65 77 20 46 74 73 33  /* If a new Fts3
ec50: 53 65 67 52 65 61 64 65 72 20 77 61 73 20 61 6c  SegReader was al
ec60: 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 69 74 20  located, add it 
ec70: 74 6f 20 74 68 65 20 61 70 53 65 67 6d 65 6e 74  to the apSegment
ec80: 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 61   array. */.    a
ec90: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 7c  ssert( pNew!=0 |
eca0: 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
ecb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
ecc0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65  ){.      if( nSe
ecd0: 67 6d 65 6e 74 3d 3d 6e 41 6c 6c 6f 63 20 29 7b  gment==nAlloc ){
ece0: 0a 20 20 20 20 20 20 20 20 46 74 73 33 53 65 67  .        Fts3Seg
ecf0: 52 65 61 64 65 72 20 2a 2a 70 41 72 72 61 79 3b  Reader **pArray;
ed00: 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20  .        nAlloc 
ed10: 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 70  += 16;.        p
ed20: 41 72 72 61 79 20 3d 20 28 46 74 73 33 53 65 67  Array = (Fts3Seg
ed30: 52 65 61 64 65 72 20 2a 2a 29 73 71 6c 69 74 65  Reader **)sqlite
ed40: 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
ed50: 20 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74         apSegment
ed60: 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
ed70: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
ed80: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
ed90: 20 20 20 20 69 66 28 20 21 70 41 72 72 61 79 20      if( !pArray 
eda0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
edb0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
edc0: 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a  rFree(p, pNew);.
edd0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
ede0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
edf0: 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69         goto fini
ee00: 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  shed;.        }.
ee10: 20 20 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e          apSegmen
ee20: 74 20 3d 20 70 41 72 72 61 79 3b 0a 20 20 20 20  t = pArray;.    
ee30: 20 20 7d 0a 20 20 20 20 20 20 61 70 53 65 67 6d    }.      apSegm
ee40: 65 6e 74 5b 6e 53 65 67 6d 65 6e 74 2b 2b 5d 20  ent[nSegment++] 
ee50: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
ee60: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
ee70: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 61  TE_DONE ){.    a
ee80: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
ee90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 67 6f 74 6f  E_OK );.    goto
eea0: 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a   finished;.  }..
eeb0: 20 20 6d 65 6d 73 65 74 28 26 74 73 63 2c 20 30    memset(&tsc, 0
eec0: 2c 20 73 69 7a 65 6f 66 28 54 65 72 6d 53 65 6c  , sizeof(TermSel
eed0: 65 63 74 29 29 3b 0a 20 20 74 73 63 2e 69 73 52  ect));.  tsc.isR
eee0: 65 71 50 6f 73 20 3d 20 69 73 52 65 71 50 6f 73  eqPos = isReqPos
eef0: 3b 0a 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67  ;..  filter.flag
ef00: 73 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  s = FTS3_SEGMENT
ef10: 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 0a 20  _IGNORE_EMPTY . 
ef20: 20 20 20 20 20 20 20 7c 20 28 69 73 50 72 65 66         | (isPref
ef30: 69 78 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e  ix ? FTS3_SEGMEN
ef40: 54 5f 50 52 45 46 49 58 20 3a 20 30 29 0a 20 20  T_PREFIX : 0).  
ef50: 20 20 20 20 20 20 7c 20 28 69 73 52 65 71 50 6f        | (isReqPo
ef60: 73 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  s ? FTS3_SEGMENT
ef70: 5f 52 45 51 55 49 52 45 5f 50 4f 53 20 3a 20 30  _REQUIRE_POS : 0
ef80: 29 0a 20 20 20 20 20 20 20 20 7c 20 28 69 43 6f  ).        | (iCo
ef90: 6c 75 6d 6e 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  lumn<p->nColumn 
efa0: 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43  ? FTS3_SEGMENT_C
efb0: 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 20 3a 20 30  OLUMN_FILTER : 0
efc0: 29 3b 0a 20 20 66 69 6c 74 65 72 2e 69 43 6f 6c  );.  filter.iCol
efd0: 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 66 69   = iColumn;.  fi
efe0: 6c 74 65 72 2e 7a 54 65 72 6d 20 3d 20 7a 54 65  lter.zTerm = zTe
eff0: 72 6d 3b 0a 20 20 66 69 6c 74 65 72 2e 6e 54 65  rm;.  filter.nTe
f000: 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 72  rm = nTerm;..  r
f010: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
f020: 65 67 52 65 61 64 65 72 49 74 65 72 61 74 65 28  egReaderIterate(
f030: 70 2c 20 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53  p, apSegment, nS
f040: 65 67 6d 65 6e 74 2c 20 26 66 69 6c 74 65 72 2c  egment, &filter,
f050: 0a 20 20 20 20 20 20 66 74 73 33 54 65 72 6d 53  .      fts3TermS
f060: 65 6c 65 63 74 43 62 2c 20 28 76 6f 69 64 20 2a  electCb, (void *
f070: 29 26 74 73 63 0a 20 20 29 3b 0a 0a 20 20 69 66  )&tsc.  );..  if
f080: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f090: 29 7b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  ){.    *ppOut = 
f0a0: 74 73 63 2e 61 4f 75 74 70 75 74 3b 0a 20 20 20  tsc.aOutput;.   
f0b0: 20 2a 70 6e 4f 75 74 20 3d 20 74 73 63 2e 6e 4f   *pnOut = tsc.nO
f0c0: 75 74 70 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  utput;.  }else{.
f0d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f0e0: 28 74 73 63 2e 61 4f 75 74 70 75 74 29 3b 0a 20  (tsc.aOutput);. 
f0f0: 20 7d 0a 0a 66 69 6e 69 73 68 65 64 3a 0a 20 20   }..finished:.  
f100: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
f110: 74 6d 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  tmt);.  for(i=0;
f120: 20 69 3c 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b   i<nSegment; i++
f130: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
f140: 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65 28  s3SegReaderFree(
f150: 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29  p, apSegment[i])
f160: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
f170: 66 72 65 65 28 61 70 53 65 67 6d 65 6e 74 29 3b  free(apSegment);
f180: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f190: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ../* .** Return 
f1a0: 61 20 44 6f 63 4c 69 73 74 20 63 6f 72 72 65 73  a DocList corres
f1b0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
f1c0: 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 2e 0a  hrase *pPhrase..
f1d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
f1e0: 73 33 50 68 72 61 73 65 53 65 6c 65 63 74 28 0a  s3PhraseSelect(.
f1f0: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f210: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
f220: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
f230: 74 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61  ts3Phrase *pPhra
f240: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
f250: 2a 20 50 68 72 61 73 65 20 74 6f 20 72 65 74 75  * Phrase to retu
f260: 72 6e 20 61 20 64 6f 63 6c 69 73 74 20 66 6f 72  rn a doclist for
f270: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 71 50   */.  int isReqP
f280: 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
f290: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
f2a0: 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 20 63   output should c
f2b0: 6f 6e 74 61 69 6e 20 70 6f 73 69 74 69 6f 6e 73  ontain positions
f2c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 4f   */.  char **paO
f2d0: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
f2e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
f2f0: 69 6e 74 65 72 20 74 6f 20 6d 61 6c 6c 6f 63 27  inter to malloc'
f300: 64 20 72 65 73 75 6c 74 20 62 75 66 66 65 72 20  d result buffer 
f310: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 20  */.  int *pnOut 
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
f340: 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 2a  e of buffer at *
f350: 70 61 4f 75 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  paOut */.){.  ch
f360: 61 72 20 2a 70 4f 75 74 20 3d 20 30 3b 0a 20 20  ar *pOut = 0;.  
f370: 69 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  int nOut = 0;.  
f380: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f390: 4f 4b 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  OK;.  int ii;.  
f3a0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 68 72 61  int iCol = pPhra
f3b0: 73 65 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 69  se->iColumn;.  i
f3c0: 6e 74 20 69 73 54 65 72 6d 50 6f 73 20 3d 20 28  nt isTermPos = (
f3d0: 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3e  pPhrase->nToken>
f3e0: 31 20 7c 7c 20 69 73 52 65 71 50 6f 73 29 3b 0a  1 || isReqPos);.
f3f0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
f400: 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b  pPhrase->nToken;
f410: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75   ii++){.    stru
f420: 63 74 20 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ct PhraseToken *
f430: 70 54 6f 6b 20 3d 20 26 70 50 68 72 61 73 65 2d  pTok = &pPhrase-
f440: 3e 61 54 6f 6b 65 6e 5b 69 69 5d 3b 0a 20 20 20  >aToken[ii];.   
f450: 20 63 68 61 72 20 2a 7a 20 3d 20 70 54 6f 6b 2d   char *z = pTok-
f460: 3e 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  >z;            /
f470: 2a 20 4e 65 78 74 20 74 6f 6b 65 6e 20 6f 66 20  * Next token of 
f480: 74 68 65 20 70 68 72 61 73 65 20 2a 2f 0a 20 20  the phrase */.  
f490: 20 20 69 6e 74 20 6e 20 3d 20 70 54 6f 6b 2d 3e    int n = pTok->
f4a0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
f4b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 20 69 6e 20  /* Size of z in 
f4c0: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
f4d0: 20 69 73 50 72 65 66 69 78 20 3d 20 70 54 6f 6b   isPrefix = pTok
f4e0: 2d 3e 69 73 50 72 65 66 69 78 3b 2f 2a 20 54 72  ->isPrefix;/* Tr
f4f0: 75 65 20 69 66 20 74 6f 6b 65 6e 20 69 73 20 61  ue if token is a
f500: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 63   prefix */.    c
f510: 68 61 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  har *pList;     
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f530: 50 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b 65 6e  Pointer to token
f540: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20   doclist */.    
f550: 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20  int nList;      
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f570: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
f580: 61 74 20 70 4c 69 73 74 20 2a 2f 0a 0a 20 20 20  at pList */..   
f590: 20 72 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65   rc = fts3TermSe
f5a0: 6c 65 63 74 28 70 2c 20 69 43 6f 6c 2c 20 7a 2c  lect(p, iCol, z,
f5b0: 20 6e 2c 20 69 73 50 72 65 66 69 78 2c 20 69 73   n, isPrefix, is
f5c0: 54 65 72 6d 50 6f 73 2c 20 26 6e 4c 69 73 74 2c  TermPos, &nList,
f5d0: 20 26 70 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   &pList);.    if
f5e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f5f0: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66  ) break;..    if
f600: 28 20 69 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( ii==0 ){.     
f610: 20 70 4f 75 74 20 3d 20 70 4c 69 73 74 3b 0a 20   pOut = pList;. 
f620: 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4c 69 73       nOut = nLis
f630: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
f640: 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65      /* Merge the
f650: 20 6e 65 77 20 74 65 72 6d 20 6c 69 73 74 20 61   new term list a
f660: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  nd the current o
f670: 75 74 70 75 74 2e 20 49 66 20 74 68 69 73 20 69  utput. If this i
f680: 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  s the.      ** l
f690: 61 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ast term in the 
f6a0: 70 68 72 61 73 65 2c 20 61 6e 64 20 70 6f 73 69  phrase, and posi
f6b0: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 72 65  tions are not re
f6c0: 71 75 69 72 65 64 20 69 6e 20 74 68 65 0a 20 20  quired in the.  
f6d0: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 6f 66      ** output of
f6e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
f6f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 63 61  the positions ca
f700: 6e 20 62 65 20 64 72 6f 70 70 65 64 20 61 73 20  n be dropped as 
f710: 70 61 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66  part.      ** of
f720: 20 74 68 69 73 20 6d 65 72 67 65 2e 20 45 69 74   this merge. Eit
f730: 68 65 72 20 77 61 79 2c 20 74 68 65 20 72 65 73  her way, the res
f740: 75 6c 74 20 6f 66 20 74 68 69 73 20 6d 65 72 67  ult of this merg
f750: 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
f760: 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ** smaller than 
f770: 6e 4c 69 73 74 20 62 79 74 65 73 2e 20 54 68 65  nList bytes. The
f780: 20 63 6f 64 65 20 69 6e 20 66 74 73 33 44 6f 63   code in fts3Doc
f790: 6c 69 73 74 4d 65 72 67 65 28 29 20 69 73 20 77  listMerge() is w
f7a0: 72 69 74 74 65 6e 0a 20 20 20 20 20 20 2a 2a 20  ritten.      ** 
f7b0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 73 61  so that it is sa
f7c0: 66 65 20 74 6f 20 75 73 65 20 70 4c 69 73 74 20  fe to use pList 
f7d0: 61 73 20 74 68 65 20 6f 75 74 70 75 74 20 61 73  as the output as
f7e0: 20 77 65 6c 6c 20 61 73 20 61 6e 20 69 6e 70 75   well as an inpu
f7f0: 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  t.      ** in th
f800: 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 2a  is case..      *
f810: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6d 65 72 67  /.      int merg
f820: 65 74 79 70 65 20 3d 20 4d 45 52 47 45 5f 50 4f  etype = MERGE_PO
f830: 53 5f 50 48 52 41 53 45 3b 0a 20 20 20 20 20 20  S_PHRASE;.      
f840: 69 66 28 20 69 69 3d 3d 70 50 68 72 61 73 65 2d  if( ii==pPhrase-
f850: 3e 6e 54 6f 6b 65 6e 2d 31 20 26 26 20 21 69 73  >nToken-1 && !is
f860: 52 65 71 50 6f 73 20 29 7b 0a 20 20 20 20 20 20  ReqPos ){.      
f870: 20 20 6d 65 72 67 65 74 79 70 65 20 3d 20 4d 45    mergetype = ME
f880: 52 47 45 5f 50 48 52 41 53 45 3b 0a 20 20 20 20  RGE_PHRASE;.    
f890: 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 44 6f    }.      fts3Do
f8a0: 63 6c 69 73 74 4d 65 72 67 65 28 6d 65 72 67 65  clistMerge(merge
f8b0: 74 79 70 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73  type, 0, 0, pLis
f8c0: 74 2c 20 26 6e 4f 75 74 2c 20 70 4f 75 74 2c 20  t, &nOut, pOut, 
f8d0: 6e 4f 75 74 2c 20 70 4c 69 73 74 2c 20 6e 4c 69  nOut, pList, nLi
f8e0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
f8f0: 65 33 5f 66 72 65 65 28 70 4f 75 74 29 3b 0a 20  e3_free(pOut);. 
f900: 20 20 20 20 20 70 4f 75 74 20 3d 20 70 4c 69 73       pOut = pLis
f910: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
f920: 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20  ert( nOut==0 || 
f930: 70 4f 75 74 21 3d 30 20 29 3b 0a 20 20 7d 0a 0a  pOut!=0 );.  }..
f940: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f950: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 61 4f 75  _OK ){.    *paOu
f960: 74 20 3d 20 70 4f 75 74 3b 0a 20 20 20 20 2a 70  t = pOut;.    *p
f970: 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d  nOut = nOut;.  }
f980: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
f990: 33 5f 66 72 65 65 28 70 4f 75 74 29 3b 0a 20 20  3_free(pOut);.  
f9a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f9b0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
f9c0: 33 4e 65 61 72 4d 65 72 67 65 28 0a 20 20 69 6e  3NearMerge(.  in
f9d0: 74 20 6d 65 72 67 65 74 79 70 65 2c 20 20 20 20  t mergetype,    
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f9f0: 20 4d 45 52 47 45 5f 50 4f 53 5f 4e 45 41 52 20   MERGE_POS_NEAR 
fa00: 6f 72 20 4d 45 52 47 45 5f 4e 45 41 52 20 2a 2f  or MERGE_NEAR */
fa10: 0a 20 20 69 6e 74 20 6e 4e 65 61 72 2c 20 20 20  .  int nNear,   
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20     /* Parameter 
fa40: 74 6f 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72  to NEAR operator
fa50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e   */.  int nToken
fa60: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
fa70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fa80: 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 4c 48 53  of tokens in LHS
fa90: 20 70 68 72 61 73 65 20 61 72 67 20 2a 2f 0a 20   phrase arg */. 
faa0: 20 63 68 61 72 20 2a 61 4c 65 66 74 2c 20 20 20   char *aLeft,   
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 2f 2a 20 44 6f 63 6c 69 73 74 20 66 6f 72 20   /* Doclist for 
fad0: 4c 48 53 20 28 69 6e 63 6c 2e 20 70 6f 73 69 74  LHS (incl. posit
fae0: 69 6f 6e 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  ions) */.  int n
faf0: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
fb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
fb10: 7a 65 20 6f 66 20 4c 48 53 20 64 6f 63 6c 69 73  ze of LHS doclis
fb20: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
fb30: 69 6e 74 20 6e 54 6f 6b 65 6e 52 69 67 68 74 2c  int nTokenRight,
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 2f 2a 20 41 73 20 6e 54 6f 6b 65 6e 4c 65 66 74  /* As nTokenLeft
fb60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 52 69 67   */.  char *aRig
fb70: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
fb80: 20 20 20 20 20 20 2f 2a 20 41 73 20 61 4c 65 66        /* As aLef
fb90: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 69 67 68  t */.  int nRigh
fba0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
fbb0: 20 20 20 20 20 20 20 2f 2a 20 41 73 20 6e 52 69         /* As nRi
fbc0: 67 68 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ght */.  char **
fbd0: 70 61 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  paOut,          
fbe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
fbf0: 20 52 65 73 75 6c 74 73 20 6f 66 20 6d 65 72 67   Results of merg
fc00: 65 20 28 6d 61 6c 6c 6f 63 65 64 29 20 2a 2f 0a  e (malloced) */.
fc10: 20 20 69 6e 74 20 2a 70 6e 4f 75 74 20 20 20 20    int *pnOut    
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 64 20    /* OUT: Sized 
fc40: 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
fc50: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 61   */.){.  char *a
fc60: 4f 75 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Out;.  int rc;..
fc70: 20 20 61 73 73 65 72 74 28 20 6d 65 72 67 65 74    assert( merget
fc80: 79 70 65 3d 3d 4d 45 52 47 45 5f 50 4f 53 5f 4e  ype==MERGE_POS_N
fc90: 45 41 52 20 7c 7c 20 4d 45 52 47 45 5f 4e 45 41  EAR || MERGE_NEA
fca0: 52 20 29 3b 0a 0a 20 20 61 4f 75 74 20 3d 20 73  R );..  aOut = s
fcb0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4c  qlite3_malloc(nL
fcc0: 65 66 74 2b 6e 52 69 67 68 74 2b 31 29 3b 0a 20  eft+nRight+1);. 
fcd0: 20 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a   if( aOut==0 ){.
fce0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
fcf0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
fd00: 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 63      rc = fts3Doc
fd10: 6c 69 73 74 4d 65 72 67 65 28 6d 65 72 67 65 74  listMerge(merget
fd20: 79 70 65 2c 20 6e 4e 65 61 72 2b 6e 54 6f 6b 65  ype, nNear+nToke
fd30: 6e 52 69 67 68 74 2c 20 6e 4e 65 61 72 2b 6e 54  nRight, nNear+nT
fd40: 6f 6b 65 6e 4c 65 66 74 2c 20 0a 20 20 20 20 20  okenLeft, .     
fd50: 20 61 4f 75 74 2c 20 70 6e 4f 75 74 2c 20 61 4c   aOut, pnOut, aL
fd60: 65 66 74 2c 20 6e 4c 65 66 74 2c 20 61 52 69 67  eft, nLeft, aRig
fd70: 68 74 2c 20 6e 52 69 67 68 74 0a 20 20 20 20 29  ht, nRight.    )
fd80: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
fd90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fda0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f   sqlite3_free(aO
fdb0: 75 74 29 3b 0a 20 20 20 20 20 20 61 4f 75 74 20  ut);.      aOut 
fdc0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
fdd0: 20 20 2a 70 61 4f 75 74 20 3d 20 61 4f 75 74 3b    *paOut = aOut;
fde0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fdf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
fe00: 45 78 70 72 4e 65 61 72 54 72 69 6d 28 46 74 73  ExprNearTrim(Fts
fe10: 33 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 46 74  3Expr *pLeft, Ft
fe20: 73 33 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20  s3Expr *pRight, 
fe30: 69 6e 74 20 6e 4e 65 61 72 29 7b 0a 20 20 69 6e  int nNear){.  in
fe40: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 4c 65 66  t rc;.  if( pLef
fe50: 74 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20 7c  t->aDoclist==0 |
fe60: 7c 20 70 52 69 67 68 74 2d 3e 61 44 6f 63 6c 69  | pRight->aDocli
fe70: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  st==0 ){.    sql
fe80: 69 74 65 33 5f 66 72 65 65 28 70 4c 65 66 74 2d  ite3_free(pLeft-
fe90: 3e 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  >aDoclist);.    
fea0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 69  sqlite3_free(pRi
feb0: 67 68 74 2d 3e 61 44 6f 63 6c 69 73 74 29 3b 0a  ght->aDoclist);.
fec0: 20 20 20 20 70 52 69 67 68 74 2d 3e 61 44 6f 63      pRight->aDoc
fed0: 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 4c  list = 0;.    pL
fee0: 65 66 74 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20  eft->aDoclist = 
fef0: 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  0;.    rc = SQLI
ff00: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
ff10: 20 20 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a      char *aOut;.
ff20: 20 20 20 20 69 6e 74 20 6e 4f 75 74 3b 0a 0a 20      int nOut;.. 
ff30: 20 20 20 72 63 20 3d 20 66 74 73 33 4e 65 61 72     rc = fts3Near
ff40: 4d 65 72 67 65 28 4d 45 52 47 45 5f 50 4f 53 5f  Merge(MERGE_POS_
ff50: 4e 45 41 52 2c 20 6e 4e 65 61 72 2c 20 0a 20 20  NEAR, nNear, .  
ff60: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70 50 68        pLeft->pPh
ff70: 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 2c 20 70 4c  rase->nToken, pL
ff80: 65 66 74 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70  eft->aDoclist, p
ff90: 4c 65 66 74 2d 3e 6e 44 6f 63 6c 69 73 74 2c 0a  Left->nDoclist,.
ffa0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
ffb0: 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 2c  pPhrase->nToken,
ffc0: 20 70 52 69 67 68 74 2d 3e 61 44 6f 63 6c 69 73   pRight->aDoclis
ffd0: 74 2c 20 70 52 69 67 68 74 2d 3e 6e 44 6f 63 6c  t, pRight->nDocl
ffe0: 69 73 74 2c 0a 20 20 20 20 20 20 20 20 26 61 4f  ist,.        &aO
fff0: 75 74 2c 20 26 6e 4f 75 74 0a 20 20 20 20 29 3b  ut, &nOut.    );
10000 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10010 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
10020 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rc;.    sqlite3_
10030 66 72 65 65 28 70 52 69 67 68 74 2d 3e 61 44 6f  free(pRight->aDo
10040 63 6c 69 73 74 29 3b 0a 20 20 20 20 70 52 69 67  clist);.    pRig
10050 68 74 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61  ht->aDoclist = a
10060 4f 75 74 3b 0a 20 20 20 20 70 52 69 67 68 74 2d  Out;.    pRight-
10070 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 6e 4f 75 74  >nDoclist = nOut
10080 3b 0a 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ;..    rc = fts3
10090 4e 65 61 72 4d 65 72 67 65 28 4d 45 52 47 45 5f  NearMerge(MERGE_
100a0 50 4f 53 5f 4e 45 41 52 2c 20 6e 4e 65 61 72 2c  POS_NEAR, nNear,
100b0 20 0a 20 20 20 20 20 20 20 20 70 52 69 67 68 74   .        pRight
100c0 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65  ->pPhrase->nToke
100d0 6e 2c 20 70 52 69 67 68 74 2d 3e 61 44 6f 63 6c  n, pRight->aDocl
100e0 69 73 74 2c 20 70 52 69 67 68 74 2d 3e 6e 44 6f  ist, pRight->nDo
100f0 63 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 70  clist,.        p
10100 4c 65 66 74 2d 3e 70 50 68 72 61 73 65 2d 3e 6e  Left->pPhrase->n
10110 54 6f 6b 65 6e 2c 20 70 4c 65 66 74 2d 3e 61 44  Token, pLeft->aD
10120 6f 63 6c 69 73 74 2c 20 70 4c 65 66 74 2d 3e 6e  oclist, pLeft->n
10130 44 6f 63 6c 69 73 74 2c 0a 20 20 20 20 20 20 20  Doclist,.       
10140 20 26 61 4f 75 74 2c 20 26 6e 4f 75 74 0a 20 20   &aOut, &nOut.  
10150 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
10160 5f 66 72 65 65 28 70 4c 65 66 74 2d 3e 61 44 6f  _free(pLeft->aDo
10170 63 6c 69 73 74 29 3b 0a 20 20 20 20 70 4c 65 66  clist);.    pLef
10180 74 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61 4f  t->aDoclist = aO
10190 75 74 3b 0a 20 20 20 20 70 4c 65 66 74 2d 3e 6e  ut;.    pLeft->n
101a0 44 6f 63 6c 69 73 74 20 3d 20 6e 4f 75 74 3b 0a  Doclist = nOut;.
101b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
101c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61  .}../*.** Evalua
101d0 74 65 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  te the full-text
101e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
101f0 72 20 61 67 61 69 6e 73 74 20 66 74 73 33 20 74  r against fts3 t
10200 61 62 6c 65 20 70 54 61 62 2e 20 53 74 6f 72 65  able pTab. Store
10210 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 69 6e  .** the resultin
10220 67 20 64 6f 63 6c 69 73 74 20 69 6e 20 2a 70 61  g doclist in *pa
10230 4f 75 74 20 61 6e 64 20 2a 70 6e 4f 75 74 2e 20  Out and *pnOut. 
10240 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
10250 6c 6c 6f 63 73 20 66 6f 72 0a 2a 2a 20 74 68 65  llocs for.** the
10260 20 73 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f   space needed to
10270 20 73 74 6f 72 65 20 74 68 65 20 6f 75 74 70 75   store the outpu
10280 74 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69  t.  The caller i
10290 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
102a0 72 0a 2a 2a 20 66 72 65 65 69 6e 67 20 74 68 65  r.** freeing the
102b0 20 73 70 61 63 65 20 77 68 65 6e 20 69 74 20 68   space when it h
102c0 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2f 0a  as finished..*/.
102d0 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 46  static int evalF
102e0 74 73 33 45 78 70 72 28 0a 20 20 46 74 73 33 54  ts3Expr(.  Fts3T
102f0 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
10300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
10310 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
10320 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  le */.  Fts3Expr
10330 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
10340 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
10350 64 20 66 74 73 33 20 65 78 70 72 65 73 73 69 6f  d fts3 expressio
10360 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61  n */.  char **pa
10370 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
10380 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
10390 6f 69 6e 74 65 72 20 74 6f 20 6d 61 6c 6c 6f 63  ointer to malloc
103a0 27 64 20 72 65 73 75 6c 74 20 62 75 66 66 65 72  'd result buffer
103b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74   */.  int *pnOut
103c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
103d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
103e0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
103f0 2a 70 61 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20  *paOut */.  int 
10400 69 73 52 65 71 50 6f 73 20 20 20 20 20 20 20 20  isReqPos        
10410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10420 65 71 75 69 72 65 20 70 6f 73 69 74 69 6f 6e 73  equire positions
10430 20 69 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65   in output buffe
10440 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
10450 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
10460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10470 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
10480 2a 20 5a 65 72 6f 20 74 68 65 20 6f 75 74 70 75  * Zero the outpu
10490 74 20 70 61 72 61 6d 65 74 65 72 73 2e 20 2a 2f  t parameters. */
104a0 0a 20 20 2a 70 61 4f 75 74 20 3d 20 30 3b 0a 20  .  *paOut = 0;. 
104b0 20 2a 70 6e 4f 75 74 20 3d 20 30 3b 0a 0a 20 20   *pnOut = 0;..  
104c0 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
104d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
104e0 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
104f0 50 48 52 41 53 45 20 0a 20 20 20 20 20 20 20 20  PHRASE .        
10500 20 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79 70 65   || pExpr->eType
10510 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20  ==FTSQUERY_NEAR 
10520 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 69 73 52  .         || isR
10530 65 71 50 6f 73 3d 3d 30 0a 20 20 20 20 29 3b 0a  eqPos==0.    );.
10540 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65      if( pExpr->e
10550 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50  Type==FTSQUERY_P
10560 48 52 41 53 45 20 29 7b 0a 20 20 20 20 20 20 72  HRASE ){.      r
10570 63 20 3d 20 66 74 73 33 50 68 72 61 73 65 53 65  c = fts3PhraseSe
10580 6c 65 63 74 28 70 2c 20 70 45 78 70 72 2d 3e 70  lect(p, pExpr->p
10590 50 68 72 61 73 65 2c 20 0a 20 20 20 20 20 20 20  Phrase, .       
105a0 20 20 20 69 73 52 65 71 50 6f 73 20 7c 7c 20 28     isReqPos || (
105b0 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 20 26  pExpr->pParent &
105c0 26 20 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74  & pExpr->pParent
105d0 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
105e0 59 5f 4e 45 41 52 29 2c 0a 20 20 20 20 20 20 20  Y_NEAR),.       
105f0 20 20 20 70 61 4f 75 74 2c 20 70 6e 4f 75 74 0a     paOut, pnOut.
10600 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
10610 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
10620 61 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 68 61  aLeft;.      cha
10630 72 20 2a 61 52 69 67 68 74 3b 0a 20 20 20 20 20  r *aRight;.     
10640 20 69 6e 74 20 6e 4c 65 66 74 3b 0a 20 20 20 20   int nLeft;.    
10650 20 20 69 6e 74 20 6e 52 69 67 68 74 3b 0a 0a 20    int nRight;.. 
10660 20 20 20 20 20 69 66 28 20 30 3d 3d 28 72 63 20       if( 0==(rc 
10670 3d 20 65 76 61 6c 46 74 73 33 45 78 70 72 28 70  = evalFts3Expr(p
10680 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
10690 20 26 61 52 69 67 68 74 2c 20 26 6e 52 69 67 68   &aRight, &nRigh
106a0 74 2c 20 69 73 52 65 71 50 6f 73 29 29 0a 20 20  t, isReqPos)).  
106b0 20 20 20 20 20 26 26 20 30 3d 3d 28 72 63 20 3d       && 0==(rc =
106c0 20 65 76 61 6c 46 74 73 33 45 78 70 72 28 70 2c   evalFts3Expr(p,
106d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
106e0 61 4c 65 66 74 2c 20 26 6e 4c 65 66 74 2c 20 69  aLeft, &nLeft, i
106f0 73 52 65 71 50 6f 73 29 29 0a 20 20 20 20 20 20  sReqPos)).      
10700 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
10710 74 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  t( pExpr->eType=
10720 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 7c  =FTSQUERY_NEAR |
10730 7c 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d  | pExpr->eType==
10740 46 54 53 51 55 45 52 59 5f 4f 52 20 20 20 20 20  FTSQUERY_OR     
10750 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
10760 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
10770 53 51 55 45 52 59 5f 41 4e 44 20 20 7c 7c 20 70  SQUERY_AND  || p
10780 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
10790 51 55 45 52 59 5f 4e 4f 54 0a 20 20 20 20 20 20  QUERY_NOT.      
107a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69    );.        swi
107b0 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70  tch( pExpr->eTyp
107c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  e ){.          c
107d0 61 73 65 20 46 54 53 51 55 45 52 59 5f 4e 45 41  ase FTSQUERY_NEA
107e0 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
107f0 20 46 74 73 33 45 78 70 72 20 2a 70 4c 65 66 74   Fts3Expr *pLeft
10800 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 74  ;.            Ft
10810 73 33 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a  s3Expr *pRight;.
10820 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
10830 6d 65 72 67 65 74 79 70 65 20 3d 20 69 73 52 65  mergetype = isRe
10840 71 50 6f 73 20 3f 20 4d 45 52 47 45 5f 50 4f 53  qPos ? MERGE_POS
10850 5f 4e 45 41 52 20 3a 20 4d 45 52 47 45 5f 4e 45  _NEAR : MERGE_NE
10860 41 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 0a  AR;.           .
10870 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
10880 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 20 26  pExpr->pParent &
10890 26 20 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74  & pExpr->pParent
108a0 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
108b0 59 5f 4e 45 41 52 20 29 7b 0a 20 20 20 20 20 20  Y_NEAR ){.      
108c0 20 20 20 20 20 20 20 20 6d 65 72 67 65 74 79 70          mergetyp
108d0 65 20 3d 20 4d 45 52 47 45 5f 50 4f 53 5f 4e 45  e = MERGE_POS_NE
108e0 41 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AR;.            
108f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4c  }.            pL
10900 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
10910 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
10920 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e 65 54  while( pLeft->eT
10930 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45  ype==FTSQUERY_NE
10940 41 52 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  AR ){ .         
10950 20 20 20 20 20 70 4c 65 66 74 3d 70 4c 65 66 74       pLeft=pLeft
10960 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
10970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10980 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
10990 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
109a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
109b0 70 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46  pRight->eType==F
109c0 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29  TSQUERY_PHRASE )
109d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
109e0 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 65 54 79  sert( pLeft->eTy
109f0 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52  pe==FTSQUERY_PHR
10a00 41 53 45 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  ASE );..        
10a10 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 65 61      rc = fts3Nea
10a20 72 4d 65 72 67 65 28 6d 65 72 67 65 74 79 70 65  rMerge(mergetype
10a30 2c 20 70 45 78 70 72 2d 3e 6e 4e 65 61 72 2c 20  , pExpr->nNear, 
10a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10a50 20 70 4c 65 66 74 2d 3e 70 50 68 72 61 73 65 2d   pLeft->pPhrase-
10a60 3e 6e 54 6f 6b 65 6e 2c 20 61 4c 65 66 74 2c 20  >nToken, aLeft, 
10a70 6e 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  nLeft,.         
10a80 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70         pRight->p
10a90 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 2c 20  Phrase->nToken, 
10aa0 61 52 69 67 68 74 2c 20 6e 52 69 67 68 74 2c 0a  aRight, nRight,.
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 70 61 4f 75 74 2c 20 70 6e 4f 75 74 0a 20 20 20  paOut, pnOut.   
10ad0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
10ae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10af0 66 72 65 65 28 61 4c 65 66 74 29 3b 0a 20 20 20  free(aLeft);.   
10b00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10b10 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
10b20 20 20 20 20 20 20 20 63 61 73 65 20 46 54 53 51         case FTSQ
10b30 55 45 52 59 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  UERY_OR: {.     
10b40 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
10b50 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
10b60 74 68 65 20 6f 75 74 70 75 74 2e 20 54 68 65 20  the output. The 
10b70 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69 73 20  maximum size is 
10b80 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
10b90 2a 2a 20 73 75 6d 20 6f 66 20 74 68 65 20 73 69  ** sum of the si
10ba0 7a 65 73 20 6f 66 20 74 68 65 20 74 77 6f 20 69  zes of the two i
10bb0 6e 70 75 74 20 62 75 66 66 65 72 73 2e 20 54 68  nput buffers. Th
10bc0 65 20 2b 31 20 74 65 72 6d 20 69 73 0a 20 20 20  e +1 term is.   
10bd0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
10be0 68 61 74 20 61 20 62 75 66 66 65 72 20 6f 66 20  hat a buffer of 
10bf0 7a 65 72 6f 20 62 79 74 65 73 20 69 73 20 6e 65  zero bytes is ne
10c00 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 2d 20  ver allocated - 
10c10 74 68 69 73 20 63 61 6e 0a 20 20 20 20 20 20 20  this can.       
10c20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 66 74       ** cause ft
10c30 73 33 44 6f 63 6c 69 73 74 4d 65 72 67 65 28 29  s3DoclistMerge()
10c40 20 74 6f 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   to incorrectly 
10c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10c60 4d 45 4d 2e 0a 20 20 20 20 20 20 20 20 20 20 20  MEM..           
10c70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
10c80 63 68 61 72 20 2a 61 42 75 66 66 65 72 20 3d 20  char *aBuffer = 
10c90 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
10ca0 52 69 67 68 74 2b 6e 4c 65 66 74 2b 31 29 3b 0a  Right+nLeft+1);.
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
10cc0 20 66 74 73 33 44 6f 63 6c 69 73 74 4d 65 72 67   fts3DoclistMerg
10cd0 65 28 4d 45 52 47 45 5f 4f 52 2c 20 30 2c 20 30  e(MERGE_OR, 0, 0
10ce0 2c 20 61 42 75 66 66 65 72 2c 20 70 6e 4f 75 74  , aBuffer, pnOut
10cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10d00 20 20 61 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20    aLeft, nLeft, 
10d10 61 52 69 67 68 74 2c 20 6e 52 69 67 68 74 0a 20  aRight, nRight. 
10d20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
10d30 20 20 20 20 20 20 20 20 20 20 2a 70 61 4f 75 74            *paOut
10d40 20 3d 20 61 42 75 66 66 65 72 3b 0a 20 20 20 20   = aBuffer;.    
10d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10d60 66 72 65 65 28 61 4c 65 66 74 29 3b 0a 20 20 20  free(aLeft);.   
10d70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10d80 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
10d90 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
10da0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
10db0 73 65 72 74 28 20 46 54 53 51 55 45 52 59 5f 4e  sert( FTSQUERY_N
10dc0 4f 54 3d 3d 4d 45 52 47 45 5f 4e 4f 54 20 26 26  OT==MERGE_NOT &&
10dd0 20 46 54 53 51 55 45 52 59 5f 41 4e 44 3d 3d 4d   FTSQUERY_AND==M
10de0 45 52 47 45 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ERGE_AND );.    
10df0 20 20 20 20 20 20 20 20 66 74 73 33 44 6f 63 6c          fts3Docl
10e00 69 73 74 4d 65 72 67 65 28 70 45 78 70 72 2d 3e  istMerge(pExpr->
10e10 65 54 79 70 65 2c 20 30 2c 20 30 2c 20 61 4c 65  eType, 0, 0, aLe
10e20 66 74 2c 20 70 6e 4f 75 74 2c 0a 20 20 20 20 20  ft, pnOut,.     
10e30 20 20 20 20 20 20 20 20 20 20 20 61 4c 65 66 74             aLeft
10e40 2c 20 6e 4c 65 66 74 2c 20 61 52 69 67 68 74 2c  , nLeft, aRight,
10e50 20 6e 52 69 67 68 74 0a 20 20 20 20 20 20 20 20   nRight.        
10e60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
10e70 20 20 20 2a 70 61 4f 75 74 20 3d 20 61 4c 65 66     *paOut = aLef
10e80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  t;.            b
10e90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
10ea0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
10eb0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10ec0 33 5f 66 72 65 65 28 61 52 69 67 68 74 29 3b 0a  3_free(aRight);.
10ed0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
10ee0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10ef0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 46 69   This is the xFi
10f00 6c 74 65 72 20 69 6e 74 65 72 66 61 63 65 20 66  lter interface f
10f10 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
10f20 61 62 6c 65 2e 20 20 53 65 65 0a 2a 2a 20 74 68  able.  See.** th
10f30 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
10f40 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 64  xFilter method d
10f50 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
10f60 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69   additional.** i
10f70 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
10f80 2a 20 49 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53  * If idxNum==FTS
10f90 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43  3_FULLSCAN_SEARC
10fa0 48 20 74 68 65 6e 20 64 6f 20 61 20 66 75 6c 6c  H then do a full
10fb0 20 74 61 62 6c 65 20 73 63 61 6e 20 61 67 61 69   table scan agai
10fc0 6e 73 74 0a 2a 2a 20 74 68 65 20 25 5f 63 6f 6e  nst.** the %_con
10fd0 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tent table..**.*
10fe0 2a 20 49 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53  * If idxNum==FTS
10ff0 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20 74  3_DOCID_SEARCH t
11000 68 65 6e 20 64 6f 20 61 20 64 6f 63 69 64 20 6c  hen do a docid l
11010 6f 6f 6b 75 70 20 66 6f 72 20 61 20 73 69 6e 67  ookup for a sing
11020 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74  le entry.** in t
11030 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  he %_content tab
11040 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 64 78  le..**.** If idx
11050 4e 75 6d 3e 3d 46 54 53 33 5f 46 55 4c 4c 54 45  Num>=FTS3_FULLTE
11060 58 54 5f 53 45 41 52 43 48 20 74 68 65 6e 20 75  XT_SEARCH then u
11070 73 65 20 74 68 65 20 66 75 6c 6c 20 74 65 78 74  se the full text
11080 20 69 6e 64 65 78 2e 20 20 54 68 65 0a 2a 2a 20   index.  The.** 
11090 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65  column on the le
110a0 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
110b0 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
110c0 6f 72 20 69 73 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  or is column.** 
110d0 6e 75 6d 62 65 72 20 69 64 78 4e 75 6d 2d 46 54  number idxNum-FT
110e0 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52  S3_FULLTEXT_SEAR
110f0 43 48 2c 20 30 20 69 6e 64 65 78 65 64 2e 20 20  CH, 0 indexed.  
11100 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65 20 72  argv[0] is the r
11110 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 64  ight-hand.** sid
11120 65 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  e of the MATCH o
11130 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 54  perator..*/./* T
11140 4f 44 4f 28 73 68 65 73 73 29 20 55 70 67 72 61  ODO(shess) Upgra
11150 64 65 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  de the cursor in
11160 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64  itialization and
11170 20 64 65 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   destruction to.
11180 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 66  ** account for f
11190 74 73 33 46 69 6c 74 65 72 4d 65 74 68 6f 64 28  ts3FilterMethod(
111a0 29 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 6d  ) being called m
111b0 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 6f 6e  ultiple times on
111c0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 63 75 72   the.** same cur
111d0 73 6f 72 2e 20 54 68 65 20 63 75 72 72 65 6e 74  sor. The current
111e0 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 76 65 72   solution is ver
111f0 79 20 66 72 61 67 69 6c 65 2e 20 41 70 70 6c 79  y fragile. Apply
11200 20 66 69 78 20 74 6f 0a 2a 2a 20 66 74 73 33 20   fix to.** fts3 
11210 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
11220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
11230 73 33 46 69 6c 74 65 72 4d 65 74 68 6f 64 28 0a  s3FilterMethod(.
11240 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
11250 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
11260 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
11270 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 71 75  used for this qu
11280 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ery */.  int idx
11290 4e 75 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Num,            
112a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 61           /* Stra
112b0 74 65 67 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tegy index */.  
112c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
112d0 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
112e0 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 69  /* Unused */.  i
112f0 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20  nt nVal,        
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11310 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
11320 65 6e 74 73 20 69 6e 20 61 70 56 61 6c 20 2a 2f  ents in apVal */
11330 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
11340 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
11350 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
11360 66 6f 72 20 74 68 65 20 69 6e 64 65 78 69 6e 67  for the indexing
11370 20 73 63 68 65 6d 65 20 2a 2f 0a 29 7b 0a 20 20   scheme */.){.  
11380 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 71  const char *azSq
11390 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 53 45 4c  l[] = {.    "SEL
113a0 45 43 54 20 2a 20 46 52 4f 4d 20 25 51 2e 27 25  ECT * FROM %Q.'%
113b0 71 5f 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45  q_content' WHERE
113c0 20 64 6f 63 69 64 20 3d 20 3f 22 2c 20 2f 2a 20   docid = ?", /* 
113d0 6e 6f 6e 2d 66 75 6c 6c 2d 74 61 62 6c 65 2d 73  non-full-table-s
113e0 63 61 6e 20 2a 2f 0a 20 20 20 20 22 53 45 4c 45  can */.    "SELE
113f0 43 54 20 2a 20 46 52 4f 4d 20 25 51 2e 27 25 71  CT * FROM %Q.'%q
11400 5f 63 6f 6e 74 65 6e 74 27 22 2c 20 20 20 20 20  _content'",     
11410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
11420 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 2a  ull-table-scan *
11430 2f 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63 3b  /.  };.  int rc;
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
11460 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
11470 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11490 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 75 73  SQL statement us
114a0 65 64 20 74 6f 20 61 63 63 65 73 73 20 25 5f 63  ed to access %_c
114b0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33  ontent */.  Fts3
114c0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
114d0 54 61 62 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d  Table *)pCursor-
114e0 3e 70 56 74 61 62 3b 0a 20 20 46 74 73 33 43 75  >pVtab;.  Fts3Cu
114f0 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
11500 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73  s3Cursor *)pCurs
11510 6f 72 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  or;..  UNUSED_PA
11520 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29 3b  RAMETER(idxStr);
11530 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11540 54 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61 73  TER(nVal);..  as
11550 73 65 72 74 28 20 69 64 78 4e 75 6d 3e 3d 30 20  sert( idxNum>=0 
11560 26 26 20 69 64 78 4e 75 6d 3c 3d 28 46 54 53 33  && idxNum<=(FTS3
11570 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48  _FULLTEXT_SEARCH
11580 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 3b 0a  +p->nColumn) );.
11590 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d    assert( nVal==
115a0 30 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  0 || nVal==1 );.
115b0 20 20 61 73 73 65 72 74 28 20 28 6e 56 61 6c 3d    assert( (nVal=
115c0 3d 30 29 3d 3d 28 69 64 78 4e 75 6d 3d 3d 46 54  =0)==(idxNum==FT
115d0 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45 41 52  S3_FULLSCAN_SEAR
115e0 43 48 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  CH) );..  /* In 
115f0 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  case the cursor 
11600 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 65  has been used be
11610 66 6f 72 65 2c 20 63 6c 65 61 72 20 69 74 20 6e  fore, clear it n
11620 6f 77 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ow. */.  sqlite3
11630 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e  _finalize(pCsr->
11640 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65  pStmt);.  sqlite
11650 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 44 6f  3_free(pCsr->aDo
11660 63 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  clist);.  sqlite
11670 33 46 74 73 33 45 78 70 72 46 72 65 65 28 70 43  3Fts3ExprFree(pC
11680 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 6d 65  sr->pExpr);.  me
11690 6d 73 65 74 28 26 70 43 75 72 73 6f 72 5b 31 5d  mset(&pCursor[1]
116a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
116b0 43 75 72 73 6f 72 29 2d 73 69 7a 65 6f 66 28 73  Cursor)-sizeof(s
116c0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
116d0 6f 72 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  or));..  /* Comp
116e0 69 6c 65 20 61 20 53 45 4c 45 43 54 20 73 74 61  ile a SELECT sta
116f0 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20  tement for this 
11700 63 75 72 73 6f 72 2e 20 46 6f 72 20 61 20 66 75  cursor. For a fu
11710 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 2c 20 74  ll-table-scan, t
11720 68 65 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  he.  ** statemen
11730 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
11740 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
11750 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
11760 20 46 6f 72 20 61 0a 20 20 2a 2a 20 66 75 6c 6c   For a.  ** full
11770 2d 74 65 78 74 20 71 75 65 72 79 20 6f 72 20 64  -text query or d
11780 6f 63 69 64 20 6c 6f 6f 6b 75 70 2c 20 74 68 65  ocid lookup, the
11790 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 72 69   statement retri
117a0 65 76 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20  eves a single.  
117b0 2a 2a 20 72 6f 77 20 62 79 20 64 6f 63 69 64 2e  ** row by docid.
117c0 0a 20 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20 73  .  */.  zSql = s
117d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
117e0 7a 53 71 6c 5b 69 64 78 4e 75 6d 3d 3d 46 54 53  zSql[idxNum==FTS
117f0 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43  3_FULLSCAN_SEARC
11800 48 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  H], p->zDb, p->z
11810 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 53  Name);.  if( !zS
11820 71 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ql ){.    rc = S
11830 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11840 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
11850 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
11860 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
11870 31 2c 20 26 70 43 73 72 2d 3e 70 53 74 6d 74 2c  1, &pCsr->pStmt,
11880 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11890 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
118a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
118b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
118c0 3b 0a 20 20 70 43 73 72 2d 3e 65 53 65 61 72 63  ;.  pCsr->eSearc
118d0 68 20 3d 20 28 69 31 36 29 69 64 78 4e 75 6d 3b  h = (i16)idxNum;
118e0 0a 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d  ..  if( idxNum==
118f0 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43  FTS3_DOCID_SEARC
11900 48 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  H ){.    rc = sq
11910 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
11920 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c  (pCsr->pStmt, 1,
11930 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7d 65   apVal[0]);.  }e
11940 6c 73 65 20 69 66 28 20 69 64 78 4e 75 6d 21 3d  lse if( idxNum!=
11950 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45  FTS3_FULLSCAN_SE
11960 41 52 43 48 20 29 7b 0a 20 20 20 20 69 6e 74 20  ARCH ){.    int 
11970 69 43 6f 6c 20 3d 20 69 64 78 4e 75 6d 2d 46 54  iCol = idxNum-FT
11980 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52  S3_FULLTEXT_SEAR
11990 43 48 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  CH;.    const ch
119a0 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 28 63 6f  ar *zQuery = (co
119b0 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
119c0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
119d0 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 20 20 69 66  Val[0]);..    if
119e0 28 20 7a 51 75 65 72 79 3d 3d 30 20 26 26 20 73  ( zQuery==0 && s
119f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
11a00 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53 51 4c  e(apVal[0])!=SQL
11a10 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
11a20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
11a40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
11a50 73 33 45 78 70 72 50 61 72 73 65 28 70 2d 3e 70  s3ExprParse(p->p
11a60 54 6f 6b 65 6e 69 7a 65 72 2c 20 70 2d 3e 61 7a  Tokenizer, p->az
11a70 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 6e 43 6f 6c 75  Column, p->nColu
11a80 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 69 43 6f  mn, .        iCo
11a90 6c 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  l, zQuery, -1, &
11aa0 70 43 73 72 2d 3e 70 45 78 70 72 0a 20 20 20 20  pCsr->pExpr.    
11ab0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11ac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11ad0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11ae0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
11af0 20 20 70 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73    p->base.zErrMs
11b00 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
11b10 6e 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20 4d  ntf("malformed M
11b20 41 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 3a  ATCH expression:
11b30 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20   [%s]",.        
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b60 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20    zQuery);.     
11b70 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
11b80 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rc;.    }..    r
11b90 63 20 3d 20 65 76 61 6c 46 74 73 33 45 78 70 72  c = evalFts3Expr
11ba0 28 70 2c 20 70 43 73 72 2d 3e 70 45 78 70 72 2c  (p, pCsr->pExpr,
11bb0 20 26 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74   &pCsr->aDoclist
11bc0 2c 20 26 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73  , &pCsr->nDoclis
11bd0 74 2c 20 30 29 3b 0a 20 20 20 20 70 43 73 72 2d  t, 0);.    pCsr-
11be0 3e 70 4e 65 78 74 49 64 20 3d 20 70 43 73 72 2d  >pNextId = pCsr-
11bf0 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 70  >aDoclist;.    p
11c00 43 73 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 30  Csr->iPrevId = 0
11c10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
11c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
11c30 75 72 6e 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  urn rc;.  return
11c40 20 66 74 73 33 4e 65 78 74 4d 65 74 68 6f 64 28   fts3NextMethod(
11c50 70 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 20  pCursor);.}../* 
11c60 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
11c70 78 45 6f 66 20 6d 65 74 68 6f 64 20 6f 66 20 74  xEof method of t
11c80 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
11c90 2e 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  . SQLite calls t
11ca0 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  his .** routine 
11cb0 74 6f 20 66 69 6e 64 20 6f 75 74 20 69 66 20 69  to find out if i
11cc0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 74 68  t has reached th
11cd0 65 20 65 6e 64 20 6f 66 20 61 20 72 65 73 75 6c  e end of a resul
11ce0 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
11cf0 20 69 6e 74 20 66 74 73 33 45 6f 66 4d 65 74 68   int fts3EofMeth
11d00 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  od(sqlite3_vtab_
11d10 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29  cursor *pCursor)
11d20 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 46 74 73  {.  return ((Fts
11d30 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f  3Cursor *)pCurso
11d40 72 29 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a 2f 2a  r)->isEof;.}../*
11d50 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65   .** This is the
11d60 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 20   xRowid method. 
11d70 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  The SQLite core 
11d80 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
11d90 6e 65 20 74 6f 0a 2a 2a 20 72 65 74 72 69 65 76  ne to.** retriev
11da0 65 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  e the rowid for 
11db0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
11dc0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
11dd0 74 2e 20 66 74 73 33 0a 2a 2a 20 65 78 70 6f 73  t. fts3.** expos
11de0 65 73 20 25 5f 63 6f 6e 74 65 6e 74 2e 64 6f 63  es %_content.doc
11df0 69 64 20 61 73 20 74 68 65 20 72 6f 77 69 64 20  id as the rowid 
11e00 66 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20  for the virtual 
11e10 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 6f  table. The.** ro
11e20 77 69 64 20 73 68 6f 75 6c 64 20 62 65 20 77 72  wid should be wr
11e30 69 74 74 65 6e 20 74 6f 20 2a 70 52 6f 77 69 64  itten to *pRowid
11e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11e50 66 74 73 33 52 6f 77 69 64 4d 65 74 68 6f 64 28  fts3RowidMethod(
11e60 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
11e70 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 73 71  sor *pCursor, sq
11e80 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
11e90 69 64 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f  id){.  Fts3Curso
11ea0 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33 43  r *pCsr = (Fts3C
11eb0 75 72 73 6f 72 20 2a 29 20 70 43 75 72 73 6f 72  ursor *) pCursor
11ec0 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 44  ;.  if( pCsr->aD
11ed0 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70  oclist ){.    *p
11ee0 52 6f 77 69 64 20 3d 20 70 43 73 72 2d 3e 69 50  Rowid = pCsr->iP
11ef0 72 65 76 49 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  revId;.  }else{.
11f00 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 73 71      *pRowid = sq
11f10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
11f20 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  64(pCsr->pStmt, 
11f30 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
11f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11f50 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  * .** This is th
11f60 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  e xColumn method
11f70 2c 20 63 61 6c 6c 65 64 20 62 79 20 53 51 4c 69  , called by SQLi
11f80 74 65 20 74 6f 20 72 65 71 75 65 73 74 20 61 20  te to request a 
11f90 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68  value from.** th
11fa0 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 73  e row that the s
11fb0 75 70 70 6c 69 65 64 20 63 75 72 73 6f 72 20 63  upplied cursor c
11fc0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
11fd0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
11fe0 74 20 66 74 73 33 43 6f 6c 75 6d 6e 4d 65 74 68  t fts3ColumnMeth
11ff0 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
12000 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
12010 6f 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  or,   /* Cursor 
12020 74 6f 20 72 65 74 72 69 65 76 65 20 76 61 6c 75  to retrieve valu
12030 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69  e from */.  sqli
12040 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 6f  te3_context *pCo
12050 6e 74 65 78 74 2c 20 20 20 20 20 20 2f 2a 20 43  ntext,      /* C
12060 6f 6e 74 65 78 74 20 66 6f 72 20 73 71 6c 69 74  ontext for sqlit
12070 65 33 5f 72 65 73 75 6c 74 5f 78 78 78 28 29 20  e3_result_xxx() 
12080 63 61 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69  calls */.  int i
12090 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
120a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
120b0 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f  dex of column to
120c0 20 72 65 61 64 20 76 61 6c 75 65 20 66 72 6f 6d   read value from
120d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
12100 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn Code */.  Fts
12110 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  3Cursor *pCsr = 
12120 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29 20 70  (Fts3Cursor *) p
12130 43 75 72 73 6f 72 3b 0a 20 20 46 74 73 33 54 61  Cursor;.  Fts3Ta
12140 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
12150 62 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70  ble *)pCursor->p
12160 56 74 61 62 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  Vtab;..  /* The 
12170 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 73 75 70  column value sup
12180 70 6c 69 65 64 20 62 79 20 53 51 4c 69 74 65 20  plied by SQLite 
12190 6d 75 73 74 20 62 65 20 69 6e 20 72 61 6e 67 65  must be in range
121a0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
121b0 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 3d  Col>=0 && iCol<=
121c0 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a  p->nColumn+1 );.
121d0 0a 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 2d 3e  .  if( iCol==p->
121e0 6e 43 6f 6c 75 6d 6e 2b 31 20 29 7b 0a 20 20 20  nColumn+1 ){.   
121f0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
12200 20 61 20 72 65 71 75 65 73 74 20 66 6f 72 20 74   a request for t
12210 68 65 20 22 64 6f 63 69 64 22 20 63 6f 6c 75 6d  he "docid" colum
12220 6e 2e 20 53 69 6e 63 65 20 22 64 6f 63 69 64 22  n. Since "docid"
12230 20 69 73 20 61 6e 20 0a 20 20 20 20 2a 2a 20 61   is an .    ** a
12240 6c 69 61 73 20 66 6f 72 20 22 72 6f 77 69 64 22  lias for "rowid"
12250 2c 20 75 73 65 20 74 68 65 20 78 52 6f 77 69 64  , use the xRowid
12260 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 6f 62 74  () method to obt
12270 61 69 6e 20 74 68 65 20 76 61 6c 75 65 2e 0a 20  ain the value.. 
12280 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
12290 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 0a  3_int64 iRowid;.
122a0 20 20 20 20 72 63 20 3d 20 66 74 73 33 52 6f 77      rc = fts3Row
122b0 69 64 4d 65 74 68 6f 64 28 70 43 75 72 73 6f 72  idMethod(pCursor
122c0 2c 20 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  , &iRowid);.    
122d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
122e0 6e 74 36 34 28 70 43 6f 6e 74 65 78 74 2c 20 69  nt64(pContext, i
122f0 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20  Rowid);.  }else 
12300 69 66 28 20 69 43 6f 6c 3d 3d 70 2d 3e 6e 43 6f  if( iCol==p->nCo
12310 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54  lumn ){.    /* T
12320 68 65 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 20  he extra column 
12330 77 68 6f 73 65 20 6e 61 6d 65 20 69 73 20 74 68  whose name is th
12340 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 74 61  e same as the ta
12350 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75  ble..    ** Retu
12360 72 6e 20 61 20 62 6c 6f 62 20 77 68 69 63 68 20  rn a blob which 
12370 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
12380 74 68 65 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  the cursor..    
12390 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  */.    sqlite3_r
123a0 65 73 75 6c 74 5f 62 6c 6f 62 28 70 43 6f 6e 74  esult_blob(pCont
123b0 65 78 74 2c 20 26 70 43 73 72 2c 20 73 69 7a 65  ext, &pCsr, size
123c0 6f 66 28 70 43 73 72 29 2c 20 53 51 4c 49 54 45  of(pCsr), SQLITE
123d0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
123e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
123f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
12400 20 3d 20 66 74 73 33 43 75 72 73 6f 72 53 65 65   = fts3CursorSee
12410 6b 28 30 2c 20 70 43 73 72 29 3b 0a 20 20 20 20  k(0, pCsr);.    
12420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12430 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
12440 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
12450 70 43 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  pContext, sqlite
12460 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
12470 43 73 72 2d 3e 70 53 74 6d 74 2c 20 69 43 6f 6c  Csr->pStmt, iCol
12480 2b 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  +1));.    }.  }.
12490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
124a0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
124b0 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
124c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
124d0 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 62 61  e xUpdate callba
124e0 63 6b 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 46  ck used by .** F
124f0 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS3 virtual tabl
12500 65 73 2e 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  es. It is invoke
12510 64 20 62 79 20 53 51 4c 69 74 65 20 65 61 63 68  d by SQLite each
12520 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 74   time a row is t
12530 6f 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  o be.** inserted
12540 2c 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c  , updated or del
12550 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
12560 69 6e 74 20 66 74 73 33 55 70 64 61 74 65 4d 65  int fts3UpdateMe
12570 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
12580 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20  vtab *pVtab,    
12590 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
125a0 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
125b0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
125e0 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
125f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
12600 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20  e **apVal,      
12610 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
12620 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73  arguments */.  s
12630 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
12640 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 2f  wid            /
12650 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66 65 63  * OUT: The affec
12660 74 65 64 20 28 6f 72 20 65 66 66 65 63 74 65 64  ted (or effected
12670 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  ) rowid */.){.  
12680 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
12690 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28 70  s3UpdateMethod(p
126a0 56 74 61 62 2c 20 6e 41 72 67 2c 20 61 70 56 61  Vtab, nArg, apVa
126b0 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f  l, pRowid);.}../
126c0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
126d0 69 6f 6e 20 6f 66 20 78 53 79 6e 63 28 29 20 6d  ion of xSync() m
126e0 65 74 68 6f 64 2e 20 46 6c 75 73 68 20 74 68 65  ethod. Flush the
126f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12700 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 0a 2a   pending-terms.*
12710 2a 20 68 61 73 68 2d 74 61 62 6c 65 20 74 6f 20  * hash-table to 
12720 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
12730 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
12740 53 79 6e 63 4d 65 74 68 6f 64 28 73 71 6c 69 74  SyncMethod(sqlit
12750 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
12760 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
12770 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
12780 73 46 6c 75 73 68 28 28 46 74 73 33 54 61 62 6c  sFlush((Fts3Tabl
12790 65 20 2a 29 70 56 74 61 62 29 3b 0a 7d 0a 0a 2f  e *)pVtab);.}../
127a0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
127b0 69 6f 6e 20 6f 66 20 78 42 65 67 69 6e 28 29 20  ion of xBegin() 
127c0 6d 65 74 68 6f 64 2e 20 54 68 69 73 20 69 73 20  method. This is 
127d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
127e0 69 63 20 69 6e 74 20 66 74 73 33 42 65 67 69 6e  ic int fts3Begin
127f0 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
12800 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 55  tab *pVtab){.  U
12810 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12820 70 56 74 61 62 29 3b 0a 20 20 61 73 73 65 72 74  pVtab);.  assert
12830 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ( ((Fts3Table *)
12840 70 56 74 61 62 29 2d 3e 6e 50 65 6e 64 69 6e 67  pVtab)->nPending
12850 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Data==0 );.  ret
12860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12870 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
12880 74 61 74 69 6f 6e 20 6f 66 20 78 43 6f 6d 6d 69  tation of xCommi
12890 74 28 29 20 6d 65 74 68 6f 64 2e 20 54 68 69 73  t() method. This
128a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
128b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20   contents of.** 
128c0 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
128d0 73 20 68 61 73 68 2d 74 61 62 6c 65 20 68 61 76  s hash-table hav
128e0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  e already been f
128f0 6c 75 73 68 65 64 20 69 6e 74 6f 20 74 68 65 20  lushed into the 
12900 64 61 74 61 62 61 73 65 0a 2a 2a 20 62 79 20 66  database.** by f
12910 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 28 29 2e  ts3SyncMethod().
12920 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12930 74 73 33 43 6f 6d 6d 69 74 4d 65 74 68 6f 64 28  ts3CommitMethod(
12940 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
12950 74 61 62 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  tab){.  UNUSED_P
12960 41 52 41 4d 45 54 45 52 28 70 56 74 61 62 29 3b  ARAMETER(pVtab);
12970 0a 20 20 61 73 73 65 72 74 28 20 28 28 46 74 73  .  assert( ((Fts
12980 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 29 2d  3Table *)pVtab)-
12990 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30  >nPendingData==0
129a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
129b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
129c0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
129d0 6f 66 20 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  of xRollback(). 
129e0 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  Discard the cont
129f0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64  ents of the pend
12a00 69 6e 67 2d 74 65 72 6d 73 0a 2a 2a 20 68 61 73  ing-terms.** has
12a10 68 2d 74 61 62 6c 65 2e 20 41 6e 79 20 63 68 61  h-table. Any cha
12a20 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
12a30 20 64 61 74 61 62 61 73 65 20 61 72 65 20 72 65   database are re
12a40 76 65 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  verted by SQLite
12a50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12a60 66 74 73 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68  fts3RollbackMeth
12a70 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
12a80 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74  *pVtab){.  sqlit
12a90 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72  e3Fts3PendingTer
12aa0 6d 73 43 6c 65 61 72 28 28 46 74 73 33 54 61 62  msClear((Fts3Tab
12ab0 6c 65 20 2a 29 70 56 74 61 62 29 3b 0a 20 20 72  le *)pVtab);.  r
12ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  .}../*.** Load t
12ae0 68 65 20 64 6f 63 6c 69 73 74 20 61 73 73 6f 63  he doclist assoc
12af0 69 61 74 65 64 20 77 69 74 68 20 65 78 70 72 65  iated with expre
12b00 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f 20 70  ssion pExpr to p
12b10 45 78 70 72 2d 3e 61 44 6f 63 6c 69 73 74 2e 0a  Expr->aDoclist..
12b20 2a 2a 20 54 68 65 20 6c 6f 61 64 65 64 20 64 6f  ** The loaded do
12b30 63 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 70  clist contains p
12b40 6f 73 69 74 69 6f 6e 73 20 61 73 20 77 65 6c 6c  ositions as well
12b50 20 61 73 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   as the document
12b60 20 69 64 73 2e 0a 2a 2a 20 54 68 69 73 20 69 73   ids..** This is
12b70 20 75 73 65 64 20 62 79 20 74 68 65 20 6d 61 74   used by the mat
12b80 63 68 69 6e 66 6f 28 29 2c 20 73 6e 69 70 70 65  chinfo(), snippe
12b90 74 28 29 20 61 6e 64 20 6f 66 66 73 65 74 73 28  t() and offsets(
12ba0 29 20 61 75 78 69 6c 6c 61 72 79 0a 2a 2a 20 66  ) auxillary.** f
12bb0 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  unctions..*/.int
12bc0 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
12bd0 4c 6f 61 64 44 6f 63 6c 69 73 74 28 46 74 73 33  LoadDoclist(Fts3
12be0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 46 74 73  Table *pTab, Fts
12bf0 33 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  3Expr *pExpr){. 
12c00 20 72 65 74 75 72 6e 20 65 76 61 6c 46 74 73 33   return evalFts3
12c10 45 78 70 72 28 70 54 61 62 2c 20 70 45 78 70 72  Expr(pTab, pExpr
12c20 2c 20 26 70 45 78 70 72 2d 3e 61 44 6f 63 6c 69  , &pExpr->aDocli
12c30 73 74 2c 20 26 70 45 78 70 72 2d 3e 6e 44 6f 63  st, &pExpr->nDoc
12c40 6c 69 73 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  list, 1);.}../*.
12c50 2a 2a 20 41 66 74 65 72 20 45 78 70 72 4c 6f 61  ** After ExprLoa
12c60 64 44 6f 63 6c 69 73 74 28 29 20 28 73 65 65 20  dDoclist() (see 
12c70 61 62 6f 76 65 29 20 68 61 73 20 62 65 65 6e 20  above) has been 
12c80 63 61 6c 6c 65 64 2c 20 74 68 69 73 20 66 75 6e  called, this fun
12c90 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75 73 65 64  ction is.** used
12ca0 20 74 6f 20 69 74 65 72 61 74 65 2f 73 65 61 72   to iterate/sear
12cb0 63 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  ch through the p
12cc0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 74 68  osition lists th
12cd0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64  at make up the d
12ce0 6f 63 6c 69 73 74 0a 2a 2a 20 73 74 6f 72 65 64  oclist.** stored
12cf0 20 69 6e 20 70 45 78 70 72 2d 3e 61 44 6f 63 6c   in pExpr->aDocl
12d00 69 73 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ist..*/.char *sq
12d10 6c 69 74 65 33 46 74 73 33 46 69 6e 64 50 6f 73  lite3Fts3FindPos
12d20 69 74 69 6f 6e 73 28 0a 20 20 46 74 73 33 45 78  itions(.  Fts3Ex
12d30 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
12d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
12d50 65 73 73 20 74 68 69 73 20 65 78 70 72 65 73 73  ess this express
12d60 69 6f 6e 73 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  ions doclist */.
12d70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12d80 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20  iDocid,         
12d90 20 20 2f 2a 20 44 6f 63 69 64 20 61 73 73 6f 63    /* Docid assoc
12da0 69 61 74 65 64 20 77 69 74 68 20 72 65 71 75 65  iated with reque
12db0 73 74 65 64 20 70 6f 73 2d 6c 69 73 74 20 2a 2f  sted pos-list */
12dc0 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20     /* Column of 
12df0 72 65 71 75 65 73 74 65 64 20 70 6f 73 2d 6c 69  requested pos-li
12e00 73 74 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  st */.){.  asser
12e10 74 28 20 70 45 78 70 72 2d 3e 69 73 4c 6f 61 64  t( pExpr->isLoad
12e20 65 64 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  ed );.  if( pExp
12e30 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 7b 0a 20  r->aDoclist ){. 
12e40 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20     char *pEnd = 
12e50 26 70 45 78 70 72 2d 3e 61 44 6f 63 6c 69 73 74  &pExpr->aDoclist
12e60 5b 70 45 78 70 72 2d 3e 6e 44 6f 63 6c 69 73 74  [pExpr->nDoclist
12e70 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 43 73  ];.    char *pCs
12e80 72 20 3d 20 70 45 78 70 72 2d 3e 70 43 75 72 72  r = pExpr->pCurr
12e90 65 6e 74 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ent;..    assert
12ea0 28 20 70 43 73 72 20 29 3b 0a 20 20 20 20 77 68  ( pCsr );.    wh
12eb0 69 6c 65 28 20 70 43 73 72 3c 70 45 6e 64 20 29  ile( pCsr<pEnd )
12ec0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
12ed0 72 2d 3e 69 43 75 72 72 65 6e 74 3c 69 44 6f 63  r->iCurrent<iDoc
12ee0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  id ){.        ft
12ef0 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c  s3PoslistCopy(0,
12f00 20 26 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20   &pCsr);.       
12f10 20 69 66 28 20 70 43 73 72 3c 70 45 6e 64 20 29   if( pCsr<pEnd )
12f20 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
12f30 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26  GetDeltaVarint(&
12f40 70 43 73 72 2c 20 26 70 45 78 70 72 2d 3e 69 43  pCsr, &pExpr->iC
12f50 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  urrent);.       
12f60 20 7d 0a 20 20 20 20 20 20 20 20 70 45 78 70 72   }.        pExpr
12f70 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 70 43 73  ->pCurrent = pCs
12f80 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
12f90 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
12fa0 72 2d 3e 69 43 75 72 72 65 6e 74 3d 3d 69 44 6f  r->iCurrent==iDo
12fb0 63 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cid ){.         
12fc0 20 69 6e 74 20 69 54 68 69 73 20 3d 20 30 3b 0a   int iThis = 0;.
12fd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
12fe0 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
12ff0 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
13000 73 20 6e 65 67 61 74 69 76 65 2c 20 72 65 74 75  s negative, retu
13010 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
13020 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
13030 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
13040 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 28 69  position-list (i
13050 6e 73 74 65 61 64 20 6f 66 20 61 20 70 6f 69 6e  nstead of a poin
13060 74 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ter to the start
13070 20 6f 66 20 61 20 6c 69 73 74 0a 20 20 20 20 20   of a list.     
13080 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 66 66         ** of off
13090 73 65 74 73 20 61 73 73 6f 63 69 61 74 65 64 20  sets associated 
130a0 77 69 74 68 20 61 20 73 70 65 63 69 66 69 63 20  with a specific 
130b0 63 6f 6c 75 6d 6e 29 2e 0a 20 20 20 20 20 20 20  column)..       
130c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
130d0 20 20 20 20 72 65 74 75 72 6e 20 70 43 73 72 3b      return pCsr;
130e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
130f0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 54         while( iT
13100 68 69 73 3c 69 43 6f 6c 20 29 7b 0a 20 20 20 20  his<iCol ){.    
13110 20 20 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75          fts3Colu
13120 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  mnlistCopy(0, &p
13130 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Csr);.          
13140 20 20 69 66 28 20 2a 70 43 73 72 3d 3d 30 78 30    if( *pCsr==0x0
13150 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13160 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2b 2b            pCsr++
13170 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
13180 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  sr += sqlite3Fts
13190 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 73  3GetVarint32(pCs
131a0 72 2c 20 26 69 54 68 69 73 29 3b 0a 20 20 20 20  r, &iThis);.    
131b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
131c0 20 20 69 66 28 20 69 43 6f 6c 3d 3d 69 54 68 69    if( iCol==iThi
131d0 73 20 26 26 20 28 2a 70 43 73 72 26 30 78 46 45  s && (*pCsr&0xFE
131e0 29 20 29 20 72 65 74 75 72 6e 20 70 43 73 72 3b  ) ) return pCsr;
131f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13200 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
13210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13220 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
13230 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
13240 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
13250 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13260 6f 66 20 74 68 65 20 6f 76 65 72 6c 6f 61 64 65  of the overloade
13270 64 20 73 6e 69 70 70 65 74 28 29 2c 0a 2a 2a 20  d snippet(),.** 
13280 6f 66 66 73 65 74 73 28 29 20 61 6e 64 20 6f 70  offsets() and op
13290 74 69 6d 69 7a 65 28 29 20 53 51 4c 20 66 75 6e  timize() SQL fun
132a0 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctions..**.** If
132b0 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
132c0 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  d as the third a
132d0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 62 6c 6f  rgument is a blo
132e0 62 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 73 69 7a  b of size.** siz
132f0 65 6f 66 28 46 74 73 33 43 75 72 73 6f 72 2a 29  eof(Fts3Cursor*)
13300 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 62 20  , then the blob 
13310 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 63 6f 70  contents are cop
13320 69 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6f  ied to the .** o
13330 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
13340 70 70 43 73 72 20 61 6e 64 20 53 51 4c 49 54 45  ppCsr and SQLITE
13350 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
13360 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
13370 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
13380 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 63 6f  is written to co
13390 6e 74 65 78 74 20 70 43 6f 6e 74 65 78 74 20 61  ntext pContext a
133a0 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
133b0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 0a 2a 2a  returned. The.**
133c0 20 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 76   string passed v
133d0 69 61 20 7a 46 75 6e 63 20 69 73 20 75 73 65 64  ia zFunc is used
133e0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
133f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
13400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
13410 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 0a 20 20  3FunctionArg(.  
13420 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
13430 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
13440 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  /* SQL function 
13450 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
13460 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
13470 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
13480 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 6e 61    /* Function na
13490 6d 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  me */.  sqlite3_
134a0 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20  value *pVal,    
134b0 20 20 20 20 20 20 20 20 2f 2a 20 61 72 67 76 5b          /* argv[
134c0 30 5d 20 70 61 73 73 65 64 20 74 6f 20 66 75 6e  0] passed to fun
134d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 43  ction */.  Fts3C
134e0 75 72 73 6f 72 20 2a 2a 70 70 43 73 72 20 20 20  ursor **ppCsr   
134f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74        /* OUT: St
13500 6f 72 65 20 63 75 72 73 6f 72 20 68 61 6e 64 6c  ore cursor handl
13510 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 46  e here */.){.  F
13520 74 73 33 43 75 72 73 6f 72 20 2a 70 52 65 74 3b  ts3Cursor *pRet;
13530 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
13540 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 21  alue_type(pVal)!
13550 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 0a 20 20  =SQLITE_BLOB .  
13560 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   || sqlite3_valu
13570 65 5f 62 79 74 65 73 28 70 56 61 6c 29 21 3d 73  e_bytes(pVal)!=s
13580 69 7a 65 6f 66 28 46 74 73 33 43 75 72 73 6f 72  izeof(Fts3Cursor
13590 20 2a 29 0a 20 20 29 7b 0a 20 20 20 20 63 68 61   *).  ){.    cha
135a0 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  r *zErr = sqlite
135b0 33 5f 6d 70 72 69 6e 74 66 28 22 69 6c 6c 65 67  3_mprintf("illeg
135c0 61 6c 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  al first argumen
135d0 74 20 74 6f 20 25 73 22 2c 20 7a 46 75 6e 63 29  t to %s", zFunc)
135e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
135f0 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 6f 6e 74  sult_error(pCont
13600 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a  ext, zErr, -1);.
13610 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13620 28 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 74 75  (zErr);.    retu
13630 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13640 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
13650 52 65 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ret, sqlite3_val
13660 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 2c 20 73  ue_blob(pVal), s
13670 69 7a 65 6f 66 28 46 74 73 33 43 75 72 73 6f 72  izeof(Fts3Cursor
13680 20 2a 29 29 3b 0a 20 20 2a 70 70 43 73 72 20 3d   *));.  *ppCsr =
13690 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20   pRet;.  return 
136a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
136b0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
136c0 6f 6e 20 6f 66 20 74 68 65 20 73 6e 69 70 70 65  on of the snippe
136d0 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  t() function for
136e0 20 46 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63 20   FTS3.*/.static 
136f0 76 6f 69 64 20 66 74 73 33 53 6e 69 70 70 65 74  void fts3Snippet
13700 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
13710 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
13720 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74  t,      /* SQLit
13730 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
13740 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
13750 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   nVal,          
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13770 53 69 7a 65 20 6f 66 20 61 70 56 61 6c 5b 5d 20  Size of apVal[] 
13780 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74  array */.  sqlit
13790 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
137a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
137b0 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
137c0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43 75 72   */.){.  Fts3Cur
137d0 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20  sor *pCsr;      
137e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
137f0 6f 72 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  or handle passed
13800 20 74 68 72 6f 75 67 68 20 61 70 56 61 6c 5b 30   through apVal[0
13810 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ] */.  const cha
13820 72 20 2a 7a 53 74 61 72 74 20 3d 20 22 3c 62 3e  r *zStart = "<b>
13830 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
13840 2a 7a 45 6e 64 20 3d 20 22 3c 2f 62 3e 22 3b 0a  *zEnd = "</b>";.
13850 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
13860 6c 6c 69 70 73 69 73 20 3d 20 22 3c 62 3e 2e 2e  llipsis = "<b>..
13870 2e 3c 2f 62 3e 22 3b 0a 20 20 69 6e 74 20 69 43  .</b>";.  int iC
13880 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e  ol = -1;.  int n
13890 54 6f 6b 65 6e 20 3d 20 31 35 3b 20 20 20 20 20  Token = 15;     
138a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
138b0 66 61 75 6c 74 20 6e 75 6d 62 65 72 20 6f 66 20  fault number of 
138c0 74 6f 6b 65 6e 73 20 69 6e 20 73 6e 69 70 70 65  tokens in snippe
138d0 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 72 65  t */..  /* There
138e0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
138f0 74 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 70  t one argument p
13900 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
13910 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69 73  nction (otherwis
13920 65 0a 20 20 2a 2a 20 74 68 65 20 6e 6f 6e 2d 6f  e.  ** the non-o
13930 76 65 72 6c 6f 61 64 65 64 20 76 65 72 73 69 6f  verloaded versio
13940 6e 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  n would have bee
13950 6e 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  n called instead
13960 20 6f 66 20 74 68 69 73 20 6f 6e 65 29 2e 0a 20   of this one).. 
13970 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 56   */.  assert( nV
13980 61 6c 3e 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  al>=1 );..  if( 
13990 6e 56 61 6c 3e 36 20 29 7b 0a 20 20 20 20 73 71  nVal>6 ){.    sq
139a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
139b0 6f 72 28 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20  or(pContext, .  
139c0 20 20 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d        "wrong num
139d0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
139e0 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 73 6e 69   to function sni
139f0 70 70 65 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20  ppet()", -1);.  
13a00 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
13a10 69 66 28 20 66 74 73 33 46 75 6e 63 74 69 6f 6e  if( fts3Function
13a20 41 72 67 28 70 43 6f 6e 74 65 78 74 2c 20 22 73  Arg(pContext, "s
13a30 6e 69 70 70 65 74 22 2c 20 61 70 56 61 6c 5b 30  nippet", apVal[0
13a40 5d 2c 20 26 70 43 73 72 29 20 29 20 72 65 74 75  ], &pCsr) ) retu
13a50 72 6e 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 6e  rn;..  switch( n
13a60 56 61 6c 20 29 7b 0a 20 20 20 20 63 61 73 65 20  Val ){.    case 
13a70 36 3a 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69  6: nToken = sqli
13a80 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
13a90 56 61 6c 5b 35 5d 29 3b 0a 20 20 20 20 63 61 73  Val[5]);.    cas
13aa0 65 20 35 3a 20 69 43 6f 6c 20 3d 20 73 71 6c 69  e 5: iCol = sqli
13ab0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
13ac0 56 61 6c 5b 34 5d 29 3b 0a 20 20 20 20 63 61 73  Val[4]);.    cas
13ad0 65 20 34 3a 20 7a 45 6c 6c 69 70 73 69 73 20 3d  e 4: zEllipsis =
13ae0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
13af0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
13b00 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 20 20 20 20  (apVal[3]);.    
13b10 63 61 73 65 20 33 3a 20 7a 45 6e 64 20 3d 20 28  case 3: zEnd = (
13b20 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
13b30 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
13b40 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 63 61  pVal[2]);.    ca
13b50 73 65 20 32 3a 20 7a 53 74 61 72 74 20 3d 20 28  se 2: zStart = (
13b60 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
13b70 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
13b80 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20  pVal[1]);.  }.  
13b90 69 66 28 20 21 7a 45 6c 6c 69 70 73 69 73 20 7c  if( !zEllipsis |
13ba0 7c 20 21 7a 45 6e 64 20 7c 7c 20 21 7a 53 74 61  | !zEnd || !zSta
13bb0 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
13bc0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
13bd0 6f 6d 65 6d 28 70 43 6f 6e 74 65 78 74 29 3b 0a  omem(pContext);.
13be0 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
13bf0 54 45 5f 4f 4b 3d 3d 66 74 73 33 43 75 72 73 6f  TE_OK==fts3Curso
13c00 72 53 65 65 6b 28 70 43 6f 6e 74 65 78 74 2c 20  rSeek(pContext, 
13c10 70 43 73 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  pCsr) ){.    sql
13c20 69 74 65 33 46 74 73 33 53 6e 69 70 70 65 74 28  ite3Fts3Snippet(
13c30 70 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20  pContext, pCsr, 
13c40 7a 53 74 61 72 74 2c 20 7a 45 6e 64 2c 20 7a 45  zStart, zEnd, zE
13c50 6c 6c 69 70 73 69 73 2c 20 69 43 6f 6c 2c 20 6e  llipsis, iCol, n
13c60 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Token);.  }.}../
13c70 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
13c80 69 6f 6e 20 6f 66 20 74 68 65 20 6f 66 66 73 65  ion of the offse
13c90 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ts() function fo
13ca0 72 20 46 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63  r FTS3.*/.static
13cb0 20 76 6f 69 64 20 66 74 73 33 4f 66 66 73 65 74   void fts3Offset
13cc0 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  sFunc(.  sqlite3
13cd0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65  _context *pConte
13ce0 78 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69  xt,      /* SQLi
13cf0 74 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  te function call
13d00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
13d10 74 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20  t nVal,         
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d30 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e   Size of argumen
13d40 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c  t array */.  sql
13d50 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
13d60 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
13d70 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
13d80 74 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43  ts */.){.  Fts3C
13d90 75 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20  ursor *pCsr;    
13da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
13db0 72 73 6f 72 20 68 61 6e 64 6c 65 20 70 61 73 73  rsor handle pass
13dc0 65 64 20 74 68 72 6f 75 67 68 20 61 70 56 61 6c  ed through apVal
13dd0 5b 30 5d 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44  [0] */..  UNUSED
13de0 5f 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29  _PARAMETER(nVal)
13df0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61  ;..  assert( nVa
13e00 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 66 74  l==1 );.  if( ft
13e10 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70 43  s3FunctionArg(pC
13e20 6f 6e 74 65 78 74 2c 20 22 6f 66 66 73 65 74 73  ontext, "offsets
13e30 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26 70 43  ", apVal[0], &pC
13e40 73 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  sr) ) return;.  
13e50 61 73 73 65 72 74 28 20 70 43 73 72 20 29 3b 0a  assert( pCsr );.
13e60 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
13e70 3d 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28  =fts3CursorSeek(
13e80 70 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 29 20  pContext, pCsr) 
13e90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
13ea0 73 33 4f 66 66 73 65 74 73 28 70 43 6f 6e 74 65  s3Offsets(pConte
13eb0 78 74 2c 20 70 43 73 72 29 3b 0a 20 20 7d 0a 7d  xt, pCsr);.  }.}
13ec0 0a 0a 2f 2a 20 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ../* .** Impleme
13ed0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
13ee0 70 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a 65 28  pecial optimize(
13ef0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46  ) function for F
13f00 54 53 33 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  TS3. This .** fu
13f10 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 61 6c  nction merges al
13f20 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
13f30 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
13f40 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 0a  single segment..
13f50 2a 2a 20 45 78 61 6d 70 6c 65 20 75 73 61 67 65  ** Example usage
13f60 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   is:.**.**   SEL
13f70 45 43 54 20 6f 70 74 69 6d 69 7a 65 28 74 29 20  ECT optimize(t) 
13f80 46 52 4f 4d 20 74 20 4c 49 4d 49 54 20 31 3b 0a  FROM t LIMIT 1;.
13f90 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 27 74 27 20  **.** where 't' 
13fa0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
13fb0 6e 20 46 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2f  n FTS3 table..*/
13fc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
13fd0 33 4f 70 74 69 6d 69 7a 65 46 75 6e 63 28 0a 20  3OptimizeFunc(. 
13fe0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
13ff0 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20   *pContext,     
14000 20 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74   /* SQLite funct
14010 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74  ion call context
14020 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20   */.  int nVal, 
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14050 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
14060 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
14070 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
14080 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
14090 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
140a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
140d0 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65  e */.  Fts3Table
140e0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
140f0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
14100 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
14110 2f 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  /.  Fts3Cursor *
14120 70 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  pCursor;        
14130 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61      /* Cursor ha
14140 6e 64 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f  ndle passed thro
14150 75 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a  ugh apVal[0] */.
14160 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
14170 54 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61 73  TER(nVal);..  as
14180 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b  sert( nVal==1 );
14190 0a 20 20 69 66 28 20 66 74 73 33 46 75 6e 63 74  .  if( fts3Funct
141a0 69 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74 2c  ionArg(pContext,
141b0 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 61 70 56   "optimize", apV
141c0 61 6c 5b 30 5d 2c 20 26 70 43 75 72 73 6f 72 29  al[0], &pCursor)
141d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d   ) return;.  p =
141e0 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
141f0 75 72 73 6f 72 2d 3e 62 61 73 65 2e 70 56 74 61  ursor->base.pVta
14200 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  b;.  assert( p )
14210 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
14220 33 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 70 29  3Fts3Optimize(p)
14230 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ;..  switch( rc 
14240 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
14250 54 45 5f 4f 4b 3a 0a 20 20 20 20 20 20 73 71 6c  TE_OK:.      sql
14260 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
14270 28 70 43 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65  (pContext, "Inde
14280 78 20 6f 70 74 69 6d 69 7a 65 64 22 2c 20 2d 31  x optimized", -1
14290 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
142a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
142b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
142c0 4f 4e 45 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ONE:.      sqlit
142d0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
142e0 43 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78 20  Context, "Index 
142f0 61 6c 72 65 61 64 79 20 6f 70 74 69 6d 61 6c 22  already optimal"
14300 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
14310 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
14320 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
14330 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
14340 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
14350 70 43 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20  pContext, rc);. 
14360 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
14370 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
14380 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
14390 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74  atchinfo() funct
143a0 69 6f 6e 20 66 6f 72 20 46 54 53 33 0a 2a 2f 0a  ion for FTS3.*/.
143b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
143c0 4d 61 74 63 68 69 6e 66 6f 46 75 6e 63 28 0a 20  MatchinfoFunc(. 
143d0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
143e0 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20   *pContext,     
143f0 20 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74   /* SQLite funct
14400 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74  ion call context
14410 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20   */.  int nVal, 
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14440 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
14450 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
14460 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
14470 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
14480 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
14490 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
144a0 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
144b0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e     /* Cursor han
144c0 64 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  dle passed throu
144d0 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 0a  gh apVal[0] */..
144e0 20 20 69 66 28 20 6e 56 61 6c 21 3d 31 20 29 7b    if( nVal!=1 ){
144f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
14500 75 6c 74 5f 65 72 72 6f 72 28 70 43 6f 6e 74 65  ult_error(pConte
14510 78 74 2c 0a 20 20 20 20 20 20 20 20 22 77 72 6f  xt,.        "wro
14520 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
14530 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
14540 6f 6e 20 6d 61 74 63 68 69 6e 66 6f 28 29 22 2c  on matchinfo()",
14550 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
14560 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 53 51 4c  ;.  }..  if( SQL
14570 49 54 45 5f 4f 4b 3d 3d 66 74 73 33 46 75 6e 63  ITE_OK==fts3Func
14580 74 69 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74  tionArg(pContext
14590 2c 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 61  , "matchinfo", a
145a0 70 56 61 6c 5b 30 5d 2c 20 26 70 43 73 72 29 20  pVal[0], &pCsr) 
145b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
145c0 73 33 4d 61 74 63 68 69 6e 66 6f 28 70 43 6f 6e  s3Matchinfo(pCon
145d0 74 65 78 74 2c 20 70 43 73 72 29 3b 0a 20 20 7d  text, pCsr);.  }
145e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
145f0 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
14600 73 20 74 68 65 20 78 46 69 6e 64 46 75 6e 63 74  s the xFindFunct
14610 69 6f 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  ion method for t
14620 68 65 20 46 54 53 33 0a 2a 2a 20 76 69 72 74 75  he FTS3.** virtu
14630 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
14640 74 69 63 20 69 6e 74 20 66 74 73 33 46 69 6e 64  tic int fts3Find
14650 46 75 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 28 0a  FunctionMethod(.
14660 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
14670 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20  pVtab,          
14680 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
14690 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
146a0 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 51 4c 20  * Number of SQL 
146d0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
146e0 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
146f0 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
14700 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
14710 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  of SQL function 
14720 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 2a 70 78 46  */.  void (**pxF
14730 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
14740 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
14750 33 5f 76 61 6c 75 65 2a 2a 29 2c 20 2f 2a 20 4f  3_value**), /* O
14760 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 20 20  UT: Result */.  
14770 76 6f 69 64 20 2a 2a 70 70 41 72 67 20 20 20 20  void **ppArg    
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a  /* Unused */.){.
147a0 20 20 73 74 72 75 63 74 20 4f 76 65 72 6c 6f 61    struct Overloa
147b0 64 65 64 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ded {.    const 
147c0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
147d0 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
147e0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
147f0 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
14800 65 2a 2a 29 3b 0a 20 20 7d 20 61 4f 76 65 72 6c  e**);.  } aOverl
14810 6f 61 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  oad[] = {.    { 
14820 22 73 6e 69 70 70 65 74 22 2c 20 66 74 73 33 53  "snippet", fts3S
14830 6e 69 70 70 65 74 46 75 6e 63 20 7d 2c 0a 20 20  nippetFunc },.  
14840 20 20 7b 20 22 6f 66 66 73 65 74 73 22 2c 20 66    { "offsets", f
14850 74 73 33 4f 66 66 73 65 74 73 46 75 6e 63 20 7d  ts3OffsetsFunc }
14860 2c 0a 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a  ,.    { "optimiz
14870 65 22 2c 20 66 74 73 33 4f 70 74 69 6d 69 7a 65  e", fts3Optimize
14880 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6d  Func },.    { "m
14890 61 74 63 68 69 6e 66 6f 22 2c 20 66 74 73 33 4d  atchinfo", fts3M
148a0 61 74 63 68 69 6e 66 6f 46 75 6e 63 20 7d 2c 0a  atchinfoFunc },.
148b0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20    };.  int i;   
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
148e0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
148f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
14900 45 52 28 70 56 74 61 62 29 3b 0a 20 20 55 4e 55  ER(pVtab);.  UNU
14910 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
14920 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg);.  UNUSED_PA
14930 52 41 4d 45 54 45 52 28 70 70 41 72 67 29 3b 0a  RAMETER(ppArg);.
14940 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 69  .  for(i=0; i<Si
14950 7a 65 6f 66 41 72 72 61 79 28 61 4f 76 65 72 6c  zeofArray(aOverl
14960 6f 61 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oad); i++){.    
14970 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
14980 2c 20 61 4f 76 65 72 6c 6f 61 64 5b 69 5d 2e 7a  , aOverload[i].z
14990 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
149a0 20 20 2a 70 78 46 75 6e 63 20 3d 20 61 4f 76 65    *pxFunc = aOve
149b0 72 6c 6f 61 64 5b 69 5d 2e 78 46 75 6e 63 3b 0a  rload[i].xFunc;.
149c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
149d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
149e0 4e 6f 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  No function of t
149f0 68 65 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d  he specified nam
14a00 65 20 77 61 73 20 66 6f 75 6e 64 2e 20 52 65 74  e was found. Ret
14a10 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75  urn 0. */.  retu
14a20 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
14a30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
14a40 20 46 54 53 33 20 78 52 65 6e 61 6d 65 20 6d 65   FTS3 xRename me
14a50 74 68 6f 64 2e 20 52 65 6e 61 6d 65 20 61 6e 20  thod. Rename an 
14a60 66 74 73 33 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  fts3 table..*/.s
14a70 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 52 65  tatic int fts3Re
14a80 6e 61 6d 65 4d 65 74 68 6f 64 28 0a 20 20 73 71  nameMethod(.  sq
14a90 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
14aa0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
14ab0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
14ac0 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
14ad0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
14ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
14af0 77 20 6e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  w name of table 
14b00 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  */.){.  Fts3Tabl
14b10 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
14b20 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c  e *)pVtab;.  sql
14b30 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14b50 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
14b60 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
14b90 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 0a 20 20 64  rn Code */. .  d
14ba0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
14bb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
14bc0 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64  ts3DbExec(&rc, d
14bd0 62 2c 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  b,.    "ALTER TA
14be0 42 4c 45 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  BLE %Q.'%q_conte
14bf0 6e 74 27 20 20 52 45 4e 41 4d 45 20 54 4f 20 27  nt'  RENAME TO '
14c00 25 71 5f 63 6f 6e 74 65 6e 74 27 3b 22 2c 0a 20  %q_content';",. 
14c10 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e     p->zDb, p->zN
14c20 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 29 3b 0a  ame, zName.  );.
14c30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14c40 5f 45 52 52 4f 52 20 29 20 72 63 20 3d 20 53 51  _ERROR ) rc = SQ
14c50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
14c60 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
14c70 0a 20 20 20 20 66 74 73 33 44 62 45 78 65 63 28  .    fts3DbExec(
14c80 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 22  &rc, db,.      "
14c90 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27  ALTER TABLE %Q.'
14ca0 25 71 5f 64 6f 63 73 69 7a 65 27 20 20 52 45 4e  %q_docsize'  REN
14cb0 41 4d 45 20 54 4f 20 27 25 71 5f 64 6f 63 73 69  AME TO '%q_docsi
14cc0 7a 65 27 3b 22 2c 0a 20 20 20 20 20 20 70 2d 3e  ze';",.      p->
14cd0 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  zDb, p->zName, z
14ce0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
14cf0 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20  fts3DbExec(&rc, 
14d00 64 62 2c 0a 20 20 20 20 20 20 22 41 4c 54 45 52  db,.      "ALTER
14d10 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73 74   TABLE %Q.'%q_st
14d20 61 74 27 20 20 52 45 4e 41 4d 45 20 54 4f 20 27  at'  RENAME TO '
14d30 25 71 5f 73 74 61 74 27 3b 22 2c 0a 20 20 20 20  %q_stat';",.    
14d40 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
14d50 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  me, zName.    );
14d60 0a 20 20 7d 0a 20 20 66 74 73 33 44 62 45 78 65  .  }.  fts3DbExe
14d70 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 22  c(&rc, db,.    "
14d80 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27  ALTER TABLE %Q.'
14d90 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 52 45 4e  %q_segments' REN
14da0 41 4d 45 20 54 4f 20 27 25 71 5f 73 65 67 6d 65  AME TO '%q_segme
14db0 6e 74 73 27 3b 22 2c 0a 20 20 20 20 70 2d 3e 7a  nts';",.    p->z
14dc0 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Db, p->zName, zN
14dd0 61 6d 65 0a 20 20 29 3b 0a 20 20 66 74 73 33 44  ame.  );.  fts3D
14de0 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20  bExec(&rc, db,. 
14df0 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20     "ALTER TABLE 
14e00 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 20  %Q.'%q_segdir'  
14e10 20 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 73   RENAME TO '%q_s
14e20 65 67 64 69 72 27 3b 22 2c 0a 20 20 20 20 70 2d  egdir';",.    p-
14e30 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  >zDb, p->zName, 
14e40 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 72 65 74  zName.  );.  ret
14e50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
14e60 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
14e70 6d 6f 64 75 6c 65 20 66 74 73 33 4d 6f 64 75 6c  module fts3Modul
14e80 65 20 3d 20 7b 0a 20 20 2f 2a 20 69 56 65 72 73  e = {.  /* iVers
14e90 69 6f 6e 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  ion      */ 0,. 
14ea0 20 2f 2a 20 78 43 72 65 61 74 65 20 20 20 20 20   /* xCreate     
14eb0 20 20 2a 2f 20 66 74 73 33 43 72 65 61 74 65 4d    */ fts3CreateM
14ec0 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 43 6f 6e  ethod,.  /* xCon
14ed0 6e 65 63 74 20 20 20 20 20 20 2a 2f 20 66 74 73  nect      */ fts
14ee0 33 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 0a  3ConnectMethod,.
14ef0 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20    /* xBestIndex 
14f00 20 20 20 2a 2f 20 66 74 73 33 42 65 73 74 49 6e     */ fts3BestIn
14f10 64 65 78 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  dexMethod,.  /* 
14f20 78 44 69 73 63 6f 6e 6e 65 63 74 20 20 20 2a 2f  xDisconnect   */
14f30 20 66 74 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d   fts3DisconnectM
14f40 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 44 65 73  ethod,.  /* xDes
14f50 74 72 6f 79 20 20 20 20 20 20 2a 2f 20 66 74 73  troy      */ fts
14f60 33 44 65 73 74 72 6f 79 4d 65 74 68 6f 64 2c 0a  3DestroyMethod,.
14f70 20 20 2f 2a 20 78 4f 70 65 6e 20 20 20 20 20 20    /* xOpen      
14f80 20 20 20 2a 2f 20 66 74 73 33 4f 70 65 6e 4d 65     */ fts3OpenMe
14f90 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 43 6c 6f 73  thod,.  /* xClos
14fa0 65 20 20 20 20 20 20 20 20 2a 2f 20 66 75 6c 6c  e        */ full
14fb0 74 65 78 74 43 6c 6f 73 65 2c 0a 20 20 2f 2a 20  textClose,.  /* 
14fc0 78 46 69 6c 74 65 72 20 20 20 20 20 20 20 2a 2f  xFilter       */
14fd0 20 66 74 73 33 46 69 6c 74 65 72 4d 65 74 68 6f   fts3FilterMetho
14fe0 64 2c 0a 20 20 2f 2a 20 78 4e 65 78 74 20 20 20  d,.  /* xNext   
14ff0 20 20 20 20 20 20 2a 2f 20 66 74 73 33 4e 65 78        */ fts3Nex
15000 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 45  tMethod,.  /* xE
15010 6f 66 20 20 20 20 20 20 20 20 20 20 2a 2f 20 66  of          */ f
15020 74 73 33 45 6f 66 4d 65 74 68 6f 64 2c 0a 20 20  ts3EofMethod,.  
15030 2f 2a 20 78 43 6f 6c 75 6d 6e 20 20 20 20 20 20  /* xColumn      
15040 20 2a 2f 20 66 74 73 33 43 6f 6c 75 6d 6e 4d 65   */ fts3ColumnMe
15050 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52 6f 77 69  thod,.  /* xRowi
15060 64 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33  d        */ fts3
15070 52 6f 77 69 64 4d 65 74 68 6f 64 2c 0a 20 20 2f  RowidMethod,.  /
15080 2a 20 78 55 70 64 61 74 65 20 20 20 20 20 20 20  * xUpdate       
15090 2a 2f 20 66 74 73 33 55 70 64 61 74 65 4d 65 74  */ fts3UpdateMet
150a0 68 6f 64 2c 0a 20 20 2f 2a 20 78 42 65 67 69 6e  hod,.  /* xBegin
150b0 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 42          */ fts3B
150c0 65 67 69 6e 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a  eginMethod,.  /*
150d0 20 78 53 79 6e 63 20 20 20 20 20 20 20 20 20 2a   xSync         *
150e0 2f 20 66 74 73 33 53 79 6e 63 4d 65 74 68 6f 64  / fts3SyncMethod
150f0 2c 0a 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 20  ,.  /* xCommit  
15100 20 20 20 20 20 2a 2f 20 66 74 73 33 43 6f 6d 6d       */ fts3Comm
15110 69 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  itMethod,.  /* x
15120 52 6f 6c 6c 62 61 63 6b 20 20 20 20 20 2a 2f 20  Rollback     */ 
15130 66 74 73 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68  fts3RollbackMeth
15140 6f 64 2c 0a 20 20 2f 2a 20 78 46 69 6e 64 46 75  od,.  /* xFindFu
15150 6e 63 74 69 6f 6e 20 2a 2f 20 66 74 73 33 46 69  nction */ fts3Fi
15160 6e 64 46 75 6e 63 74 69 6f 6e 4d 65 74 68 6f 64  ndFunctionMethod
15170 2c 0a 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a  ,.  /* xRename *
15180 2f 20 20 20 20 20 20 20 66 74 73 33 52 65 6e 61  /       fts3Rena
15190 6d 65 4d 65 74 68 6f 64 2c 0a 7d 3b 0a 0a 2f 2a  meMethod,.};../*
151a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
151b0 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
151c0 61 73 20 74 68 65 20 6d 6f 64 75 6c 65 20 64 65  as the module de
151d0 73 74 72 75 63 74 6f 72 20 28 63 61 6c 6c 65 64  structor (called
151e0 20 77 68 65 6e 20 61 6e 0a 2a 2a 20 46 54 53 33   when an.** FTS3
151f0 20 65 6e 61 62 6c 65 64 20 64 61 74 61 62 61 73   enabled databas
15200 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
15210 63 6c 6f 73 65 64 29 2e 20 49 74 20 66 72 65 65  closed). It free
15220 73 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  s the memory.** 
15230 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
15240 65 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61 73 68  e tokenizer hash
15250 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
15260 63 20 76 6f 69 64 20 68 61 73 68 44 65 73 74 72  c void hashDestr
15270 6f 79 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 46  oy(void *p){.  F
15280 74 73 33 48 61 73 68 20 2a 70 48 61 73 68 20 3d  ts3Hash *pHash =
15290 20 28 46 74 73 33 48 61 73 68 20 2a 29 70 3b 0a   (Fts3Hash *)p;.
152a0 20 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73    sqlite3Fts3Has
152b0 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20  hClear(pHash);. 
152c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
152d0 61 73 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ash);.}../*.** T
152e0 68 65 20 66 74 73 33 20 62 75 69 6c 74 2d 69 6e  he fts3 built-in
152f0 20 74 6f 6b 65 6e 69 7a 65 72 73 20 2d 20 22 73   tokenizers - "s
15300 69 6d 70 6c 65 22 20 61 6e 64 20 22 70 6f 72 74  imple" and "port
15310 65 72 22 20 2d 20 61 72 65 20 69 6d 70 6c 65 6d  er" - are implem
15320 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 66 69 6c 65  ented.** in file
15330 73 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  s fts3_tokenizer
15340 31 2e 63 20 61 6e 64 20 66 74 73 33 5f 70 6f 72  1.c and fts3_por
15350 74 65 72 2e 63 20 72 65 73 70 65 63 74 69 76 65  ter.c respective
15360 6c 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ly. The followin
15370 67 0a 2a 2a 20 74 77 6f 20 66 6f 72 77 61 72 64  g.** two forward
15380 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 72   declarations ar
15390 65 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 73 20  e for functions 
153a0 64 65 63 6c 61 72 65 64 20 69 6e 20 74 68 65 73  declared in thes
153b0 65 20 66 69 6c 65 73 0a 2a 2a 20 75 73 65 64 20  e files.** used 
153c0 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
153d0 72 65 73 70 65 63 74 69 76 65 20 69 6d 70 6c 65  respective imple
153e0 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  mentations..**.*
153f0 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  * Calling sqlite
15400 33 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b 65 6e  3Fts3SimpleToken
15410 69 7a 65 72 4d 6f 64 75 6c 65 28 29 20 73 65 74  izerModule() set
15420 73 20 74 68 65 20 76 61 6c 75 65 20 70 6f 69 6e  s the value poin
15430 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 74 68 65  ted.** to by the
15440 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 6f 69   argument to poi
15450 6e 74 20 61 20 74 68 65 20 22 73 69 6d 70 6c 65  nt a the "simple
15460 22 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c  " tokenizer impl
15470 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 20 46  ementation..** F
15480 75 6e 63 74 69 6f 6e 20 2e 2e 2e 50 6f 72 74 65  unction ...Porte
15490 72 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65  rTokenizerModule
154a0 28 29 20 73 65 74 73 20 2a 70 4d 6f 64 75 6c 65  () sets *pModule
154b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
154c0 0a 2a 2a 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e  .** porter token
154d0 69 7a 65 72 2f 73 74 65 6d 6d 65 72 20 69 6d 70  izer/stemmer imp
154e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
154f0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
15500 53 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d  SimpleTokenizerM
15510 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74 6f  odule(sqlite3_to
15520 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63  kenizer_module c
15530 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b  onst**ppModule);
15540 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
15550 33 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72  3PorterTokenizer
15560 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74  Module(sqlite3_t
15570 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
15580 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29  const**ppModule)
15590 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
155a0 73 33 49 63 75 54 6f 6b 65 6e 69 7a 65 72 4d 6f  s3IcuTokenizerMo
155b0 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74 6f 6b  dule(sqlite3_tok
155c0 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f  enizer_module co
155d0 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b 0a  nst**ppModule);.
155e0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 73  ./*.** Initialis
155f0 65 20 74 68 65 20 66 74 73 33 20 65 78 74 65 6e  e the fts3 exten
15600 73 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 65 78  sion. If this ex
15610 74 65 6e 73 69 6f 6e 20 69 73 20 62 75 69 6c 74  tension is built
15620 20 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74   as part.** of t
15630 68 65 20 73 71 6c 69 74 65 20 6c 69 62 72 61 72  he sqlite librar
15640 79 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  y, then this fun
15650 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15660 64 69 72 65 63 74 6c 79 20 62 79 0a 2a 2a 20 53  directly by.** S
15670 51 4c 69 74 65 2e 20 49 66 20 66 74 73 33 20 69  QLite. If fts3 i
15680 73 20 62 75 69 6c 74 20 61 73 20 61 20 64 79 6e  s built as a dyn
15690 61 6d 69 63 61 6c 6c 79 20 6c 6f 61 64 61 62 6c  amically loadabl
156a0 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 69  e extension, thi
156b0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
156c0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 73   called by the s
156d0 71 6c 69 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e  qlite3_extension
156e0 5f 69 6e 69 74 28 29 20 65 6e 74 72 79 20 70 6f  _init() entry po
156f0 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  int..*/.int sqli
15700 74 65 33 46 74 73 33 49 6e 69 74 28 73 71 6c 69  te3Fts3Init(sqli
15710 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
15720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15730 20 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73    Fts3Hash *pHas
15740 68 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73  h = 0;.  const s
15750 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
15760 5f 6d 6f 64 75 6c 65 20 2a 70 53 69 6d 70 6c 65  _module *pSimple
15770 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71   = 0;.  const sq
15780 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
15790 6d 6f 64 75 6c 65 20 2a 70 50 6f 72 74 65 72 20  module *pPorter 
157a0 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
157b0 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20  ITE_ENABLE_ICU. 
157c0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74   const sqlite3_t
157d0 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
157e0 2a 70 49 63 75 20 3d 20 30 3b 0a 20 20 73 71 6c  *pIcu = 0;.  sql
157f0 69 74 65 33 46 74 73 33 49 63 75 54 6f 6b 65 6e  ite3Fts3IcuToken
15800 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70 49 63 75  izerModule(&pIcu
15810 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
15820 69 74 65 33 46 74 73 33 53 69 6d 70 6c 65 54 6f  ite3Fts3SimpleTo
15830 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70  kenizerModule(&p
15840 53 69 6d 70 6c 65 29 3b 0a 20 20 73 71 6c 69 74  Simple);.  sqlit
15850 65 33 46 74 73 33 50 6f 72 74 65 72 54 6f 6b 65  e3Fts3PorterToke
15860 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70 50 6f  nizerModule(&pPo
15870 72 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  rter);..  /* All
15880 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
15890 6c 69 73 65 20 74 68 65 20 68 61 73 68 2d 74 61  lise the hash-ta
158a0 62 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ble used to stor
158b0 65 20 74 6f 6b 65 6e 69 7a 65 72 73 2e 20 2a 2f  e tokenizers. */
158c0 0a 20 20 70 48 61 73 68 20 3d 20 73 71 6c 69 74  .  pHash = sqlit
158d0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
158e0 28 46 74 73 33 48 61 73 68 29 29 3b 0a 20 20 69  (Fts3Hash));.  i
158f0 66 28 20 21 70 48 61 73 68 20 29 7b 0a 20 20 20  f( !pHash ){.   
15900 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
15910 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
15920 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73 68   sqlite3Fts3Hash
15930 49 6e 69 74 28 70 48 61 73 68 2c 20 46 54 53 33  Init(pHash, FTS3
15940 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 31 29  _HASH_STRING, 1)
15950 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64  ;.  }..  /* Load
15960 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 74 6f   the built-in to
15970 6b 65 6e 69 7a 65 72 73 20 69 6e 74 6f 20 74 68  kenizers into th
15980 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
15990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
159a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
159b0 71 6c 69 74 65 33 46 74 73 33 48 61 73 68 49 6e  qlite3Fts3HashIn
159c0 73 65 72 74 28 70 48 61 73 68 2c 20 22 73 69 6d  sert(pHash, "sim
159d0 70 6c 65 22 2c 20 37 2c 20 28 76 6f 69 64 20 2a  ple", 7, (void *
159e0 29 70 53 69 6d 70 6c 65 29 0a 20 20 20 20 20 7c  )pSimple).     |
159f0 7c 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73  | sqlite3Fts3Has
15a00 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 22  hInsert(pHash, "
15a10 70 6f 72 74 65 72 22 2c 20 37 2c 20 28 76 6f 69  porter", 7, (voi
15a20 64 20 2a 29 70 50 6f 72 74 65 72 29 20 0a 23 69  d *)pPorter) .#i
15a30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15a40 4c 45 5f 49 43 55 0a 20 20 20 20 20 7c 7c 20 28  LE_ICU.     || (
15a50 70 49 63 75 20 26 26 20 73 71 6c 69 74 65 33 46  pIcu && sqlite3F
15a60 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  ts3HashInsert(pH
15a70 61 73 68 2c 20 22 69 63 75 22 2c 20 34 2c 20 28  ash, "icu", 4, (
15a80 76 6f 69 64 20 2a 29 70 49 63 75 29 29 0a 23 65  void *)pIcu)).#e
15a90 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
15aa0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15ab0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
15ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
15ad0 53 54 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ST.  if( rc==SQL
15ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
15af0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 45 78   = sqlite3Fts3Ex
15b00 70 72 49 6e 69 74 54 65 73 74 49 6e 74 65 72 66  prInitTestInterf
15b10 61 63 65 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  ace(db);.  }.#en
15b20 64 69 66 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  dif..  /* Create
15b30 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
15b40 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  le wrapper aroun
15b50 64 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  d the hash-table
15b60 20 61 6e 64 20 6f 76 65 72 6c 6f 61 64 20 0a 20   and overload . 
15b70 20 2a 2a 20 74 68 65 20 74 77 6f 20 73 63 61 6c   ** the two scal
15b80 61 72 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 66  ar functions. If
15b90 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
15ba0 66 75 6c 2c 20 72 65 67 69 73 74 65 72 20 74 68  ful, register th
15bb0 65 0a 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 77 69  e.  ** module wi
15bc0 74 68 20 73 71 6c 69 74 65 2e 0a 20 20 2a 2f 0a  th sqlite..  */.
15bd0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
15be0 3d 72 63 20 0a 20 20 20 26 26 20 53 51 4c 49 54  =rc .   && SQLIT
15bf0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
15c00 74 65 33 46 74 73 33 49 6e 69 74 48 61 73 68 54  te3Fts3InitHashT
15c10 61 62 6c 65 28 64 62 2c 20 70 48 61 73 68 2c 20  able(db, pHash, 
15c20 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22  "fts3_tokenizer"
15c30 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f  )).   && SQLITE_
15c40 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
15c50 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
15c60 69 6f 6e 28 64 62 2c 20 22 73 6e 69 70 70 65 74  ion(db, "snippet
15c70 22 2c 20 2d 31 29 29 0a 20 20 20 26 26 20 53 51  ", -1)).   && SQ
15c80 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
15c90 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
15ca0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6f 66  function(db, "of
15cb0 66 73 65 74 73 22 2c 20 31 29 29 0a 20 20 20 26  fsets", 1)).   &
15cc0 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
15cd0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c   = sqlite3_overl
15ce0 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  oad_function(db,
15cf0 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 2d 31   "matchinfo", -1
15d00 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f  )).   && SQLITE_
15d10 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
15d20 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
15d30 69 6f 6e 28 64 62 2c 20 22 6f 70 74 69 6d 69 7a  ion(db, "optimiz
15d40 65 22 2c 20 31 29 29 0a 20 20 29 7b 0a 20 20 20  e", 1)).  ){.   
15d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
15d60 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 0a  eate_module_v2(.
15d70 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73          db, "fts
15d80 33 22 2c 20 26 66 74 73 33 4d 6f 64 75 6c 65 2c  3", &fts3Module,
15d90 20 28 76 6f 69 64 20 2a 29 70 48 61 73 68 2c 20   (void *)pHash, 
15da0 68 61 73 68 44 65 73 74 72 6f 79 0a 20 20 20 20  hashDestroy.    
15db0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15dd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
15de0 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28  reate_module_v2(
15df0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 22  .          db, "
15e00 66 74 73 34 22 2c 20 26 66 74 73 33 4d 6f 64 75  fts4", &fts3Modu
15e10 6c 65 2c 20 28 76 6f 69 64 20 2a 29 70 48 61 73  le, (void *)pHas
15e20 68 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  h, 0.      );.  
15e30 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
15e40 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20  c;.  }..  /* An 
15e50 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
15e60 65 64 2e 20 44 65 6c 65 74 65 20 74 68 65 20 68  ed. Delete the h
15e70 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72 65  ash table and re
15e80 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
15e90 6f 64 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ode. */.  assert
15ea0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15eb0 29 3b 0a 20 20 69 66 28 20 70 48 61 73 68 20 29  );.  if( pHash )
15ec0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
15ed0 33 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68  3HashClear(pHash
15ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15ef0 72 65 65 28 70 48 61 73 68 29 3b 0a 20 20 7d 0a  ree(pHash);.  }.
15f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15f10 23 69 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45  #if !SQLITE_CORE
15f20 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
15f30 65 6e 73 69 6f 6e 5f 69 6e 69 74 28 0a 20 20 73  ension_init(.  s
15f40 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
15f50 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a  har **pzErrMsg,.
15f60 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
15f70 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41  api_routines *pA
15f80 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45 5f 45  pi.){.  SQLITE_E
15f90 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70  XTENSION_INIT2(p
15fa0 41 70 69 29 0a 20 20 72 65 74 75 72 6e 20 73 71  Api).  return sq
15fb0 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62  lite3Fts3Init(db
15fc0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e  );.}.#endif..#en
15fd0 64 69 66 0a                                      dif.