/ Hex Artifact Content
Login

Artifact 3d12dad6cbe788ff7214ef227520fb6600ff5112:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4f 63 74 20 32  /*.** 2009 Oct 2
0010: 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  3.**.** 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 66 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66   file is part of
0190: 20 74 68 65 20 53 51 4c 69 74 65 20 46 54 53 33   the SQLite FTS3
01a0: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c   extension modul
01b0: 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  e. Specifically,
01c0: 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 20 63 6f  .** this file co
01d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69  ntains code to i
01e0: 6e 73 65 72 74 2c 20 75 70 64 61 74 65 20 61 6e  nsert, update an
01f0: 64 20 64 65 6c 65 74 65 20 72 6f 77 73 20 66 72  d delete rows fr
0200: 6f 6d 20 46 54 53 33 0a 2a 2a 20 74 61 62 6c 65  om FTS3.** table
0210: 73 2e 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  s. It also conta
0220: 69 6e 73 20 63 6f 64 65 20 74 6f 20 6d 65 72 67  ins code to merg
0230: 65 20 46 54 53 33 20 62 2d 74 72 65 65 20 73 65  e FTS3 b-tree se
0240: 67 6d 65 6e 74 73 2e 20 53 6f 6d 65 0a 2a 2a 20  gments. Some.** 
0250: 6f 66 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  of the sub-routi
0260: 6e 65 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67  nes used to merg
0270: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 61  e segments are a
0280: 6c 73 6f 20 75 73 65 64 20 62 79 20 74 68 65 20  lso used by the 
0290: 71 75 65 72 79 20 0a 2a 2a 20 63 6f 64 65 20 69  query .** code i
02a0: 6e 20 66 74 73 33 2e 63 2e 0a 2a 2f 0a 0a 23 69  n fts3.c..*/..#i
02b0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
02c0: 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e  E_CORE) || defin
02d0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
02e0: 5f 46 54 53 33 29 0a 0a 23 69 6e 63 6c 75 64 65  _FTS3)..#include
02f0: 20 22 66 74 73 33 49 6e 74 2e 68 22 0a 23 69 6e   "fts3Int.h".#in
0300: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0320: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
0330: 74 64 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  tdlib.h>../*.** 
0340: 57 68 65 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69  When full-text i
0350: 6e 64 65 78 20 6e 6f 64 65 73 20 61 72 65 20 6c  ndex nodes are l
0360: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2c  oaded from disk,
0370: 20 74 68 65 20 62 75 66 66 65 72 20 74 68 61 74   the buffer that
0380: 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6c 6f 61   they.** are loa
0390: 64 65 64 20 69 6e 74 6f 20 68 61 73 20 74 68 65  ded into has the
03a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 75 6d 62 65   following numbe
03b0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
03c0: 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  dding at the end
03d0: 20 0a 2a 2a 20 6f 66 20 69 74 2e 20 69 2e 65 2e   .** of it. i.e.
03e0: 20 69 66 20 61 20 66 75 6c 6c 2d 74 65 78 74 20   if a full-text 
03f0: 69 6e 64 65 78 20 6e 6f 64 65 20 69 73 20 39 30  index node is 90
0400: 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
0410: 20 74 68 65 6e 20 61 20 62 75 66 66 65 72 0a 2a   then a buffer.*
0420: 2a 20 6f 66 20 39 32 30 20 62 79 74 65 73 20 69  * of 920 bytes i
0430: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
0440: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  it..**.** This m
0450: 65 61 6e 73 20 74 68 61 74 20 69 66 20 77 65 20  eans that if we 
0460: 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 69  have a pointer i
0470: 6e 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e  nto a buffer con
0480: 74 61 69 6e 69 6e 67 20 6e 6f 64 65 20 64 61 74  taining node dat
0490: 61 2c 0a 2a 2a 20 69 74 20 69 73 20 61 6c 77 61  a,.** it is alwa
04a0: 79 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  ys safe to read 
04b0: 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
04c0: 73 20 66 72 6f 6d 20 69 74 20 77 69 74 68 6f 75  s from it withou
04d0: 74 20 72 69 73 6b 69 6e 67 20 61 6e 0a 2a 2a 20  t risking an.** 
04e0: 6f 76 65 72 72 65 61 64 2c 20 65 76 65 6e 20 69  overread, even i
04f0: 66 20 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20  f the node data 
0500: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 0a 2a 2f  is corrupted..*/
0510: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 4e 4f  .#define FTS3_NO
0520: 44 45 5f 50 41 44 44 49 4e 47 20 28 46 54 53 33  DE_PADDING (FTS3
0530: 5f 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29 0a 0a  _VARINT_MAX*2)..
0540: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
0550: 65 6e 64 69 6e 67 4c 69 73 74 20 50 65 6e 64 69  endingList Pendi
0560: 6e 67 4c 69 73 74 3b 0a 74 79 70 65 64 65 66 20  ngList;.typedef 
0570: 73 74 72 75 63 74 20 53 65 67 6d 65 6e 74 4e 6f  struct SegmentNo
0580: 64 65 20 53 65 67 6d 65 6e 74 4e 6f 64 65 3b 0a  de SegmentNode;.
0590: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
05a0: 65 67 6d 65 6e 74 57 72 69 74 65 72 20 53 65 67  egmentWriter Seg
05b0: 6d 65 6e 74 57 72 69 74 65 72 3b 0a 0a 2f 2a 0a  mentWriter;../*.
05c0: 2a 2a 20 44 61 74 61 20 73 74 72 75 63 74 75 72  ** Data structur
05d0: 65 20 75 73 65 64 20 77 68 69 6c 65 20 61 63 63  e used while acc
05e0: 75 6d 75 6c 61 74 69 6e 67 20 74 65 72 6d 73 20  umulating terms 
05f0: 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  in the pending-t
0600: 65 72 6d 73 20 68 61 73 68 0a 2a 2a 20 74 61 62  erms hash.** tab
0610: 6c 65 2e 20 54 68 65 20 68 61 73 68 20 74 61 62  le. The hash tab
0620: 6c 65 20 65 6e 74 72 79 20 6d 61 70 73 20 66 72  le entry maps fr
0630: 6f 6d 20 74 65 72 6d 20 28 61 20 73 74 72 69 6e  om term (a strin
0640: 67 29 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 27 64  g) to a malloc'd
0650: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  .** instance of 
0660: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
0670: 2a 2f 0a 73 74 72 75 63 74 20 50 65 6e 64 69 6e  */.struct Pendin
0680: 67 4c 69 73 74 20 7b 0a 20 20 69 6e 74 20 6e 44  gList {.  int nD
0690: 61 74 61 3b 0a 20 20 63 68 61 72 20 2a 61 44 61  ata;.  char *aDa
06a0: 74 61 3b 0a 20 20 69 6e 74 20 6e 53 70 61 63 65  ta;.  int nSpace
06b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
06c0: 34 20 69 4c 61 73 74 44 6f 63 69 64 3b 0a 20 20  4 iLastDocid;.  
06d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
06e0: 61 73 74 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65  astCol;.  sqlite
06f0: 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 50 6f 73  3_int64 iLastPos
0700: 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  ;.};.../*.** Eac
0710: 68 20 63 75 72 73 6f 72 20 68 61 73 20 61 20 28  h cursor has a (
0720: 70 6f 73 73 69 62 6c 79 20 65 6d 70 74 79 29 20  possibly empty) 
0730: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74  linked list of t
0740: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a  he following obj
0750: 65 63 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ects..*/.struct 
0760: 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
0770: 6e 20 7b 0a 20 20 46 74 73 33 50 68 72 61 73 65  n {.  Fts3Phrase
0780: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 20 20  Token *pToken;  
0790: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
07a0: 20 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   to correspondin
07b0: 67 20 65 78 70 72 20 74 6f 6b 65 6e 20 2a 2f 0a  g expr token */.
07c0: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65    /* Column toke
07f0: 6e 20 6d 75 73 74 20 6f 63 63 75 72 20 69 6e 20  n must occur in 
0800: 2a 2f 0a 20 20 46 74 73 33 44 65 66 65 72 72 65  */.  Fts3Deferre
0810: 64 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 20 20  dToken *pNext;  
0820: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20       /* Next in 
0830: 6c 69 73 74 20 6f 66 20 64 65 66 65 72 72 65 64  list of deferred
0840: 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 50 65 6e   tokens */.  Pen
0850: 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 3b  dingList *pList;
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0870: 44 6f 63 6c 69 73 74 20 69 73 20 61 73 73 65 6d  Doclist is assem
0880: 62 6c 65 64 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a  bled here */.};.
0890: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
08a0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
08b0: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
08c0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
08d0: 74 68 65 20 74 65 72 6d 73 20 6f 6e 0a 2a 2a 20  the terms on.** 
08e0: 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 74  a contiguous set
08f0: 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d 74 72   of segment b-tr
0900: 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 2e 20 41  ee leaf nodes. A
0910: 6c 74 68 6f 75 67 68 20 74 68 65 20 64 65 74 61  lthough the deta
0920: 69 6c 73 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73  ils of.** this s
0930: 74 72 75 63 74 75 72 65 20 61 72 65 20 6f 6e 6c  tructure are onl
0940: 79 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  y manipulated by
0950: 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
0960: 6c 65 2c 20 6f 70 61 71 75 65 20 68 61 6e 64 6c  le, opaque handl
0970: 65 73 0a 2a 2a 20 6f 66 20 74 79 70 65 20 46 74  es.** of type Ft
0980: 73 33 53 65 67 52 65 61 64 65 72 2a 20 61 72 65  s3SegReader* are
0990: 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 63 6f   also used by co
09a0: 64 65 20 69 6e 20 66 74 73 33 2e 63 20 74 6f 20  de in fts3.c to 
09b0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
09c0: 2a 2a 20 74 65 72 6d 73 20 77 68 65 6e 20 71 75  ** terms when qu
09d0: 65 72 79 69 6e 67 20 74 68 65 20 66 75 6c 6c 2d  erying the full-
09e0: 74 65 78 74 20 69 6e 64 65 78 2e 20 53 65 65 20  text index. See 
09f0: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
0a00: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65     sqlite3Fts3Se
0a10: 67 52 65 61 64 65 72 4e 65 77 28 29 0a 2a 2a 20  gReaderNew().** 
0a20: 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
0a30: 52 65 61 64 65 72 46 72 65 65 28 29 0a 2a 2a 20  ReaderFree().** 
0a40: 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
0a50: 52 65 61 64 65 72 43 6f 73 74 28 29 0a 2a 2a 20  ReaderCost().** 
0a60: 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
0a70: 52 65 61 64 65 72 49 74 65 72 61 74 65 28 29 0a  ReaderIterate().
0a80: 2a 2a 0a 2a 2a 20 4d 65 74 68 6f 64 73 20 75 73  **.** Methods us
0a90: 65 64 20 74 6f 20 6d 61 6e 69 70 75 6c 61 74 65  ed to manipulate
0aa0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 73   Fts3SegReader s
0ab0: 74 72 75 63 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a  tructures:.**.**
0ac0: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
0ad0: 4e 65 78 74 28 29 0a 2a 2a 20 20 20 66 74 73 33  Next().**   fts3
0ae0: 53 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f  SegReaderFirstDo
0af0: 63 69 64 28 29 0a 2a 2a 20 20 20 66 74 73 33 53  cid().**   fts3S
0b00: 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69  egReaderNextDoci
0b10: 64 28 29 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  d().*/.struct Ft
0b20: 73 33 53 65 67 52 65 61 64 65 72 20 7b 0a 20 20  s3SegReader {.  
0b30: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 2f 2a 20 49 6e 64 65 78 20 77 69 74 68 69 6e 20  /* Index within 
0b60: 6c 65 76 65 6c 2c 20 6f 72 20 30 78 37 46 46 46  level, or 0x7FFF
0b70: 46 46 46 46 20 66 6f 72 20 50 54 20 2a 2f 0a 0a  FFFF for PT */..
0b80: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0b90: 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20 20 20 20  iStartBlock;    
0ba0: 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 66 69    /* Rowid of fi
0bb0: 72 73 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 74  rst leaf block t
0bc0: 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20  o traverse */.  
0bd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
0be0: 65 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 20 20 20  eafEndBlock;    
0bf0: 2f 2a 20 52 6f 77 69 64 20 6f 66 20 66 69 6e 61  /* Rowid of fina
0c00: 6c 20 6c 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20  l leaf block to 
0c10: 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 71  traverse */.  sq
0c20: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64  lite3_int64 iEnd
0c30: 42 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a  Block;        /*
0c40: 20 52 6f 77 69 64 20 6f 66 20 66 69 6e 61 6c 20   Rowid of final 
0c50: 62 6c 6f 63 6b 20 69 6e 20 73 65 67 6d 65 6e 74  block in segment
0c60: 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 73 71 6c   (or 0) */.  sql
0c70: 69 74 65 33 5f 69 6e 74 36 34 20 69 43 75 72 72  ite3_int64 iCurr
0c80: 65 6e 74 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20  entBlock;    /* 
0c90: 43 75 72 72 65 6e 74 20 6c 65 61 66 20 62 6c 6f  Current leaf blo
0ca0: 63 6b 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20  ck (or 0) */..  
0cb0: 63 68 61 72 20 2a 61 4e 6f 64 65 3b 20 20 20 20  char *aNode;    
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 6f  /* Pointer to no
0ce0: 64 65 20 64 61 74 61 20 28 6f 72 20 4e 55 4c 4c  de data (or NULL
0cf0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64 65  ) */.  int nNode
0d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0d10: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
0d20: 66 20 62 75 66 66 65 72 20 61 74 20 61 4e 6f 64  f buffer at aNod
0d30: 65 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 46 74  e (or 0) */.  Ft
0d40: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 70 70 4e  s3HashElem **ppN
0d50: 65 78 74 45 6c 65 6d 3b 0a 0a 20 20 2f 2a 20 56  extElem;..  /* V
0d60: 61 72 69 61 62 6c 65 73 20 73 65 74 20 62 79 20  ariables set by 
0d70: 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
0d80: 74 28 29 2e 20 54 68 65 73 65 20 6d 61 79 20 62  t(). These may b
0d90: 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 0a  e read directly.
0da0: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
0db0: 65 72 2e 20 54 68 65 79 20 61 72 65 20 76 61 6c  er. They are val
0dc0: 69 64 20 66 72 6f 6d 20 74 68 65 20 74 69 6d 65  id from the time
0dd0: 20 53 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65   SegmentReaderNe
0de0: 77 28 29 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  w() returns.  **
0df0: 20 75 6e 74 69 6c 20 53 65 67 6d 65 6e 74 52 65   until SegmentRe
0e00: 61 64 65 72 4e 65 78 74 28 29 20 72 65 74 75 72  aderNext() retur
0e10: 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
0e20: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
0e30: 4b 0a 20 20 2a 2a 20 28 69 2e 65 2e 20 53 51 4c  K.  ** (i.e. SQL
0e40: 49 54 45 5f 44 4f 4e 45 29 2e 0a 20 20 2a 2f 0a  ITE_DONE)..  */.
0e50: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
0e80: 79 74 65 73 20 69 6e 20 63 75 72 72 65 6e 74 20  ytes in current 
0e90: 74 65 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a  term */.  char *
0ea0: 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
0eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0ec0: 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
0ed0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  term */.  int nT
0ee0: 65 72 6d 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  ermAlloc;       
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0f00: 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 7a  ocated size of z
0f10: 54 65 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20  Term buffer */. 
0f20: 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 3b   char *aDoclist;
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
0f50: 6f 63 6c 69 73 74 20 6f 66 20 63 75 72 72 65 6e  oclist of curren
0f60: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  t entry */.  int
0f70: 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20   nDoclist;      
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f90: 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
0fa0: 69 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  in current entry
0fb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   */..  /* The fo
0fc0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
0fd0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  s are used to it
0fe0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
0ff0: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
1000: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f 66  t */.  char *pOf
1010: 66 73 65 74 4c 69 73 74 3b 0a 20 20 73 71 6c 69  fsetList;.  sqli
1020: 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
1030: 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74  ;.};..#define ft
1040: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
1050: 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70 70  ding(p) ((p)->pp
1060: 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64 65  NextElem!=0).#de
1070: 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61 64  fine fts3SegRead
1080: 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29 20  erIsRootOnly(p) 
1090: 28 28 70 29 2d 3e 61 4e 6f 64 65 3d 3d 28 63 68  ((p)->aNode==(ch
10a0: 61 72 20 2a 29 26 28 70 29 5b 31 5d 29 0a 0a 2f  ar *)&(p)[1])../
10b0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
10c0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
10d0: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 72  re is used to cr
10e0: 65 61 74 65 20 61 20 73 65 67 6d 65 6e 74 20 62  eate a segment b
10f0: 2d 74 72 65 65 20 69 6e 20 74 68 65 0a 2a 2a 20  -tree in the.** 
1100: 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 69 6e  database. The in
1110: 74 65 72 6e 61 6c 20 64 65 74 61 69 6c 73 20 6f  ternal details o
1120: 66 20 74 68 69 73 20 74 79 70 65 20 61 72 65 20  f this type are 
1130: 6f 6e 6c 79 20 61 63 63 65 73 73 65 64 20 62 79  only accessed by
1140: 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
1150: 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
1160: 2a 2a 20 20 20 66 74 73 33 53 65 67 57 72 69 74  **   fts3SegWrit
1170: 65 72 41 64 64 28 29 0a 2a 2a 20 20 20 66 74 73  erAdd().**   fts
1180: 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28  3SegWriterFlush(
1190: 29 0a 2a 2a 20 20 20 66 74 73 33 53 65 67 57 72  ).**   fts3SegWr
11a0: 69 74 65 72 46 72 65 65 28 29 0a 2a 2f 0a 73 74  iterFree().*/.st
11b0: 72 75 63 74 20 53 65 67 6d 65 6e 74 57 72 69 74  ruct SegmentWrit
11c0: 65 72 20 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  er {.  SegmentNo
11d0: 64 65 20 2a 70 54 72 65 65 3b 20 20 20 20 20 20  de *pTree;      
11e0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
11f0: 72 20 74 6f 20 69 6e 74 65 72 69 6f 72 20 74 72  r to interior tr
1200: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
1210: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1220: 69 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  iFirst;         
1230: 20 20 2f 2a 20 46 69 72 73 74 20 73 6c 6f 74 20    /* First slot 
1240: 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 77 72  in %_segments wr
1250: 69 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  itten */.  sqlit
1260: 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65 3b 20  e3_int64 iFree; 
1270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1280: 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20  xt free slot in 
1290: 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  %_segments */.  
12a0: 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 72  /* Pointer to pr
12d0: 65 76 69 6f 75 73 20 74 65 72 6d 20 62 75 66 66  evious term buff
12e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  er */.  int nTer
12f0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1300: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1310: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 54  r of bytes in zT
1320: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  erm */.  int nMa
1330: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
1340: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1350: 20 6f 66 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66   of malloc'd buf
1360: 66 65 72 20 61 74 20 7a 4d 61 6c 6c 6f 63 20 2a  fer at zMalloc *
1370: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f  /.  char *zMallo
1380: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1390: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
13a0: 73 70 61 63 65 20 28 70 6f 73 73 69 62 6c 79 29  space (possibly)
13b0: 20 75 73 65 64 20 66 6f 72 20 7a 54 65 72 6d 20   used for zTerm 
13c0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  */.  int nSize; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
13f0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 20 61 44  allocation at aD
1400: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ata */.  int nDa
1410: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1420: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1430: 73 20 6f 66 20 64 61 74 61 20 69 6e 20 61 44 61  s of data in aDa
1440: 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ta */.  char *aD
1450: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1460: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1470: 65 72 20 74 6f 20 62 6c 6f 63 6b 20 66 72 6f 6d  er to block from
1480: 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a   malloc() */.};.
1490: 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53 65 67 6d  ./*.** Type Segm
14a0: 65 6e 74 4e 6f 64 65 20 69 73 20 75 73 65 64 20  entNode is used 
14b0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
14c0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
14d0: 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 74 68   to create.** th
14e0: 65 20 69 6e 74 65 72 69 6f 72 20 70 61 72 74 20  e interior part 
14f0: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  of the segment b
1500: 2b 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  +-tree structure
1510: 73 20 28 65 76 65 72 79 74 68 69 6e 67 20 65 78  s (everything ex
1520: 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c 65 61 66  cept.** the leaf
1530: 20 6e 6f 64 65 73 29 2e 20 54 68 65 73 65 20 66   nodes). These f
1540: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74 79 70  unctions and typ
1550: 65 20 61 72 65 20 6f 6e 6c 79 20 65 76 65 72 20  e are only ever 
1560: 75 73 65 64 20 62 79 20 63 6f 64 65 0a 2a 2a 20  used by code.** 
1570: 77 69 74 68 69 6e 20 74 68 65 20 66 74 73 33 53  within the fts3S
1580: 65 67 57 72 69 74 65 72 58 58 58 28 29 20 66 61  egWriterXXX() fa
1590: 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mily of function
15a0: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
15b0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 4e  e..**.**   fts3N
15c0: 6f 64 65 41 64 64 54 65 72 6d 28 29 0a 2a 2a 20  odeAddTerm().** 
15d0: 20 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28    fts3NodeWrite(
15e0: 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 46  ).**   fts3NodeF
15f0: 72 65 65 28 29 0a 2a 2f 0a 73 74 72 75 63 74 20  ree().*/.struct 
1600: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 7b 0a 20 20  SegmentNode {.  
1610: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61  SegmentNode *pPa
1620: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
1630: 2f 2a 20 50 61 72 65 6e 74 20 6e 6f 64 65 20 28  /* Parent node (
1640: 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f 74  or NULL for root
1650: 20 6e 6f 64 65 29 20 2a 2f 0a 20 20 53 65 67 6d   node) */.  Segm
1660: 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67 68 74 3b  entNode *pRight;
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1680: 6f 69 6e 74 65 72 20 74 6f 20 72 69 67 68 74 2d  ointer to right-
1690: 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 53 65 67  sibling */.  Seg
16a0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 4c 65 66 74 6d  mentNode *pLeftm
16b0: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ost;         /* 
16c0: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 65 66 74 2d  Pointer to left-
16d0: 6d 6f 73 74 20 6e 6f 64 65 20 6f 66 20 74 68 69  most node of thi
16e0: 73 20 64 65 70 74 68 20 2a 2f 0a 20 20 69 6e 74  s depth */.  int
16f0: 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1710: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1720: 77 72 69 74 74 65 6e 20 74 6f 20 6e 6f 64 65 20  written to node 
1730: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72  so far */.  char
1740: 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *zTerm;        
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1760: 6f 69 6e 74 65 72 20 74 6f 20 70 72 65 76 69 6f  ointer to previo
1770: 75 73 20 74 65 72 6d 20 62 75 66 66 65 72 20 2a  us term buffer *
1780: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20  /.  int nTerm;  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17b0: 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72 6d 20   bytes in zTerm 
17c0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f 63  */.  int nMalloc
17d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
17f0: 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72 20  malloc'd buffer 
1800: 61 74 20 7a 4d 61 6c 6c 6f 63 20 2a 2f 0a 20 20  at zMalloc */.  
1810: 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b 20 20  char *zMalloc;  
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 73 70 61 63  /* Malloc'd spac
1840: 65 20 28 70 6f 73 73 69 62 6c 79 29 20 75 73 65  e (possibly) use
1850: 64 20 66 6f 72 20 7a 54 65 72 6d 20 2a 2f 0a 20  d for zTerm */. 
1860: 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20   int nData;     
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 76 61 6c   /* Bytes of val
1890: 69 64 20 64 61 74 61 20 73 6f 20 66 61 72 20 2a  id data so far *
18a0: 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 2f 2a 20 4e 6f 64 65 20 64 61 74 61      /* Node data
18d0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61   */.};../*.** Va
18e0: 6c 69 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74  lid values for t
18f0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1900: 6e 74 20 74 6f 20 66 74 73 33 53 71 6c 53 74 6d  nt to fts3SqlStm
1910: 74 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  t()..*/.#define 
1920: 53 51 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e 54 45  SQL_DELETE_CONTE
1930: 4e 54 20 20 20 20 20 20 20 20 20 20 20 20 20 30  NT             0
1940: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 49 53 5f  .#define SQL_IS_
1950: 45 4d 50 54 59 20 20 20 20 20 20 20 20 20 20 20  EMPTY           
1960: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
1970: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  e SQL_DELETE_ALL
1980: 5f 43 4f 4e 54 45 4e 54 20 20 20 20 20 20 20 20  _CONTENT        
1990: 20 32 20 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   2 .#define SQL_
19a0: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 4d 45  DELETE_ALL_SEGME
19b0: 4e 54 53 20 20 20 20 20 20 20 20 33 0a 23 64 65  NTS        3.#de
19c0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
19d0: 41 4c 4c 5f 53 45 47 44 49 52 20 20 20 20 20 20  ALL_SEGDIR      
19e0: 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 53 51      4.#define SQ
19f0: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43  L_DELETE_ALL_DOC
1a00: 53 49 5a 45 20 20 20 20 20 20 20 20 20 35 0a 23  SIZE         5.#
1a10: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
1a20: 45 5f 41 4c 4c 5f 53 54 41 54 20 20 20 20 20 20  E_ALL_STAT      
1a30: 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20        6.#define 
1a40: 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45  SQL_SELECT_CONTE
1a50: 4e 54 5f 42 59 5f 52 4f 57 49 44 20 20 20 20 37  NT_BY_ROWID    7
1a60: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58  .#define SQL_NEX
1a70: 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 20  T_SEGMENT_INDEX 
1a80: 20 20 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e          8.#defin
1a90: 65 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47  e SQL_INSERT_SEG
1aa0: 4d 45 4e 54 53 20 20 20 20 20 20 20 20 20 20 20  MENTS           
1ab0: 20 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 4e   9.#define SQL_N
1ac0: 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49 44 20  EXT_SEGMENTS_ID 
1ad0: 20 20 20 20 20 20 20 20 20 31 30 0a 23 64 65 66           10.#def
1ae0: 69 6e 65 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53  ine SQL_INSERT_S
1af0: 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20 20  EGDIR           
1b00: 20 20 31 31 0a 23 64 65 66 69 6e 65 20 53 51 4c    11.#define SQL
1b10: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 20 20 20  _SELECT_LEVEL   
1b20: 20 20 20 20 20 20 20 20 20 20 20 31 32 0a 23 64             12.#d
1b30: 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54  efine SQL_SELECT
1b40: 5f 41 4c 4c 5f 4c 45 56 45 4c 20 20 20 20 20 20  _ALL_LEVEL      
1b50: 20 20 20 20 31 33 0a 23 64 65 66 69 6e 65 20 53      13.#define S
1b60: 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f  QL_SELECT_LEVEL_
1b70: 43 4f 55 4e 54 20 20 20 20 20 20 20 20 31 34 0a  COUNT        14.
1b80: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
1b90: 43 54 5f 53 45 47 44 49 52 5f 43 4f 55 4e 54 5f  CT_SEGDIR_COUNT_
1ba0: 4d 41 58 20 20 20 31 35 0a 23 64 65 66 69 6e 65  MAX   15.#define
1bb0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
1bc0: 49 52 5f 42 59 5f 4c 45 56 45 4c 20 20 20 20 31  IR_BY_LEVEL    1
1bd0: 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45  6.#define SQL_DE
1be0: 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41  LETE_SEGMENTS_RA
1bf0: 4e 47 45 20 20 20 20 20 31 37 0a 23 64 65 66 69  NGE     17.#defi
1c00: 6e 65 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49  ne SQL_CONTENT_I
1c10: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
1c20: 20 31 38 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   18.#define SQL_
1c30: 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a 45 20 20  DELETE_DOCSIZE  
1c40: 20 20 20 20 20 20 20 20 20 20 31 39 0a 23 64 65            19.#de
1c50: 66 69 6e 65 20 53 51 4c 5f 52 45 50 4c 41 43 45  fine SQL_REPLACE
1c60: 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20 20  _DOCSIZE        
1c70: 20 20 20 32 30 0a 23 64 65 66 69 6e 65 20 53 51     20.#define SQ
1c80: 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45  L_SELECT_DOCSIZE
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 32 31 0a 23              21.#
1ca0: 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43  define SQL_SELEC
1cb0: 54 5f 44 4f 43 54 4f 54 41 4c 20 20 20 20 20 20  T_DOCTOTAL      
1cc0: 20 20 20 20 20 32 32 0a 23 64 65 66 69 6e 65 20       22.#define 
1cd0: 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 54  SQL_REPLACE_DOCT
1ce0: 4f 54 41 4c 20 20 20 20 20 20 20 20 20 20 32 33  OTAL          23
1cf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d00: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1d10: 20 6f 62 74 61 69 6e 20 61 6e 20 53 51 4c 69 74   obtain an SQLit
1d20: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1d30: 6d 65 6e 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66  ment handle.** f
1d40: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
1d50: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
1d60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1d70: 6e 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  nt. If successfu
1d80: 6c 2c 0a 2a 2a 20 2a 70 70 20 69 73 20 73 65 74  l,.** *pp is set
1d90: 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74 65   to the requeste
1da0: 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  d statement hand
1db0: 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  le and SQLITE_OK
1dc0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
1dd0: 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
1de0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1df0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1e00: 70 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  p is set to 0..*
1e10: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1e20: 20 61 70 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55   apVal is not NU
1e30: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  LL, then it must
1e40: 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
1e50: 61 79 20 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65  ay with.** at le
1e60: 61 73 74 20 61 73 20 6d 61 6e 79 20 65 6e 74 72  ast as many entr
1e70: 69 65 73 20 61 73 20 74 68 65 20 72 65 71 75 65  ies as the reque
1e80: 73 74 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68  sted statement h
1e90: 61 73 20 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72  as bound .** par
1ea0: 61 6d 65 74 65 72 73 2e 20 54 68 65 20 76 61 6c  ameters. The val
1eb0: 75 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f  ues are bound to
1ec0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20   the statements 
1ed0: 70 61 72 61 6d 65 74 65 72 73 20 62 65 66 6f 72  parameters befor
1ee0: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
1ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1f00: 73 33 53 71 6c 53 74 6d 74 28 0a 20 20 46 74 73  s3SqlStmt(.  Fts
1f10: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f30: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
1f40: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53  ndle */.  int eS
1f50: 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  tmt,            
1f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
1f70: 20 6f 66 20 74 68 65 20 53 51 4c 5f 58 58 58 20   of the SQL_XXX 
1f80: 63 6f 6e 73 74 61 6e 74 73 20 61 62 6f 76 65 20  constants above 
1f90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
1fa0: 74 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20  t **pp,         
1fb0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61       /* OUT: Sta
1fc0: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f  tement handle */
1fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1fe0: 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
1ff0: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20     /* Values to 
2000: 62 69 6e 64 20 74 6f 20 73 74 61 74 65 6d 65 6e  bind to statemen
2010: 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  t */.){.  const 
2020: 63 68 61 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20  char *azSql[] = 
2030: 7b 0a 2f 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c  {./* 0  */  "DEL
2040: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2050: 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72  content' WHERE r
2060: 6f 77 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20  owid = ?",./* 1 
2070: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 4e 4f 54   */  "SELECT NOT
2080: 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 64   EXISTS(SELECT d
2090: 6f 63 69 64 20 46 52 4f 4d 20 25 51 2e 27 25 71  ocid FROM %Q.'%q
20a0: 5f 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20  _content' WHERE 
20b0: 72 6f 77 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32  rowid!=?)",./* 2
20c0: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52    */  "DELETE FR
20d0: 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e  OM %Q.'%q_conten
20e0: 74 27 22 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22  t'",./* 3  */  "
20f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
2100: 25 71 5f 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f  %q_segments'",./
2110: 2a 20 34 20 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 4  */  "DELETE
2120: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
2130: 64 69 72 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20  dir'",./* 5  */ 
2140: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
2150: 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 22 2c 0a  .'%q_docsize'",.
2160: 2f 2a 20 36 20 20 2a 2f 20 20 22 44 45 4c 45 54  /* 6  */  "DELET
2170: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74  E FROM %Q.'%q_st
2180: 61 74 27 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20 20  at'",./* 7  */  
2190: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25  "SELECT * FROM %
21a0: 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 57  Q.'%q_content' W
21b0: 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 2c 0a 2f  HERE rowid=?",./
21c0: 2a 20 38 20 20 2a 2f 20 20 22 53 45 4c 45 43 54  * 8  */  "SELECT
21d0: 20 28 53 45 4c 45 43 54 20 6d 61 78 28 69 64 78   (SELECT max(idx
21e0: 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  ) FROM %Q.'%q_se
21f0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
2200: 6c 20 3d 20 3f 29 20 2b 20 31 22 2c 0a 2f 2a 20  l = ?) + 1",./* 
2210: 39 20 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49  9  */  "INSERT I
2220: 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65 67 6d 65  NTO %Q.'%q_segme
2230: 6e 74 73 27 28 62 6c 6f 63 6b 69 64 2c 20 62 6c  nts'(blockid, bl
2240: 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c 20 3f  ock) VALUES(?, ?
2250: 29 22 2c 0a 2f 2a 20 31 30 20 2a 2f 20 20 22 53  )",./* 10 */  "S
2260: 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 28  ELECT coalesce((
2270: 53 45 4c 45 43 54 20 6d 61 78 28 62 6c 6f 63 6b  SELECT max(block
2280: 69 64 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  id) FROM %Q.'%q_
2290: 73 65 67 6d 65 6e 74 73 27 29 20 2b 20 31 2c 20  segments') + 1, 
22a0: 31 29 22 2c 0a 2f 2a 20 31 31 20 2a 2f 20 20 22  1)",./* 11 */  "
22b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 27  INSERT INTO %Q.'
22c0: 25 71 5f 73 65 67 64 69 72 27 20 56 41 4c 55 45  %q_segdir' VALUE
22d0: 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c  S(?,?,?,?,?,?)",
22e0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ..          /* R
22f0: 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73 20 69  eturn segments i
2300: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f 6c 64  n order from old
2310: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 2a 2f  est to newest.*/
2320: 20 0a 2f 2a 20 31 32 20 2a 2f 20 20 22 53 45 4c   ./* 12 */  "SEL
2330: 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f 62  ECT idx, start_b
2340: 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64  lock, leaves_end
2350: 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63  _block, end_bloc
2360: 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20 20  k, root ".      
2370: 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e 27        "FROM %Q.'
2380: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
2390: 20 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44 45 52   level = ? ORDER
23a0: 20 42 59 20 69 64 78 20 41 53 43 22 2c 0a 2f 2a   BY idx ASC",./*
23b0: 20 31 33 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   13 */  "SELECT 
23c0: 69 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b  idx, start_block
23d0: 2c 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f  , leaves_end_blo
23e0: 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72  ck, end_block, r
23f0: 6f 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20  oot ".          
2400: 20 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73    "FROM %Q.'%q_s
2410: 65 67 64 69 72 27 20 4f 52 44 45 52 20 42 59 20  egdir' ORDER BY 
2420: 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64 78 20  level DESC, idx 
2430: 41 53 43 22 2c 0a 0a 2f 2a 20 31 34 20 2a 2f 20  ASC",../* 14 */ 
2440: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
2450: 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  ) FROM %Q.'%q_se
2460: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
2470: 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31 35 20 2a 2f  l = ?",./* 15 */
2480: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
2490: 2a 29 2c 20 6d 61 78 28 6c 65 76 65 6c 29 20 46  *), max(level) F
24a0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
24b0: 72 27 22 2c 0a 0a 2f 2a 20 31 36 20 2a 2f 20 20  r'",../* 16 */  
24c0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
24d0: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
24e0: 45 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a  E level = ?",./*
24f0: 20 31 37 20 2a 2f 20 20 22 44 45 4c 45 54 45 20   17 */  "DELETE 
2500: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d  FROM %Q.'%q_segm
2510: 65 6e 74 73 27 20 57 48 45 52 45 20 62 6c 6f 63  ents' WHERE bloc
2520: 6b 69 64 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  kid BETWEEN ? AN
2530: 44 20 3f 22 2c 0a 2f 2a 20 31 38 20 2a 2f 20 20  D ?",./* 18 */  
2540: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
2550: 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 56 41 4c  '%q_content' VAL
2560: 55 45 53 28 25 7a 29 22 2c 0a 2f 2a 20 31 39 20  UES(%z)",./* 19 
2570: 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  */  "DELETE FROM
2580: 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27   %Q.'%q_docsize'
2590: 20 57 48 45 52 45 20 64 6f 63 69 64 20 3d 20 3f   WHERE docid = ?
25a0: 22 2c 0a 2f 2a 20 32 30 20 2a 2f 20 20 22 52 45  ",./* 20 */  "RE
25b0: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25  PLACE INTO %Q.'%
25c0: 71 5f 64 6f 63 73 69 7a 65 27 20 56 41 4c 55 45  q_docsize' VALUE
25d0: 53 28 3f 2c 3f 29 22 2c 0a 2f 2a 20 32 31 20 2a  S(?,?)",./* 21 *
25e0: 2f 20 20 22 53 45 4c 45 43 54 20 73 69 7a 65 20  /  "SELECT size 
25f0: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73  FROM %Q.'%q_docs
2600: 69 7a 65 27 20 57 48 45 52 45 20 64 6f 63 69 64  ize' WHERE docid
2610: 3d 3f 22 2c 0a 2f 2a 20 32 32 20 2a 2f 20 20 22  =?",./* 22 */  "
2620: 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f  SELECT value FRO
2630: 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27 20 57  M %Q.'%q_stat' W
2640: 48 45 52 45 20 69 64 3d 30 22 2c 0a 2f 2a 20 32  HERE id=0",./* 2
2650: 33 20 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49  3 */  "REPLACE I
2660: 4e 54 4f 20 25 51 2e 27 25 71 5f 73 74 61 74 27  NTO %Q.'%q_stat'
2670: 20 56 41 4c 55 45 53 28 30 2c 3f 29 22 2c 0a 20   VALUES(0,?)",. 
2680: 20 7d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   };.  int rc = S
2690: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
26a0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
26b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 69 7a 65  ..  assert( Size
26c0: 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 3d 3d  ofArray(azSql)==
26d0: 53 69 7a 65 6f 66 41 72 72 61 79 28 70 2d 3e 61  SizeofArray(p->a
26e0: 53 74 6d 74 29 20 29 3b 0a 20 20 61 73 73 65 72  Stmt) );.  asser
26f0: 74 28 20 65 53 74 6d 74 3c 53 69 7a 65 6f 66 41  t( eStmt<SizeofA
2700: 72 72 61 79 28 61 7a 53 71 6c 29 20 26 26 20 65  rray(azSql) && e
2710: 53 74 6d 74 3e 3d 30 20 29 3b 0a 20 20 0a 20 20  Stmt>=0 );.  .  
2720: 70 53 74 6d 74 20 3d 20 70 2d 3e 61 53 74 6d 74  pStmt = p->aStmt
2730: 5b 65 53 74 6d 74 5d 3b 0a 20 20 69 66 28 20 21  [eStmt];.  if( !
2740: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 63 68 61  pStmt ){.    cha
2750: 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 69 66 28  r *zSql;.    if(
2760: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f 4e 54   eStmt==SQL_CONT
2770: 45 4e 54 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20  ENT_INSERT ){.  
2780: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
27b0: 61 62 6c 65 20 2a 2f 20 20 0a 20 20 20 20 20 20  able */  .      
27c0: 63 68 61 72 20 2a 7a 56 61 72 6c 69 73 74 3b 20  char *zVarlist; 
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e0: 68 65 20 22 3f 2c 20 3f 2c 20 2e 2e 2e 22 20 73  he "?, ?, ..." s
27f0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 7a  tring */.      z
2800: 56 61 72 6c 69 73 74 20 3d 20 28 63 68 61 72 20  Varlist = (char 
2810: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2820: 28 32 2a 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 29  (2*p->nColumn+2)
2830: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 56 61  ;.      if( !zVa
2840: 72 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rlist ){.       
2850: 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *pp = 0;.      
2860: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2870: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
2880: 20 20 20 20 20 7a 56 61 72 6c 69 73 74 5b 30 5d       zVarlist[0]
2890: 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 7a 56   = '?';.      zV
28a0: 61 72 6c 69 73 74 5b 70 2d 3e 6e 43 6f 6c 75 6d  arlist[p->nColum
28b0: 6e 2a 32 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  n*2+1] = '\0';. 
28c0: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
28d0: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  =p->nColumn; i++
28e0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 61 72 6c  ){.        zVarl
28f0: 69 73 74 5b 69 2a 32 2d 31 5d 20 3d 20 27 2c 27  ist[i*2-1] = ','
2900: 3b 0a 20 20 20 20 20 20 20 20 7a 56 61 72 6c 69  ;.        zVarli
2910: 73 74 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20  st[i*2] = '?';. 
2920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 71       }.      zSq
2930: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2940: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d  ntf(azSql[eStmt]
2950: 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61  , p->zDb, p->zNa
2960: 6d 65 2c 20 7a 56 61 72 6c 69 73 74 29 3b 0a 20  me, zVarlist);. 
2970: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2980: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2990: 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74  printf(azSql[eSt
29a0: 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e  mt], p->zDb, p->
29b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
29c0: 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20    if( !zSql ){. 
29d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
29f0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
2a00: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2a10: 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2a20: 2c 20 26 70 53 74 6d 74 2c 20 4e 55 4c 4c 29 3b  , &pStmt, NULL);
2a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2a40: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ree(zSql);.     
2a50: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2a60: 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
2a70: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  =0 );.      p->a
2a80: 53 74 6d 74 5b 65 53 74 6d 74 5d 20 3d 20 70 53  Stmt[eStmt] = pS
2a90: 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tmt;.    }.  }. 
2aa0: 20 69 66 28 20 61 70 56 61 6c 20 29 7b 0a 20 20   if( apVal ){.  
2ab0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
2ac0: 20 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74 65   nParam = sqlite
2ad0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2ae0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
2af0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
2b00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
2b10: 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  Param; i++){.   
2b20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2b30: 62 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74  bind_value(pStmt
2b40: 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29  , i+1, apVal[i])
2b50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
2b60: 70 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74  p = pStmt;.  ret
2b70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b80: 20 53 69 6d 69 6c 61 72 20 74 6f 20 66 74 73 33   Similar to fts3
2b90: 53 71 6c 53 74 6d 74 28 29 2e 20 45 78 63 65 70  SqlStmt(). Excep
2ba0: 74 2c 20 61 66 74 65 72 20 62 69 6e 64 69 6e 67  t, after binding
2bb0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
2bc0: 69 6e 0a 2a 2a 20 61 72 72 61 79 20 61 70 56 61  in.** array apVa
2bd0: 6c 5b 5d 20 74 6f 20 74 68 65 20 53 51 4c 20 73  l[] to the SQL s
2be0: 74 61 74 65 6d 65 6e 74 20 69 64 65 6e 74 69 66  tatement identif
2bf0: 69 65 64 20 62 79 20 65 53 74 6d 74 2c 20 74 68  ied by eStmt, th
2c00: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  e statement.** i
2c10: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a  s executed..**.*
2c20: 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54 45  * Returns SQLITE
2c30: 5f 4f 4b 20 69 66 20 74 68 65 20 73 74 61 74 65  _OK if the state
2c40: 6d 65 6e 74 20 69 73 20 73 75 63 63 65 73 73 66  ment is successf
2c50: 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2c 20 6f  ully executed, o
2c60: 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65  r an.** SQLite e
2c70: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
2c80: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ise..*/.static v
2c90: 6f 69 64 20 66 74 73 33 53 71 6c 45 78 65 63 28  oid fts3SqlExec(
2ca0: 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20  .  int *pRC,    
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2cc0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
2cd0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
2ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2cf0: 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20  FTS3 table */.  
2d00: 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20 20 20  int eStmt,      
2d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2d20: 78 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20 74  x of statement t
2d30: 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20 20  o evaluate */.  
2d40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2d50: 61 70 56 61 6c 20 20 20 20 2f 2a 20 50 61 72 61  apVal    /* Para
2d60: 6d 65 74 65 72 73 20 74 6f 20 62 69 6e 64 20 2a  meters to bind *
2d70: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
2d80: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
2d90: 74 20 72 63 3b 0a 20 20 69 66 28 20 2a 70 52 43  t rc;.  if( *pRC
2da0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20   ) return;.  rc 
2db0: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
2dc0: 20 65 53 74 6d 74 2c 20 26 70 53 74 6d 74 2c 20   eStmt, &pStmt, 
2dd0: 61 70 56 61 6c 29 3b 20 0a 20 20 69 66 28 20 72  apVal); .  if( r
2de0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
2e00: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20  (pStmt);.    rc 
2e10: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
2e20: 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 2a 70  pStmt);.  }.  *p
2e30: 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  RC = rc;.}.../*.
2e40: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2e50: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
2e60: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
2e70: 61 69 6e 65 64 20 61 20 73 68 61 72 65 64 2d 63  ained a shared-c
2e80: 61 63 68 65 0a 2a 2a 20 74 61 62 6c 65 2d 6c 6f  ache.** table-lo
2e90: 63 6b 20 6f 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ck on the %_cont
2ea0: 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ent table. This 
2eb0: 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
2ec0: 72 65 20 72 65 61 64 69 6e 67 0a 2a 2a 20 64 61  re reading.** da
2ed0: 74 61 20 66 72 6f 6d 20 74 68 65 20 66 74 73 33  ta from the fts3
2ee0: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73 20   table. If this 
2ef0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71 75  lock is not acqu
2f00: 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 6e  ired first, then
2f10: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  .** the caller m
2f20: 61 79 20 65 6e 64 20 75 70 20 68 6f 6c 64 69 6e  ay end up holdin
2f30: 67 20 72 65 61 64 2d 6c 6f 63 6b 73 20 6f 6e 20  g read-locks on 
2f40: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 61  the %_segments a
2f50: 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 74  nd %_segdir.** t
2f60: 61 62 6c 65 73 2c 20 62 75 74 20 6e 6f 20 72 65  ables, but no re
2f70: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25  ad-lock on the %
2f80: 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20  _content table. 
2f90: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
2fa0: 0a 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 6f 6e  .** a second con
2fb0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  nection will be 
2fc0: 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f  able to write to
2fd0: 20 74 68 65 20 66 74 73 33 20 74 61 62 6c 65 2c   the fts3 table,
2fe0: 20 62 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69   but.** attempti
2ff0: 6e 67 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 6f  ng to commit tho
3000: 73 65 20 77 72 69 74 65 73 20 6d 69 67 68 74 20  se writes might 
3010: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
3020: 43 4b 45 44 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  CKED or.** SQLIT
3030: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
3040: 41 43 48 45 20 28 62 65 63 61 75 73 65 20 74 68  ACHE (because th
3050: 65 20 63 6f 6d 6d 69 74 20 61 74 74 65 6d 70 74  e commit attempt
3060: 73 20 74 6f 20 6f 62 74 61 69 6e 20 0a 2a 2a 20  s to obtain .** 
3070: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 6f 6e 20 74  write-locks on t
3080: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 61 6e  he %_segments an
3090: 64 20 25 5f 73 65 67 64 69 72 20 2a 2a 20 74 61  d %_segdir ** ta
30a0: 62 6c 65 73 29 2e 20 0a 2a 2a 0a 2a 2a 20 57 65  bles). .**.** We
30b0: 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20 74 68   try to avoid th
30c0: 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46 54  is because if FT
30d0: 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20 65  S3 returns any e
30e0: 72 72 6f 72 20 77 68 65 6e 20 63 6f 6d 6d 69 74  rror when commit
30f0: 74 69 6e 67 0a 2a 2a 20 61 20 74 72 61 6e 73 61  ting.** a transa
3100: 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c 65  ction, the whole
3110: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
3120: 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
3130: 2e 20 41 6e 64 20 74 68 69 73 20 69 73 0a 2a 2a  . And this is.**
3140: 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72 73 20   not what users 
3150: 65 78 70 65 63 74 20 77 68 65 6e 20 74 68 65 79  expect when they
3160: 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   get SQLITE_LOCK
3170: 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 2e 20  ED_SHAREDCACHE. 
3180: 49 74 20 63 61 6e 0a 2a 2a 20 73 74 69 6c 6c 20  It can.** still 
3190: 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 75 73  happen if the us
31a0: 65 72 20 72 65 61 64 73 20 64 61 74 61 20 64 69  er reads data di
31b0: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
31c0: 25 5f 73 65 67 6d 65 6e 74 73 20 6f 72 0a 2a 2a  %_segments or.**
31d0: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 73   %_segdir tables
31e0: 20 69 6e 73 74 65 61 64 20 6f 66 20 67 6f 69 6e   instead of goin
31f0: 67 20 74 68 72 6f 75 67 68 20 46 54 53 33 20 74  g through FTS3 t
3200: 68 6f 75 67 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hough..*/.int sq
3210: 6c 69 74 65 33 46 74 73 33 52 65 61 64 4c 6f 63  lite3Fts3ReadLoc
3220: 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b  k(Fts3Table *p){
3230: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3250: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
3260: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
3270: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
3280: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
3290: 65 6e 74 20 75 73 65 64 20 74 6f 20 6f 62 74 61  ent used to obta
32a0: 69 6e 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 72 63  in lock */..  rc
32b0: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
32c0: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e  , SQL_SELECT_CON
32d0: 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26  TENT_BY_ROWID, &
32e0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
32f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3300: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
3310: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 31  nd_null(pStmt, 1
3320: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
3330: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
3340: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
3350: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  et(pStmt);.  }. 
3360: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3370: 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 53 74 6d 74  *.** Set *ppStmt
3380: 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20   to a statement 
3390: 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 79 20  handle that may 
33a0: 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
33b0: 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c  te through.** al
33c0: 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 25 5f  l rows in the %_
33d0: 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20 66 72  segdir table, fr
33e0: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
33f0: 65 73 74 2e 20 49 66 20 73 75 63 63 65 73 73 66  est. If successf
3400: 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51  ul,.** return SQ
3410: 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65  LITE_OK. If an e
3420: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
3430: 65 20 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e preparing the 
3440: 73 74 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a 20 72  statement, .** r
3450: 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
3460: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
3470: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
3480: 65 76 65 72 20 6f 6e 65 20 69 6e 73 74 61 6e 63  ever one instanc
3490: 65 20 6f 66 20 74 68 69 73 20 53 51 4c 20 73 74  e of this SQL st
34a0: 61 74 65 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 64  atement compiled
34b0: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 46 54 53   for.** each FTS
34c0: 33 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  3 table..**.** T
34d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  he statement ret
34e0: 75 72 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  urns the followi
34f0: 6e 67 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  ng columns from 
3500: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
3510: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 69  le:.**.**   0: i
3520: 64 78 0a 2a 2a 20 20 20 31 3a 20 73 74 61 72 74  dx.**   1: start
3530: 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a 20 6c  _block.**   2: l
3540: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a  eaves_end_block.
3550: 2a 2a 20 20 20 33 3a 20 65 6e 64 5f 62 6c 6f 63  **   3: end_bloc
3560: 6b 0a 2a 2a 20 20 20 34 3a 20 72 6f 6f 74 0a 2a  k.**   4: root.*
3570: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3580: 33 41 6c 6c 53 65 67 64 69 72 73 28 46 74 73 33  3AllSegdirs(Fts3
3590: 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
35a0: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 29  3_stmt **ppStmt)
35b0: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53  {.  return fts3S
35c0: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
35d0: 4c 45 43 54 5f 41 4c 4c 5f 4c 45 56 45 4c 2c 20  LECT_ALL_LEVEL, 
35e0: 70 70 53 74 6d 74 2c 20 30 29 3b 0a 7d 0a 0a 0a  ppStmt, 0);.}...
35f0: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 73  /*.** Append a s
3600: 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20  ingle varint to 
3610: 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 62 75  a PendingList bu
3620: 66 66 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ffer. SQLITE_OK 
3630: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
3640: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
3650: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
3660: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
3670: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
3680: 74 69 6f 6e 20 61 6c 73 6f 20 73 65 72 76 65 73  tion also serves
3690: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
36a0: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72   PendingList str
36b0: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a  ucture itself..*
36c0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
36d0: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50  o create a new P
36e0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
36f0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
3700: 74 77 6f 0a 2a 2a 20 76 61 72 69 6e 74 73 3a 0a  two.** varints:.
3710: 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64 69 6e 67 4c  **.**   PendingL
3720: 69 73 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20  ist *p = 0;.**  
3730: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
3740: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
3750: 20 31 29 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65   1);.**   fts3Pe
3760: 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56  ndingListAppendV
3770: 61 72 69 6e 74 28 26 70 2c 20 32 29 3b 0a 2a 2f  arint(&p, 2);.*/
3780: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
3790: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
37a0: 64 56 61 72 69 6e 74 28 0a 20 20 50 65 6e 64 69  dVarint(.  Pendi
37b0: 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20  ngList **pp,    
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
37d0: 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f  /OUT: Pointer to
37e0: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72   PendingList str
37f0: 75 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  uct */.  sqlite3
3800: 5f 69 6e 74 36 34 20 69 20 20 20 20 20 20 20 20  _int64 i        
3810: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
3820: 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64  e to append to d
3830: 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64  ata */.){.  Pend
3840: 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70  ingList *p = *pp
3850: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
3860: 20 6f 72 20 67 72 6f 77 20 74 68 65 20 50 65 6e   or grow the Pen
3870: 64 69 6e 67 4c 69 73 74 20 61 73 20 72 65 71 75  dingList as requ
3880: 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ired. */.  if( !
3890: 70 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  p ){.    p = sql
38a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
38b0: 6f 66 28 2a 70 29 20 2b 20 31 30 30 29 3b 0a 20  of(*p) + 100);. 
38c0: 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20     if( !p ){.   
38d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
38f0: 20 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 31 30    p->nSpace = 10
3900: 30 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  0;.    p->aData 
3910: 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b  = (char *)&p[1];
3920: 0a 20 20 20 20 70 2d 3e 6e 44 61 74 61 20 3d 20  .    p->nData = 
3930: 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  0;.  }.  else if
3940: 28 20 70 2d 3e 6e 44 61 74 61 2b 46 54 53 33 5f  ( p->nData+FTS3_
3950: 56 41 52 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e  VARINT_MAX+1>p->
3960: 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 69 6e  nSpace ){.    in
3970: 74 20 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53 70 61  t nNew = p->nSpa
3980: 63 65 20 2a 20 32 3b 0a 20 20 20 20 70 20 3d 20  ce * 2;.    p = 
3990: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
39a0: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20  p, sizeof(*p) + 
39b0: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21  nNew);.    if( !
39c0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
39d0: 65 33 5f 66 72 65 65 28 2a 70 70 29 3b 0a 20 20  e3_free(*pp);.  
39e0: 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20      *pp = 0;.   
39f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3a00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
3a10: 20 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e    p->nSpace = nN
3a20: 65 77 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61  ew;.    p->aData
3a30: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d   = (char *)&p[1]
3a40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
3a50: 6e 64 20 74 68 65 20 6e 65 77 20 73 65 72 69 61  nd the new seria
3a60: 6c 69 7a 65 64 20 76 61 72 69 6e 74 20 74 6f 20  lized varint to 
3a70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
3a80: 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61  ist. */.  p->nDa
3a90: 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ta += sqlite3Fts
3aa0: 33 50 75 74 56 61 72 69 6e 74 28 26 70 2d 3e 61  3PutVarint(&p->a
3ab0: 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20  Data[p->nData], 
3ac0: 69 29 3b 0a 20 20 70 2d 3e 61 44 61 74 61 5b 70  i);.  p->aData[p
3ad0: 2d 3e 6e 44 61 74 61 5d 20 3d 20 27 5c 30 27 3b  ->nData] = '\0';
3ae0: 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65  .  *pp = p;.  re
3af0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 64  }../*.** Add a d
3b10: 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69  ocid/column/posi
3b20: 74 69 6f 6e 20 65 6e 74 72 79 20 74 6f 20 61 20  tion entry to a 
3b30: 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75  PendingList stru
3b40: 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a  cture. Non-zero.
3b50: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
3b60: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
3b70: 69 73 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  is sqlite3_reall
3b80: 6f 63 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  oced as part of 
3b90: 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e  adding.** the en
3ba0: 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  try. Otherwise, 
3bb0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  zero..**.** If a
3bc0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
3bd0: 72 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20  rs, *pRc is set 
3be0: 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
3bf0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
3c00: 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 61 6c 77  ..** Zero is alw
3c10: 61 79 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20  ays returned in 
3c20: 74 68 69 73 20 63 61 73 65 2e 20 4f 74 68 65 72  this case. Other
3c30: 77 69 73 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20  wise, if no OOM 
3c40: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
3c50: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 53 51   it is set to SQ
3c60: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
3c70: 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69  ic int fts3Pendi
3c80: 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  ngListAppend(.  
3c90: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70  PendingList **pp
3ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3cb0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 65 6e 64 69  /* IN/OUT: Pendi
3cc0: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65  ngList structure
3cd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
3ce0: 74 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20  t64 iDocid,     
3cf0: 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66        /* Docid f
3d00: 6f 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20  or entry to add 
3d10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
3d20: 36 34 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  64 iCol,        
3d30: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66       /* Column f
3d40: 6f 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20  or entry to add 
3d50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
3d60: 36 34 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  64 iPos,        
3d70: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
3d80: 20 6f 66 20 74 65 72 6d 20 66 6f 72 20 65 6e 74   of term for ent
3d90: 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  ry to add */.  i
3da0: 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3dc0: 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f  * OUT: Return co
3dd0: 64 65 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69  de */.){.  Pendi
3de0: 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b  ngList *p = *pp;
3df0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
3e00: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
3e10: 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74  ( !p || p->iLast
3e20: 44 6f 63 69 64 3c 3d 69 44 6f 63 69 64 20 29 3b  Docid<=iDocid );
3e30: 0a 0a 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d  ..  if( !p || p-
3e40: 3e 69 4c 61 73 74 44 6f 63 69 64 21 3d 69 44 6f  >iLastDocid!=iDo
3e50: 63 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  cid ){.    sqlit
3e60: 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 20  e3_int64 iDelta 
3e70: 3d 20 69 44 6f 63 69 64 20 2d 20 28 70 20 3f 20  = iDocid - (p ? 
3e80: 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3a 20  p->iLastDocid : 
3e90: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  0);.    if( p ){
3ea0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3eb0: 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e 53 70 61 63  ->nData<p->nSpac
3ec0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
3ed0: 74 28 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e  t( p->aData[p->n
3ee0: 44 61 74 61 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  Data]==0 );.    
3ef0: 20 20 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20    p->nData++;.  
3f00: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
3f10: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73  TE_OK!=(rc = fts
3f20: 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
3f30: 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 69 44 65  ndVarint(&p, iDe
3f40: 6c 74 61 29 29 20 29 7b 0a 20 20 20 20 20 20 67  lta)) ){.      g
3f50: 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61  oto pendinglista
3f60: 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d  ppend_out;.    }
3f70: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c  .    p->iLastCol
3f80: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 69 4c   = -1;.    p->iL
3f90: 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20  astPos = 0;.    
3fa0: 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3d 20  p->iLastDocid = 
3fb0: 69 44 6f 63 69 64 3b 0a 20 20 7d 0a 20 20 69 66  iDocid;.  }.  if
3fc0: 28 20 69 43 6f 6c 3e 30 20 26 26 20 70 2d 3e 69  ( iCol>0 && p->i
3fd0: 4c 61 73 74 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b  LastCol!=iCol ){
3fe0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
3ff0: 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65  OK!=(rc = fts3Pe
4000: 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56  ndingListAppendV
4010: 61 72 69 6e 74 28 26 70 2c 20 31 29 29 0a 20 20  arint(&p, 1)).  
4020: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
4030: 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69  =(rc = fts3Pendi
4040: 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
4050: 6e 74 28 26 70 2c 20 69 43 6f 6c 29 29 0a 20 20  nt(&p, iCol)).  
4060: 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
4070: 70 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e  pendinglistappen
4080: 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  d_out;.    }.   
4090: 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 69   p->iLastCol = i
40a0: 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73  Col;.    p->iLas
40b0: 74 50 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tPos = 0;.  }.  
40c0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
40d0: 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 3e     assert( iPos>
40e0: 70 2d 3e 69 4c 61 73 74 50 6f 73 20 7c 7c 20 28  p->iLastPos || (
40f0: 69 50 6f 73 3d 3d 30 20 26 26 20 70 2d 3e 69 4c  iPos==0 && p->iL
4100: 61 73 74 50 6f 73 3d 3d 30 29 20 29 3b 0a 20 20  astPos==0) );.  
4110: 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
4120: 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
4130: 6e 74 28 26 70 2c 20 32 2b 69 50 6f 73 2d 70 2d  nt(&p, 2+iPos-p-
4140: 3e 69 4c 61 73 74 50 6f 73 29 3b 0a 20 20 20 20  >iLastPos);.    
4150: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4160: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  K ){.      p->iL
4170: 61 73 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20  astPos = iPos;. 
4180: 20 20 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64 69     }.  }.. pendi
4190: 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74  nglistappend_out
41a0: 3a 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20  :.  *pRc = rc;. 
41b0: 20 69 66 28 20 70 21 3d 2a 70 70 20 29 7b 0a 20   if( p!=*pp ){. 
41c0: 20 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20     *pp = p;.    
41d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
41e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
41f0: 2a 2a 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20  ** Tokenize the 
4200: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
4210: 74 72 69 6e 67 20 7a 54 65 78 74 20 61 6e 64 20  tring zText and 
4220: 61 64 64 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74  add all tokens t
4230: 6f 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67  o the.** pending
4240: 2d 74 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c  -terms hash-tabl
4250: 65 2e 20 54 68 65 20 64 6f 63 69 64 20 75 73 65  e. The docid use
4260: 64 20 69 73 20 74 68 61 74 20 63 75 72 72 65 6e  d is that curren
4270: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  tly stored in.**
4280: 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20   p->iPrevDocid, 
4290: 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  and the column i
42a0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 61  s specified by a
42b0: 72 67 75 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a  rgument iCol..**
42c0: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
42d0: 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
42e0: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
42f0: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
4300: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
4310: 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e  atic int fts3Pen
4320: 64 69 6e 67 54 65 72 6d 73 41 64 64 28 0a 20 20  dingTermsAdd(.  
4330: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 2f 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68  /* Table into wh
4360: 69 63 68 20 74 65 78 74 20 77 69 6c 6c 20 62 65  ich text will be
4370: 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 63   inserted */.  c
4380: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
4390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
43a0: 2a 20 54 65 78 74 20 6f 66 20 64 6f 63 75 6d 65  * Text of docume
43b0: 6e 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  nt to be inserte
43c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  d */.  int iCol,
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
43f0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78 74   into which text
4400: 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
4410: 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 57  ed */.  u32 *pnW
4420: 6f 72 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ord             
4430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4440: 4e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  Number of tokens
4450: 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a   inserted */.){.
4460: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
4470: 69 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 69 45  iStart;.  int iE
4480: 6e 64 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a  nd;.  int iPos;.
4490: 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 30 3b    int nWord = 0;
44a0: 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ..  char const *
44b0: 7a 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54  zToken;.  int nT
44c0: 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33  oken;..  sqlite3
44d0: 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b  _tokenizer *pTok
44e0: 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70 54 6f 6b  enizer = p->pTok
44f0: 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c 69 74 65  enizer;.  sqlite
4500: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
4510: 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c  le const *pModul
4520: 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e  e = pTokenizer->
4530: 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71 6c 69 74  pModule;.  sqlit
4540: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72  e3_tokenizer_cur
4550: 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 69 6e 74  sor *pCsr;.  int
4560: 20 28 2a 78 4e 65 78 74 29 28 73 71 6c 69 74 65   (*xNext)(sqlite
4570: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73  3_tokenizer_curs
4580: 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a 20 20 20  or *pCursor,.   
4590: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 2c     const char**,
45a0: 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69  int*,int*,int*,i
45b0: 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt*);..  assert(
45c0: 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26 26 20 70   pTokenizer && p
45d0: 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20 72 63 20  Module );..  rc 
45e0: 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e  = pModule->xOpen
45f0: 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 7a 54 65  (pTokenizer, zTe
4600: 78 74 2c 20 2d 31 2c 20 26 70 43 73 72 29 3b 0a  xt, -1, &pCsr);.
4610: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4620: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
4630: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 73 72  n rc;.  }.  pCsr
4640: 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70  ->pTokenizer = p
4650: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 0a 20 20 78 4e  Tokenizer;..  xN
4660: 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78  ext = pModule->x
4670: 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28 20 53  Next;.  while( S
4680: 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20  QLITE_OK==rc.   
4690: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d     && SQLITE_OK=
46a0: 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70 43 73  =(rc = xNext(pCs
46b0: 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f  r, &zToken, &nTo
46c0: 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20 26 69  ken, &iStart, &i
46d0: 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20 20 29  End, &iPos)).  )
46e0: 7b 0a 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73  {.    PendingLis
46f0: 74 20 2a 70 4c 69 73 74 3b 0a 20 0a 20 20 20 20  t *pList;. .    
4700: 69 66 28 20 69 50 6f 73 3e 3d 6e 57 6f 72 64 20  if( iPos>=nWord 
4710: 29 20 6e 57 6f 72 64 20 3d 20 69 50 6f 73 2b 31  ) nWord = iPos+1
4720: 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73 69 74 69  ;..    /* Positi
4730: 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65  ons cannot be ne
4740: 67 61 74 69 76 65 3b 20 77 65 20 75 73 65 20 2d  gative; we use -
4750: 31 20 61 73 20 61 20 74 65 72 6d 69 6e 61 74 6f  1 as a terminato
4760: 72 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  r internally..  
4770: 20 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d 75 73 74    ** Tokens must
4780: 20 68 61 76 65 20 61 20 6e 6f 6e 2d 7a 65 72 6f   have a non-zero
4790: 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a   length..    */.
47a0: 20 20 20 20 69 66 28 20 69 50 6f 73 3c 30 20 7c      if( iPos<0 |
47b0: 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20 6e 54 6f  | !zToken || nTo
47c0: 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ken<=0 ){.      
47d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
47e0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
47f0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4c 69 73 74      }..    pList
4800: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
4810: 2a 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 26  *)fts3HashFind(&
4820: 70 2d 3e 70 65 6e 64 69 6e 67 54 65 72 6d 73 2c  p->pendingTerms,
4830: 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29   zToken, nToken)
4840: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
4850: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 65 6e  ){.      p->nPen
4860: 64 69 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c 69  dingData -= (pLi
4870: 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f 6b  st->nData + nTok
4880: 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33  en + sizeof(Fts3
4890: 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 20 20  HashElem));.    
48a0: 7d 0a 20 20 20 20 69 66 28 20 66 74 73 33 50 65  }.    if( fts3Pe
48b0: 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28  ndingListAppend(
48c0: 26 70 4c 69 73 74 2c 20 70 2d 3e 69 50 72 65 76  &pList, p->iPrev
48d0: 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Docid, iCol, iPo
48e0: 73 2c 20 26 72 63 29 20 29 7b 0a 20 20 20 20 20  s, &rc) ){.     
48f0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 66 74 73 33   if( pList==fts3
4900: 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
4910: 65 6e 64 69 6e 67 54 65 72 6d 73 2c 20 7a 54 6f  endingTerms, zTo
4920: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69  ken, nToken, pLi
4930: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  st) ){.        /
4940: 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  * Malloc failed 
4950: 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20  while inserting 
4960: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54  the new entry. T
4970: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 0a 20 20  his can only .  
4980: 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 20        ** happen 
4990: 69 66 20 74 68 65 72 65 20 77 61 73 20 6e 6f 20  if there was no 
49a0: 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 66  previous entry f
49b0: 6f 72 20 74 68 69 73 20 74 6f 6b 65 6e 2e 0a 20  or this token.. 
49c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
49d0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73    assert( 0==fts
49e0: 33 48 61 73 68 46 69 6e 64 28 26 70 2d 3e 70 65  3HashFind(&p->pe
49f0: 6e 64 69 6e 67 54 65 72 6d 73 2c 20 7a 54 6f 6b  ndingTerms, zTok
4a00: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20  en, nToken) );. 
4a10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
4a20: 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ree(pList);.    
4a30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
4a50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
4a60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4a70: 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
4a80: 61 74 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e 6e  ata += (pList->n
4a90: 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20  Data + nToken + 
4aa0: 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45  sizeof(Fts3HashE
4ab0: 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lem));.    }.  }
4ac0: 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  ..  pModule->xCl
4ad0: 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a 70 6e  ose(pCsr);.  *pn
4ae0: 57 6f 72 64 20 3d 20 6e 57 6f 72 64 3b 0a 20 20  Word = nWord;.  
4af0: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
4b00: 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
4b10: 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
4b20: 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69   .** Calling thi
4b30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
4b40: 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65 71  ates that subseq
4b50: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  uent calls to .*
4b60: 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  * fts3PendingTer
4b70: 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f 20 61  msAdd() are to a
4b80: 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f 6e  dd term/position
4b90: 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f 72 20  -list pairs for 
4ba0: 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
4bb0: 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  of the document 
4bc0: 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f 63 69  with docid iDoci
4bd0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
4be0: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
4bf0: 73 44 6f 63 69 64 28 46 74 73 33 54 61 62 6c 65  sDocid(Fts3Table
4c00: 20 2a 70 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36   *p, sqlite_int6
4c10: 34 20 69 44 6f 63 69 64 29 7b 0a 20 20 2f 2a 20  4 iDocid){.  /* 
4c20: 54 4f 44 4f 28 73 68 65 73 73 29 20 45 78 70 6c  TODO(shess) Expl
4c30: 6f 72 65 20 77 68 65 74 68 65 72 20 70 61 72 74  ore whether part
4c40: 69 61 6c 6c 79 20 66 6c 75 73 68 69 6e 67 20 74  ially flushing t
4c50: 68 65 20 62 75 66 66 65 72 20 6f 6e 0a 20 20 2a  he buffer on.  *
4c60: 2a 20 66 6f 72 63 65 64 2d 66 6c 75 73 68 20 77  * forced-flush w
4c70: 6f 75 6c 64 20 70 72 6f 76 69 64 65 20 62 65 74  ould provide bet
4c80: 74 65 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ter performance.
4c90: 20 20 49 20 73 75 73 70 65 63 74 20 74 68 61 74    I suspect that
4ca0: 20 69 66 0a 20 20 2a 2a 20 77 65 20 6f 72 64 65   if.  ** we orde
4cb0: 72 65 64 20 74 68 65 20 64 6f 63 6c 69 73 74 73  red the doclists
4cc0: 20 62 79 20 73 69 7a 65 20 61 6e 64 20 66 6c 75   by size and flu
4cd0: 73 68 65 64 20 74 68 65 20 6c 61 72 67 65 73 74  shed the largest
4ce0: 20 75 6e 74 69 6c 20 74 68 65 0a 20 20 2a 2a 20   until the.  ** 
4cf0: 62 75 66 66 65 72 20 77 61 73 20 68 61 6c 66 20  buffer was half 
4d00: 65 6d 70 74 79 2c 20 74 68 61 74 20 77 6f 75 6c  empty, that woul
4d10: 64 20 6c 65 74 20 74 68 65 20 6c 65 73 73 20 66  d let the less f
4d20: 72 65 71 75 65 6e 74 20 74 65 72 6d 73 0a 20 20  requent terms.  
4d30: 2a 2a 20 67 65 6e 65 72 61 74 65 20 6c 6f 6e 67  ** generate long
4d40: 65 72 20 64 6f 63 6c 69 73 74 73 2e 0a 20 20 2a  er doclists..  *
4d50: 2f 0a 20 20 69 66 28 20 69 44 6f 63 69 64 3c 3d  /.  if( iDocid<=
4d60: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20 7c 7c  p->iPrevDocid ||
4d70: 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
4d80: 3e 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44  >p->nMaxPendingD
4d90: 61 74 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ata ){.    int r
4da0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50  c = sqlite3Fts3P
4db0: 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68  endingTermsFlush
4dc0: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
4dd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
4de0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 2d  urn rc;.  }.  p-
4df0: 3e 69 50 72 65 76 44 6f 63 69 64 20 3d 20 69 44  >iPrevDocid = iD
4e00: 6f 63 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  ocid;.  return S
4e10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
4e20: 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  ** Discard the c
4e30: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
4e40: 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73  ending-terms has
4e50: 68 20 74 61 62 6c 65 2e 20 0a 2a 2f 0a 76 6f 69  h table. .*/.voi
4e60: 64 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e  d sqlite3Fts3Pen
4e70: 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 46  dingTermsClear(F
4e80: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
4e90: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45  Fts3HashElem *pE
4ea0: 6c 65 6d 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  lem;.  for(pElem
4eb0: 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28 26  =fts3HashFirst(&
4ec0: 70 2d 3e 70 65 6e 64 69 6e 67 54 65 72 6d 73 29  p->pendingTerms)
4ed0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 66  ; pElem; pElem=f
4ee0: 74 73 33 48 61 73 68 4e 65 78 74 28 70 45 6c 65  ts3HashNext(pEle
4ef0: 6d 29 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  m)){.    sqlite3
4f00: 5f 66 72 65 65 28 66 74 73 33 48 61 73 68 44 61  _free(fts3HashDa
4f10: 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a  ta(pElem));.  }.
4f20: 20 20 66 74 73 33 48 61 73 68 43 6c 65 61 72 28    fts3HashClear(
4f30: 26 70 2d 3e 70 65 6e 64 69 6e 67 54 65 72 6d 73  &p->pendingTerms
4f40: 29 3b 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  );.  p->nPending
4f50: 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Data = 0;.}../*.
4f60: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4f70: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
4f80: 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68  e xUpdate() meth
4f90: 6f 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  od as part of an
4fa0: 20 49 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61   INSERT.** opera
4fb0: 74 69 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e  tion. It adds en
4fc0: 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 74  tries for each t
4fd0: 65 72 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72  erm in the new r
4fe0: 65 63 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20  ecord to the.** 
4ff0: 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73  pendingTerms has
5000: 68 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  h table..**.** A
5010: 72 67 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73  rgument apVal is
5020: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
5030: 20 73 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64   similarly named
5040: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
5050: 20 74 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72   to.** fts3Inser
5060: 74 44 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74  tData(). Paramet
5070: 65 72 20 69 44 6f 63 69 64 20 69 73 20 74 68 65  er iDocid is the
5080: 20 64 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65   docid of the ne
5090: 77 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  w row..*/.static
50a0: 20 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54   int fts3InsertT
50b0: 65 72 6d 73 28 46 74 73 33 54 61 62 6c 65 20 2a  erms(Fts3Table *
50c0: 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  p, sqlite3_value
50d0: 20 2a 2a 61 70 56 61 6c 2c 20 75 33 32 20 2a 61   **apVal, u32 *a
50e0: 53 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  Sz){.  int i;   
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
5110: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
5120: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 70 2d 3e 6e   for(i=2; i<p->n
5130: 43 6f 6c 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b 0a  Column+2; i++){.
5140: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5150: 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
5160: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
5170: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69  lue_text(apVal[i
5180: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 78  ]);.    if( zTex
5190: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t ){.      int r
51a0: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
51b0: 65 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78 74  ermsAdd(p, zText
51c0: 2c 20 69 2d 32 2c 20 26 61 53 7a 5b 69 2d 32 5d  , i-2, &aSz[i-2]
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5210: 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d     aSz[p->nColum
5220: 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61  n] += sqlite3_va
5230: 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b  lue_bytes(apVal[
5240: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
5250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5260: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
5270: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
5280: 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d   the xUpdate() m
5290: 65 74 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53  ethod for an INS
52a0: 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ERT operation..*
52b0: 2a 20 54 68 65 20 61 70 56 61 6c 20 70 61 72 61  * The apVal para
52c0: 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
52d0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70  a copy of the ap
52e0: 56 61 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73  Val argument pas
52f0: 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65  sed by.** SQLite
5300: 20 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 28   to the xUpdate(
5310: 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a  ) method. i.e:.*
5320: 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20  *.**   apVal[0] 
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
5340: 6f 74 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45  ot used for INSE
5350: 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31  RT..**   apVal[1
5360: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
5370: 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61   rowid.**   apVa
5380: 6c 5b 32 5d 20 20 20 20 20 20 20 20 20 20 20 20  l[2]            
5390: 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73      Left-most us
53a0: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er-defined colum
53b0: 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20  n.**   ....**   
53c0: 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e  apVal[p->nColumn
53d0: 2b 31 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f  +1]     Right-mo
53e0: 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  st user-defined 
53f0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61  column.**   apVa
5400: 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20  l[p->nColumn+2] 
5410: 20 20 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d      Hidden colum
5420: 6e 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  n with same name
5430: 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61   as table.**   a
5440: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
5450: 33 5d 20 20 20 20 20 48 69 64 64 65 6e 20 22 64  3]     Hidden "d
5460: 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c  ocid" column (al
5470: 69 61 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a  ias for rowid).*
5480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
5490: 33 49 6e 73 65 72 74 44 61 74 61 28 0a 20 20 46  3InsertData(.  F
54a0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54c0: 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61 62 6c  * Full-text tabl
54d0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
54e0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20  alue **apVal,   
54f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
5500: 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73  of values to ins
5510: 65 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ert */.  sqlite3
5520: 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 20  _int64 *piDocid 
5530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
5540: 20 44 6f 63 69 64 20 66 6f 72 20 72 6f 77 20 6a   Docid for row j
5550: 75 73 74 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ust inserted */.
5560: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
5590: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
55a0: 5f 73 74 6d 74 20 2a 70 43 6f 6e 74 65 6e 74 49  _stmt *pContentI
55b0: 6e 73 65 72 74 3b 20 20 20 2f 2a 20 49 4e 53 45  nsert;   /* INSE
55c0: 52 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e  RT INTO %_conten
55d0: 74 20 56 41 4c 55 45 53 28 2e 2e 2e 29 20 2a 2f  t VALUES(...) */
55e0: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
55f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  e statement hand
5600: 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72  le used to inser
5610: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
5620: 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 74  %_content.  ** t
5630: 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20 66 6f  able. The SQL fo
5640: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
5650: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
5660: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63   INSERT INTO %_c
5670: 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 3f 2c  ontent VALUES(?,
5680: 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20 2a 2a   ?, ?, ...).  **
5690: 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65 6d  .  ** The statem
56a0: 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e 20 27  ent features N '
56b0: 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20 77 68  ?' variables, wh
56c0: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
56d0: 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20 2a 2a  ber of user.  **
56e0: 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
56f0: 20 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62   in the FTS3 tab
5700: 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66 6f 72  le, plus one for
5710: 20 74 68 65 20 64 6f 63 69 64 20 66 69 65 6c 64   the docid field
5720: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ..  */.  rc = ft
5730: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
5740: 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 2c  _CONTENT_INSERT,
5750: 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74   &pContentInsert
5760: 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  , &apVal[1]);.  
5770: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5780: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
5790: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
57a0: 65 72 65 20 69 73 20 61 20 71 75 69 72 6b 20 68  ere is a quirk h
57b0: 65 72 65 2e 20 54 68 65 20 75 73 65 72 73 20 49  ere. The users I
57c0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20  NSERT statement 
57d0: 6d 61 79 20 68 61 76 65 20 73 70 65 63 69 66 69  may have specifi
57e0: 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c 75 65 20  ed.  ** a value 
57f0: 66 6f 72 20 74 68 65 20 22 72 6f 77 69 64 22 20  for the "rowid" 
5800: 66 69 65 6c 64 2c 20 66 6f 72 20 74 68 65 20 22  field, for the "
5810: 64 6f 63 69 64 22 20 66 69 65 6c 64 2c 20 6f 72  docid" field, or
5820: 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 20   for both..  ** 
5830: 57 68 69 63 68 20 69 73 20 61 20 70 72 6f 62 6c  Which is a probl
5840: 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f 77 69 64  em, since "rowid
5850: 22 20 61 6e 64 20 22 64 6f 63 69 64 22 20 61 72  " and "docid" ar
5860: 65 20 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68  e aliases for th
5870: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
5880: 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  e. For example:.
5890: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45    **.  **   INSE
58a0: 52 54 20 49 4e 54 4f 20 66 74 73 33 74 62 6c 28  RT INTO fts3tbl(
58b0: 72 6f 77 69 64 2c 20 64 6f 63 69 64 29 20 56 41  rowid, docid) VA
58c0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 2a 2a  LUES(1, 2);.  **
58d0: 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33 2c 20 74  .  ** In FTS3, t
58e0: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
58f0: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
5900: 74 6f 20 73 70 65 63 69 66 79 20 6e 6f 6e 2d 4e  to specify non-N
5910: 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  ULL values.  ** 
5920: 66 6f 72 20 62 6f 74 68 20 64 6f 63 69 64 20 61  for both docid a
5930: 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 6f  nd some other ro
5940: 77 69 64 20 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a  wid alias..  */.
5950: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
5960: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
5970: 5f 74 79 70 65 28 61 70 56 61 6c 5b 33 2b 70 2d  _type(apVal[3+p-
5980: 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20  >nColumn]) ){.  
5990: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
59a0: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
59b0: 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 0a  _type(apVal[0]).
59c0: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4e       && SQLITE_N
59d0: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
59e0: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d  ue_type(apVal[1]
59f0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
5a00: 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63 69 64 20  * A rowid/docid 
5a10: 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20 20  conflict. */.   
5a20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5a30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5a40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5a50: 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f 6e 74 65  ind_value(pConte
5a60: 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20 61 70 56  ntInsert, 1, apV
5a70: 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d  al[3+p->nColumn]
5a80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
5a90: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5aa0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5ab0: 45 78 65 63 75 74 65 20 74 68 65 20 73 74 61 74  Execute the stat
5ac0: 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20  ement to insert 
5ad0: 74 68 65 20 72 65 63 6f 72 64 2e 20 53 65 74 20  the record. Set 
5ae0: 2a 70 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20  *piDocid to the 
5af0: 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63 69 64 20  .  ** new docid 
5b00: 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20 20 73  value. .  */.  s
5b10: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6f 6e  qlite3_step(pCon
5b20: 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 20 20 72  tentInsert);.  r
5b30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
5b40: 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74  t(pContentInsert
5b50: 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69 64 20 3d  );..  *piDocid =
5b60: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
5b70: 73 65 72 74 5f 72 6f 77 69 64 28 70 2d 3e 64 62  sert_rowid(p->db
5b80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5b90: 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }..../*.** Remov
5ba0: 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  e all data from 
5bb0: 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20  the FTS3 table. 
5bc0: 43 6c 65 61 72 20 74 68 65 20 68 61 73 68 20 74  Clear the hash t
5bd0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  able containing.
5be0: 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  ** pending terms
5bf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5c00: 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 46 74  fts3DeleteAll(Ft
5c10: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
5c20: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5c30: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
5c40: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
5c50: 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74  ..  /* Discard t
5c60: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
5c70: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
5c80: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
5c90: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
5ca0: 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
5cb0: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
5cc0: 65 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d 20  everything from 
5cd0: 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 2c 20 25  the %_content, %
5ce0: 5f 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f  _segments and %_
5cf0: 73 65 67 64 69 72 20 74 61 62 6c 65 73 2e 20 2a  segdir tables. *
5d00: 2f 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63 28  /.  fts3SqlExec(
5d10: 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
5d20: 54 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20  TE_ALL_CONTENT, 
5d30: 30 29 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65  0);.  fts3SqlExe
5d40: 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
5d50: 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54  LETE_ALL_SEGMENT
5d60: 53 2c 20 30 29 3b 0a 20 20 66 74 73 33 53 71 6c  S, 0);.  fts3Sql
5d70: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
5d80: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44  _DELETE_ALL_SEGD
5d90: 49 52 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d  IR, 0);.  if( p-
5da0: 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a  >bHasDocsize ){.
5db0: 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28      fts3SqlExec(
5dc0: 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
5dd0: 54 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 2c 20  TE_ALL_DOCSIZE, 
5de0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  0);.  }.  if( p-
5df0: 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20  >bHasStat ){.   
5e00: 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63   fts3SqlExec(&rc
5e10: 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  , p, SQL_DELETE_
5e20: 41 4c 4c 5f 53 54 41 54 2c 20 30 29 3b 0a 20 20  ALL_STAT, 0);.  
5e30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5e40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
5e50: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65  t element in the
5e60: 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69   apVal[] array i
5e70: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
5e80: 74 61 69 6e 20 74 68 65 20 64 6f 63 69 64 0a 2a  tain the docid.*
5e90: 2a 20 28 61 6e 20 69 6e 74 65 67 65 72 29 20 6f  * (an integer) o
5ea0: 66 20 61 20 72 6f 77 20 61 62 6f 75 74 20 74 6f  f a row about to
5eb0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 52 65 6d   be deleted. Rem
5ec0: 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73 20 66 72  ove all terms fr
5ed0: 6f 6d 20 74 68 65 0a 2a 2a 20 66 75 6c 6c 2d 74  om the.** full-t
5ee0: 65 78 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ext index..*/.st
5ef0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 44 65  atic void fts3De
5f00: 6c 65 74 65 54 65 72 6d 73 28 20 0a 20 20 69 6e  leteTerms( .  in
5f10: 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20  t *pRC,         
5f20: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
5f30: 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61  code */.  Fts3Ta
5f40: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
5f50: 20 20 2f 2a 20 54 68 65 20 46 54 53 20 74 61 62    /* The FTS tab
5f60: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f  le to delete fro
5f70: 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  m */.  sqlite3_v
5f80: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 2f  alue **apVal,  /
5f90: 2a 20 61 70 56 61 6c 5b 5d 20 63 6f 6e 74 61 69  * apVal[] contai
5fa0: 6e 73 20 74 68 65 20 64 6f 63 69 64 20 74 6f 20  ns the docid to 
5fb0: 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
5fc0: 75 33 32 20 2a 61 53 7a 20 20 20 20 20 20 20 20  u32 *aSz        
5fd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
5fe0: 20 6f 66 20 64 65 6c 65 74 65 64 20 64 6f 63 75   of deleted docu
5ff0: 6d 65 6e 74 20 77 72 69 74 74 65 6e 20 68 65 72  ment written her
6000: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
6010: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
6020: 20 2a 70 53 65 6c 65 63 74 3b 0a 0a 20 20 69 66   *pSelect;..  if
6030: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
6040: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
6050: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
6060: 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57  T_CONTENT_BY_ROW
6070: 49 44 2c 20 26 70 53 65 6c 65 63 74 2c 20 61 70  ID, &pSelect, ap
6080: 56 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Val);.  if( rc==
6090: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
60a0: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
60b0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
60c0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
60d0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
60e0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 43 6f 6c  (i=1; i<=p->nCol
60f0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
6100: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6110: 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
6120: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
6130: 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74  umn_text(pSelect
6140: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , i);.        rc
6150: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
6160: 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78 74 2c  rmsAdd(p, zText,
6170: 20 2d 31 2c 20 26 61 53 7a 5b 69 2d 31 5d 29 3b   -1, &aSz[i-1]);
6180: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
6190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
61a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
61b0: 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a  reset(pSelect);.
61c0: 20 20 20 20 20 20 20 20 20 20 2a 70 52 43 20 3d            *pRC =
61d0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 72   rc;.          r
61e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
61f0: 0a 20 20 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e  .        aSz[p->
6200: 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69  nColumn] += sqli
6210: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
6220: 28 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20  (pSelect, i);.  
6230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6240: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
6250: 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  et(pSelect);.  }
6260: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6270: 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29  3_reset(pSelect)
6280: 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72  ;.  }.  *pRC = r
6290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  c;.}../*.** Forw
62a0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
62b0: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
62c0: 68 65 20 63 69 72 63 75 6c 61 72 20 64 65 70 65  he circular depe
62d0: 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a  ndency between.*
62e0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 33  * functions fts3
62f0: 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 29 20 61  SegmentMerge() a
6300: 6e 64 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53  nd fts3AllocateS
6310: 65 67 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73  egdirIdx()..*/.s
6320: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
6330: 67 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33 54  gmentMerge(Fts3T
6340: 61 62 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  able *, int);../
6350: 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
6360: 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
6370: 6e 65 77 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c  new level iLevel
6380: 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 65   index in the se
6390: 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 20 55  gdir table..** U
63a0: 73 75 61 6c 6c 79 2c 20 69 6e 64 65 78 65 73 20  sually, indexes 
63b0: 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  are allocated wi
63c0: 74 68 69 6e 20 61 20 6c 65 76 65 6c 20 73 65 71  thin a level seq
63d0: 75 65 6e 74 69 61 6c 6c 79 20 73 74 61 72 74 69  uentially starti
63e0: 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2c 20 73 6f  ng.** with 0, so
63f0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69   the allocated i
6400: 6e 64 65 78 20 69 73 20 6f 6e 65 20 67 72 65 61  ndex is one grea
6410: 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
6420: 75 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62  ue returned.** b
6430: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
6440: 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20  T max(idx) FROM 
6450: 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c  %_segdir WHERE l
6460: 65 76 65 6c 20 3d 20 3a 69 4c 65 76 65 6c 0a 2a  evel = :iLevel.*
6470: 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
6480: 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
6490: 64 79 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f  dy FTS3_MERGE_CO
64a0: 55 4e 54 20 69 6e 64 65 78 65 73 20 61 74 20 74  UNT indexes at t
64b0: 68 65 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  he requested.** 
64c0: 6c 65 76 65 6c 2c 20 74 68 65 79 20 61 72 65 20  level, they are 
64d0: 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73 69  merged into a si
64e0: 6e 67 6c 65 20 6c 65 76 65 6c 20 28 69 4c 65 76  ngle level (iLev
64f0: 65 6c 2b 31 29 20 73 65 67 6d 65 6e 74 20 61 6e  el+1) segment an
6500: 64 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  d the .** alloca
6510: 74 65 64 20 69 6e 64 65 78 20 69 73 20 30 2e 0a  ted index is 0..
6520: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
6530: 66 75 6c 2c 20 2a 70 69 49 64 78 20 69 73 20 73  ful, *piIdx is s
6540: 65 74 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  et to the alloca
6550: 74 65 64 20 69 6e 64 65 78 20 73 6c 6f 74 20 61  ted index slot a
6560: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
6570: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
6580: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
6590: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
65a0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
65b0: 20 69 6e 74 20 66 74 73 33 41 6c 6c 6f 63 61 74   int fts3Allocat
65c0: 65 53 65 67 64 69 72 49 64 78 28 46 74 73 33 54  eSegdirIdx(Fts3T
65d0: 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 4c 65  able *p, int iLe
65e0: 76 65 6c 2c 20 69 6e 74 20 2a 70 69 49 64 78 29  vel, int *piIdx)
65f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
6620: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
6630: 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b 20  stmt *pNextIdx; 
6640: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
6650: 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61 74   for next idx at
6660: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a 2f   level iLevel */
6670: 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20 30  .  int iNext = 0
6680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6690: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
66a0: 71 75 65 72 79 20 70 4e 65 78 74 49 64 78 20 2a  query pNextIdx *
66b0: 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 76 61 72 69  /..  /* Set vari
66c0: 61 62 6c 65 20 69 4e 65 78 74 20 74 6f 20 74 68  able iNext to th
66d0: 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  e next available
66e0: 20 73 65 67 64 69 72 20 69 6e 64 65 78 20 61 74   segdir index at
66f0: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 2a   level iLevel. *
6700: 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
6710: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54  Stmt(p, SQL_NEXT
6720: 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20  _SEGMENT_INDEX, 
6730: 26 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20  &pNextIdx, 0);. 
6740: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6750: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
6760: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 4e 65 78 74  3_bind_int(pNext
6770: 49 64 78 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b  Idx, 1, iLevel);
6780: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
6790: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
67a0: 70 28 70 4e 65 78 74 49 64 78 29 20 29 7b 0a 20  p(pNextIdx) ){. 
67b0: 20 20 20 20 20 69 4e 65 78 74 20 3d 20 73 71 6c       iNext = sql
67c0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
67d0: 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20  pNextIdx, 0);.  
67e0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
67f0: 69 74 65 33 5f 72 65 73 65 74 28 70 4e 65 78 74  ite3_reset(pNext
6800: 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Idx);.  }..  if(
6810: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6820: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 4e 65 78  {.    /* If iNex
6830: 74 20 69 73 20 46 54 53 33 5f 4d 45 52 47 45 5f  t is FTS3_MERGE_
6840: 43 4f 55 4e 54 2c 20 69 6e 64 69 63 61 74 69 6e  COUNT, indicatin
6850: 67 20 74 68 61 74 20 6c 65 76 65 6c 20 69 4c 65  g that level iLe
6860: 76 65 6c 20 69 73 20 61 6c 72 65 61 64 79 0a 20  vel is already. 
6870: 20 20 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72 67     ** full, merg
6880: 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  e all segments i
6890: 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69  n level iLevel i
68a0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c 65  nto a single iLe
68b0: 76 65 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65 67  vel+1.    ** seg
68c0: 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61 74  ment and allocat
68d0: 65 20 28 6e 65 77 6c 79 20 66 72 65 65 64 29 20  e (newly freed) 
68e0: 69 6e 64 65 78 20 30 20 61 74 20 6c 65 76 65 6c  index 0 at level
68f0: 20 69 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77 69   iLevel. Otherwi
6900: 73 65 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69 4e  se,.    ** if iN
6910: 65 78 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ext is less than
6920: 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e   FTS3_MERGE_COUN
6930: 54 2c 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64 65  T, allocate inde
6940: 78 20 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f 0a  x iNext..    */.
6950: 20 20 20 20 69 66 28 20 69 4e 65 78 74 3e 3d 46      if( iNext>=F
6960: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20  TS3_MERGE_COUNT 
6970: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ){.      rc = ft
6980: 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70  s3SegmentMerge(p
6990: 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , iLevel);.     
69a0: 20 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20 20 20   *piIdx = 0;.   
69b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
69c0: 69 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a 20 20  iIdx = iNext;.  
69d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
69e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
69f0: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
6a00: 62 6c 65 20 69 73 20 64 65 63 6c 61 72 65 64 20  ble is declared 
6a10: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
6a20: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
6a30: 20 25 5f 73 65 67 6d 65 6e 74 73 28 62 6c 6f 63   %_segments(bloc
6a40: 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  kid INTEGER PRIM
6a50: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
6a60: 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  LOB).**.** This 
6a70: 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 64  function reads d
6a80: 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ata from a singl
6a90: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 25 5f 73  e row of the %_s
6aa0: 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20 54  egments table. T
6ab0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 72  he.** specific r
6ac0: 6f 77 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  ow is identified
6ad0: 20 62 79 20 74 68 65 20 69 42 6c 6f 63 6b 69 64   by the iBlockid
6ae0: 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20 70   parameter. If p
6af0: 61 42 6c 6f 62 20 69 73 20 6e 6f 74 0a 2a 2a 20  aBlob is not.** 
6b00: 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 62 75 66  NULL, then a buf
6b10: 66 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  fer is allocated
6b20: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d   using sqlite3_m
6b30: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 70 75  alloc() and popu
6b40: 6c 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  lated.** with th
6b50: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
6b60: 65 20 62 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e  e blob stored in
6b70: 20 74 68 65 20 22 62 6c 6f 63 6b 22 20 63 6f 6c   the "block" col
6b80: 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69  umn of the .** i
6b90: 64 65 6e 74 69 66 69 65 64 20 74 61 62 6c 65 20  dentified table 
6ba0: 72 6f 77 20 69 73 2e 20 57 68 65 74 68 65 72 20  row is. Whether 
6bb0: 6f 72 20 6e 6f 74 20 70 61 42 6c 6f 62 20 69 73  or not paBlob is
6bc0: 20 4e 55 4c 4c 2c 20 2a 70 6e 42 6c 6f 62 20 69   NULL, *pnBlob i
6bd0: 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  s set.** to the 
6be0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
6bf0: 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
6c00: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
6c10: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6c20: 63 75 72 73 2c 20 6f 72 20 74 68 65 20 74 61 62  curs, or the tab
6c30: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  le does not cont
6c40: 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65  ain the specifie
6c50: 64 20 72 6f 77 2c 0a 2a 2a 20 61 6e 20 53 51 4c  d row,.** an SQL
6c60: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
6c70: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
6c80: 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
6c90: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
6ca0: 0a 2a 2a 20 70 61 42 6c 6f 62 20 69 73 20 6e 6f  .** paBlob is no
6cb0: 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  n-NULL, then it 
6cc0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
6cd0: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
6ce0: 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e 74 75  ler to.** eventu
6cf0: 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72 65  ally free the re
6d00: 74 75 72 6e 65 64 20 62 75 66 66 65 72 2e 0a 2a  turned buffer..*
6d10: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6d20: 6f 6e 20 6d 61 79 20 6c 65 61 76 65 20 61 6e 20  on may leave an 
6d30: 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 62 6c 6f  open sqlite3_blo
6d40: 62 2a 20 68 61 6e 64 6c 65 20 69 6e 20 74 68 65  b* handle in the
6d50: 0a 2a 2a 20 46 74 73 33 54 61 62 6c 65 2e 70 53  .** Fts3Table.pS
6d60: 65 67 6d 65 6e 74 73 20 76 61 72 69 61 62 6c 65  egments variable
6d70: 2e 20 54 68 69 73 20 68 61 6e 64 6c 65 20 69 73  . This handle is
6d80: 20 72 65 75 73 65 64 20 62 79 20 73 75 62 73 65   reused by subse
6d90: 71 75 65 6e 74 20 63 61 6c 6c 73 0a 2a 2a 20 74  quent calls.** t
6da0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
6db0: 20 54 68 65 20 68 61 6e 64 6c 65 20 6d 61 79 20   The handle may 
6dc0: 62 65 20 63 6c 6f 73 65 64 20 62 79 20 63 61 6c  be closed by cal
6dd0: 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ling the.** sqli
6de0: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
6df0: 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lose() function.
6e00: 20 52 65 75 73 69 6e 67 20 61 20 62 6c 6f 62 20   Reusing a blob 
6e10: 68 61 6e 64 6c 65 20 69 73 20 61 20 68 61 6e 64  handle is a hand
6e20: 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  y.** performance
6e30: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2c 20 62 75   improvement, bu
6e40: 74 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c  t the blob handl
6e50: 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
6e60: 62 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 65 66  be closed.** bef
6e70: 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 72  ore control is r
6e80: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
6e90: 73 65 72 20 28 74 6f 20 70 72 65 76 65 6e 74 20  ser (to prevent 
6ea0: 61 20 6c 6f 63 6b 20 62 65 69 6e 67 20 68 65 6c  a lock being hel
6eb0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  d.** on the data
6ec0: 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6c 6f  base file for lo
6ed0: 6e 67 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  nger than necess
6ee0: 61 72 79 29 2e 20 54 68 75 73 2c 20 61 6e 79 20  ary). Thus, any 
6ef0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2a  virtual table.**
6f00: 20 6d 65 74 68 6f 64 20 28 78 46 69 6c 74 65 72   method (xFilter
6f10: 20 65 74 63 2e 29 20 74 68 61 74 20 6d 61 79 20   etc.) that may 
6f20: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
6f30: 72 65 63 74 6c 79 20 63 61 6c 6c 20 74 68 69 73  rectly call this
6f40: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
6f50: 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 46 74  t call sqlite3Ft
6f60: 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
6f70: 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
6f80: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
6f90: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
6fa0: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
6fd0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
6fe0: 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63  ite3_int64 iBloc
6ff0: 6b 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  kid,         /* 
7000: 41 63 63 65 73 73 20 74 68 65 20 72 6f 77 20 77  Access the row w
7010: 69 74 68 20 62 6c 6f 63 6b 69 64 3d 24 69 42 6c  ith blockid=$iBl
7020: 6f 63 6b 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  ockid */.  char 
7030: 2a 2a 70 61 42 6c 6f 62 2c 20 20 20 20 20 20 20  **paBlob,       
7040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7050: 54 3a 20 42 6c 6f 62 20 64 61 74 61 20 69 6e 20  T: Blob data in 
7060: 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72 20  malloc'd buffer 
7070: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 6c 6f 62  */.  int *pnBlob
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
70a0: 65 20 6f 66 20 62 6c 6f 62 20 64 61 74 61 20 2a  e of blob data *
70b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
70e0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 70   code */..  /* p
70f0: 6e 42 6c 6f 62 20 6d 75 73 74 20 62 65 20 6e 6f  nBlob must be no
7100: 6e 2d 4e 55 4c 4c 2e 20 70 61 42 6c 6f 62 20 6d  n-NULL. paBlob m
7110: 61 79 20 62 65 20 4e 55 4c 4c 20 6f 72 20 6e 6f  ay be NULL or no
7120: 6e 2d 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73  n-NULL. */.  ass
7130: 65 72 74 28 20 70 6e 42 6c 6f 62 29 3b 0a 0a 20  ert( pnBlob);.. 
7140: 20 69 66 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74   if( p->pSegment
7150: 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  s ){.    rc = sq
7160: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
7170: 6e 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20  n(p->pSegments, 
7180: 69 42 6c 6f 63 6b 69 64 29 3b 0a 20 20 7d 65 6c  iBlockid);.  }el
7190: 73 65 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  se{.    if( 0==p
71a0: 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 29  ->zSegmentsTbl )
71b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 53 65 67 6d  {.      p->zSegm
71c0: 65 6e 74 73 54 62 6c 20 3d 20 73 71 6c 69 74 65  entsTbl = sqlite
71d0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 5f 73 65  3_mprintf("%s_se
71e0: 67 6d 65 6e 74 73 22 2c 20 70 2d 3e 7a 4e 61 6d  gments", p->zNam
71f0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  e);.      if( 0=
7200: 3d 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c  =p->zSegmentsTbl
7210: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7220: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
7230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
7240: 6c 6f 62 5f 6f 70 65 6e 28 0a 20 20 20 20 20 20  lob_open(.      
7250: 20 70 2d 3e 64 62 2c 20 70 2d 3e 7a 44 62 2c 20   p->db, p->zDb, 
7260: 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 2c  p->zSegmentsTbl,
7270: 20 22 62 6c 6f 63 6b 22 2c 20 69 42 6c 6f 63 6b   "block", iBlock
7280: 69 64 2c 20 30 2c 20 26 70 2d 3e 70 53 65 67 6d  id, 0, &p->pSegm
7290: 65 6e 74 73 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  ents.    );.  }.
72a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
72b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
72c0: 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  nByte = sqlite3_
72d0: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 53  blob_bytes(p->pS
72e0: 65 67 6d 65 6e 74 73 29 3b 0a 20 20 20 20 69 66  egments);.    if
72f0: 28 20 70 61 42 6c 6f 62 20 29 7b 0a 20 20 20 20  ( paBlob ){.    
7300: 20 20 63 68 61 72 20 2a 61 42 79 74 65 20 3d 20    char *aByte = 
7310: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
7320: 42 79 74 65 20 2b 20 46 54 53 33 5f 4e 4f 44 45  Byte + FTS3_NODE
7330: 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 20  _PADDING);.     
7340: 20 69 66 28 20 21 61 42 79 74 65 20 29 7b 0a 20   if( !aByte ){. 
7350: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
7360: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
7380: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
7390: 5f 72 65 61 64 28 70 2d 3e 70 53 65 67 6d 65 6e  _read(p->pSegmen
73a0: 74 73 2c 20 61 42 79 74 65 2c 20 6e 42 79 74 65  ts, aByte, nByte
73b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  , 0);.        me
73c0: 6d 73 65 74 28 26 61 42 79 74 65 5b 6e 42 79 74  mset(&aByte[nByt
73d0: 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44 45  e], 0, FTS3_NODE
73e0: 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 20  _PADDING);.     
73f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7400: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7410: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
7420: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Byte);.         
7430: 20 61 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   aByte = 0;.    
7440: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7450: 20 20 20 20 2a 70 61 42 6c 6f 62 20 3d 20 61 42      *paBlob = aB
7460: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  yte;.    }.    *
7470: 70 6e 42 6c 6f 62 20 3d 20 6e 42 79 74 65 3b 0a  pnBlob = nByte;.
7480: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
7490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
74a0: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
74b0: 20 61 74 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73   at p->pSegments
74c0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
74d0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
74e0: 6f 76 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ove.** the sqlit
74f0: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
7500: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  ) function for d
7510: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
7520: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
7530: 6e 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61 62  ntsClose(Fts3Tab
7540: 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  le *p){.  sqlite
7550: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
7560: 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20 70 2d  pSegments);.  p-
7570: 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a  >pSegments = 0;.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
7590: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
75a0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
75b0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e  rgument to the n
75c0: 65 78 74 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ext term in the.
75d0: 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73  ** segment. If s
75e0: 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
75f0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
7600: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
7610: 20 6e 65 78 74 20 74 65 72 6d 2c 0a 2a 2a 20 53   next term,.** S
7620: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 74 68 65  QLITE_DONE. Othe
7630: 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
7640: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
7650: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
7660: 65 67 52 65 61 64 65 72 4e 65 78 74 28 46 74 73  egReaderNext(Fts
7670: 33 54 61 62 6c 65 20 2a 70 2c 20 46 74 73 33 53  3Table *p, Fts3S
7680: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
7690: 72 29 7b 0a 20 20 63 68 61 72 20 2a 70 4e 65 78  r){.  char *pNex
76a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
76b0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
76c0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
76d0: 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  t nPrefix;      
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
76f0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7700: 20 69 6e 20 74 65 72 6d 20 70 72 65 66 69 78 20   in term prefix 
7710: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78  */.  int nSuffix
7720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7730: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7740: 66 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20  f bytes in term 
7750: 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69 66 28  suffix */..  if(
7760: 20 21 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c   !pReader->aDocl
7770: 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 65 78 74  ist ){.    pNext
7780: 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64   = pReader->aNod
7790: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
77a0: 70 4e 65 78 74 20 3d 20 26 70 52 65 61 64 65 72  pNext = &pReader
77b0: 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64  ->aDoclist[pRead
77c0: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20  er->nDoclist];. 
77d0: 20 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65 78 74   }..  if( !pNext
77e0: 20 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52 65 61   || pNext>=&pRea
77f0: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
7800: 65 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a 20 20  er->nNode] ){.  
7810: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
7840: 72 6f 6d 20 46 74 73 33 52 65 61 64 42 6c 6f 63  rom Fts3ReadBloc
7850: 6b 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  k() */..    if( 
7860: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
7870: 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20  ending(pReader) 
7880: 29 7b 0a 20 20 20 20 20 20 46 74 73 33 48 61 73  ){.      Fts3Has
7890: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d 20 2a  hElem *pElem = *
78a0: 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74  (pReader->ppNext
78b0: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Elem);.      if(
78c0: 20 70 45 6c 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pElem==0 ){.   
78d0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e       pReader->aN
78e0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ode = 0;.      }
78f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 65  else{.        Pe
7900: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
7910: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
7920: 2a 29 66 74 73 33 48 61 73 68 44 61 74 61 28 70  *)fts3HashData(p
7930: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70  Elem);.        p
7940: 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20  Reader->zTerm = 
7950: 28 63 68 61 72 20 2a 29 66 74 73 33 48 61 73 68  (char *)fts3Hash
7960: 4b 65 79 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  Key(pElem);.    
7970: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65      pReader->nTe
7980: 72 6d 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79  rm = fts3HashKey
7990: 73 69 7a 65 28 70 45 6c 65 6d 29 3b 0a 20 20 20  size(pElem);.   
79a0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e       pReader->nN
79b0: 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e  ode = pReader->n
79c0: 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73 74 2d  Doclist = pList-
79d0: 3e 6e 44 61 74 61 20 2b 20 31 3b 0a 20 20 20 20  >nData + 1;.    
79e0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f      pReader->aNo
79f0: 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 44  de = pReader->aD
7a00: 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e  oclist = pList->
7a10: 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70  aData;.        p
7a20: 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c  Reader->ppNextEl
7a30: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  em++;.        as
7a40: 73 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61  sert( pReader->a
7a50: 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 7d 0a  Node );.      }.
7a60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7a70: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
7a80: 20 20 20 69 66 28 20 21 66 74 73 33 53 65 67 52     if( !fts3SegR
7a90: 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28  eaderIsRootOnly(
7aa0: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
7ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7ac0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a  Reader->aNode);.
7ad0: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65      }.    pReade
7ae0: 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 0a 20  r->aNode = 0;.. 
7af0: 20 20 20 2f 2a 20 49 66 20 69 43 75 72 72 65 6e     /* If iCurren
7b00: 74 42 6c 6f 63 6b 3e 3d 69 4c 65 61 66 45 6e 64  tBlock>=iLeafEnd
7b10: 42 6c 6f 63 6b 2c 20 74 68 69 73 20 69 73 20 61  Block, this is a
7b20: 6e 20 45 4f 46 20 63 6f 6e 64 69 74 69 6f 6e 2e  n EOF condition.
7b30: 20 41 6c 6c 20 6c 65 61 66 20 0a 20 20 20 20 2a   All leaf .    *
7b40: 2a 20 62 6c 6f 63 6b 73 20 68 61 76 65 20 61 6c  * blocks have al
7b50: 72 65 61 64 79 20 62 65 65 6e 20 74 72 61 76 65  ready been trave
7b60: 72 73 65 64 2e 20 20 2a 2f 0a 20 20 20 20 61 73  rsed.  */.    as
7b70: 73 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 69  sert( pReader->i
7b80: 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3c 3d 70 52  CurrentBlock<=pR
7b90: 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42  eader->iLeafEndB
7ba0: 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20  lock );.    if( 
7bb0: 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e  pReader->iCurren
7bc0: 74 42 6c 6f 63 6b 3e 3d 70 52 65 61 64 65 72 2d  tBlock>=pReader-
7bd0: 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 29  >iLeafEndBlock )
7be0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7bf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
7c00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7c10: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 0a  3Fts3ReadBlock(.
7c20: 20 20 20 20 20 20 20 20 70 2c 20 2b 2b 70 52 65          p, ++pRe
7c30: 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c  ader->iCurrentBl
7c40: 6f 63 6b 2c 20 26 70 52 65 61 64 65 72 2d 3e 61  ock, &pReader->a
7c50: 4e 6f 64 65 2c 20 26 70 52 65 61 64 65 72 2d 3e  Node, &pReader->
7c60: 6e 4e 6f 64 65 0a 20 20 20 20 29 3b 0a 20 20 20  nNode.    );.   
7c70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7c80: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7c90: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61      pNext = pRea
7ca0: 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a  der->aNode;.  }.
7cb0: 20 20 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20    .  /* Because 
7cc0: 6f 66 20 74 68 65 20 46 54 53 33 5f 4e 4f 44 45  of the FTS3_NODE
7cd0: 5f 50 41 44 44 49 4e 47 20 62 79 74 65 73 20 6f  _PADDING bytes o
7ce0: 66 20 70 61 64 64 69 6e 67 2c 20 74 68 65 20 66  f padding, the f
7cf0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 0a 20 20 2a  ollowing is .  *
7d00: 2a 20 73 61 66 65 20 28 6e 6f 20 72 69 73 6b 20  * safe (no risk 
7d10: 6f 66 20 6f 76 65 72 72 65 61 64 29 20 65 76 65  of overread) eve
7d20: 6e 20 69 66 20 74 68 65 20 6e 6f 64 65 20 64 61  n if the node da
7d30: 74 61 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  ta is corrupted.
7d40: 20 20 0a 20 20 2a 2f 0a 20 20 70 4e 65 78 74 20    .  */.  pNext 
7d50: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
7d60: 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c  tVarint32(pNext,
7d70: 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 70 4e   &nPrefix);.  pN
7d80: 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ext += sqlite3Ft
7d90: 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e  s3GetVarint32(pN
7da0: 65 78 74 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a  ext, &nSuffix);.
7db0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 3c 30 20    if( nPrefix<0 
7dc0: 7c 7c 20 6e 53 75 66 66 69 78 3c 3d 30 20 0a 20  || nSuffix<=0 . 
7dd0: 20 20 7c 7c 20 26 70 4e 65 78 74 5b 6e 53 75 66    || &pNext[nSuf
7de0: 66 69 78 5d 3e 26 70 52 65 61 64 65 72 2d 3e 61  fix]>&pReader->a
7df0: 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e  Node[pReader->nN
7e00: 6f 64 65 5d 20 0a 20 20 29 7b 0a 20 20 20 20 72  ode] .  ){.    r
7e10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7e20: 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RUPT;.  }..  if(
7e30: 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78   nPrefix+nSuffix
7e40: 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41  >pReader->nTermA
7e50: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
7e60: 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66 69 78 2b  nNew = (nPrefix+
7e70: 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20 20 20 20  nSuffix)*2;.    
7e80: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c  char *zNew = sql
7e90: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 52 65  ite3_realloc(pRe
7ea0: 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65  ader->zTerm, nNe
7eb0: 77 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4e 65  w);.    if( !zNe
7ec0: 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  w ){.      retur
7ed0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7ee0: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65      }.    pReade
7ef0: 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b  r->zTerm = zNew;
7f00: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54  .    pReader->nT
7f10: 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  ermAlloc = nNew;
7f20: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
7f30: 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 5b 6e 50  Reader->zTerm[nP
7f40: 72 65 66 69 78 5d 2c 20 70 4e 65 78 74 2c 20 6e  refix], pNext, n
7f50: 53 75 66 66 69 78 29 3b 0a 20 20 70 52 65 61 64  Suffix);.  pRead
7f60: 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 50 72 65  er->nTerm = nPre
7f70: 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20 20 70  fix+nSuffix;.  p
7f80: 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66 69 78 3b  Next += nSuffix;
7f90: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69  .  pNext += sqli
7fa0: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
7fb0: 33 32 28 70 4e 65 78 74 2c 20 26 70 52 65 61 64  32(pNext, &pRead
7fc0: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  er->nDoclist);. 
7fd0: 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69   pReader->aDocli
7fe0: 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 70 52  st = pNext;.  pR
7ff0: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
8000: 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68  st = 0;..  /* Ch
8010: 65 63 6b 20 74 68 61 74 20 74 68 65 20 64 6f 63  eck that the doc
8020: 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20 61 70  list does not ap
8030: 70 65 61 72 20 74 6f 20 65 78 74 65 6e 64 20 70  pear to extend p
8040: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
8050: 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 6e  he.  ** b-tree n
8060: 6f 64 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68  ode. And that th
8070: 65 20 66 69 6e 61 6c 20 62 79 74 65 20 6f 66 20  e final byte of 
8080: 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20 30  the doclist is 0
8090: 78 30 30 2e 20 49 66 20 65 69 74 68 65 72 20 0a  x00. If either .
80a0: 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20 73 74    ** of these st
80b0: 61 74 65 6d 65 6e 74 73 20 69 73 20 75 6e 74 72  atements is untr
80c0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
80d0: 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  a structure is c
80e0: 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a 20 20 69  orrupt..  */.  i
80f0: 66 28 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f  f( &pReader->aDo
8100: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
8110: 44 6f 63 6c 69 73 74 5d 3e 26 70 52 65 61 64 65  Doclist]>&pReade
8120: 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72  r->aNode[pReader
8130: 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 20 7c 7c 20  ->nNode] .   || 
8140: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
8150: 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  t[pReader->nDocl
8160: 69 73 74 2d 31 5d 0a 20 20 29 7b 0a 20 20 20 20  ist-1].  ){.    
8170: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8180: 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  RRUPT;.  }.  ret
8190: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
81a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
81b0: 53 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69  SegReader to poi
81c0: 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
81d0: 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63  docid in the doc
81e0: 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a  list associated.
81f0: 2a 2a 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ** with the curr
8200: 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  ent term..*/.sta
8210: 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67  tic void fts3Seg
8220: 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64  ReaderFirstDocid
8230: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
8240: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20  pReader){.  int 
8250: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  n;.  assert( pRe
8260: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29  ader->aDoclist )
8270: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52 65  ;.  assert( !pRe
8280: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
8290: 74 20 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  t );.  n = sqlit
82a0: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
82b0: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
82c0: 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f  t, &pReader->iDo
82d0: 63 69 64 29 3b 0a 20 20 70 52 65 61 64 65 72 2d  cid);.  pReader-
82e0: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 26  >pOffsetList = &
82f0: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
8300: 74 5b 6e 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  t[n];.}../*.** A
8310: 64 76 61 6e 63 65 20 74 68 65 20 53 65 67 52 65  dvance the SegRe
8320: 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ader to point to
8330: 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20   the next docid 
8340: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a  in the doclist.*
8350: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
8360: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  h the current te
8370: 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 61 72  rm..** .** If ar
8380: 67 75 6d 65 6e 74 73 20 70 70 4f 66 66 73 65 74  guments ppOffset
8390: 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66 66 73 65  List and pnOffse
83a0: 74 4c 69 73 74 20 61 72 65 20 6e 6f 74 20 4e 55  tList are not NU
83b0: 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a 70 70  LL, then .** *pp
83c0: 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20 73 65  OffsetList is se
83d0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
83e0: 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2d 6f  e first column-o
83f0: 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a 20 69 6e  ffset list.** in
8400: 20 74 68 65 20 64 6f 63 6c 69 73 74 20 65 6e 74   the doclist ent
8410: 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65 64 69 61  ry (i.e. immedia
8420: 74 65 6c 79 20 70 61 73 74 20 74 68 65 20 64 6f  tely past the do
8430: 63 69 64 20 76 61 72 69 6e 74 29 2e 0a 2a 2a 20  cid varint)..** 
8440: 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 69 73  *pnOffsetList is
8450: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 65 6e 67   set to the leng
8460: 74 68 20 6f 66 20 74 68 65 20 73 65 74 20 6f 66  th of the set of
8470: 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 0a 2a   column-offset.*
8480: 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20 69 6e 63  * lists, not inc
8490: 6c 75 64 69 6e 67 20 74 68 65 20 6e 75 6c 2d 74  luding the nul-t
84a0: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 2e 20  erminator byte. 
84b0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2f 0a  For example:.*/.
84c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
84d0: 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63  SegReaderNextDoc
84e0: 69 64 28 0a 20 20 46 74 73 33 53 65 67 52 65 61  id(.  Fts3SegRea
84f0: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 0a 20 20  der *pReader,.  
8500: 63 68 61 72 20 2a 2a 70 70 4f 66 66 73 65 74 4c  char **ppOffsetL
8510: 69 73 74 2c 0a 20 20 69 6e 74 20 2a 70 6e 4f 66  ist,.  int *pnOf
8520: 66 73 65 74 4c 69 73 74 0a 29 7b 0a 20 20 63 68  fsetList.){.  ch
8530: 61 72 20 2a 70 20 3d 20 70 52 65 61 64 65 72 2d  ar *p = pReader-
8540: 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20  >pOffsetList;.  
8550: 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20 2f  char c = 0;..  /
8560: 2a 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72  * Pointer p curr
8570: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20  ently points at 
8580: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
8590: 66 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74  f an offset list
85a0: 2e 20 54 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  . The.  ** follo
85b0: 77 69 6e 67 20 74 77 6f 20 6c 69 6e 65 73 20 61  wing two lines a
85c0: 64 76 61 6e 63 65 20 69 74 20 74 6f 20 70 6f 69  dvance it to poi
85d0: 6e 74 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74  nt one byte past
85e0: 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 2a 2a   the end of.  **
85f0: 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65 74   the same offset
8600: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 77 68   list..  */.  wh
8610: 69 6c 65 28 20 2a 70 20 7c 20 63 20 29 20 63 20  ile( *p | c ) c 
8620: 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20  = *p++ & 0x80;. 
8630: 20 70 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 66 20 72   p++;..  /* If r
8640: 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
8650: 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
8660: 69 61 62 6c 65 73 20 77 69 74 68 20 61 20 70 6f  iables with a po
8670: 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65  inter to and the
8680: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
8690: 65 20 70 72 65 76 69 6f 75 73 20 6f 66 66 73 65  e previous offse
86a0: 74 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  t-list..  */.  i
86b0: 66 28 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f( ppOffsetList 
86c0: 29 7b 0a 20 20 20 20 2a 70 70 4f 66 66 73 65 74  ){.    *ppOffset
86d0: 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e  List = pReader->
86e0: 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20  pOffsetList;.   
86f0: 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d   *pnOffsetList =
8700: 20 28 69 6e 74 29 28 70 20 2d 20 70 52 65 61 64   (int)(p - pRead
8710: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
8720: 2d 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  - 1);.  }..  /* 
8730: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
8740: 6d 6f 72 65 20 65 6e 74 72 69 65 73 20 69 6e 20  more entries in 
8750: 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 73 65 74  the doclist, set
8760: 20 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 0a   pOffsetList to.
8770: 20 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68 65 72    ** NULL. Other
8780: 77 69 73 65 2c 20 73 65 74 20 46 74 73 33 53 65  wise, set Fts3Se
8790: 67 52 65 61 64 65 72 2e 69 44 6f 63 69 64 20 74  gReader.iDocid t
87a0: 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64  o the next docid
87b0: 20 61 6e 64 0a 20 20 2a 2a 20 46 74 73 33 53 65   and.  ** Fts3Se
87c0: 67 52 65 61 64 65 72 2e 70 4f 66 66 73 65 74 4c  gReader.pOffsetL
87d0: 69 73 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ist to point to 
87e0: 74 68 65 20 6e 65 78 74 20 6f 66 66 73 65 74 20  the next offset 
87f0: 6c 69 73 74 20 62 65 66 6f 72 65 0a 20 20 2a 2a  list before.  **
8800: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
8810: 0a 20 20 69 66 28 20 70 3e 3d 26 70 52 65 61 64  .  if( p>=&pRead
8820: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65  er->aDoclist[pRe
8830: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 20  ader->nDoclist] 
8840: 29 7b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e  ){.    pReader->
8850: 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b  pOffsetList = 0;
8860: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
8870: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
8880: 74 61 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d  ta;.    pReader-
8890: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70  >pOffsetList = p
88a0: 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   + sqlite3Fts3Ge
88b0: 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44 65 6c  tVarint(p, &iDel
88c0: 74 61 29 3b 0a 20 20 20 20 70 52 65 61 64 65 72  ta);.    pReader
88d0: 2d 3e 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c  ->iDocid += iDel
88e0: 74 61 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta;.  }.}../*.**
88f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
8900: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69  s called to esti
8910: 6d 61 74 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mate the amount 
8920: 6f 66 20 64 61 74 61 20 74 68 61 74 20 77 69 6c  of data that wil
8930: 6c 20 62 65 20 0a 2a 2a 20 6c 6f 61 64 65 64 20  l be .** loaded 
8940: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 49 66  from the disk If
8950: 20 53 65 67 52 65 61 64 65 72 49 74 65 72 61 74   SegReaderIterat
8960: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
8970: 20 74 68 69 73 20 73 65 67 2d 72 65 61 64 65 72   this seg-reader
8980: 2c 0a 2a 2a 20 69 6e 20 75 6e 69 74 73 20 6f 66  ,.** in units of
8990: 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65 6e   average documen
89a0: 74 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  t size..** .** T
89b0: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
89c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 49 66 20 74  as follows: If t
89d0: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 20  he caller has a 
89e0: 73 6d 61 6c 6c 20 64 6f 63 6c 69 73 74 20 74 68  small doclist th
89f0: 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  at .** contains 
8a00: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 4e 20  references to N 
8a10: 64 6f 63 75 6d 65 6e 74 73 2c 20 61 6e 64 20 69  documents, and i
8a20: 73 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 6d 65  s considering me
8a30: 72 67 69 6e 67 20 69 74 20 77 69 74 68 0a 2a 2a  rging it with.**
8a40: 20 61 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74   a large doclist
8a50: 20 28 73 69 7a 65 20 58 20 22 61 76 65 72 61 67   (size X "averag
8a60: 65 20 64 6f 63 75 6d 65 6e 74 73 22 29 2c 20 69  e documents"), i
8a70: 74 20 6d 61 79 20 6f 70 74 20 6e 6f 74 20 74 6f  t may opt not to
8a80: 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 6c 61 72   load.** the lar
8a90: 67 65 20 64 6f 63 6c 69 73 74 20 69 66 20 58 3e  ge doclist if X>
8aa0: 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  N..*/.int sqlite
8ab0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 6f  3Fts3SegReaderCo
8ac0: 73 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  st(.  Fts3Cursor
8ad0: 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
8ae0: 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 63 75        /* FTS3 cu
8af0: 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  rsor handle */. 
8b00: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
8b10: 70 52 65 61 64 65 72 2c 20 20 20 20 20 20 20 20  pReader,        
8b20: 20 2f 2a 20 53 65 67 6d 65 6e 74 2d 72 65 61 64   /* Segment-read
8b30: 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  er handle */.  i
8b40: 6e 74 20 2a 70 6e 43 6f 73 74 20 20 20 20 20 20  nt *pnCost      
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b60: 2a 20 49 4e 2f 4f 55 54 3a 20 4e 75 6d 62 65 72  * IN/OUT: Number
8b70: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 2a   of bytes read *
8b80: 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  /.){.  Fts3Table
8b90: 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
8ba0: 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
8bb0: 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ab;.  int rc = S
8bc0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
8bd0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8be0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
8bf0: 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
8c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
8c10: 74 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  t in bytes to re
8c20: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 70 67  turn */.  int pg
8c30: 73 7a 20 3d 20 70 2d 3e 6e 50 67 73 7a 3b 20 20  sz = p->nPgsz;  
8c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
8c50: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20  abase page size 
8c60: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
8c70: 20 73 65 67 2d 72 65 61 64 65 72 20 69 73 20 72   seg-reader is r
8c80: 65 61 64 69 6e 67 20 74 68 65 20 70 65 6e 64 69  eading the pendi
8c90: 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c 65 2c 20  ng-terms table, 
8ca0: 6f 72 20 69 66 20 61 6c 6c 20 64 61 74 61 0a 20  or if all data. 
8cb0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 73 65 67 6d   ** for the segm
8cc0: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 6f 6e  ent is stored on
8cd0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
8ce0: 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20 74 68  f the b-tree, th
8cf0: 65 6e 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  en the cost.  **
8d00: 20 69 73 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   is zero. In thi
8d10: 73 20 63 61 73 65 20 61 6c 6c 20 72 65 71 75 69  s case all requi
8d20: 72 65 64 20 64 61 74 61 20 69 73 20 61 6c 72 65  red data is alre
8d30: 61 64 79 20 69 6e 20 6d 61 69 6e 20 6d 65 6d 6f  ady in main memo
8d40: 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ry..  */.  if( p
8d50: 2d 3e 62 48 61 73 53 74 61 74 20 0a 20 20 20 26  ->bHasStat .   &
8d60: 26 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72  & !fts3SegReader
8d70: 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65  IsPending(pReade
8d80: 72 29 20 0a 20 20 20 26 26 20 21 66 74 73 33 53  r) .   && !fts3S
8d90: 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e  egReaderIsRootOn
8da0: 6c 79 28 70 52 65 61 64 65 72 29 20 0a 20 20 29  ly(pReader) .  )
8db0: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20  {.    int nBlob 
8dc0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
8dd0: 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 3b 0a 0a  _int64 iBlock;..
8de0: 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 6e 52      if( pCsr->nR
8df0: 6f 77 41 76 67 3d 3d 30 20 29 7b 0a 20 20 20 20  owAvg==0 ){.    
8e00: 20 20 2f 2a 20 54 68 65 20 61 76 65 72 61 67 65    /* The average
8e10: 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65 2c 20   document size, 
8e20: 77 68 69 63 68 20 69 73 20 72 65 71 75 69 72 65  which is require
8e30: 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 74  d to calculate t
8e40: 68 65 20 63 6f 73 74 0a 20 20 20 20 20 20 2a 2a  he cost.      **
8e50: 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69 73 74   of each doclist
8e60: 2c 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  , has not yet be
8e70: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 2e 20 52  en determined. R
8e80: 65 61 64 20 74 68 65 20 72 65 71 75 69 72 65 64  ead the required
8e90: 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20   .      ** data 
8ea0: 66 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 20  from the %_stat 
8eb0: 74 61 62 6c 65 20 74 6f 20 63 61 6c 63 75 6c 61  table to calcula
8ec0: 74 65 20 69 74 2e 0a 20 20 20 20 20 20 2a 2a 0a  te it..      **.
8ed0: 20 20 20 20 20 20 2a 2a 20 45 6e 74 72 79 20 30        ** Entry 0
8ee0: 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20 74   of the %_stat t
8ef0: 61 62 6c 65 20 69 73 20 61 20 62 6c 6f 62 20 63  able is a blob c
8f00: 6f 6e 74 61 69 6e 69 6e 67 20 28 6e 43 6f 6c 2b  ontaining (nCol+
8f10: 31 29 20 46 54 53 33 20 0a 20 20 20 20 20 20 2a  1) FTS3 .      *
8f20: 2a 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65  * varints, where
8f30: 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d   nCol is the num
8f40: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
8f50: 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  n the FTS3 table
8f60: 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66  ..      ** The f
8f70: 69 72 73 74 20 76 61 72 69 6e 74 20 69 73 20 74  irst varint is t
8f80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63  he number of doc
8f90: 75 6d 65 6e 74 73 20 63 75 72 72 65 6e 74 6c 79  uments currently
8fa0: 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20   stored in.     
8fb0: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 54   ** the table. T
8fc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 43 6f  he following nCo
8fd0: 6c 20 76 61 72 69 6e 74 73 20 63 6f 6e 74 61 69  l varints contai
8fe0: 6e 20 74 68 65 20 74 6f 74 61 6c 20 61 6d 6f 75  n the total amou
8ff0: 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 64  nt of.      ** d
9000: 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 61 6c  ata stored in al
9010: 6c 20 72 6f 77 73 20 6f 66 20 65 61 63 68 20 63  l rows of each c
9020: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
9030: 6c 65 2c 20 66 72 6f 6d 20 6c 65 66 74 0a 20 20  le, from left.  
9040: 20 20 20 20 2a 2a 20 74 6f 20 72 69 67 68 74 2e      ** to right.
9050: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9060: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
9070: 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  tmt;.      rc = 
9080: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
9090: 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54 4f 54  QL_SELECT_DOCTOT
90a0: 41 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  AL, &pStmt, 0);.
90b0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
90c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
90d0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
90e0: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
90f0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ROW ){.        s
9100: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 44 6f  qlite3_int64 nDo
9110: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  c = 0;.        s
9120: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
9130: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
9140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 20 3d 20  const char *a = 
9150: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
9160: 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  lob(pStmt, 0);. 
9170: 20 20 20 20 20 20 20 69 66 28 20 61 20 29 7b 0a         if( a ){.
9180: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
9190: 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 61 5b  char *pEnd = &a[
91a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
91b0: 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 5d 3b  ytes(pStmt, 0)];
91c0: 0a 20 20 20 20 20 20 20 20 20 20 61 20 2b 3d 20  .          a += 
91d0: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
91e0: 72 69 6e 74 28 61 2c 20 26 6e 44 6f 63 29 3b 0a  rint(a, &nDoc);.
91f0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
9200: 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20   a<pEnd ){.     
9210: 20 20 20 20 20 20 20 61 20 2b 3d 20 73 71 6c 69         a += sqli
9220: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
9230: 28 61 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  (a, &nByte);.   
9240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9250: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 43 73 72   }..        pCsr
9260: 2d 3e 6e 52 6f 77 41 76 67 20 3d 20 28 28 28 6e  ->nRowAvg = (((n
9270: 42 79 74 65 20 2f 20 6e 44 6f 63 29 20 2b 20 70  Byte / nDoc) + p
9280: 67 73 7a 20 2d 20 31 29 20 2f 20 70 67 73 7a 29  gsz - 1) / pgsz)
9290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
92a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
92b0: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
92c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
92d0: 4f 4b 20 7c 7c 20 70 43 73 72 2d 3e 6e 52 6f 77  OK || pCsr->nRow
92e0: 41 76 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Avg==0 ) return 
92f0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
9300: 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 61 20  * Assume that a 
9310: 62 6c 6f 62 20 66 6c 6f 77 73 20 6f 76 65 72 20  blob flows over 
9320: 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
9330: 67 65 73 20 69 66 20 69 74 20 69 73 20 6c 61 72  ges if it is lar
9340: 67 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ger.    ** than 
9350: 28 70 67 73 7a 2d 33 35 29 20 62 79 74 65 73 20  (pgsz-35) bytes 
9360: 69 6e 20 73 69 7a 65 20 28 74 68 65 20 66 69 6c  in size (the fil
9370: 65 2d 66 6f 72 6d 61 74 20 64 6f 63 75 6d 65 6e  e-format documen
9380: 74 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 63 6f  tation.    ** co
9390: 6e 66 69 72 6d 73 20 74 68 69 73 29 2e 0a 20 20  nfirms this)..  
93a0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 42 6c    */.    for(iBl
93b0: 6f 63 6b 3d 70 52 65 61 64 65 72 2d 3e 69 53 74  ock=pReader->iSt
93c0: 61 72 74 42 6c 6f 63 6b 3b 20 69 42 6c 6f 63 6b  artBlock; iBlock
93d0: 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66  <=pReader->iLeaf
93e0: 45 6e 64 42 6c 6f 63 6b 3b 20 69 42 6c 6f 63 6b  EndBlock; iBlock
93f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
9400: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42  sqlite3Fts3ReadB
9410: 6c 6f 63 6b 28 70 2c 20 69 42 6c 6f 63 6b 2c 20  lock(p, iBlock, 
9420: 30 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  0, &nBlob);.    
9430: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9440: 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  _OK ) break;.   
9450: 20 20 20 69 66 28 20 28 6e 42 6c 6f 62 2b 33 35     if( (nBlob+35
9460: 29 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  )>pgsz ){.      
9470: 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 6e    int nOvfl = (n
9480: 42 6c 6f 62 20 2b 20 33 34 29 2f 70 67 73 7a 3b  Blob + 34)/pgsz;
9490: 0a 20 20 20 20 20 20 20 20 6e 43 6f 73 74 20 2b  .        nCost +
94a0: 3d 20 28 28 6e 4f 76 66 6c 20 2b 20 70 43 73 72  = ((nOvfl + pCsr
94b0: 2d 3e 6e 52 6f 77 41 76 67 20 2d 20 31 29 2f 70  ->nRowAvg - 1)/p
94c0: 43 73 72 2d 3e 6e 52 6f 77 41 76 67 29 3b 0a 20  Csr->nRowAvg);. 
94d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
94e0: 0a 0a 20 20 2a 70 6e 43 6f 73 74 20 2b 3d 20 6e  ..  *pnCost += n
94f0: 43 6f 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cost;.  return r
9500: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
9510: 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   all allocations
9520: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9530: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
9540: 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20  ssed as the .** 
9550: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
9560: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9570: 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65  Fts3SegReaderFre
9580: 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  e(Fts3Table *p, 
9590: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
95a0: 52 65 61 64 65 72 29 7b 0a 20 20 69 66 28 20 70  Reader){.  if( p
95b0: 52 65 61 64 65 72 20 26 26 20 21 66 74 73 33 53  Reader && !fts3S
95c0: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
95d0: 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20  g(pReader) ){.  
95e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
95f0: 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b 0a  Reader->zTerm);.
9600: 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65 67      if( !fts3Seg
9610: 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79  ReaderIsRootOnly
9620: 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20  (pReader) ){.   
9630: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9640: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b  pReader->aNode);
9650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9660: 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65  ite3_free(pReade
9670: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
9680: 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65 67 52  ocate a new SegR
9690: 65 61 64 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f  eader object..*/
96a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
96b0: 53 65 67 52 65 61 64 65 72 4e 65 77 28 0a 20 20  SegReaderNew(.  
96c0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
96f0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
9700: 20 69 41 67 65 2c 20 20 20 20 20 20 20 20 20 20   iAge,          
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9720: 53 65 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a  Segment "age". *
9730: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
9740: 34 20 69 53 74 61 72 74 4c 65 61 66 2c 20 20 20  4 iStartLeaf,   
9750: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61      /* First lea
9760: 66 20 74 6f 20 74 72 61 76 65 72 73 65 20 2a 2f  f to traverse */
9770: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
9780: 20 69 45 6e 64 4c 65 61 66 2c 20 20 20 20 20 20   iEndLeaf,      
9790: 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66     /* Final leaf
97a0: 20 74 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a   to traverse */.
97b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
97c0: 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20  iEndBlock,      
97d0: 20 20 2f 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b    /* Final block
97e0: 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   of segment */. 
97f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f   const char *zRo
9800: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
9810: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
9820: 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
9830: 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20  */.  int nRoot, 
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9860: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
9870: 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20  g root node */. 
9880: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
9890: 2a 70 70 52 65 61 64 65 72 20 20 20 20 20 20 20  *ppReader       
98a0: 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74   /* OUT: Allocat
98b0: 65 64 20 46 74 73 33 53 65 67 52 65 61 64 65 72  ed Fts3SegReader
98c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
98d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
98e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
98f0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
9900: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
9910: 64 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  der;         /* 
9920: 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
9930: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
9940: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9950: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9960: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
9970: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65 67 6d 65  o allocate segme
9980: 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  nt root node */.
9990: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
99a0: 74 4c 65 61 66 3c 3d 69 45 6e 64 4c 65 61 66 20  tLeaf<=iEndLeaf 
99b0: 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 4c  );.  if( iStartL
99c0: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 45  eaf==0 ){.    nE
99d0: 78 74 72 61 20 3d 20 6e 52 6f 6f 74 20 2b 20 46  xtra = nRoot + F
99e0: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
99f0: 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 61 64 65 72  ;.  }..  pReader
9a00: 20 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65   = (Fts3SegReade
9a10: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
9a20: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 53 65  oc(sizeof(Fts3Se
9a30: 67 52 65 61 64 65 72 29 20 2b 20 6e 45 78 74 72  gReader) + nExtr
9a40: 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 61 64  a);.  if( !pRead
9a50: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
9a60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9a70: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52 65 61   }.  memset(pRea
9a80: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  der, 0, sizeof(F
9a90: 74 73 33 53 65 67 52 65 61 64 65 72 29 29 3b 0a  ts3SegReader));.
9aa0: 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78 20    pReader->iIdx 
9ab0: 3d 20 69 41 67 65 3b 0a 20 20 70 52 65 61 64 65  = iAge;.  pReade
9ac0: 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d  r->iStartBlock =
9ad0: 20 69 53 74 61 72 74 4c 65 61 66 3b 0a 20 20 70   iStartLeaf;.  p
9ae0: 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64  Reader->iLeafEnd
9af0: 42 6c 6f 63 6b 20 3d 20 69 45 6e 64 4c 65 61 66  Block = iEndLeaf
9b00: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 45 6e  ;.  pReader->iEn
9b10: 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64 42 6c 6f  dBlock = iEndBlo
9b20: 63 6b 3b 0a 0a 20 20 69 66 28 20 6e 45 78 74 72  ck;..  if( nExtr
9b30: 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  a ){.    /* The 
9b40: 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 20 69  entire segment i
9b50: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
9b60: 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20  root node. */.  
9b70: 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65    pReader->aNode
9b80: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 65 61   = (char *)&pRea
9b90: 64 65 72 5b 31 5d 3b 0a 20 20 20 20 70 52 65 61  der[1];.    pRea
9ba0: 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 52 6f  der->nNode = nRo
9bb0: 6f 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ot;.    memcpy(p
9bc0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 7a  Reader->aNode, z
9bd0: 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20  Root, nRoot);.  
9be0: 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65    memset(&pReade
9bf0: 72 2d 3e 61 4e 6f 64 65 5b 6e 52 6f 6f 74 5d 2c  r->aNode[nRoot],
9c00: 20 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41   0, FTS3_NODE_PA
9c10: 44 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 7b  DDING);.  }else{
9c20: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 43  .    pReader->iC
9c30: 75 72 72 65 6e 74 42 6c 6f 63 6b 20 3d 20 69 53  urrentBlock = iS
9c40: 74 61 72 74 4c 65 61 66 2d 31 3b 0a 20 20 7d 0a  tartLeaf-1;.  }.
9c50: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9c60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 52  E_OK ){.    *ppR
9c70: 65 61 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b  eader = pReader;
9c80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
9c90: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
9ca0: 65 72 46 72 65 65 28 70 2c 20 70 52 65 61 64 65  erFree(p, pReade
9cb0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
9cc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
9cd0: 69 73 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  is is a comparis
9ce0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64  on function used
9cf0: 20 61 73 20 61 20 71 73 6f 72 74 28 29 20 63 61   as a qsort() ca
9d00: 6c 6c 62 61 63 6b 20 77 68 65 6e 20 73 6f 72 74  llback when sort
9d10: 69 6e 67 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20  ing.** an array 
9d20: 6f 66 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  of pending terms
9d30: 20 62 79 20 74 65 72 6d 2e 20 54 68 69 73 20 6f   by term. This o
9d40: 63 63 75 72 73 20 61 73 20 70 61 72 74 20 6f 66  ccurs as part of
9d50: 20 66 6c 75 73 68 69 6e 67 0a 2a 2a 20 74 68 65   flushing.** the
9d60: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
9d70: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68   pending-terms h
9d80: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 74 68 65  ash table to the
9d90: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
9da0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f 6d  atic int fts3Com
9db0: 70 61 72 65 45 6c 65 6d 42 79 54 65 72 6d 28 63  pareElemByTerm(c
9dc0: 6f 6e 73 74 20 76 6f 69 64 20 2a 6c 68 73 2c 20  onst void *lhs, 
9dd0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 72 68 73 29  const void *rhs)
9de0: 7b 0a 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 66  {.  char *z1 = f
9df0: 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73  ts3HashKey(*(Fts
9e00: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73  3HashElem **)lhs
9e10: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 32 20 3d 20  );.  char *z2 = 
9e20: 66 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74  fts3HashKey(*(Ft
9e30: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68  s3HashElem **)rh
9e40: 73 29 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66  s);.  int n1 = f
9e50: 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a  ts3HashKeysize(*
9e60: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
9e70: 29 6c 68 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20  )lhs);.  int n2 
9e80: 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a  = fts3HashKeysiz
9e90: 65 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d  e(*(Fts3HashElem
9ea0: 20 2a 2a 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74   **)rhs);..  int
9eb0: 20 6e 20 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31   n = (n1<n2 ? n1
9ec0: 20 3a 20 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20   : n2);.  int c 
9ed0: 3d 20 6d 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c  = memcmp(z1, z2,
9ee0: 20 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20   n);.  if( c==0 
9ef0: 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20  ){.    c = n1 - 
9f00: 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n2;.  }.  return
9f10: 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   c;.}../*.** Thi
9f20: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
9f30: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ed to allocate a
9f40: 6e 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  n Fts3SegReader 
9f50: 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68  that iterates th
9f60: 72 6f 75 67 68 0a 2a 2a 20 61 20 73 75 62 73 65  rough.** a subse
9f70: 74 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 73  t of the terms s
9f80: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 46 74 73  tored in the Fts
9f90: 33 54 61 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65  3Table.pendingTe
9fa0: 72 6d 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 69 6e  rms array..*/.in
9fb0: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
9fc0: 52 65 61 64 65 72 50 65 6e 64 69 6e 67 28 0a 20  ReaderPending(. 
9fd0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
a000: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
a010: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a030: 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   Term to search 
a040: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  for */.  int nTe
a050: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
a060: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
a070: 20 6f 66 20 62 75 66 66 65 72 20 7a 54 65 72 6d   of buffer zTerm
a080: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 50 72 65 66   */.  int isPref
a090: 69 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ix,             
a0a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
a0b0: 72 20 61 20 74 65 72 6d 2d 70 72 65 66 69 78 20  r a term-prefix 
a0c0: 71 75 65 72 79 20 2a 2f 0a 20 20 46 74 73 33 53  query */.  Fts3S
a0d0: 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52 65 61  egReader **ppRea
a0e0: 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  der        /* OU
a0f0: 54 3a 20 53 65 67 52 65 61 64 65 72 20 66 6f 72  T: SegReader for
a100: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 2a   pending-terms *
a110: 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65  /.){.  Fts3SegRe
a120: 61 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20  ader *pReader = 
a130: 30 3b 20 20 20 20 20 2f 2a 20 46 74 73 33 53 65  0;     /* Fts3Se
a140: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74  gReader object t
a150: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74  o return */.  Ft
a160: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c  s3HashElem **aEl
a170: 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  em = 0;       /*
a180: 20 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20 68   Array of term h
a190: 61 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20 73  ash entries to s
a1a0: 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c  can */.  int nEl
a1b0: 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  em = 0;         
a1c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
a1d0: 20 6f 66 20 61 72 72 61 79 20 61 74 20 61 45 6c   of array at aEl
a1e0: 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  em */.  int rc =
a1f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
a200: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a210: 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n Code */..  if(
a220: 20 69 73 50 72 65 66 69 78 20 29 7b 0a 20 20 20   isPrefix ){.   
a230: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a250: 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61  * Size of alloca
a260: 74 65 64 20 61 72 72 61 79 20 61 74 20 61 45 6c  ted array at aEl
a270: 65 6d 20 2a 2f 0a 20 20 20 20 46 74 73 33 48 61  em */.    Fts3Ha
a280: 73 68 45 6c 65 6d 20 2a 70 45 20 3d 20 30 3b 20  shElem *pE = 0; 
a290: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
a2a0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
a2b0: 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33  .    for(pE=fts3
a2c0: 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e 70 65  HashFirst(&p->pe
a2d0: 6e 64 69 6e 67 54 65 72 6d 73 29 3b 20 70 45 3b  ndingTerms); pE;
a2e0: 20 70 45 3d 66 74 73 33 48 61 73 68 4e 65 78 74   pE=fts3HashNext
a2f0: 28 70 45 29 29 7b 0a 20 20 20 20 20 20 63 68 61  (pE)){.      cha
a300: 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68 61 72 20  r *zKey = (char 
a310: 2a 29 66 74 73 33 48 61 73 68 4b 65 79 28 70 45  *)fts3HashKey(pE
a320: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  );.      int nKe
a330: 79 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73  y = fts3HashKeys
a340: 69 7a 65 28 70 45 29 3b 0a 20 20 20 20 20 20 69  ize(pE);.      i
a350: 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( nTerm==0 || (
a360: 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26 26 20 30  nKey>=nTerm && 0
a370: 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79 2c 20 7a  ==memcmp(zKey, z
a380: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 20 29 7b  Term, nTerm)) ){
a390: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 6c  .        if( nEl
a3a0: 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  em==nAlloc ){.  
a3b0: 20 20 20 20 20 20 20 20 46 74 73 33 48 61 73 68          Fts3Hash
a3c0: 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32 3b 0a 20  Elem **aElem2;. 
a3d0: 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20           nAlloc 
a3e0: 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20  += 16;.         
a3f0: 20 61 45 6c 65 6d 32 20 3d 20 28 46 74 73 33 48   aElem2 = (Fts3H
a400: 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71 6c 69 74  ashElem **)sqlit
a410: 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
a420: 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 2c            aElem,
a430: 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 46   nAlloc*sizeof(F
a440: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 0a 20  ts3HashElem *). 
a450: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
a460: 20 20 20 20 20 20 69 66 28 20 21 61 45 6c 65 6d        if( !aElem
a470: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
a480: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a490: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
a4a0: 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20 20 20 20  nElem = 0;.     
a4b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a4c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a4d0: 20 20 20 20 61 45 6c 65 6d 20 3d 20 61 45 6c 65      aElem = aEle
a4e0: 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  m2;.        }.  
a4f0: 20 20 20 20 20 20 61 45 6c 65 6d 5b 6e 45 6c 65        aElem[nEle
a500: 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20 20 20 20 20  m++] = pE;.     
a510: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a520: 20 49 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   If more than on
a530: 65 20 74 65 72 6d 20 6d 61 74 63 68 65 73 20 74  e term matches t
a540: 68 65 20 70 72 65 66 69 78 2c 20 73 6f 72 74 20  he prefix, sort 
a550: 74 68 65 20 46 74 73 33 48 61 73 68 45 6c 65 6d  the Fts3HashElem
a560: 0a 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  .    ** objects 
a570: 69 6e 20 74 65 72 6d 20 6f 72 64 65 72 20 75 73  in term order us
a580: 69 6e 67 20 71 73 6f 72 74 28 29 2e 20 54 68 69  ing qsort(). Thi
a590: 73 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  s uses the same 
a5a0: 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
a5b0: 2a 20 63 61 6c 6c 62 61 63 6b 20 61 73 20 69 73  * callback as is
a5c0: 20 75 73 65 64 20 77 68 65 6e 20 66 6c 75 73 68   used when flush
a5d0: 69 6e 67 20 74 65 72 6d 73 20 74 6f 20 64 69 73  ing terms to dis
a5e0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  k..    */.    if
a5f0: 28 20 6e 45 6c 65 6d 3e 31 20 29 7b 0a 20 20 20  ( nElem>1 ){.   
a600: 20 20 20 71 73 6f 72 74 28 61 45 6c 65 6d 2c 20     qsort(aElem, 
a610: 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f 66 28 46 74  nElem, sizeof(Ft
a620: 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 2c 20 66  s3HashElem *), f
a630: 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42 79  ts3CompareElemBy
a640: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Term);.    }..  
a650: 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 33 48  }else{.    Fts3H
a660: 61 73 68 45 6c 65 6d 20 2a 70 45 20 3d 20 66 74  ashElem *pE = ft
a670: 73 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28 26  s3HashFindElem(&
a680: 70 2d 3e 70 65 6e 64 69 6e 67 54 65 72 6d 73 2c  p->pendingTerms,
a690: 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
a6a0: 20 20 20 20 69 66 28 20 70 45 20 29 7b 0a 20 20      if( pE ){.  
a6b0: 20 20 20 20 61 45 6c 65 6d 20 3d 20 26 70 45 3b      aElem = &pE;
a6c0: 0a 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 31  .      nElem = 1
a6d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
a6e0: 66 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a 20 20  f( nElem>0 ){.  
a6f0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
a700: 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
a710: 65 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31 29 2a  er) + (nElem+1)*
a720: 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45  sizeof(Fts3HashE
a730: 6c 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52 65 61  lem *);.    pRea
a740: 64 65 72 20 3d 20 28 46 74 73 33 53 65 67 52 65  der = (Fts3SegRe
a750: 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  ader *)sqlite3_m
a760: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
a770: 20 20 69 66 28 20 21 70 52 65 61 64 65 72 20 29    if( !pReader )
a780: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
a790: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
a7a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
a7b0: 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c 20 6e  et(pReader, 0, n
a7c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 52 65  Byte);.      pRe
a7d0: 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 30 78 37  ader->iIdx = 0x7
a7e0: 46 46 46 46 46 46 46 3b 0a 20 20 20 20 20 20 70  FFFFFFF;.      p
a7f0: 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c  Reader->ppNextEl
a800: 65 6d 20 3d 20 28 46 74 73 33 48 61 73 68 45 6c  em = (Fts3HashEl
a810: 65 6d 20 2a 2a 29 26 70 52 65 61 64 65 72 5b 31  em **)&pReader[1
a820: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
a830: 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45  pReader->ppNextE
a840: 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45 6c 65  lem, aElem, nEle
a850: 6d 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73  m*sizeof(Fts3Has
a860: 68 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20 20 7d  hElem *));.    }
a870: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 50 72  .  }..  if( isPr
a880: 65 66 69 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  efix ){.    sqli
a890: 74 65 33 5f 66 72 65 65 28 61 45 6c 65 6d 29 3b  te3_free(aElem);
a8a0: 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72  .  }.  *ppReader
a8b0: 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65   = pReader;.  re
a8c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
a8d0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
a8e0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
a8f0: 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 70 65 63  unction is expec
a900: 74 65 64 20 74 6f 20 62 65 20 61 20 73 74 61 74  ted to be a stat
a910: 65 6d 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20  ement of.** the 
a920: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
a930: 4c 45 43 54 20 0a 2a 2a 20 20 20 20 20 69 64 78  LECT .**     idx
a940: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a950: 20 20 20 2d 2d 20 63 6f 6c 20 30 0a 2a 2a 20 20     -- col 0.**  
a960: 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20     start_block, 
a970: 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6c 20           -- col 
a980: 31 0a 2a 2a 20 20 20 20 20 6c 65 61 76 65 73 5f  1.**     leaves_
a990: 65 6e 64 5f 62 6c 6f 63 6b 2c 20 20 20 20 20 2d  end_block,     -
a9a0: 2d 20 63 6f 6c 20 32 0a 2a 2a 20 20 20 20 20 65  - col 2.**     e
a9b0: 6e 64 5f 62 6c 6f 63 6b 2c 20 20 20 20 20 20 20  nd_block,       
a9c0: 20 20 20 20 20 2d 2d 20 63 6f 6c 20 33 0a 2a 2a       -- col 3.**
a9d0: 20 20 20 20 20 72 6f 6f 74 20 20 20 20 20 20 20       root       
a9e0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f             -- co
a9f0: 6c 20 34 0a 2a 2a 20 20 20 46 52 4f 4d 20 25 5f  l 4.**   FROM %_
aa00: 73 65 67 64 69 72 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  segdir ....**.**
aa10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
aa20: 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 69 6e 69  llocates and ini
aa30: 74 69 61 6c 69 7a 65 73 20 61 20 46 74 73 33 53  tializes a Fts3S
aa40: 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74 75  egReader structu
aa50: 72 65 20 74 6f 0a 2a 2a 20 69 74 65 72 61 74 65  re to.** iterate
aa60: 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 72   through the ter
aa70: 6d 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ms stored in the
aa80: 20 73 65 67 6d 65 6e 74 20 69 64 65 6e 74 69 66   segment identif
aa90: 69 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 75  ied by the.** cu
aaa0: 72 72 65 6e 74 20 72 6f 77 20 74 68 61 74 20 70  rrent row that p
aab0: 53 74 6d 74 20 69 73 20 70 6f 69 6e 74 69 6e 67  Stmt is pointing
aac0: 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73   to. .**.** If s
aad0: 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 46  uccessful, the F
aae0: 74 73 33 53 65 67 52 65 61 64 65 72 20 69 73 20  ts3SegReader is 
aaf0: 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
ab00: 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 0a   the first term.
ab10: 2a 2a 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ** in the segmen
ab20: 74 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  t and SQLITE_OK 
ab30: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
ab40: 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
ab50: 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
ab60: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
ab70: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
ab80: 65 67 52 65 61 64 65 72 4e 65 77 28 0a 20 20 46  egReaderNew(.  F
ab90: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abb0: 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
abc0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
abd0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
abf0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 69 6e  ee above */.  in
ac00: 74 20 69 41 67 65 2c 20 20 20 20 20 20 20 20 20  t iAge,         
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac20: 20 53 65 67 6d 65 6e 74 20 22 61 67 65 22 2e 20   Segment "age". 
ac30: 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
ac40: 65 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20  er **ppReader   
ac50: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c       /* OUT: All
ac60: 6f 63 61 74 65 64 20 46 74 73 33 53 65 67 52 65  ocated Fts3SegRe
ac70: 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  ader */.){.  ret
ac80: 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 33 53  urn sqlite3Fts3S
ac90: 65 67 52 65 61 64 65 72 4e 65 77 28 70 2c 20 69  egReaderNew(p, i
aca0: 41 67 65 2c 20 0a 20 20 20 20 20 20 73 71 6c 69  Age, .      sqli
acb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
acc0: 28 70 53 74 6d 74 2c 20 31 29 2c 0a 20 20 20 20  (pStmt, 1),.    
acd0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
ace0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 29  _int64(pStmt, 2)
acf0: 2c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ,.      sqlite3_
ad00: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
ad10: 6d 74 2c 20 33 29 2c 0a 20 20 20 20 20 20 73 71  mt, 3),.      sq
ad20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
ad30: 62 28 70 53 74 6d 74 2c 20 34 29 2c 0a 20 20 20  b(pStmt, 4),.   
ad40: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
ad50: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 34  n_bytes(pStmt, 4
ad60: 29 2c 0a 20 20 20 20 20 20 70 70 52 65 61 64 65  ),.      ppReade
ad70: 72 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r.  );.}../*.** 
ad80: 43 6f 6d 70 61 72 65 20 74 68 65 20 65 6e 74 72  Compare the entr
ad90: 69 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ies pointed to b
ada0: 79 20 74 77 6f 20 46 74 73 33 53 65 67 52 65 61  y two Fts3SegRea
adb0: 64 65 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  der structures. 
adc0: 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69  .** Comparison i
add0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
ade0: 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 69 73 20  .**   1) EOF is 
adf0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 6f 74  greater than not
ae00: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29   EOF..**.**   2)
ae10: 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   The current ter
ae20: 6d 73 20 28 69 66 20 61 6e 79 29 20 61 72 65 20  ms (if any) are 
ae30: 63 6f 6d 70 61 72 65 64 20 75 73 69 6e 67 20 6d  compared using m
ae40: 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65 0a  emcmp(). If one.
ae50: 2a 2a 20 20 20 20 20 20 74 65 72 6d 20 69 73 20  **      term is 
ae60: 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 6f 74  a prefix of anot
ae70: 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20  her, the longer 
ae80: 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 64 65 72  term is consider
ae90: 65 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  ed the.**      l
aea0: 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  arger..**.**   3
aeb0: 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65  ) By segment age
aec0: 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65  . An older segme
aed0: 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  nt is considered
aee0: 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74   larger..*/.stat
aef0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
af00: 61 64 65 72 43 6d 70 28 46 74 73 33 53 65 67 52  aderCmp(Fts3SegR
af10: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73  eader *pLhs, Fts
af20: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73  3SegReader *pRhs
af30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
af40: 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26  f( pLhs->aNode &
af50: 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 7b  & pRhs->aNode ){
af60: 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 70  .    int rc2 = p
af70: 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20 70 52 68  Lhs->nTerm - pRh
af80: 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 69 66  s->nTerm;.    if
af90: 28 20 72 63 32 3c 30 20 29 7b 0a 20 20 20 20 20  ( rc2<0 ){.     
afa0: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68   rc = memcmp(pLh
afb0: 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e  s->zTerm, pRhs->
afc0: 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e 6e 54 65  zTerm, pLhs->nTe
afd0: 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rm);.    }else{.
afe0: 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
aff0: 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70  p(pLhs->zTerm, p
b000: 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73  Rhs->zTerm, pRhs
b010: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  ->nTerm);.    }.
b020: 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b      if( rc==0 ){
b030: 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
b040: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
b050: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e      rc = (pLhs->
b060: 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28 70 52 68  aNode==0) - (pRh
b070: 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b 0a 20 20  s->aNode==0);.  
b080: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
b090: 0a 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e  .    rc = pRhs->
b0a0: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64  iIdx - pLhs->iId
b0b0: 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
b0c0: 20 72 63 21 3d 30 20 29 3b 0a 20 20 72 65 74 75   rc!=0 );.  retu
b0d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b0e0: 41 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d 70  A different comp
b0f0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
b100: 66 6f 72 20 53 65 67 52 65 61 64 65 72 20 73 74  for SegReader st
b110: 72 75 63 74 75 72 65 73 2e 20 49 6e 20 74 68 69  ructures. In thi
b120: 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 69 74  s.** version, it
b130: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
b140: 20 65 61 63 68 20 53 65 67 52 65 61 64 65 72 20   each SegReader 
b150: 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
b160: 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f 63 6c 69  ry in.** a docli
b170: 73 74 20 66 6f 72 20 69 64 65 6e 74 69 63 61 6c  st for identical
b180: 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61 72 69 73   terms. Comparis
b190: 6f 6e 20 69 73 20 6d 61 64 65 20 61 73 20 66 6f  on is made as fo
b1a0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  llows:.**.**   1
b1b0: 29 20 45 4f 46 20 28 65 6e 64 20 6f 66 20 64 6f  ) EOF (end of do
b1c0: 63 6c 69 73 74 20 69 6e 20 74 68 69 73 20 63 61  clist in this ca
b1d0: 73 65 29 20 69 73 20 67 72 65 61 74 65 72 20 74  se) is greater t
b1e0: 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a  han not EOF..**.
b1f0: 2a 2a 20 20 20 32 29 20 42 79 20 63 75 72 72 65  **   2) By curre
b200: 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a 20  nt docid..**.** 
b210: 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20    3) By segment 
b220: 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65  age. An older se
b230: 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65  gment is conside
b240: 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73  red larger..*/.s
b250: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
b260: 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
b270: 70 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  p(Fts3SegReader 
b280: 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65  *pLhs, Fts3SegRe
b290: 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69  ader *pRhs){.  i
b2a0: 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70  nt rc = (pLhs->p
b2b0: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28  OffsetList==0)-(
b2c0: 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pRhs->pOffsetLis
b2d0: 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t==0);.  if( rc=
b2e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  =0 ){.    if( pL
b2f0: 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73  hs->iDocid==pRhs
b300: 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20  ->iDocid ){.    
b310: 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64    rc = pRhs->iId
b320: 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a  x - pLhs->iIdx;.
b330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b340: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f   rc = (pLhs->iDo
b350: 63 69 64 20 3e 20 70 52 68 73 2d 3e 69 44 6f 63  cid > pRhs->iDoc
b360: 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20  id) ? 1 : -1;.  
b370: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
b380: 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26  ( pLhs->aNode &&
b390: 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a   pRhs->aNode );.
b3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b3b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
b3c0: 65 20 74 65 72 6d 20 74 68 61 74 20 74 68 65 20  e term that the 
b3d0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62  Fts3SegReader ob
b3e0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
b3f0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
b400: 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 77  t.** points to w
b410: 69 74 68 20 74 68 65 20 74 65 72 6d 20 73 70 65  ith the term spe
b420: 63 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65  cified by argume
b430: 6e 74 73 20 7a 54 65 72 6d 20 61 6e 64 20 6e 54  nts zTerm and nT
b440: 65 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  erm. .**.** If t
b450: 68 65 20 70 53 65 67 20 69 74 65 72 61 74 6f 72  he pSeg iterator
b460: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45   is already at E
b470: 4f 46 2c 20 72 65 74 75 72 6e 20 30 2e 20 4f 74  OF, return 0. Ot
b480: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a  herwise, return.
b490: 2a 2a 20 2d 76 65 20 69 66 20 74 68 65 20 70 53  ** -ve if the pS
b4a0: 65 67 20 74 65 72 6d 20 69 73 20 6c 65 73 73 20  eg term is less 
b4b0: 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  than zTerm/nTerm
b4c0: 2c 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 74  , 0 if the two t
b4d0: 65 72 6d 73 20 61 72 65 0a 2a 2a 20 65 71 75 61  erms are.** equa
b4e0: 6c 2c 20 6f 72 20 2b 76 65 20 69 66 20 74 68 65  l, or +ve if the
b4f0: 20 70 53 65 67 20 74 65 72 6d 20 69 73 20 67 72   pSeg term is gr
b500: 65 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d  eater than zTerm
b510: 2f 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  /nTerm..*/.stati
b520: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
b530: 64 65 72 54 65 72 6d 43 6d 70 28 0a 20 20 46 74  derTermCmp(.  Ft
b540: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
b550: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g,            /*
b560: 20 53 65 67 6d 65 6e 74 20 72 65 61 64 65 72 20   Segment reader 
b570: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
b580: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  t char *zTerm,  
b590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b5a0: 65 72 6d 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  erm to compare t
b5b0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  o */.  int nTerm
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b5e0: 66 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20  f term zTerm in 
b5f0: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
b600: 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  t res = 0;.  if(
b610: 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20 29 7b 0a   pSeg->aNode ){.
b620: 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 54      if( pSeg->nT
b630: 65 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20  erm>nTerm ){.   
b640: 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
b650: 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  pSeg->zTerm, zTe
b660: 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
b670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
b680: 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e   = memcmp(pSeg->
b690: 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 70 53  zTerm, zTerm, pS
b6a0: 65 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  eg->nTerm);.    
b6b0: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  }.    if( res==0
b6c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
b6d0: 70 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e 54 65 72  pSeg->nTerm-nTer
b6e0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  m;.    }.  }.  r
b6f0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
b700: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 53  .** Argument apS
b710: 65 67 6d 65 6e 74 20 69 73 20 61 6e 20 61 72 72  egment is an arr
b720: 61 79 20 6f 66 20 6e 53 65 67 6d 65 6e 74 20 65  ay of nSegment e
b730: 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 6b  lements. It is k
b740: 6e 6f 77 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65  nown that.** the
b750: 20 66 69 6e 61 6c 20 28 6e 53 65 67 6d 65 6e 74   final (nSegment
b760: 2d 6e 53 75 73 70 65 63 74 29 20 6d 65 6d 62 65  -nSuspect) membe
b770: 72 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  rs are already i
b780: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 2a  n sorted order.*
b790: 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  * (according to 
b7a0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
b7b0: 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64  unction provided
b7c0: 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
b7d0: 20 73 68 75 66 66 6c 65 73 0a 2a 2a 20 74 68 65   shuffles.** the
b7e0: 20 61 72 72 61 79 20 61 72 6f 75 6e 64 20 75 6e   array around un
b7f0: 74 69 6c 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  til all entries 
b800: 61 72 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  are in sorted or
b810: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
b820: 6f 69 64 20 66 74 73 33 53 65 67 52 65 61 64 65  oid fts3SegReade
b830: 72 53 6f 72 74 28 0a 20 20 46 74 73 33 53 65 67  rSort(.  Fts3Seg
b840: 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65  Reader **apSegme
b850: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
b860: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
b870: 20 74 6f 20 73 6f 72 74 20 65 6e 74 72 69 65 73   to sort entries
b880: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65   of */.  int nSe
b890: 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b8c0: 6f 66 20 61 70 53 65 67 6d 65 6e 74 20 61 72 72  of apSegment arr
b8d0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 73  ay */.  int nSus
b8e0: 70 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  pect,           
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
b910: 65 64 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a  ed entry count *
b920: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  /.  int (*xCmp)(
b930: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c  Fts3SegReader *,
b940: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
b950: 29 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  )  /* Comparison
b960: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
b970: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
b9a0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  riable */..  ass
b9b0: 65 72 74 28 20 6e 53 75 73 70 65 63 74 3c 3d 6e  ert( nSuspect<=n
b9c0: 53 65 67 6d 65 6e 74 20 29 3b 0a 0a 20 20 69 66  Segment );..  if
b9d0: 28 20 6e 53 75 73 70 65 63 74 3d 3d 6e 53 65 67  ( nSuspect==nSeg
b9e0: 6d 65 6e 74 20 29 20 6e 53 75 73 70 65 63 74 2d  ment ) nSuspect-
b9f0: 2d 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 75 73 70  -;.  for(i=nSusp
ba00: 65 63 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ect-1; i>=0; i--
ba10: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
ba20: 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 28 6e 53    for(j=i; j<(nS
ba30: 65 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b 2b 29 7b  egment-1); j++){
ba40: 0a 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65  .      Fts3SegRe
ba50: 61 64 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  ader *pTmp;.    
ba60: 20 20 69 66 28 20 78 43 6d 70 28 61 70 53 65 67    if( xCmp(apSeg
ba70: 6d 65 6e 74 5b 6a 5d 2c 20 61 70 53 65 67 6d 65  ment[j], apSegme
ba80: 6e 74 5b 6a 2b 31 5d 29 3c 30 20 29 20 62 72 65  nt[j+1])<0 ) bre
ba90: 61 6b 3b 0a 20 20 20 20 20 20 70 54 6d 70 20 3d  ak;.      pTmp =
baa0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 3b   apSegment[j+1];
bab0: 0a 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74  .      apSegment
bac0: 5b 6a 2b 31 5d 20 3d 20 61 70 53 65 67 6d 65 6e  [j+1] = apSegmen
bad0: 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 70 53 65  t[j];.      apSe
bae0: 67 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54 6d 70 3b  gment[j] = pTmp;
baf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
bb00: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
bb10: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
bb20: 69 73 74 20 72 65 61 6c 6c 79 20 69 73 20 73 6f  ist really is so
bb30: 72 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a 20 20 66  rted now. */.  f
bb40: 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 53 75 73 70  or(i=0; i<(nSusp
bb50: 65 63 74 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20  ect-1); i++){.  
bb60: 20 20 61 73 73 65 72 74 28 20 78 43 6d 70 28 61    assert( xCmp(a
bb70: 70 53 65 67 6d 65 6e 74 5b 69 5d 2c 20 61 70 53  pSegment[i], apS
bb80: 65 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c 30 20 29  egment[i+1])<0 )
bb90: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
bba0: 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  /* .** Insert a 
bbb0: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
bbc0: 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65  %_segments table
bbd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bbe0: 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74  fts3WriteSegment
bbf0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
bc00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bc10: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
bc20: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
bc30: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
bc40: 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  Block,          
bc50: 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 66 6f 72   /* Block id for
bc60: 20 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20   new block */.  
bc70: 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20  char *z,        
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
bca0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
bcb0: 62 6c 6f 63 6b 20 64 61 74 61 20 2a 2f 0a 20 20  block data */.  
bcc0: 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20  int n           
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
bcf0: 72 20 7a 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  r z in bytes */.
bd00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
bd10: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
bd20: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
bd30: 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53  (p, SQL_INSERT_S
bd40: 45 47 4d 45 4e 54 53 2c 20 26 70 53 74 6d 74 2c  EGMENTS, &pStmt,
bd50: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
bd60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bd70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
bd80: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 42 6c  64(pStmt, 1, iBl
bd90: 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ock);.    sqlite
bda0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
bdb0: 74 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53 51 4c 49  t, 2, z, n, SQLI
bdc0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
bdd0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
bde0: 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  mt);.    rc = sq
bdf0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
be00: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
be10: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49   rc;.}../* .** I
be20: 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64 20 69  nsert a record i
be30: 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 64 69 72  nto the %_segdir
be40: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
be50: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 53  c int fts3WriteS
be60: 65 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62  egdir(.  Fts3Tab
be70: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
be80: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
be90: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
bea0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
beb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bec0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
bed0: 6f 72 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64  or "level" field
bee0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
bf10: 6f 72 20 22 69 64 78 22 20 66 69 65 6c 64 20 2a  or "idx" field *
bf20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
bf30: 34 20 69 53 74 61 72 74 42 6c 6f 63 6b 2c 20 20  4 iStartBlock,  
bf40: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
bf50: 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 66   "start_block" f
bf60: 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ield */.  sqlite
bf70: 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e 64  3_int64 iLeafEnd
bf80: 42 6c 6f 63 6b 2c 20 20 20 20 2f 2a 20 56 61 6c  Block,    /* Val
bf90: 75 65 20 66 6f 72 20 22 6c 65 61 76 65 73 5f 65  ue for "leaves_e
bfa0: 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20  nd_block" field 
bfb0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
bfc0: 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20  64 iEndBlock,   
bfd0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
bfe0: 72 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69  r "end_block" fi
bff0: 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  eld */.  char *z
c000: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
c010: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 62           /* Blob
c020: 20 76 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f 74   value for "root
c030: 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  " field */.  int
c040: 20 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20   nRoot          
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c060: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
c070: 69 6e 20 62 75 66 66 65 72 20 7a 52 6f 6f 74 20  in buffer zRoot 
c080: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
c090: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
c0a0: 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  nt rc = fts3SqlS
c0b0: 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52  tmt(p, SQL_INSER
c0c0: 54 5f 53 45 47 44 49 52 2c 20 26 70 53 74 6d 74  T_SEGDIR, &pStmt
c0d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
c0e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c0f0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
c100: 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76  t(pStmt, 1, iLev
c110: 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
c120: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
c130: 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73   2, iIdx);.    s
c140: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
c150: 34 28 70 53 74 6d 74 2c 20 33 2c 20 69 53 74 61  4(pStmt, 3, iSta
c160: 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71  rtBlock);.    sq
c170: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
c180: 28 70 53 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66  (pStmt, 4, iLeaf
c190: 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73  EndBlock);.    s
c1a0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
c1b0: 34 28 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64  4(pStmt, 5, iEnd
c1c0: 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69  Block);.    sqli
c1d0: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
c1e0: 74 6d 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c 20 6e  tmt, 6, zRoot, n
c1f0: 52 6f 6f 74 2c 20 53 51 4c 49 54 45 5f 53 54 41  Root, SQLITE_STA
c200: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
c210: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
c220: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
c230: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
c240: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c250: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c260: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  he size of the c
c270: 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66  ommon prefix (if
c280: 20 61 6e 79 29 20 73 68 61 72 65 64 20 62 79 20   any) shared by 
c290: 7a 50 72 65 76 20 61 6e 64 0a 2a 2a 20 7a 4e 65  zPrev and.** zNe
c2a0: 78 74 2c 20 69 6e 20 62 79 74 65 73 2e 20 46 6f  xt, in bytes. Fo
c2b0: 72 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a  r example, .**.*
c2c0: 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f  *   fts3PrefixCo
c2d0: 6d 70 72 65 73 73 28 22 61 62 63 22 2c 20 33 2c  mpress("abc", 3,
c2e0: 20 22 61 62 63 64 65 66 22 2c 20 36 29 20 20 20   "abcdef", 6)   
c2f0: 2f 2f 20 72 65 74 75 72 6e 73 20 33 0a 2a 2a 20  // returns 3.** 
c300: 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70    fts3PrefixComp
c310: 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22  ress("abX", 3, "
c320: 61 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f  abcdef", 6)   //
c330: 20 72 65 74 75 72 6e 73 20 32 0a 2a 2a 20 20 20   returns 2.**   
c340: 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
c350: 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22 58 62  ss("abX", 3, "Xb
c360: 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72  cdef", 6)   // r
c370: 65 74 75 72 6e 73 20 30 0a 2a 2f 0a 73 74 61 74  eturns 0.*/.stat
c380: 69 63 20 69 6e 74 20 66 74 73 33 50 72 65 66 69  ic int fts3Prefi
c390: 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 63 6f 6e  xCompress(.  con
c3a0: 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76 2c 20  st char *zPrev, 
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c3c0: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
c3d0: 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  g previous term 
c3e0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 76 2c 20  */.  int nPrev, 
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c400: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
c410: 62 75 66 66 65 72 20 7a 50 72 65 76 20 69 6e 20  buffer zPrev in 
c420: 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  bytes */.  const
c430: 20 63 68 61 72 20 2a 7a 4e 65 78 74 2c 20 20 20   char *zNext,   
c440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
c450: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
c460: 6e 65 78 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  next term */.  i
c470: 6e 74 20 6e 4e 65 78 74 20 20 20 20 20 20 20 20  nt nNext        
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c490: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
c4a0: 20 7a 4e 65 78 74 20 69 6e 20 62 79 74 65 73 20   zNext in bytes 
c4b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
c4c0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
c4d0: 52 28 6e 4e 65 78 74 29 3b 0a 20 20 66 6f 72 28  R(nNext);.  for(
c4e0: 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26 26 20  n=0; n<nPrev && 
c4f0: 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78 74 5b  zPrev[n]==zNext[
c500: 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65 74 75  n]; n++);.  retu
c510: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn n;.}../*.** A
c520: 64 64 20 74 65 72 6d 20 7a 54 65 72 6d 20 74 6f  dd term zTerm to
c530: 20 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f 64 65   the SegmentNode
c540: 2e 20 49 74 20 69 73 20 67 75 61 72 61 6e 74 65  . It is guarante
c550: 65 64 20 74 68 61 74 20 7a 54 65 72 6d 20 69 73  ed that zTerm is
c560: 20 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63 63 6f   larger.** (acco
c570: 72 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d 70 29  rding to memcmp)
c580: 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f   than the previo
c590: 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  us term..*/.stat
c5a0: 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65 41  ic int fts3NodeA
c5b0: 64 64 54 65 72 6d 28 0a 20 20 46 74 73 33 54 61  ddTerm(.  Fts3Ta
c5c0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
c5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
c5e0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
c5f0: 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  e */.  SegmentNo
c600: 64 65 20 2a 2a 70 70 54 72 65 65 2c 20 20 20 20  de **ppTree,    
c610: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
c620: 3a 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61  : SegmentNode ha
c630: 6e 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69  ndle */ .  int i
c640: 73 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20  sCopyTerm,      
c650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
c660: 75 65 20 69 66 20 7a 54 65 72 6d 2f 6e 54 65 72  ue if zTerm/nTer
c670: 6d 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 2a  m is transient *
c680: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c690: 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
c6a0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
c6b0: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
c6c0: 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ing term */.  in
c6d0: 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20  t nTerm         
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6f0: 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e   Size of term in
c700: 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 53   bytes */.){.  S
c710: 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65  egmentNode *pTre
c720: 65 20 3d 20 2a 70 70 54 72 65 65 3b 0a 20 20 69  e = *ppTree;.  i
c730: 6e 74 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74  nt rc;.  Segment
c740: 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f  Node *pNew;..  /
c750: 2a 20 46 69 72 73 74 20 74 72 79 20 74 6f 20 61  * First try to a
c760: 70 70 65 6e 64 20 74 68 65 20 74 65 72 6d 20 74  ppend the term t
c770: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  o the current no
c780: 64 65 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79  de. Return early
c790: 20 69 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 69   if .  ** this i
c7a0: 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  s possible..  */
c7b0: 0a 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a  .  if( pTree ){.
c7c0: 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20      int nData = 
c7d0: 70 54 72 65 65 2d 3e 6e 44 61 74 61 3b 20 20 20  pTree->nData;   
c7e0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
c7f0: 65 20 6f 66 20 6e 6f 64 65 20 69 6e 20 62 79 74  e of node in byt
c800: 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  es */.    int nR
c810: 65 71 20 3d 20 6e 44 61 74 61 3b 20 20 20 20 20  eq = nData;     
c820: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
c830: 72 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  red space after 
c840: 61 64 64 69 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a  adding zTerm */.
c850: 20 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b      int nPrefix;
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
c880: 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63  ytes of prefix c
c890: 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  ompression */.  
c8a0: 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20    int nSuffix;  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 2f 2a 20 53 75 66 66 69 78 20 6c 65 6e 67 74 68  /* Suffix length
c8d0: 20 2a 2f 0a 0a 20 20 20 20 6e 50 72 65 66 69 78   */..    nPrefix
c8e0: 20 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d   = fts3PrefixCom
c8f0: 70 72 65 73 73 28 70 54 72 65 65 2d 3e 7a 54 65  press(pTree->zTe
c900: 72 6d 2c 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d  rm, pTree->nTerm
c910: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
c920: 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  .    nSuffix = n
c930: 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20  Term-nPrefix;.. 
c940: 20 20 20 6e 52 65 71 20 2b 3d 20 73 71 6c 69 74     nReq += sqlit
c950: 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
c960: 6e 50 72 65 66 69 78 29 2b 73 71 6c 69 74 65 33  nPrefix)+sqlite3
c970: 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53  Fts3VarintLen(nS
c980: 75 66 66 69 78 29 2b 6e 53 75 66 66 69 78 3b 0a  uffix)+nSuffix;.
c990: 20 20 20 20 69 66 28 20 6e 52 65 71 3c 3d 70 2d      if( nReq<=p-
c9a0: 3e 6e 4e 6f 64 65 53 69 7a 65 20 7c 7c 20 21 70  >nNodeSize || !p
c9b0: 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a  Tree->zTerm ){..
c9c0: 20 20 20 20 20 20 69 66 28 20 6e 52 65 71 3e 70        if( nReq>p
c9d0: 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20  ->nNodeSize ){. 
c9e0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75         /* An unu
c9f0: 73 75 61 6c 20 63 61 73 65 3a 20 74 68 69 73 20  sual case: this 
ca00: 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
ca10: 6d 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  m to be added to
ca20: 20 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20   the node.      
ca30: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61    ** and the sta
ca40: 74 69 63 20 6e 6f 64 65 20 62 75 66 66 65 72 20  tic node buffer 
ca50: 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79  (p->nNodeSize by
ca60: 74 65 73 29 20 69 73 20 6e 6f 74 20 6c 61 72 67  tes) is not larg
ca70: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 6f  e.        ** eno
ca80: 75 67 68 2e 20 55 73 65 20 61 20 73 65 70 61 72  ugh. Use a separ
ca90: 61 74 65 6c 79 20 6d 61 6c 6c 6f 63 65 64 20 62  ately malloced b
caa0: 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 54 68  uffer instead Th
cab0: 69 73 20 77 61 73 74 65 73 0a 20 20 20 20 20 20  is wastes.      
cac0: 20 20 2a 2a 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a    ** p->nNodeSiz
cad0: 65 20 62 79 74 65 73 2c 20 62 75 74 20 73 69 6e  e bytes, but sin
cae0: 63 65 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  ce this scenario
caf0: 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 61 62 6f 75   only comes abou
cb00: 74 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  t when.        *
cb10: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
cb20: 6f 6e 74 61 69 6e 20 74 77 6f 20 74 65 72 6d 73  ontain two terms
cb30: 20 74 68 61 74 20 73 68 61 72 65 20 61 20 70 72   that share a pr
cb40: 65 66 69 78 20 6f 66 20 61 6c 6d 6f 73 74 20 32  efix of almost 2
cb50: 4b 42 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  KB, .        ** 
cb60: 74 68 69 73 20 69 73 20 6e 6f 74 20 65 78 70 65  this is not expe
cb70: 63 74 65 64 20 74 6f 20 62 65 20 61 20 73 65 72  cted to be a ser
cb80: 69 6f 75 73 20 70 72 6f 62 6c 65 6d 2e 20 0a 20  ious problem. . 
cb90: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
cba0: 20 20 61 73 73 65 72 74 28 20 70 54 72 65 65 2d    assert( pTree-
cbb0: 3e 61 44 61 74 61 3d 3d 28 63 68 61 72 20 2a 29  >aData==(char *)
cbc0: 26 70 54 72 65 65 5b 31 5d 20 29 3b 0a 20 20 20  &pTree[1] );.   
cbd0: 20 20 20 20 20 70 54 72 65 65 2d 3e 61 44 61 74       pTree->aDat
cbe0: 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  a = (char *)sqli
cbf0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71 29  te3_malloc(nReq)
cc00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
cc10: 54 72 65 65 2d 3e 61 44 61 74 61 20 29 7b 0a 20  Tree->aData ){. 
cc20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
cc30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cc40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cc50: 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 65 65  .      if( pTree
cc60: 2d 3e 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ->zTerm ){.     
cc70: 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
cc80: 6f 20 70 72 65 66 69 78 2d 6c 65 6e 67 74 68 20  o prefix-length 
cc90: 66 69 65 6c 64 20 66 6f 72 20 66 69 72 73 74 20  field for first 
cca0: 74 65 72 6d 20 69 6e 20 61 20 6e 6f 64 65 20 2a  term in a node *
ccb0: 2f 0a 20 20 20 20 20 20 20 20 6e 44 61 74 61 20  /.        nData 
ccc0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
ccd0: 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e  tVarint(&pTree->
cce0: 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50  aData[nData], nP
ccf0: 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a  refix);.      }.
cd00: 0a 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20  .      nData += 
cd10: 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
cd20: 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61  rint(&pTree->aDa
cd30: 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66  ta[nData], nSuff
cd40: 69 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ix);.      memcp
cd50: 79 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  y(&pTree->aData[
cd60: 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e  nData], &zTerm[n
cd70: 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78  Prefix], nSuffix
cd80: 29 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e  );.      pTree->
cd90: 6e 44 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20  nData = nData + 
cda0: 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70  nSuffix;.      p
cdb0: 54 72 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a  Tree->nEntry++;.
cdc0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 43 6f 70  .      if( isCop
cdd0: 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  yTerm ){.       
cde0: 20 69 66 28 20 70 54 72 65 65 2d 3e 6e 4d 61 6c   if( pTree->nMal
cdf0: 6c 6f 63 3c 6e 54 65 72 6d 20 29 7b 0a 20 20 20  loc<nTerm ){.   
ce00: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65         char *zNe
ce10: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
ce20: 6c 6f 63 28 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c  loc(pTree->zMall
ce30: 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20  oc, nTerm*2);.  
ce40: 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65          if( !zNe
ce50: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  w ){.           
ce60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ce70: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
ce80: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 65  }.          pTre
ce90: 65 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65  e->nMalloc = nTe
cea0: 72 6d 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  rm*2;.          
ceb0: 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d  pTree->zMalloc =
cec0: 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   zNew;.        }
ced0: 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e  .        pTree->
cee0: 7a 54 65 72 6d 20 3d 20 70 54 72 65 65 2d 3e 7a  zTerm = pTree->z
cef0: 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20  Malloc;.        
cf00: 6d 65 6d 63 70 79 28 70 54 72 65 65 2d 3e 7a 54  memcpy(pTree->zT
cf10: 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
cf20: 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65  m);.        pTre
cf30: 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d  e->nTerm = nTerm
cf40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cf50: 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54         pTree->zT
cf60: 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54  erm = (char *)zT
cf70: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 72  erm;.        pTr
cf80: 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72  ee->nTerm = nTer
cf90: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
cfa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cfb0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
cfc0: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
cfd0: 6f 77 73 20 74 6f 20 68 65 72 65 2c 20 69 74 20  ows to here, it 
cfe0: 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
cff0: 20 74 6f 20 61 70 70 65 6e 64 20 7a 54 65 72 6d   to append zTerm
d000: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   to the.  ** cur
d010: 72 65 6e 74 20 6e 6f 64 65 2e 20 43 72 65 61 74  rent node. Creat
d020: 65 20 61 20 6e 65 77 20 6e 6f 64 65 20 28 61 20  e a new node (a 
d030: 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
d040: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
d050: 65 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73  e)..  ** If this
d060: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6e 6f   is the first no
d070: 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 2c 20  de in the tree, 
d080: 74 68 65 20 74 65 72 6d 20 69 73 20 61 64 64 65  the term is adde
d090: 64 20 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  d to it..  **.  
d0a0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
d0b0: 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 64  e term is not ad
d0c0: 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 20 6e  ded to the new n
d0d0: 6f 64 65 2c 20 69 74 20 69 73 20 6c 65 66 74 20  ode, it is left 
d0e0: 65 6d 70 74 79 20 66 6f 72 0a 20 20 2a 2a 20 6e  empty for.  ** n
d0f0: 6f 77 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  ow. Instead, the
d100: 20 74 65 72 6d 20 69 73 20 69 6e 73 65 72 74 65   term is inserte
d110: 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  d into the paren
d120: 74 20 6f 66 20 70 54 72 65 65 2e 20 49 66 20 70  t of pTree. If p
d130: 54 72 65 65 20 0a 20 20 2a 2a 20 68 61 73 20 6e  Tree .  ** has n
d140: 6f 20 70 61 72 65 6e 74 2c 20 6f 6e 65 20 69 73  o parent, one is
d150: 20 63 72 65 61 74 65 64 20 68 65 72 65 2e 0a 20   created here.. 
d160: 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 28 53 65   */.  pNew = (Se
d170: 67 6d 65 6e 74 4e 6f 64 65 20 2a 29 73 71 6c 69  gmentNode *)sqli
d180: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
d190: 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 20 2b  f(SegmentNode) +
d1a0: 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a   p->nNodeSize);.
d1b0: 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
d1c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d1d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
d1e0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
d1f0: 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65  zeof(SegmentNode
d200: 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44 61 74  ));.  pNew->nDat
d210: 61 20 3d 20 31 20 2b 20 46 54 53 33 5f 56 41 52  a = 1 + FTS3_VAR
d220: 49 4e 54 5f 4d 41 58 3b 0a 20 20 70 4e 65 77 2d  INT_MAX;.  pNew-
d230: 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a  >aData = (char *
d240: 29 26 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69 66  )&pNew[1];..  if
d250: 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53  ( pTree ){.    S
d260: 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72  egmentNode *pPar
d270: 65 6e 74 20 3d 20 70 54 72 65 65 2d 3e 70 50 61  ent = pTree->pPa
d280: 72 65 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 66  rent;.    rc = f
d290: 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70  ts3NodeAddTerm(p
d2a0: 2c 20 26 70 50 61 72 65 6e 74 2c 20 69 73 43 6f  , &pParent, isCo
d2b0: 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e  pyTerm, zTerm, n
d2c0: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
d2d0: 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Tree->pParent==0
d2e0: 20 29 7b 0a 20 20 20 20 20 20 70 54 72 65 65 2d   ){.      pTree-
d2f0: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
d300: 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  nt;.    }.    pT
d310: 72 65 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e  ree->pRight = pN
d320: 65 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c  ew;.    pNew->pL
d330: 65 66 74 6d 6f 73 74 20 3d 20 70 54 72 65 65 2d  eftmost = pTree-
d340: 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20  >pLeftmost;.    
d350: 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20  pNew->pParent = 
d360: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e 65  pParent;.    pNe
d370: 77 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54 72  w->zMalloc = pTr
d380: 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20  ee->zMalloc;.   
d390: 20 70 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d   pNew->nMalloc =
d3a0: 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b   pTree->nMalloc;
d3b0: 0a 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c  .    pTree->zMal
d3c0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  loc = 0;.  }else
d3d0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66  {.    pNew->pLef
d3e0: 74 6d 6f 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  tmost = pNew;.  
d3f0: 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41    rc = fts3NodeA
d400: 64 64 54 65 72 6d 28 70 2c 20 26 70 4e 65 77 2c  ddTerm(p, &pNew,
d410: 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65   isCopyTerm, zTe
d420: 72 6d 2c 20 6e 54 65 72 6d 29 3b 20 0a 20 20 7d  rm, nTerm); .  }
d430: 0a 0a 20 20 2a 70 70 54 72 65 65 20 3d 20 70 4e  ..  *ppTree = pN
d440: 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ew;.  return rc;
d450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
d460: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 74   function for ft
d470: 73 33 4e 6f 64 65 57 72 69 74 65 28 29 2e 0a 2a  s3NodeWrite()..*
d480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
d490: 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28  3TreeFinishNode(
d4a0: 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a  .  SegmentNode *
d4b0: 70 54 72 65 65 2c 20 0a 20 20 69 6e 74 20 69 48  pTree, .  int iH
d4c0: 65 69 67 68 74 2c 20 0a 20 20 73 71 6c 69 74 65  eight, .  sqlite
d4d0: 33 5f 69 6e 74 36 34 20 69 4c 65 66 74 43 68 69  3_int64 iLeftChi
d4e0: 6c 64 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 61  ld.){.  int nSta
d4f0: 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 48  rt;.  assert( iH
d500: 65 69 67 68 74 3e 3d 31 20 26 26 20 69 48 65 69  eight>=1 && iHei
d510: 67 68 74 3c 31 32 38 20 29 3b 0a 20 20 6e 53 74  ght<128 );.  nSt
d520: 61 72 74 20 3d 20 46 54 53 33 5f 56 41 52 49 4e  art = FTS3_VARIN
d530: 54 5f 4d 41 58 20 2d 20 73 71 6c 69 74 65 33 46  T_MAX - sqlite3F
d540: 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 4c 65  ts3VarintLen(iLe
d550: 66 74 43 68 69 6c 64 29 3b 0a 20 20 70 54 72 65  ftChild);.  pTre
d560: 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d  e->aData[nStart]
d570: 20 3d 20 28 63 68 61 72 29 69 48 65 69 67 68 74   = (char)iHeight
d580: 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50  ;.  sqlite3Fts3P
d590: 75 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d  utVarint(&pTree-
d5a0: 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 2b 31 5d  >aData[nStart+1]
d5b0: 2c 20 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20  , iLeftChild);. 
d5c0: 20 72 65 74 75 72 6e 20 6e 53 74 61 72 74 3b 0a   return nStart;.
d5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  }../*.** Write t
d5e0: 68 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68  he buffer for th
d5f0: 65 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 70  e segment node p
d600: 54 72 65 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20  Tree and all of 
d610: 69 74 73 20 70 65 65 72 73 20 74 6f 20 74 68 65  its peers to the
d620: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
d630: 65 6e 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  en call this fun
d640: 63 74 69 6f 6e 20 72 65 63 75 72 73 69 76 65 6c  ction recursivel
d650: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  y to write the p
d660: 61 72 65 6e 74 20 6f 66 20 0a 2a 2a 20 70 54 72  arent of .** pTr
d670: 65 65 20 61 6e 64 20 69 74 73 20 70 65 65 72 73  ee and its peers
d680: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d690: 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  . .**.** Except,
d6a0: 20 69 66 20 70 54 72 65 65 20 69 73 20 61 20 72   if pTree is a r
d6b0: 6f 6f 74 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74  oot node, do not
d6c0: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
d6d0: 20 64 61 74 61 62 61 73 65 2e 20 49 6e 73 74 65   database. Inste
d6e0: 61 64 2c 0a 2a 2a 20 73 65 74 20 6f 75 74 70 75  ad,.** set outpu
d6f0: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 70 61 52  t variables *paR
d700: 6f 6f 74 20 61 6e 64 20 2a 70 6e 52 6f 6f 74 20  oot and *pnRoot 
d710: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
d720: 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  oot node..**.** 
d730: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
d740: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
d750: 72 6e 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20  rned and output 
d760: 76 61 72 69 61 62 6c 65 20 2a 70 69 4c 61 73 74  variable *piLast
d770: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68   is.** set to th
d780: 65 20 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69  e largest blocki
d790: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
d7a0: 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 7a 65   database (or ze
d7b0: 72 6f 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63  ro if no.** bloc
d7c0: 6b 73 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  ks were written 
d7d0: 74 6f 20 74 68 65 20 64 62 29 2e 20 4f 74 68 65  to the db). Othe
d7e0: 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
d7f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
d800: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
d810: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e  static int fts3N
d820: 6f 64 65 57 72 69 74 65 28 0a 20 20 46 74 73 33  odeWrite(.  Fts3
d830: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
d840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d850: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
d860: 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  dle */.  Segment
d870: 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20 20 20 20  Node *pTree,    
d880: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
d890: 65 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a  entNode handle *
d8a0: 2f 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c  /.  int iHeight,
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66      /* Height of
d8d0: 20 74 68 69 73 20 6e 6f 64 65 20 69 6e 20 74 72   this node in tr
d8e0: 65 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ee */.  sqlite3_
d8f0: 69 6e 74 36 34 20 69 4c 65 61 66 2c 20 20 20 20  int64 iLeaf,    
d900: 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b          /* Block
d910: 20 69 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61   id of first lea
d920: 66 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  f node */.  sqli
d930: 74 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65 2c  te3_int64 iFree,
d940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
d950: 6c 6f 63 6b 20 69 64 20 6f 66 20 6e 65 78 74 20  lock id of next 
d960: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73  free slot in %_s
d970: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c  egments */.  sql
d980: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61  ite3_int64 *piLa
d990: 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st,          /* 
d9a0: 4f 55 54 3a 20 42 6c 6f 63 6b 20 69 64 20 6f 66  OUT: Block id of
d9b0: 20 6c 61 73 74 20 65 6e 74 72 79 20 77 72 69 74   last entry writ
d9c0: 74 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ten */.  char **
d9d0: 70 61 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  paRoot,         
d9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
d9f0: 20 44 61 74 61 20 66 6f 72 20 72 6f 6f 74 20 6e   Data for root n
da00: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ode */.  int *pn
da10: 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
da20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
da30: 20 53 69 7a 65 20 6f 66 20 72 6f 6f 74 20 6e 6f   Size of root no
da40: 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  de in bytes */.)
da50: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
da60: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
da70: 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 29  pTree->pParent )
da80: 7b 0a 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f  {.    /* Root no
da90: 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20  de of the tree. 
daa0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 72  */.    int nStar
dab0: 74 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69  t = fts3TreeFini
dac0: 73 68 4e 6f 64 65 28 70 54 72 65 65 2c 20 69 48  shNode(pTree, iH
dad0: 65 69 67 68 74 2c 20 69 4c 65 61 66 29 3b 0a 20  eight, iLeaf);. 
dae0: 20 20 20 2a 70 69 4c 61 73 74 20 3d 20 69 46 72     *piLast = iFr
daf0: 65 65 2d 31 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f  ee-1;.    *pnRoo
db00: 74 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61  t = pTree->nData
db10: 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20 20 20 2a   - nStart;.    *
db20: 70 61 52 6f 6f 74 20 3d 20 26 70 54 72 65 65 2d  paRoot = &pTree-
db30: 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 3b 0a  >aData[nStart];.
db40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 65 67    }else{.    Seg
db50: 6d 65 6e 74 4e 6f 64 65 20 2a 70 49 74 65 72 3b  mentNode *pIter;
db60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
db70: 36 34 20 69 4e 65 78 74 46 72 65 65 20 3d 20 69  64 iNextFree = i
db80: 46 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Free;.    sqlite
db90: 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 4c 65 61  3_int64 iNextLea
dba0: 66 20 3d 20 69 4c 65 61 66 3b 0a 20 20 20 20 66  f = iLeaf;.    f
dbb0: 6f 72 28 70 49 74 65 72 3d 70 54 72 65 65 2d 3e  or(pIter=pTree->
dbc0: 70 4c 65 66 74 6d 6f 73 74 3b 20 70 49 74 65 72  pLeftmost; pIter
dbd0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
dbe0: 4b 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  K; pIter=pIter->
dbf0: 70 52 69 67 68 74 29 7b 0a 20 20 20 20 20 20 69  pRight){.      i
dc00: 6e 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33  nt nStart = fts3
dc10: 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70  TreeFinishNode(p
dc20: 49 74 65 72 2c 20 69 48 65 69 67 68 74 2c 20 69  Iter, iHeight, i
dc30: 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 20  NextLeaf);.     
dc40: 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 70 49   int nWrite = pI
dc50: 74 65 72 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74  ter->nData - nSt
dc60: 61 72 74 3b 0a 20 20 0a 20 20 20 20 20 20 72 63  art;.  .      rc
dc70: 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d   = fts3WriteSegm
dc80: 65 6e 74 28 70 2c 20 69 4e 65 78 74 46 72 65 65  ent(p, iNextFree
dc90: 2c 20 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  , &pIter->aData[
dca0: 6e 53 74 61 72 74 5d 2c 20 6e 57 72 69 74 65 29  nStart], nWrite)
dcb0: 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 46 72 65  ;.      iNextFre
dcc0: 65 2b 2b 3b 0a 20 20 20 20 20 20 69 4e 65 78 74  e++;.      iNext
dcd0: 4c 65 61 66 20 2b 3d 20 28 70 49 74 65 72 2d 3e  Leaf += (pIter->
dce0: 6e 45 6e 74 72 79 2b 31 29 3b 0a 20 20 20 20 7d  nEntry+1);.    }
dcf0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
dd00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
dd10: 61 73 73 65 72 74 28 20 69 4e 65 78 74 4c 65 61  assert( iNextLea
dd20: 66 3d 3d 69 46 72 65 65 20 29 3b 0a 20 20 20 20  f==iFree );.    
dd30: 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57    rc = fts3NodeW
dd40: 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
dd50: 70 2c 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e  p, pTree->pParen
dd60: 74 2c 20 69 48 65 69 67 68 74 2b 31 2c 20 69 46  t, iHeight+1, iF
dd70: 72 65 65 2c 20 69 4e 65 78 74 46 72 65 65 2c 20  ree, iNextFree, 
dd80: 70 69 4c 61 73 74 2c 20 70 61 52 6f 6f 74 2c 20  piLast, paRoot, 
dd90: 70 6e 52 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a  pnRoot.      );.
dda0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
ddb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ddc0: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
ddd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
dde0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
ddf0: 20 74 72 65 65 20 70 54 72 65 65 2e 0a 2a 2f 0a   tree pTree..*/.
de00: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
de10: 4e 6f 64 65 46 72 65 65 28 53 65 67 6d 65 6e 74  NodeFree(Segment
de20: 4e 6f 64 65 20 2a 70 54 72 65 65 29 7b 0a 20 20  Node *pTree){.  
de30: 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20  if( pTree ){.   
de40: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 20   SegmentNode *p 
de50: 3d 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f  = pTree->pLeftmo
de60: 73 74 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65  st;.    fts3Node
de70: 46 72 65 65 28 70 2d 3e 70 50 61 72 65 6e 74 29  Free(p->pParent)
de80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 29  ;.    while( p )
de90: 7b 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74 4e  {.      SegmentN
dea0: 6f 64 65 20 2a 70 52 69 67 68 74 20 3d 20 70 2d  ode *pRight = p-
deb0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
dec0: 66 28 20 70 2d 3e 61 44 61 74 61 21 3d 28 63 68  f( p->aData!=(ch
ded0: 61 72 20 2a 29 26 70 5b 31 5d 20 29 7b 0a 20 20  ar *)&p[1] ){.  
dee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
def0: 65 65 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20  ee(p->aData);.  
df00: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
df10: 72 74 28 20 70 52 69 67 68 74 3d 3d 30 20 7c 7c  rt( pRight==0 ||
df20: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29   p->zMalloc==0 )
df30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
df40: 66 72 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  free(p->zMalloc)
df50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
df60: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 70  free(p);.      p
df70: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d   = pRight;.    }
df80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
df90: 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20  d a term to the 
dfa0: 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  segment being co
dfb0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
dfc0: 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f   SegmentWriter o
dfd0: 62 6a 65 63 74 0a 2a 2a 20 2a 70 70 57 72 69 74  bject.** *ppWrit
dfe0: 65 72 2e 20 57 68 65 6e 20 61 64 64 69 6e 67 20  er. When adding 
dff0: 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 74  the first term t
e000: 6f 20 61 20 73 65 67 6d 65 6e 74 2c 20 2a 70 70  o a segment, *pp
e010: 57 72 69 74 65 72 20 73 68 6f 75 6c 64 0a 2a 2a  Writer should.**
e020: 20 62 65 20 70 61 73 73 65 64 20 4e 55 4c 4c 2e   be passed NULL.
e030: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
e040: 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  ill allocate a n
e050: 65 77 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  ew SegmentWriter
e060: 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 72   object.** and r
e070: 65 74 75 72 6e 20 69 74 20 76 69 61 20 74 68 65  eturn it via the
e080: 20 69 6e 70 75 74 2f 6f 75 74 70 75 74 20 76 61   input/output va
e090: 72 69 61 62 6c 65 20 2a 70 70 57 72 69 74 65 72  riable *ppWriter
e0a0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
e0b0: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
e0c0: 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
e0d0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
e0e0: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
e0f0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
e100: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
e110: 67 57 72 69 74 65 72 41 64 64 28 0a 20 20 46 74  gWriterAdd(.  Ft
e120: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e140: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
e150: 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65  andle */.  Segme
e160: 6e 74 57 72 69 74 65 72 20 2a 2a 70 70 57 72 69  ntWriter **ppWri
e170: 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  ter,       /* IN
e180: 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74 57 72 69  /OUT: SegmentWri
e190: 74 65 72 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20  ter handle */ . 
e1a0: 20 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c   int isCopyTerm,
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 62 75 66 66   /* True if buff
e1d0: 65 72 20 7a 54 65 72 6d 20 6d 75 73 74 20 62 65  er zTerm must be
e1e0: 20 63 6f 70 69 65 64 20 2a 2f 0a 20 20 63 6f 6e   copied */.  con
e1f0: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e210: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
e220: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  r containing ter
e230: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  m */.  int nTerm
e240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e250: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e260: 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20  f term in bytes 
e270: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e280: 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20  *aDoclist,      
e290: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e2a0: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
e2b0: 6e 69 6e 67 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  ning doclist */.
e2c0: 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20    int nDoclist  
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
e2f0: 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
e300: 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69  .){.  int nPrefi
e310: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
e320: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e330: 20 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20   term prefix in 
e340: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
e350: 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20  Suffix;         
e360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
e370: 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69  ze of term suffi
e380: 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  x in bytes */.  
e390: 69 6e 74 20 6e 52 65 71 3b 20 20 20 20 20 20 20  int nReq;       
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
e3c0: 65 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6c  es required on l
e3d0: 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  eaf page */.  in
e3e0: 74 20 6e 44 61 74 61 3b 0a 20 20 53 65 67 6d 65  t nData;.  Segme
e3f0: 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  ntWriter *pWrite
e400: 72 20 3d 20 2a 70 70 57 72 69 74 65 72 3b 0a 0a  r = *ppWriter;..
e410: 20 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29    if( !pWriter )
e420: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
e430: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e440: 70 53 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20 41  pStmt;..    /* A
e450: 6c 6c 6f 63 61 74 65 20 74 68 65 20 53 65 67 6d  llocate the Segm
e460: 65 6e 74 57 72 69 74 65 72 20 73 74 72 75 63 74  entWriter struct
e470: 75 72 65 20 2a 2f 0a 20 20 20 20 70 57 72 69 74  ure */.    pWrit
e480: 65 72 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69  er = (SegmentWri
e490: 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ter *)sqlite3_ma
e4a0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d  lloc(sizeof(Segm
e4b0: 65 6e 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20  entWriter));.   
e4c0: 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29 20   if( !pWriter ) 
e4d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e4e0: 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  MEM;.    memset(
e4f0: 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
e500: 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72  of(SegmentWriter
e510: 29 29 3b 0a 20 20 20 20 2a 70 70 57 72 69 74 65  ));.    *ppWrite
e520: 72 20 3d 20 70 57 72 69 74 65 72 3b 0a 0a 20 20  r = pWriter;..  
e530: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
e540: 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  buffer in which 
e550: 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61  to accumulate da
e560: 74 61 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65  ta */.    pWrite
e570: 72 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72  r->aData = (char
e580: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
e590: 63 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b  c(p->nNodeSize);
e5a0: 0a 20 20 20 20 69 66 28 20 21 70 57 72 69 74 65  .    if( !pWrite
e5b0: 72 2d 3e 61 44 61 74 61 20 29 20 72 65 74 75 72  r->aData ) retur
e5c0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e5d0: 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69      pWriter->nSi
e5e0: 7a 65 20 3d 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a  ze = p->nNodeSiz
e5f0: 65 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  e;..    /* Find 
e600: 74 68 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c  the next free bl
e610: 6f 63 6b 69 64 20 69 6e 20 74 68 65 20 25 5f 73  ockid in the %_s
e620: 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f  egments table */
e630: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
e640: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58  lStmt(p, SQL_NEX
e650: 54 5f 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26  T_SEGMENTS_ID, &
e660: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
e670: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e680: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e690: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
e6a0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
e6b0: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Stmt) ){.      p
e6c0: 57 72 69 74 65 72 2d 3e 69 46 72 65 65 20 3d 20  Writer->iFree = 
e6d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
e6e0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a  nt64(pStmt, 0);.
e6f0: 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
e700: 46 69 72 73 74 20 3d 20 70 57 72 69 74 65 72 2d  First = pWriter-
e710: 3e 69 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  >iFree;.    }.  
e720: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
e730: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
e740: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e750: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e760: 20 20 7d 0a 20 20 6e 44 61 74 61 20 3d 20 70 57    }.  nData = pW
e770: 72 69 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 0a 20  riter->nData;.. 
e780: 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50   nPrefix = fts3P
e790: 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 57  refixCompress(pW
e7a0: 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 57  riter->zTerm, pW
e7b0: 72 69 74 65 72 2d 3e 6e 54 65 72 6d 2c 20 7a 54  riter->nTerm, zT
e7c0: 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e  erm, nTerm);.  n
e7d0: 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e  Suffix = nTerm-n
e7e0: 50 72 65 66 69 78 3b 0a 0a 20 20 2f 2a 20 46 69  Prefix;..  /* Fi
e7f0: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
e800: 79 20 62 79 74 65 73 20 61 72 65 20 72 65 71 75  y bytes are requ
e810: 69 72 65 64 20 62 79 20 74 68 69 73 20 6e 65 77  ired by this new
e820: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6e 52 65 71   entry */.  nReq
e830: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61   = sqlite3Fts3Va
e840: 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29  rintLen(nPrefix)
e850: 20 2b 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20   +    /* varint 
e860: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
e870: 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  x size */.    sq
e880: 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
e890: 65 6e 28 6e 53 75 66 66 69 78 29 20 2b 20 20 20  en(nSuffix) +   
e8a0: 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
e8b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69  containing suffi
e8c0: 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6e 53  x size */.    nS
e8d0: 75 66 66 69 78 20 2b 20 20 20 20 20 20 20 20 20  uffix +         
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75        /* Term su
e900: 66 66 69 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffix */.    sqli
e910: 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
e920: 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20  (nDoclist) +    
e930: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
e940: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6e 44  oclist */.    nD
e950: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e970: 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
e980: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 66 28 20   data */..  if( 
e990: 6e 44 61 74 61 3e 30 20 26 26 20 6e 44 61 74 61  nData>0 && nData
e9a0: 2b 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69  +nReq>p->nNodeSi
e9b0: 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ze ){.    int rc
e9c0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ;..    /* The cu
e9d0: 72 72 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65 20  rrent leaf node 
e9e0: 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69  is full. Write i
e9f0: 74 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  t out to the dat
ea00: 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 63  abase. */.    rc
ea10: 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d   = fts3WriteSegm
ea20: 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e  ent(p, pWriter->
ea30: 69 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72  iFree++, pWriter
ea40: 2d 3e 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  ->aData, nData);
ea50: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ea60: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
ea70: 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20  rc;..    /* Add 
ea80: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
ea90: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72   to the interior
eaa0: 20 6e 6f 64 65 20 74 72 65 65 2e 20 54 68 65 20   node tree. The 
eab0: 74 65 72 6d 20 61 64 64 65 64 20 74 6f 0a 20 20  term added to.  
eac0: 20 20 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f    ** the interio
ead0: 72 20 74 72 65 65 20 6d 75 73 74 3a 0a 20 20 20  r tree must:.   
eae0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20   **.    **   a) 
eaf0: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
eb00: 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d  the largest term
eb10: 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   on the leaf nod
eb20: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20  e just written. 
eb30: 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68     **      to th
eb40: 65 20 64 61 74 61 62 61 73 65 20 28 73 74 69 6c  e database (stil
eb50: 6c 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  l available in p
eb60: 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 29 2c 20  Writer->zTerm), 
eb70: 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  and.    **.    *
eb80: 2a 20 20 20 62 29 20 62 65 20 6c 65 73 73 20 74  *   b) be less t
eb90: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
eba0: 74 68 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74  the term about t
ebb0: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
ebc0: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20  e new.    **    
ebd0: 20 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65    leaf node (zTe
ebe0: 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a  rm/nTerm)..    *
ebf0: 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  *.    ** In othe
ec00: 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74  r words, it must
ec10: 20 62 65 20 74 68 65 20 70 72 65 66 69 78 20 6f   be the prefix o
ec20: 66 20 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c  f zTerm 1 byte l
ec30: 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  onger than.    *
ec40: 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  * the common pre
ec50: 66 69 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20  fix (if any) of 
ec60: 7a 54 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65  zTerm and pWrite
ec70: 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f  r->zTerm..    */
ec80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72  .    assert( nPr
ec90: 65 66 69 78 3c 6e 54 65 72 6d 20 29 3b 0a 20 20  efix<nTerm );.  
eca0: 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41    rc = fts3NodeA
ecb0: 64 64 54 65 72 6d 28 70 2c 20 26 70 57 72 69 74  ddTerm(p, &pWrit
ecc0: 65 72 2d 3e 70 54 72 65 65 2c 20 69 73 43 6f 70  er->pTree, isCop
ecd0: 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 50  yTerm, zTerm, nP
ece0: 72 65 66 69 78 2b 31 29 3b 0a 20 20 20 20 69 66  refix+1);.    if
ecf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ed00: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
ed10: 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    nData = 0;.   
ed20: 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20   pWriter->nTerm 
ed30: 3d 20 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66 69  = 0;..    nPrefi
ed40: 78 20 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66 66  x = 0;.    nSuff
ed50: 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20  ix = nTerm;.    
ed60: 6e 52 65 71 20 3d 20 31 20 2b 20 20 20 20 20 20  nReq = 1 +      
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e          /* varin
ed90: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  t containing pre
eda0: 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  fix size */.    
edb0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72    sqlite3Fts3Var
edc0: 69 6e 74 4c 65 6e 28 6e 54 65 72 6d 29 20 2b 20  intLen(nTerm) + 
edd0: 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e          /* varin
ede0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66  t containing suf
edf0: 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  fix size */.    
ee00: 20 20 6e 54 65 72 6d 20 2b 20 20 20 20 20 20 20    nTerm +       
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20          /* Term 
ee30: 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 20 20  suffix */.      
ee40: 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
ee50: 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b  tLen(nDoclist) +
ee60: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ee70: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20   doclist */.    
ee80: 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20    nDoclist;     
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69          /* Docli
eeb0: 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 7d 0a 0a  st data */.  }..
eec0: 20 20 2f 2a 20 49 66 20 74 68 65 20 62 75 66 66    /* If the buff
eed0: 65 72 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c  er currently all
eee0: 6f 63 61 74 65 64 20 69 73 20 74 6f 6f 20 73 6d  ocated is too sm
eef0: 61 6c 6c 20 66 6f 72 20 74 68 69 73 20 65 6e 74  all for this ent
ef00: 72 79 2c 20 72 65 61 6c 6c 6f 63 0a 20 20 2a 2a  ry, realloc.  **
ef10: 20 74 68 65 20 62 75 66 66 65 72 20 74 6f 20 6d   the buffer to m
ef20: 61 6b 65 20 69 74 20 6c 61 72 67 65 20 65 6e 6f  ake it large eno
ef30: 75 67 68 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ugh..  */.  if( 
ef40: 6e 52 65 71 3e 70 57 72 69 74 65 72 2d 3e 6e 53  nReq>pWriter->nS
ef50: 69 7a 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ize ){.    char 
ef60: 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *aNew = sqlite3_
ef70: 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d  realloc(pWriter-
ef80: 3e 61 44 61 74 61 2c 20 6e 52 65 71 29 3b 0a 20  >aData, nReq);. 
ef90: 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 20 72     if( !aNew ) r
efa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
efb0: 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  EM;.    pWriter-
efc0: 3e 61 44 61 74 61 20 3d 20 61 4e 65 77 3b 0a 20  >aData = aNew;. 
efd0: 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a     pWriter->nSiz
efe0: 65 20 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a 20 20  e = nReq;.  }.  
eff0: 61 73 73 65 72 74 28 20 6e 44 61 74 61 2b 6e 52  assert( nData+nR
f000: 65 71 3c 3d 70 57 72 69 74 65 72 2d 3e 6e 53 69  eq<=pWriter->nSi
f010: 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65  ze );..  /* Appe
f020: 6e 64 20 74 68 65 20 70 72 65 66 69 78 2d 63 6f  nd the prefix-co
f030: 6d 70 72 65 73 73 65 64 20 74 65 72 6d 20 61 6e  mpressed term an
f040: 64 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65  d doclist to the
f050: 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 6e 44   buffer. */.  nD
f060: 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
f070: 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57 72  s3PutVarint(&pWr
f080: 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74  iter->aData[nDat
f090: 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  a], nPrefix);.  
f0a0: 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
f0b0: 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
f0c0: 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
f0d0: 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  ata], nSuffix);.
f0e0: 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74 65    memcpy(&pWrite
f0f0: 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c  r->aData[nData],
f100: 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d   &zTerm[nPrefix]
f110: 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 6e 44  , nSuffix);.  nD
f120: 61 74 61 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a  ata += nSuffix;.
f130: 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74    nData += sqlit
f140: 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
f150: 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b  &pWriter->aData[
f160: 6e 44 61 74 61 5d 2c 20 6e 44 6f 63 6c 69 73 74  nData], nDoclist
f170: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72  );.  memcpy(&pWr
f180: 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74  iter->aData[nDat
f190: 61 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44  a], aDoclist, nD
f1a0: 6f 63 6c 69 73 74 29 3b 0a 20 20 70 57 72 69 74  oclist);.  pWrit
f1b0: 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74  er->nData = nDat
f1c0: 61 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20  a + nDoclist;.. 
f1d0: 20 2f 2a 20 53 61 76 65 20 74 68 65 20 63 75 72   /* Save the cur
f1e0: 72 65 6e 74 20 74 65 72 6d 20 73 6f 20 74 68 61  rent term so tha
f1f0: 74 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  t it can be used
f200: 20 74 6f 20 70 72 65 66 69 78 2d 63 6f 6d 70 72   to prefix-compr
f210: 65 73 73 20 74 68 65 20 6e 65 78 74 2e 0a 20 20  ess the next..  
f220: 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 70 79  ** If the isCopy
f230: 54 65 72 6d 20 70 61 72 61 6d 65 74 65 72 20 69  Term parameter i
f240: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
f250: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
f260: 74 6f 20 62 79 0a 20 20 2a 2a 20 7a 54 65 72 6d  to by.  ** zTerm
f270: 20 69 73 20 74 72 61 6e 73 69 65 6e 74 2c 20 73   is transient, s
f280: 6f 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o take a copy of
f290: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 20   the term data. 
f2a0: 4f 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a  Otherwise, just.
f2b0: 20 20 2a 2a 20 73 74 6f 72 65 20 61 20 63 6f 70    ** store a cop
f2c0: 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
f2d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43  ..  */.  if( isC
f2e0: 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 69  opyTerm ){.    i
f2f0: 66 28 20 6e 54 65 72 6d 3e 70 57 72 69 74 65 72  f( nTerm>pWriter
f300: 2d 3e 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->nMalloc ){.   
f310: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20     char *zNew = 
f320: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
f330: 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63  pWriter->zMalloc
f340: 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20  , nTerm*2);.    
f350: 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20    if( !zNew ){. 
f360: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f370: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
f380: 20 20 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65    }.      pWrite
f390: 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65  r->nMalloc = nTe
f3a0: 72 6d 2a 32 3b 0a 20 20 20 20 20 20 70 57 72 69  rm*2;.      pWri
f3b0: 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a  ter->zMalloc = z
f3c0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 57 72 69 74  New;.      pWrit
f3d0: 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77  er->zTerm = zNew
f3e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
f3f0: 72 74 28 20 70 57 72 69 74 65 72 2d 3e 7a 54 65  rt( pWriter->zTe
f400: 72 6d 3d 3d 70 57 72 69 74 65 72 2d 3e 7a 4d 61  rm==pWriter->zMa
f410: 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 6d 65 6d 63  lloc );.    memc
f420: 70 79 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  py(pWriter->zTer
f430: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
f440: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
f450: 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20  Writer->zTerm = 
f460: 28 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20  (char *)zTerm;. 
f470: 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 54   }.  pWriter->nT
f480: 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20  erm = nTerm;..  
f490: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f4a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
f4b0: 20 61 6c 6c 20 64 61 74 61 20 61 73 73 6f 63 69   all data associ
f4c0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 53 65  ated with the Se
f4d0: 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65  gmentWriter obje
f4e0: 63 74 20 70 57 72 69 74 65 72 20 74 6f 20 74 68  ct pWriter to th
f4f0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54  e.** database. T
f500: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
f510: 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  t be called afte
f520: 72 20 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65  r all terms have
f530: 20 62 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20 74   been added.** t
f540: 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 75 73  o the segment us
f550: 69 6e 67 20 66 74 73 33 53 65 67 57 72 69 74 65  ing fts3SegWrite
f560: 72 41 64 64 28 29 2e 20 49 66 20 73 75 63 63 65  rAdd(). If succe
f570: 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
f580: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
f590: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
f5a0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
f5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f5c0: 66 74 73 33 53 65 67 57 72 69 74 65 72 46 6c 75  fts3SegWriterFlu
f5d0: 73 68 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  sh(.  Fts3Table 
f5e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f5f0: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
f600: 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
f610: 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  .  SegmentWriter
f620: 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
f630: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 57 72 69     /* SegmentWri
f640: 74 65 72 20 74 6f 20 66 6c 75 73 68 20 74 6f 20  ter to flush to 
f650: 74 68 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20  the db */.  int 
f660: 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
f670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
f680: 61 6c 75 65 20 66 6f 72 20 27 6c 65 76 65 6c 27  alue for 'level'
f690: 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67   column of %_seg
f6a0: 64 69 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  dir */.  int iId
f6b0: 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
f6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
f6d0: 65 20 66 6f 72 20 27 69 64 78 27 20 63 6f 6c 75  e for 'idx' colu
f6e0: 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a  mn of %_segdir *
f6f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
f720: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70   code */.  if( p
f730: 57 72 69 74 65 72 2d 3e 70 54 72 65 65 20 29 7b  Writer->pTree ){
f740: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
f750: 36 34 20 69 4c 61 73 74 20 3d 20 30 3b 20 20 20  64 iLast = 0;   
f760: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 62 6c     /* Largest bl
f770: 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74  ock id written t
f780: 6f 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  o database */.  
f790: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
f7a0: 69 4c 61 73 74 4c 65 61 66 3b 20 20 20 20 20 20  iLastLeaf;      
f7b0: 2f 2a 20 4c 61 72 67 65 73 74 20 6c 65 61 66 20  /* Largest leaf 
f7c0: 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e  block id written
f7d0: 20 74 6f 20 64 62 20 2a 2f 0a 20 20 20 20 63 68   to db */.    ch
f7e0: 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55 4c 4c  ar *zRoot = NULL
f7f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
f800: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
f810: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74   containing root
f820: 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74   node */.    int
f830: 20 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20   nRoot = 0;     
f840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
f850: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 52 6f  ze of buffer zRo
f860: 6f 74 20 2a 2f 0a 0a 20 20 20 20 69 4c 61 73 74  ot */..    iLast
f870: 4c 65 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e  Leaf = pWriter->
f880: 69 46 72 65 65 3b 0a 20 20 20 20 72 63 20 3d 20  iFree;.    rc = 
f890: 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74  fts3WriteSegment
f8a0: 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72  (p, pWriter->iFr
f8b0: 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61  ee++, pWriter->a
f8c0: 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e  Data, pWriter->n
f8d0: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72  Data);.    if( r
f8e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f8f0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e        rc = fts3N
f900: 6f 64 65 57 72 69 74 65 28 70 2c 20 70 57 72 69  odeWrite(p, pWri
f910: 74 65 72 2d 3e 70 54 72 65 65 2c 20 31 2c 0a 20  ter->pTree, 1,. 
f920: 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72           pWriter
f930: 2d 3e 69 46 69 72 73 74 2c 20 70 57 72 69 74 65  ->iFirst, pWrite
f940: 72 2d 3e 69 46 72 65 65 2c 20 26 69 4c 61 73 74  r->iFree, &iLast
f950: 2c 20 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f 6f 74  , &zRoot, &nRoot
f960: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f980: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
f990: 33 57 72 69 74 65 53 65 67 64 69 72 28 0a 20 20  3WriteSegdir(.  
f9a0: 20 20 20 20 20 20 20 20 70 2c 20 69 4c 65 76 65          p, iLeve
f9b0: 6c 2c 20 69 49 64 78 2c 20 70 57 72 69 74 65 72  l, iIdx, pWriter
f9c0: 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73 74 4c  ->iFirst, iLastL
f9d0: 65 61 66 2c 20 69 4c 61 73 74 2c 20 7a 52 6f 6f  eaf, iLast, zRoo
f9e0: 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d  t, nRoot);.    }
f9f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
fa00: 20 54 68 65 20 65 6e 74 69 72 65 20 74 72 65 65   The entire tree
fa10: 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f   fits on the roo
fa20: 74 20 6e 6f 64 65 2e 20 57 72 69 74 65 20 69 74  t node. Write it
fa30: 20 74 6f 20 74 68 65 20 73 65 67 64 69 72 20 74   to the segdir t
fa40: 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20  able. */.    rc 
fa50: 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69  = fts3WriteSegdi
fa60: 72 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c  r(.        p, iL
fa70: 65 76 65 6c 2c 20 69 49 64 78 2c 20 30 2c 20 30  evel, iIdx, 0, 0
fa80: 2c 20 30 2c 20 70 57 72 69 74 65 72 2d 3e 61 44  , 0, pWriter->aD
fa90: 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44  ata, pWriter->nD
faa0: 61 74 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ata);.  }.  retu
fab0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fac0: 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d 65 6d 6f  Release all memo
fad0: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 53  ry held by the S
fae0: 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a  egmentWriter obj
faf0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
fb00: 65 20 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  e .** first argu
fb10: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
fb20: 76 6f 69 64 20 66 74 73 33 53 65 67 57 72 69 74  void fts3SegWrit
fb30: 65 72 46 72 65 65 28 53 65 67 6d 65 6e 74 57 72  erFree(SegmentWr
fb40: 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
fb50: 20 20 69 66 28 20 70 57 72 69 74 65 72 20 29 7b    if( pWriter ){
fb60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
fb70: 65 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  e(pWriter->aData
fb80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
fb90: 72 65 65 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61  ree(pWriter->zMa
fba0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74 73 33 4e  lloc);.    fts3N
fbb0: 6f 64 65 46 72 65 65 28 70 57 72 69 74 65 72 2d  odeFree(pWriter-
fbc0: 3e 70 54 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  >pTree);.    sql
fbd0: 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
fbe0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
fbf0: 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65   The first value
fc00: 20 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20   in the apVal[] 
fc10: 61 72 72 61 79 20 69 73 20 61 73 73 75 6d 65 64  array is assumed
fc20: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69   to contain an i
fc30: 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68 69 73 20  nteger..** This 
fc40: 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
fc50: 66 20 74 68 65 72 65 20 65 78 69 73 74 20 61 6e  f there exist an
fc60: 79 20 64 6f 63 75 6d 65 6e 74 73 20 77 69 74 68  y documents with
fc70: 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 74 68   docid values th
fc80: 61 74 0a 2a 2a 20 61 72 65 20 64 69 66 66 65 72  at.** are differ
fc90: 65 6e 74 20 66 72 6f 6d 20 74 68 61 74 20 69 6e  ent from that in
fca0: 74 65 67 65 72 2e 20 69 2e 65 2e 20 69 66 20 64  teger. i.e. if d
fcb0: 65 6c 65 74 69 6e 67 20 74 68 65 20 64 6f 63 75  eleting the docu
fcc0: 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64 0a  ment with docid.
fcd0: 2a 2a 20 61 70 56 61 6c 5b 30 5d 20 77 6f 75 6c  ** apVal[0] woul
fce0: 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53 33 20  d mean the FTS3 
fcf0: 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70 74 79  table were empty
fd00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
fd10: 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74 79  ssful, *pisEmpty
fd20: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
fd30: 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
fd40: 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72  empty except for
fd50: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 61 70 56  .** document apV
fd60: 61 6c 5b 30 5d 2c 20 6f 72 20 66 61 6c 73 65 20  al[0], or false 
fd70: 6f 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53  otherwise, and S
fd80: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
fd90: 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  rned. If an.** e
fda0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
fdb0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
fdc0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
fdd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
fde0: 33 49 73 45 6d 70 74 79 28 46 74 73 33 54 61 62  3IsEmpty(Fts3Tab
fdf0: 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  le *p, sqlite3_v
fe00: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 69 6e  alue **apVal, in
fe10: 74 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20 20  t *pisEmpty){.  
fe20: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
fe30: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
fe40: 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
fe50: 74 28 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50 54  t(p, SQL_IS_EMPT
fe60: 59 2c 20 26 70 53 74 6d 74 2c 20 61 70 56 61 6c  Y, &pStmt, apVal
fe70: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
fe80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
fe90: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
fea0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
feb0: 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 69 73 45  ) ){.      *pisE
fec0: 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 5f 63  mpty = sqlite3_c
fed0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
fee0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
fef0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
ff00: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  t(pStmt);.  }.  
ff10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ff20: 0a 2a 2a 20 53 65 74 20 2a 70 6e 53 65 67 6d 65  .** Set *pnSegme
ff30: 6e 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  nt to the number
ff40: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 66 20   of segments of 
ff50: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 20  level iLevel in 
ff60: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
ff70: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
ff80: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
ff90: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
ffa0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6e   error code if n
ffb0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
ffc0: 74 20 66 74 73 33 53 65 67 6d 65 6e 74 43 6f 75  t fts3SegmentCou
ffd0: 6e 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  nt(Fts3Table *p,
ffe0: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 69 6e 74   int iLevel, int
fff0: 20 2a 70 6e 53 65 67 6d 65 6e 74 29 7b 0a 20 20   *pnSegment){.  
10000 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
10010 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
10020 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
10030 3e 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 66 74  >=0 );.  rc = ft
10040 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
10050 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f  _SELECT_LEVEL_CO
10060 55 4e 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  UNT, &pStmt, 0);
10070 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10080 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10090 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
100a0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 69  _int(pStmt, 1, i
100b0 4c 65 76 65 6c 29 3b 0a 20 20 69 66 28 20 53 51  Level);.  if( SQ
100c0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
100d0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
100e0 0a 20 20 20 20 2a 70 6e 53 65 67 6d 65 6e 74 20  .    *pnSegment 
100f0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
10100 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
10110 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
10120 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
10130 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
10140 2a 70 6e 53 65 67 6d 65 6e 74 20 74 6f 20 74 68  *pnSegment to th
10150 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
10160 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  f segments in th
10170 65 20 64 61 74 61 62 61 73 65 2e 20 53 65 74 0a  e database. Set.
10180 2a 2a 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65  ** *pnMax to the
10190 20 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74   largest segment
101a0 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61   level in the da
101b0 74 61 62 61 73 65 20 28 73 65 67 6d 65 6e 74 20  tabase (segment 
101c0 6c 65 76 65 6c 73 0a 2a 2a 20 61 72 65 20 73 74  levels.** are st
101d0 6f 72 65 64 20 69 6e 20 74 68 65 20 27 6c 65 76  ored in the 'lev
101e0 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  el' column of th
101f0 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
10200 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )..**.** Return 
10210 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
10220 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
10230 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
10240 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
10250 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65  ic int fts3Segme
10260 6e 74 43 6f 75 6e 74 4d 61 78 28 46 74 73 33 54  ntCountMax(Fts3T
10270 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  able *p, int *pn
10280 53 65 67 6d 65 6e 74 2c 20 69 6e 74 20 2a 70 6e  Segment, int *pn
10290 4d 61 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Max){.  sqlite3_
102a0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
102b0 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 66  nt rc;..  rc = f
102c0 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
102d0 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f  L_SELECT_SEGDIR_
102e0 43 4f 55 4e 54 5f 4d 41 58 2c 20 26 70 53 74 6d  COUNT_MAX, &pStm
102f0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
10300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
10310 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 53 51  urn rc;.  if( SQ
10320 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
10330 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
10340 0a 20 20 20 20 2a 70 6e 53 65 67 6d 65 6e 74 20  .    *pnSegment 
10350 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
10360 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
10370 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71 6c      *pnMax = sql
10380 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
10390 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20  pStmt, 1);.  }. 
103a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
103b0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a  reset(pStmt);.}.
103c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
103d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 66 74  tion is used aft
103e0 65 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69  er merging multi
103f0 70 6c 65 20 73 65 67 6d 65 6e 74 73 20 69 6e 74  ple segments int
10400 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65  o a single large
10410 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 64  .** segment to d
10420 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c 20 6e  elete the old, n
10430 6f 77 20 72 65 64 75 6e 64 61 6e 74 2c 20 73 65  ow redundant, se
10440 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 53  gment b-trees. S
10450 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20  pecifically,.** 
10460 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29 20  it:.** .**   1) 
10470 44 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65  Deletes all %_se
10480 67 6d 65 6e 74 73 20 65 6e 74 72 69 65 73 20 66  gments entries f
10490 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20  or the segments 
104a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
104b0 0a 2a 2a 20 20 20 20 20 20 65 61 63 68 20 6f 66  .**      each of
104c0 20 74 68 65 20 53 65 67 52 65 61 64 65 72 20 6f   the SegReader o
104d0 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 61 72  bjects in the ar
104e0 72 61 79 20 70 61 73 73 65 64 20 61 73 20 74 68  ray passed as th
104f0 65 20 74 68 69 72 64 20 0a 2a 2a 20 20 20 20 20  e third .**     
10500 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a   argument, and.*
10510 2a 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65 74 65  *.**   2) delete
10520 73 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65  s all %_segdir e
10530 6e 74 72 69 65 73 20 77 69 74 68 20 6c 65 76 65  ntries with leve
10540 6c 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c 6c  l iLevel, or all
10550 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20 20   %_segdir.**    
10560 20 20 65 6e 74 72 69 65 73 20 72 65 67 61 72 64    entries regard
10570 6c 65 73 73 20 6f 66 20 6c 65 76 65 6c 20 69 66  less of level if
10580 20 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a   (iLevel<0)..**.
10590 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
105a0 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
105b0 65 73 73 66 75 6c 2c 20 6f 74 68 65 72 77 69 73  essful, otherwis
105c0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
105d0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
105e0 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65  c int fts3Delete
105f0 53 65 67 64 69 72 28 0a 20 20 46 74 73 33 54 61  Segdir(.  Fts3Ta
10600 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
10610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
10620 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
10630 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
10640 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
10650 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
10660 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  of %_segdir entr
10670 69 65 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ies to delete */
10680 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
10690 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20   **apSegment,   
106a0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53     /* Array of S
106b0 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73  egReader objects
106c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 65   */.  int nReade
106d0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
106e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
106f0 20 61 72 72 61 79 20 61 70 53 65 67 6d 65 6e 74   array apSegment
10700 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10730 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
10740 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10760 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
10770 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
10780 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20  tmt *pDelete;   
10790 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
107a0 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74  atement to delet
107b0 65 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 72 63 20  e rows */..  rc 
107c0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
107d0 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d   SQL_DELETE_SEGM
107e0 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65  ENTS_RANGE, &pDe
107f0 6c 65 74 65 2c 20 30 29 3b 0a 20 20 66 6f 72 28  lete, 0);.  for(
10800 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10810 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64 65 72 3b  OK && i<nReader;
10820 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53   i++){.    Fts3S
10830 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 6d 65  egReader *pSegme
10840 6e 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69  nt = apSegment[i
10850 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 6d  ];.    if( pSegm
10860 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b  ent->iStartBlock
10870 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10880 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65  3_bind_int64(pDe
10890 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 6d 65 6e  lete, 1, pSegmen
108a0 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b  t->iStartBlock);
108b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
108c0 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74  ind_int64(pDelet
108d0 65 2c 20 32 2c 20 70 53 65 67 6d 65 6e 74 2d 3e  e, 2, pSegment->
108e0 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  iEndBlock);.    
108f0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
10900 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 72  Delete);.      r
10910 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
10920 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20  t(pDelete);.    
10930 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  }.  }.  if( rc!=
10940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10950 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10960 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3e 3d 30  .  if( iLevel>=0
10970 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
10980 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
10990 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 42 59  DELETE_SEGDIR_BY
109a0 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c 65 74 65  _LEVEL, &pDelete
109b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
109c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
109d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
109e0 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c 20 31  d_int(pDelete, 1
109f0 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , iLevel);.     
10a00 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44   sqlite3_step(pD
10a10 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 72 63  elete);.      rc
10a20 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
10a30 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 7d  (pDelete);.    }
10a40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
10a50 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
10a60 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  , SQL_DELETE_ALL
10a70 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20 7d  _SEGDIR, 0);.  }
10a80 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
10a90 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
10aa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
10ab0 6c 6c 65 64 2c 20 62 75 66 66 65 72 20 2a 70 70  lled, buffer *pp
10ac0 4c 69 73 74 20 28 73 69 7a 65 20 2a 70 6e 4c 69  List (size *pnLi
10ad0 73 74 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69  st bytes) contai
10ae0 6e 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74 69 6f  ns .** a positio
10af0 6e 20 6c 69 73 74 20 74 68 61 74 20 6d 61 79 20  n list that may 
10b00 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66 65 61  (or may not) fea
10b10 74 75 72 65 20 6d 75 6c 74 69 70 6c 65 20 63 6f  ture multiple co
10b20 6c 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a 20 66  lumns. This.** f
10b30 75 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74 73 20  unction adjusts 
10b40 74 68 65 20 70 6f 69 6e 74 65 72 20 2a 70 70 4c  the pointer *ppL
10b50 69 73 74 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ist and the leng
10b60 74 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20 74 68  th *pnList so th
10b70 61 74 20 74 68 65 79 0a 2a 2a 20 69 64 65 6e 74  at they.** ident
10b80 69 66 79 20 74 68 65 20 73 75 62 73 65 74 20 6f  ify the subset o
10b90 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
10ba0 69 73 74 20 74 68 61 74 20 63 6f 72 72 65 73 70  ist that corresp
10bb0 6f 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 69  onds to column i
10bc0 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  Col..**.** If th
10bd0 65 72 65 20 61 72 65 20 6e 6f 20 65 6e 74 72 69  ere are no entri
10be0 65 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  es in the input 
10bf0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f  position list fo
10c00 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74  r column iCol, t
10c10 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74 20 69  hen.** *pnList i
10c20 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 62 65  s set to zero be
10c30 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
10c40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10c50 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28  ts3ColumnFilter(
10c60 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
10c90 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63  filter on */.  c
10ca0 68 61 72 20 2a 2a 70 70 4c 69 73 74 2c 20 20 20  har **ppList,   
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10cc0 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
10cd0 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69  r to position li
10ce0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  st */.  int *pnL
10cf0 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
10d00 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
10d10 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  T: Size of buffe
10d20 72 20 2a 70 70 4c 69 73 74 20 69 6e 20 62 79 74  r *ppList in byt
10d30 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  es */.){.  char 
10d40 2a 70 4c 69 73 74 20 3d 20 2a 70 70 4c 69 73 74  *pList = *ppList
10d50 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20  ;.  int nList = 
10d60 2a 70 6e 4c 69 73 74 3b 0a 20 20 63 68 61 72 20  *pnList;.  char 
10d70 2a 70 45 6e 64 20 3d 20 26 70 4c 69 73 74 5b 6e  *pEnd = &pList[n
10d80 4c 69 73 74 5d 3b 0a 20 20 69 6e 74 20 69 43 75  List];.  int iCu
10d90 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61  rrent = 0;.  cha
10da0 72 20 2a 70 20 3d 20 70 4c 69 73 74 3b 0a 0a 20  r *p = pList;.. 
10db0 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
10dc0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29   );.  while( 1 )
10dd0 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 30  {.    char c = 0
10de0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70  ;.    while( p<p
10df0 45 6e 64 20 26 26 20 28 63 20 7c 20 2a 70 29 26  End && (c | *p)&
10e00 30 78 46 45 20 29 20 63 20 3d 20 2a 70 2b 2b 20  0xFE ) c = *p++ 
10e10 26 20 30 78 38 30 3b 0a 20 20 0a 20 20 20 20 69  & 0x80;.  .    i
10e20 66 28 20 69 43 6f 6c 3d 3d 69 43 75 72 72 65 6e  f( iCol==iCurren
10e30 74 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 73 74  t ){.      nList
10e40 20 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69   = (int)(p - pLi
10e50 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
10e60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 69  ;.    }..    nLi
10e70 73 74 20 2d 3d 20 28 69 6e 74 29 28 70 20 2d 20  st -= (int)(p - 
10e80 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  pList);.    pLis
10e90 74 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 6e  t = p;.    if( n
10ea0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
10eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10ec0 20 20 70 20 3d 20 26 70 4c 69 73 74 5b 31 5d 3b    p = &pList[1];
10ed0 0a 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65  .    p += sqlite
10ee0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
10ef0 28 70 2c 20 26 69 43 75 72 72 65 6e 74 29 3b 0a  (p, &iCurrent);.
10f00 20 20 7d 0a 0a 20 20 2a 70 70 4c 69 73 74 20 3d    }..  *ppList =
10f10 20 70 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69 73   pList;.  *pnLis
10f20 74 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  t = nList;.}../*
10f30 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 33 53  .** sqlite3Fts3S
10f40 65 67 52 65 61 64 65 72 49 74 65 72 61 74 65 28  egReaderIterate(
10f50 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
10f60 77 68 65 6e 20 6d 65 72 67 69 6e 67 20 6d 75 6c  when merging mul
10f70 74 69 70 6c 65 20 0a 2a 2a 20 73 65 67 6d 65 6e  tiple .** segmen
10f80 74 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 73  ts to create a s
10f90 69 6e 67 6c 65 2c 20 6c 61 72 67 65 72 20 73 65  ingle, larger se
10fa0 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
10fb0 20 69 6e 74 20 66 74 73 33 4d 65 72 67 65 43 61   int fts3MergeCa
10fc0 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 33 54 61  llback(.  Fts3Ta
10fd0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
10fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
10ff0 33 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  3 Virtual table 
11000 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64  handle */.  void
11010 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20   *pContext,     
11020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11030 6f 69 6e 74 65 72 20 74 6f 20 53 65 67 6d 65 6e  ointer to Segmen
11040 74 57 72 69 74 65 72 2a 20 74 6f 20 77 72 69 74  tWriter* to writ
11050 65 20 77 69 74 68 20 2a 2f 0a 20 20 63 68 61 72  e with */.  char
11060 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
11070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11080 65 72 6d 20 74 6f 20 77 72 69 74 65 20 74 6f 20  erm to write to 
11090 74 68 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20  the db */.  int 
110a0 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
110b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
110c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
110d0 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 63 68 61  n zTerm */.  cha
110e0 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20  r *aDoclist,    
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11100 44 6f 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74  Doclist associat
11110 65 64 20 77 69 74 68 20 7a 54 65 72 6d 20 2a 2f  ed with zTerm */
11120 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20  .  int nDoclist 
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11150 62 79 74 65 73 20 69 6e 20 64 6f 63 6c 69 73 74  bytes in doclist
11160 20 2a 2f 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74   */.){.  Segment
11170 57 72 69 74 65 72 20 2a 2a 70 70 57 20 3d 20 28  Writer **ppW = (
11180 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a  SegmentWriter **
11190 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 72 65 74  )pContext;.  ret
111a0 75 72 6e 20 66 74 73 33 53 65 67 57 72 69 74 65  urn fts3SegWrite
111b0 72 41 64 64 28 70 2c 20 70 70 57 2c 20 31 2c 20  rAdd(p, ppW, 1, 
111c0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 61 44  zTerm, nTerm, aD
111d0 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
111e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  );.}../*.** sqli
111f0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
11200 49 74 65 72 61 74 65 28 29 20 63 61 6c 6c 62 61  Iterate() callba
11210 63 6b 20 75 73 65 64 20 77 68 65 6e 20 66 6c 75  ck used when flu
11220 73 68 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  shing the conten
11230 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 65 6e  ts.** of the pen
11240 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
11250 74 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74  table to the dat
11260 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
11270 20 69 6e 74 20 66 74 73 33 46 6c 75 73 68 43 61   int fts3FlushCa
11280 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 33 54 61  llback(.  Fts3Ta
11290 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
112a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
112b0 33 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  3 Virtual table 
112c0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64  handle */.  void
112d0 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20   *pContext,     
112e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
112f0 6f 69 6e 74 65 72 20 74 6f 20 53 65 67 6d 65 6e  ointer to Segmen
11300 74 57 72 69 74 65 72 2a 20 74 6f 20 77 72 69 74  tWriter* to writ
11310 65 20 77 69 74 68 20 2a 2f 0a 20 20 63 68 61 72  e with */.  char
11320 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
11330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11340 65 72 6d 20 74 6f 20 77 72 69 74 65 20 74 6f 20  erm to write to 
11350 74 68 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20  the db */.  int 
11360 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
11370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11380 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
11390 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 63 68 61  n zTerm */.  cha
113a0 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20  r *aDoclist,    
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
113c0 44 6f 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74  Doclist associat
113d0 65 64 20 77 69 74 68 20 7a 54 65 72 6d 20 2a 2f  ed with zTerm */
113e0 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20  .  int nDoclist 
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11410 62 79 74 65 73 20 69 6e 20 64 6f 63 6c 69 73 74  bytes in doclist
11420 20 2a 2f 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74   */.){.  Segment
11430 57 72 69 74 65 72 20 2a 2a 70 70 57 20 3d 20 28  Writer **ppW = (
11440 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a  SegmentWriter **
11450 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 72 65 74  )pContext;.  ret
11460 75 72 6e 20 66 74 73 33 53 65 67 57 72 69 74 65  urn fts3SegWrite
11470 72 41 64 64 28 70 2c 20 70 70 57 2c 20 30 2c 20  rAdd(p, ppW, 0, 
11480 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 61 44  zTerm, nTerm, aD
11490 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
114a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
114b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
114c0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
114d0 6f 75 67 68 20 61 20 63 6f 6e 74 69 67 75 6f 75  ough a contiguou
114e0 73 20 73 65 74 20 6f 66 20 74 65 72 6d 73 20 0a  s set of terms .
114f0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
11500 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
11510 2e 20 49 74 20 6d 65 72 67 65 73 20 64 61 74 61  . It merges data
11520 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 6f 6e   contained in on
11530 65 20 6f 72 20 0a 2a 2a 20 6d 6f 72 65 20 73 65  e or .** more se
11540 67 6d 65 6e 74 73 20 74 6f 20 73 75 70 70 6f 72  gments to suppor
11550 74 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  t this..**.** Th
11560 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11570 74 20 69 73 20 70 61 73 73 65 64 20 61 6e 20 61  t is passed an a
11580 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
11590 20 74 6f 20 53 65 67 52 65 61 64 65 72 20 6f 62   to SegReader ob
115a0 6a 65 63 74 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  jects.** allocat
115b0 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 46  ed with sqlite3F
115c0 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 28  ts3SegReaderNew(
115d0 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
115e0 20 6d 65 72 67 65 73 20 74 68 65 20 72 61 6e 67   merges the rang
115f0 65 20 0a 2a 2a 20 6f 66 20 74 65 72 6d 73 20 73  e .** of terms s
11600 65 6c 65 63 74 65 64 20 62 79 20 65 61 63 68 20  elected by each 
11610 53 65 67 52 65 61 64 65 72 2e 20 49 66 20 61 20  SegReader. If a 
11620 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 73 20 70  single term is p
11630 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 6d 6f 72  resent in.** mor
11640 65 20 74 68 61 6e 20 6f 6e 65 20 73 65 67 6d 65  e than one segme
11650 6e 74 2c 20 74 68 65 20 61 73 73 6f 63 69 61 74  nt, the associat
11660 65 64 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20  ed doclists are 
11670 6d 65 72 67 65 64 2e 20 46 6f 72 20 65 61 63 68  merged. For each
11680 0a 2a 2a 20 74 65 72 6d 20 61 6e 64 20 28 70 6f  .** term and (po
11690 73 73 69 62 6c 79 20 6d 65 72 67 65 64 29 20 64  ssibly merged) d
116a0 6f 63 6c 69 73 74 20 69 6e 20 74 68 65 20 6d 65  oclist in the me
116b0 72 67 65 64 20 72 61 6e 67 65 2c 20 74 68 65 20  rged range, the 
116c0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 66 75 6e 63  callback.** func
116d0 74 69 6f 6e 20 78 46 75 6e 63 20 69 73 20 69 6e  tion xFunc is in
116e0 76 6f 6b 65 64 20 77 69 74 68 20 69 74 73 20 61  voked with its a
116f0 72 67 75 6d 65 6e 74 73 20 73 65 74 20 61 73 20  rguments set as 
11700 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 20  follows..**.**  
11710 20 61 72 67 20 30 3a 20 43 6f 70 79 20 6f 66 20   arg 0: Copy of 
11720 27 70 27 20 70 61 72 61 6d 65 74 65 72 20 70 61  'p' parameter pa
11730 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
11740 63 74 69 6f 6e 0a 2a 2a 20 20 20 61 72 67 20 31  ction.**   arg 1
11750 3a 20 43 6f 70 79 20 6f 66 20 27 70 43 6f 6e 74  : Copy of 'pCont
11760 65 78 74 27 20 70 61 72 61 6d 65 74 65 72 20 70  ext' parameter p
11770 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
11780 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 61 72 67 20  nction.**   arg 
11790 32 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  2: Pointer to bu
117a0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
117b0 74 65 72 6d 0a 2a 2a 20 20 20 61 72 67 20 33 3a  term.**   arg 3:
117c0 20 53 69 7a 65 20 6f 66 20 61 72 67 20 32 20 62   Size of arg 2 b
117d0 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 0a 2a  uffer in bytes.*
117e0 2a 20 20 20 61 72 67 20 34 3a 20 50 6f 69 6e 74  *   arg 4: Point
117f0 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
11800 74 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74 0a  taining doclist.
11810 2a 2a 20 20 20 61 72 67 20 35 3a 20 53 69 7a 65  **   arg 5: Size
11820 20 6f 66 20 61 72 67 20 32 20 62 75 66 66 65 72   of arg 2 buffer
11830 20 69 6e 20 62 79 74 65 73 0a 2a 2a 0a 2a 2a 20   in bytes.**.** 
11840 54 68 65 20 34 74 68 20 61 72 67 75 6d 65 6e 74  The 4th argument
11850 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
11860 6e 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  n is a pointer t
11870 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 6f 66  o a structure of
11880 20 74 79 70 65 0a 2a 2a 20 46 74 73 33 53 65 67   type.** Fts3Seg
11890 46 69 6c 74 65 72 2c 20 64 65 66 69 6e 65 64 20  Filter, defined 
118a0 69 6e 20 66 74 73 33 49 6e 74 2e 68 2e 20 54 68  in fts3Int.h. Th
118b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
118c0 69 73 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  is structure.** 
118d0 66 75 72 74 68 65 72 20 72 65 73 74 72 69 63 74  further restrict
118e0 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 65   the range of te
118f0 72 6d 73 20 74 68 61 74 20 63 61 6c 6c 62 61 63  rms that callbac
11900 6b 73 20 61 72 65 20 6d 61 64 65 20 66 6f 72 20  ks are made for 
11910 61 6e 64 0a 2a 2a 20 6d 6f 64 69 66 79 20 74 68  and.** modify th
11920 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66 20 74  e behaviour of t
11930 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 53 65  his function. Se
11940 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
11950 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 64 65   structure.** de
11960 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64 65 74  finition for det
11970 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
11980 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
11990 72 49 74 65 72 61 74 65 28 0a 20 20 46 74 73 33  rIterate(.  Fts3
119a0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
119b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
119c0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
119d0 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67  dle */.  Fts3Seg
119e0 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65  Reader **apSegme
119f0 6e 74 2c 20 20 20 20 20 20 2f 2a 20 41 72 72 61  nt,      /* Arra
11a00 79 20 6f 66 20 46 74 73 33 53 65 67 52 65 61 64  y of Fts3SegRead
11a10 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
11a20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20  int nSegment,   
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67  /* Size of apSeg
11a50 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  ment array */.  
11a60 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70  Fts3SegFilter *p
11a70 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
11a80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
11a90 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69 74 65 72  on range of iter
11aa0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 28  ation */.  int (
11ab0 2a 78 46 75 6e 63 29 28 46 74 73 33 54 61 62 6c  *xFunc)(Fts3Tabl
11ac0 65 20 2a 2c 20 76 6f 69 64 20 2a 2c 20 63 68 61  e *, void *, cha
11ad0 72 20 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a  r *, int, char *
11ae0 2c 20 69 6e 74 29 2c 20 20 2f 2a 20 43 61 6c 6c  , int),  /* Call
11af0 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  back */.  void *
11b00 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
11b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
11b20 6c 62 61 63 6b 20 63 6f 6e 74 65 78 74 20 28 32  lback context (2
11b30 6e 64 20 61 72 67 75 6d 65 6e 74 29 20 2a 2f 0a  nd argument) */.
11b40 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b60 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11b70 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 63   variable */.  c
11b80 68 61 72 20 2a 61 42 75 66 66 65 72 20 3d 20 30  har *aBuffer = 0
11b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11ba0 2a 20 42 75 66 66 65 72 20 74 6f 20 6d 65 72 67  * Buffer to merg
11bb0 65 20 64 6f 63 6c 69 73 74 73 20 69 6e 20 2a 2f  e doclists in */
11bc0 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
11bd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11be0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
11bf0 73 69 7a 65 20 6f 66 20 61 42 75 66 66 65 72 20  size of aBuffer 
11c00 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
11c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
11c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11c30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
11c40 20 69 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d 70   int isIgnoreEmp
11c50 74 79 20 3d 20 20 28 70 46 69 6c 74 65 72 2d 3e  ty =  (pFilter->
11c60 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
11c70 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54  MENT_IGNORE_EMPT
11c80 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 71 75  Y);.  int isRequ
11c90 69 72 65 50 6f 73 20 3d 20 20 20 28 70 46 69 6c  irePos =   (pFil
11ca0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
11cb0 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52  3_SEGMENT_REQUIR
11cc0 45 5f 50 4f 53 29 3b 0a 20 20 69 6e 74 20 69 73  E_POS);.  int is
11cd0 43 6f 6c 46 69 6c 74 65 72 20 3d 20 20 20 20 28  ColFilter =    (
11ce0 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
11cf0 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f   FTS3_SEGMENT_CO
11d00 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20 20  LUMN_FILTER);.  
11d10 69 6e 74 20 69 73 50 72 65 66 69 78 20 3d 20 20  int isPrefix =  
11d20 20 20 20 20 20 28 70 46 69 6c 74 65 72 2d 3e 66       (pFilter->f
11d30 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d  lags & FTS3_SEGM
11d40 45 4e 54 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20  ENT_PREFIX);..  
11d50 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
11d60 7a 65 72 6f 20 73 65 67 6d 65 6e 74 73 2c 20 74  zero segments, t
11d70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11d80 61 20 6e 6f 2d 6f 70 2e 20 54 68 69 73 20 73 63  a no-op. This sc
11d90 65 6e 61 72 69 6f 0a 20 20 2a 2a 20 63 6f 6d 65  enario.  ** come
11da0 73 20 61 62 6f 75 74 20 6f 6e 6c 79 20 77 68 65  s about only whe
11db0 6e 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 61  n reading from a
11dc0 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  n empty database
11dd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65  ..  */.  if( nSe
11de0 67 6d 65 6e 74 3d 3d 30 20 29 20 67 6f 74 6f 20  gment==0 ) goto 
11df0 66 69 6e 69 73 68 65 64 3b 0a 0a 20 20 2f 2a 20  finished;..  /* 
11e00 49 66 20 74 68 65 20 46 74 73 33 53 65 67 46 69  If the Fts3SegFi
11e10 6c 74 65 72 20 64 65 66 69 6e 65 73 20 61 20 73  lter defines a s
11e20 70 65 63 69 66 69 63 20 74 65 72 6d 20 28 6f 72  pecific term (or
11e30 20 74 65 72 6d 20 70 72 65 66 69 78 29 20 74 6f   term prefix) to
11e40 20 73 65 61 72 63 68 20 0a 20 20 2a 2a 20 66 6f   search .  ** fo
11e50 72 2c 20 74 68 65 6e 20 61 64 76 61 6e 63 65 20  r, then advance 
11e60 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 74 65  each segment ite
11e70 72 61 74 6f 72 20 75 6e 74 69 6c 20 69 74 20 70  rator until it p
11e80 6f 69 6e 74 73 20 74 6f 20 61 20 74 65 72 6d 20  oints to a term 
11e90 6f 66 0a 20 20 2a 2a 20 65 71 75 61 6c 20 6f 72  of.  ** equal or
11ea0 20 67 72 65 61 74 65 72 20 76 61 6c 75 65 20 74   greater value t
11eb0 68 61 6e 20 74 68 65 20 73 70 65 63 69 66 69 65  han the specifie
11ec0 64 20 74 65 72 6d 2e 20 54 68 69 73 20 70 72 65  d term. This pre
11ed0 76 65 6e 74 73 20 6d 61 6e 79 0a 20 20 2a 2a 20  vents many.  ** 
11ee0 75 6e 6e 65 63 65 73 73 61 72 79 20 6d 65 72 67  unnecessary merg
11ef0 65 2f 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  e/sort operation
11f00 73 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  s for the case w
11f10 68 65 72 65 20 73 69 6e 67 6c 65 20 73 65 67 6d  here single segm
11f20 65 6e 74 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  ent.  ** b-tree 
11f30 6c 65 61 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61  leaf nodes conta
11f40 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  in more than one
11f50 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 66 6f   term..  */.  fo
11f60 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 6e  r(i=0; i<nSegmen
11f70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  t; i++){.    int
11f80 20 6e 54 65 72 6d 20 3d 20 70 46 69 6c 74 65 72   nTerm = pFilter
11f90 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  ->nTerm;.    con
11fa0 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
11fb0 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 3b   pFilter->zTerm;
11fc0 0a 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64  .    Fts3SegRead
11fd0 65 72 20 2a 70 53 65 67 20 3d 20 61 70 53 65 67  er *pSeg = apSeg
11fe0 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f 20  ment[i];.    do 
11ff0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
12000 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 28 70  3SegReaderNext(p
12010 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 69  , pSeg);.      i
12020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12030 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
12040 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 54  ;.    }while( zT
12050 65 72 6d 20 26 26 20 66 74 73 33 53 65 67 52 65  erm && fts3SegRe
12060 61 64 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67  aderTermCmp(pSeg
12070 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3c  , zTerm, nTerm)<
12080 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 33  0 );.  }..  fts3
12090 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70  SegReaderSort(ap
120a0 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e  Segment, nSegmen
120b0 74 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 66 74 73  t, nSegment, fts
120c0 33 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b 0a  3SegReaderCmp);.
120d0 20 20 77 68 69 6c 65 28 20 61 70 53 65 67 6d 65    while( apSegme
120e0 6e 74 5b 30 5d 2d 3e 61 4e 6f 64 65 20 29 7b 0a  nt[0]->aNode ){.
120f0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20      int nTerm = 
12100 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 54  apSegment[0]->nT
12110 65 72 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  erm;.    char *z
12120 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74  Term = apSegment
12130 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20  [0]->zTerm;.    
12140 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 31 3b 0a  int nMerge = 1;.
12150 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
12160 69 73 20 61 20 70 72 65 66 69 78 2d 73 65 61 72  is a prefix-sear
12170 63 68 2c 20 61 6e 64 20 69 66 20 74 68 65 20 74  ch, and if the t
12180 65 72 6d 20 74 68 61 74 20 61 70 53 65 67 6d 65  erm that apSegme
12190 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20 20  nt[0] points.   
121a0 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74 20   ** to does not 
121b0 73 68 61 72 65 20 61 20 73 75 66 66 69 78 20 77  share a suffix w
121c0 69 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65  ith pFilter->zTe
121d0 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20 61  rm/nTerm, then a
121e0 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  ll .    ** requi
121f0 72 65 64 20 63 61 6c 6c 62 61 63 6b 73 20 68 61  red callbacks ha
12200 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 49 6e  ve been made. In
12210 20 74 68 69 73 20 63 61 73 65 20 65 78 69 74 20   this case exit 
12220 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  early..    **.  
12230 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
12240 69 66 20 74 68 69 73 20 69 73 20 61 20 73 65 61  if this is a sea
12250 72 63 68 20 66 6f 72 20 61 6e 20 65 78 61 63 74  rch for an exact
12260 20 6d 61 74 63 68 2c 20 61 6e 64 20 74 68 65 20   match, and the 
12270 66 69 72 73 74 20 74 65 72 6d 0a 20 20 20 20 2a  first term.    *
12280 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20 61 70 53  * of segment apS
12290 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f 74  egment[0] is not
122a0 20 61 20 6d 61 74 63 68 2c 20 65 78 69 74 20 65   a match, exit e
122b0 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  arly..    */.   
122c0 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54   if( pFilter->zT
122d0 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  erm ){.      if(
122e0 20 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72 2d 3e   nTerm<pFilter->
122f0 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c  nTerm .       ||
12300 20 28 21 69 73 50 72 65 66 69 78 20 26 26 20 6e   (!isPrefix && n
12310 54 65 72 6d 3e 70 46 69 6c 74 65 72 2d 3e 6e 54  Term>pFilter->nT
12320 65 72 6d 29 0a 20 20 20 20 20 20 20 7c 7c 20 6d  erm).       || m
12330 65 6d 63 6d 70 28 7a 54 65 72 6d 2c 20 70 46 69  emcmp(zTerm, pFi
12340 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69  lter->zTerm, pFi
12350 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20  lter->nTerm) .  
12360 20 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74    ){.        got
12370 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  o finished;.    
12380 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77    }.    }..    w
12390 68 69 6c 65 28 20 6e 4d 65 72 67 65 3c 6e 53 65  hile( nMerge<nSe
123a0 67 6d 65 6e 74 20 0a 20 20 20 20 20 20 20 20 26  gment .        &
123b0 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72  & apSegment[nMer
123c0 67 65 5d 2d 3e 61 4e 6f 64 65 0a 20 20 20 20 20  ge]->aNode.     
123d0 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b     && apSegment[
123e0 6e 4d 65 72 67 65 5d 2d 3e 6e 54 65 72 6d 3d 3d  nMerge]->nTerm==
123f0 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 20 26  nTerm .        &
12400 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 65 72  & 0==memcmp(zTer
12410 6d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65  m, apSegment[nMe
12420 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20 6e 54 65  rge]->zTerm, nTe
12430 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  rm).    ){.     
12440 20 6e 4d 65 72 67 65 2b 2b 3b 0a 20 20 20 20 7d   nMerge++;.    }
12450 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
12460 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20 28  IgnoreEmpty || (
12470 69 73 52 65 71 75 69 72 65 50 6f 73 20 26 26 20  isRequirePos && 
12480 21 69 73 43 6f 6c 46 69 6c 74 65 72 29 20 29 3b  !isColFilter) );
12490 0a 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3d  .    if( nMerge=
124a0 3d 31 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45  =1 && !isIgnoreE
124b0 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 46 74  mpty ){.      Ft
124c0 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 30 20  s3SegReader *p0 
124d0 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 3b 0a  = apSegment[0];.
124e0 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63        rc = xFunc
124f0 28 70 2c 20 70 43 6f 6e 74 65 78 74 2c 20 7a 54  (p, pContext, zT
12500 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 30 2d 3e  erm, nTerm, p0->
12510 61 44 6f 63 6c 69 73 74 2c 20 70 30 2d 3e 6e 44  aDoclist, p0->nD
12520 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69  oclist);.      i
12530 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12540 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
12550 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12560 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20     int nDoclist 
12570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
12580 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
12590 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
125a0 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d  e3_int64 iPrev =
125b0 20 30 3b 20 20 20 20 2f 2a 20 50 72 65 76 69 6f   0;    /* Previo
125c0 75 73 20 64 6f 63 69 64 20 73 74 6f 72 65 64 20  us docid stored 
125d0 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20  in doclist */.. 
125e0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
125f0 65 6e 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ent term of the 
12600 66 69 72 73 74 20 6e 4d 65 72 67 65 20 65 6e 74  first nMerge ent
12610 72 69 65 73 20 69 6e 20 74 68 65 20 61 72 72 61  ries in the arra
12620 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 46 74  y.      ** of Ft
12630 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65  s3SegReader obje
12640 63 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 2e  cts is the same.
12650 20 54 68 65 20 64 6f 63 6c 69 73 74 73 20 6d 75   The doclists mu
12660 73 74 20 62 65 20 6d 65 72 67 65 64 0a 20 20 20  st be merged.   
12670 20 20 20 2a 2a 20 61 6e 64 20 61 20 73 69 6e 67     ** and a sing
12680 6c 65 20 74 65 72 6d 20 61 64 64 65 64 20 74 6f  le term added to
12690 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   the new segment
126a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
126b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65 72   for(i=0; i<nMer
126c0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
126d0 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46    fts3SegReaderF
126e0 69 72 73 74 44 6f 63 69 64 28 61 70 53 65 67 6d  irstDocid(apSegm
126f0 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ent[i]);.      }
12700 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65  .      fts3SegRe
12710 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65  aderSort(apSegme
12720 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 65 72  nt, nMerge, nMer
12730 67 65 2c 20 66 74 73 33 53 65 67 52 65 61 64 65  ge, fts3SegReade
12740 72 44 6f 63 6c 69 73 74 43 6d 70 29 3b 0a 20 20  rDoclistCmp);.  
12750 20 20 20 20 77 68 69 6c 65 28 20 61 70 53 65 67      while( apSeg
12760 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65 74  ment[0]->pOffset
12770 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
12780 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
12790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
127a0 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
127b0 74 68 61 74 20 73 68 61 72 65 20 61 20 64 6f 63  that share a doc
127c0 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  id */.        ch
127d0 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20  ar *pList;.     
127e0 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20     int nList;.  
127f0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
12800 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12810 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20  _int64 iDocid = 
12820 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44  apSegment[0]->iD
12830 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 66 74  ocid;.        ft
12840 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
12850 6f 63 69 64 28 61 70 53 65 67 6d 65 6e 74 5b 30  ocid(apSegment[0
12860 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  ], &pList, &nLis
12870 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  t);.        j = 
12880 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  1;.        while
12890 28 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20  ( j<nMerge.     
128a0 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
128b0 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c  ent[j]->pOffsetL
128c0 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ist.            
128d0 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
128e0 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a  >iDocid==iDocid.
128f0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12900 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
12910 65 72 4e 65 78 74 44 6f 63 69 64 28 61 70 53 65  erNextDocid(apSe
12920 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b  gment[j], 0, 0);
12930 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
12940 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
12950 20 20 20 69 66 28 20 69 73 43 6f 6c 46 69 6c 74     if( isColFilt
12960 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
12970 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72  fts3ColumnFilter
12980 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c 2c 20  (pFilter->iCol, 
12990 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
129a0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
129b0 20 20 20 20 69 66 28 20 21 69 73 49 67 6e 6f 72      if( !isIgnor
129c0 65 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73 74 3e  eEmpty || nList>
129d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
129e0 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74  Byte = sqlite3Ft
129f0 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 44 6f 63  s3VarintLen(iDoc
12a00 69 64 2d 69 50 72 65 76 29 20 2b 20 28 69 73 52  id-iPrev) + (isR
12a10 65 71 75 69 72 65 50 6f 73 3f 6e 4c 69 73 74 2b  equirePos?nList+
12a20 31 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1:0);.          
12a30 69 66 28 20 6e 44 6f 63 6c 69 73 74 2b 6e 42 79  if( nDoclist+nBy
12a40 74 65 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  te>nAlloc ){.   
12a50 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61           char *a
12a60 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  New;.           
12a70 20 6e 41 6c 6c 6f 63 20 3d 20 6e 44 6f 63 6c 69   nAlloc = nDocli
12a80 73 74 2b 6e 42 79 74 65 2a 32 3b 0a 20 20 20 20  st+nByte*2;.    
12a90 20 20 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73          aNew = s
12aa0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
12ab0 42 75 66 66 65 72 2c 20 6e 41 6c 6c 6f 63 29 3b  Buffer, nAlloc);
12ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
12ad0 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
12ae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12af0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
12b00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69           goto fi
12b10 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20  nished;.        
12b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12b30 20 20 61 42 75 66 66 65 72 20 3d 20 61 4e 65 77    aBuffer = aNew
12b40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12b50 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74          nDoclist
12b60 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
12b70 75 74 56 61 72 69 6e 74 28 26 61 42 75 66 66 65  utVarint(&aBuffe
12b80 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69 44 6f  r[nDoclist], iDo
12b90 63 69 64 2d 69 50 72 65 76 29 3b 0a 20 20 20 20  cid-iPrev);.    
12ba0 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 44        iPrev = iD
12bb0 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  ocid;.          
12bc0 69 66 28 20 69 73 52 65 71 75 69 72 65 50 6f 73  if( isRequirePos
12bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12be0 6d 65 6d 63 70 79 28 26 61 42 75 66 66 65 72 5b  memcpy(&aBuffer[
12bf0 6e 44 6f 63 6c 69 73 74 5d 2c 20 70 4c 69 73 74  nDoclist], pList
12c00 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , nList);.      
12c10 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b        nDoclist +
12c20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = nList;.       
12c30 20 20 20 20 20 61 42 75 66 66 65 72 5b 6e 44 6f       aBuffer[nDo
12c40 63 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  clist++] = '\0';
12c50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12c60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
12c70 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
12c80 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  t(apSegment, nMe
12c90 72 67 65 2c 20 6a 2c 20 66 74 73 33 53 65 67 52  rge, j, fts3SegR
12ca0 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 29  eaderDoclistCmp)
12cb0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
12cc0 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20   if( nDoclist>0 
12cd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12ce0 78 46 75 6e 63 28 70 2c 20 70 43 6f 6e 74 65 78  xFunc(p, pContex
12cf0 74 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  t, zTerm, nTerm,
12d00 20 61 42 75 66 66 65 72 2c 20 6e 44 6f 63 6c 69   aBuffer, nDocli
12d10 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
12d20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12d30 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
12d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12d50 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
12d60 73 20 61 20 74 65 72 6d 20 73 70 65 63 69 66 69  s a term specifi
12d70 65 64 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 2c  ed to filter on,
12d80 20 61 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74   and this is not
12d90 20 61 20 70 72 65 66 69 78 0a 20 20 20 20 2a 2a   a prefix.    **
12da0 20 73 65 61 72 63 68 2c 20 72 65 74 75 72 6e 20   search, return 
12db0 6e 6f 77 2e 20 54 68 65 20 63 61 6c 6c 62 61 63  now. The callbac
12dc0 6b 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  k that correspon
12dd0 64 73 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  ds to the requir
12de0 65 64 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 28  ed.    ** term (
12df0 69 66 20 73 75 63 68 20 61 20 74 65 72 6d 20 65  if such a term e
12e00 78 69 73 74 73 20 69 6e 20 74 68 65 20 69 6e 64  xists in the ind
12e10 65 78 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  ex) has already 
12e20 62 65 65 6e 20 6d 61 64 65 2e 0a 20 20 20 20 2a  been made..    *
12e30 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 74 65  /.    if( pFilte
12e40 72 2d 3e 7a 54 65 72 6d 20 26 26 20 21 69 73 50  r->zTerm && !isP
12e50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 67  refix ){.      g
12e60 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20  oto finished;.  
12e70 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
12e80 3b 20 69 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b 29  ; i<nMerge; i++)
12e90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
12ea0 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 28 70  3SegReaderNext(p
12eb0 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b  , apSegment[i]);
12ec0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12ed0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
12ee0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
12ef0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
12f00 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c  rSort(apSegment,
12f10 20 6e 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67   nSegment, nMerg
12f20 65 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72  e, fts3SegReader
12f30 43 6d 70 29 3b 0a 20 20 7d 0a 0a 20 66 69 6e 69  Cmp);.  }.. fini
12f40 73 68 65 64 3a 0a 20 20 73 71 6c 69 74 65 33 5f  shed:.  sqlite3_
12f50 66 72 65 65 28 61 42 75 66 66 65 72 29 3b 0a 20  free(aBuffer);. 
12f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12f70 2a 0a 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 6c  *.** Merge all l
12f80 65 76 65 6c 20 69 4c 65 76 65 6c 20 73 65 67 6d  evel iLevel segm
12f90 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
12fa0 62 61 73 65 20 69 6e 74 6f 20 61 20 73 69 6e 67  base into a sing
12fb0 6c 65 20 0a 2a 2a 20 69 4c 65 76 65 6c 2b 31 20  le .** iLevel+1 
12fc0 73 65 67 6d 65 6e 74 2e 20 4f 72 2c 20 69 66 20  segment. Or, if 
12fd0 69 4c 65 76 65 6c 3c 30 2c 20 6d 65 72 67 65 20  iLevel<0, merge 
12fe0 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 74  all segments int
12ff0 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 73 65  o a.** single se
13000 67 6d 65 6e 74 20 77 69 74 68 20 61 20 6c 65 76  gment with a lev
13010 65 6c 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  el equal to the 
13020 6e 75 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72 67  numerically larg
13030 65 73 74 20 6c 65 76 65 6c 20 0a 2a 2a 20 63 75  est level .** cu
13040 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20  rrently present 
13050 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
13060 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
13070 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13080 64 20 77 69 74 68 20 69 4c 65 76 65 6c 3c 30 2c  d with iLevel<0,
13090 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6f 6e   but there is on
130a0 6c 79 20 6f 6e 65 0a 2a 2a 20 73 65 67 6d 65 6e  ly one.** segmen
130b0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
130c0 65 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  e, SQLITE_DONE i
130d0 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
130e0 69 61 74 65 6c 79 2e 20 0a 2a 2a 20 4f 74 68 65  iately. .** Othe
130f0 72 77 69 73 65 2c 20 69 66 20 73 75 63 63 65 73  rwise, if succes
13100 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
13110 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
13120 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
13130 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
13140 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
13160 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74   int fts3Segment
13170 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c 65 20  Merge(Fts3Table 
13180 2a 70 2c 20 69 6e 74 20 69 4c 65 76 65 6c 29 7b  *p, int iLevel){
13190 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
131c0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
131d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
13200 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77   /* Index of new
13230 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
13240 74 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 30 3b  t iNewLevel = 0;
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13260 20 4c 65 76 65 6c 20 74 6f 20 63 72 65 61 74 65   Level to create
13270 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20   new segment at 
13280 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
13290 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
132a0 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70  SegmentWriter *p
132b0 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e  Writer = 0;.  in
132c0 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20  t nSegment = 0; 
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
132e0 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
132f0 6e 74 73 20 62 65 69 6e 67 20 6d 65 72 67 65 64  nts being merged
13300 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61   */.  Fts3SegRea
13310 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 20  der **apSegment 
13320 3d 20 30 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  = 0;  /* Array o
13330 66 20 53 65 67 6d 65 6e 74 20 69 74 65 72 61 74  f Segment iterat
13340 6f 72 73 20 2a 2f 0a 20 20 46 74 73 33 53 65 67  ors */.  Fts3Seg
13350 52 65 61 64 65 72 20 2a 70 50 65 6e 64 69 6e 67  Reader *pPending
13360 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 74 65 72   = 0;    /* Iter
13370 61 74 6f 72 20 66 6f 72 20 70 65 6e 64 69 6e 67  ator for pending
13380 2d 74 65 72 6d 73 20 2a 2f 0a 20 20 46 74 73 33  -terms */.  Fts3
13390 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72  SegFilter filter
133a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
133b0 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74  egment term filt
133c0 65 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  er condition */.
133d0 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20  .  if( iLevel<0 
133e0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
133f0 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67 65 20  all is to merge 
13400 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
13410 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
13420 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a 2a 20  a single.    ** 
13430 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 6c 65 76  segment. The lev
13440 65 6c 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65  el of the new se
13450 67 6d 65 6e 74 20 69 73 20 65 71 75 61 6c 20 74  gment is equal t
13460 6f 20 74 68 65 20 74 68 65 20 6e 75 6d 65 72 69  o the the numeri
13470 63 61 6c 6c 79 20 0a 20 20 20 20 2a 2a 20 67 72  cally .    ** gr
13480 65 61 74 65 73 74 20 73 65 67 6d 65 6e 74 20 6c  eatest segment l
13490 65 76 65 6c 20 63 75 72 72 65 6e 74 6c 79 20 70  evel currently p
134a0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61  resent in the da
134b0 74 61 62 61 73 65 2e 20 54 68 65 20 69 6e 64 65  tabase. The inde
134c0 78 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  x.    ** of the 
134d0 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20 61  new segment is a
134e0 6c 77 61 79 73 20 30 2e 0a 20 20 20 20 2a 2f 0a  lways 0..    */.
134f0 20 20 20 20 69 49 64 78 20 3d 20 30 3b 0a 20 20      iIdx = 0;.  
13500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
13510 73 33 53 65 67 52 65 61 64 65 72 50 65 6e 64 69  s3SegReaderPendi
13520 6e 67 28 70 2c 20 30 2c 20 30 2c 20 31 2c 20 26  ng(p, 0, 0, 1, &
13530 70 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 69  pPending);.    i
13540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13550 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
13560 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  ;.    rc = fts3S
13570 65 67 6d 65 6e 74 43 6f 75 6e 74 4d 61 78 28 70  egmentCountMax(p
13580 2c 20 26 6e 53 65 67 6d 65 6e 74 2c 20 26 69 4e  , &nSegment, &iN
13590 65 77 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66  ewLevel);.    if
135a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
135b0 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b  ) goto finished;
135c0 0a 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d  .    nSegment +=
135d0 20 28 70 50 65 6e 64 69 6e 67 21 3d 30 29 3b 0a   (pPending!=0);.
135e0 20 20 20 20 69 66 28 20 6e 53 65 67 6d 65 6e 74      if( nSegment
135f0 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  <=1 ){.      ret
13600 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
13610 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13620 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
13630 20 69 73 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c   is to merge all
13640 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65 76   segments at lev
13650 65 6c 20 69 4c 65 76 65 6c 2e 20 46 69 6e 64 20  el iLevel. Find 
13660 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  the next.    ** 
13670 61 76 61 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e  available segmen
13680 74 20 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c  t index at level
13690 20 69 4c 65 76 65 6c 2b 31 2e 20 54 68 65 20 63   iLevel+1. The c
136a0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74  all to.    ** ft
136b0 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72  s3AllocateSegdir
136c0 49 64 78 28 29 20 77 69 6c 6c 20 6d 65 72 67 65  Idx() will merge
136d0 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 74   the segments at
136e0 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20   level iLevel+1 
136f0 74 6f 20 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e  to .    ** a sin
13700 67 6c 65 20 69 4c 65 76 65 6c 2b 32 20 73 65 67  gle iLevel+2 seg
13710 6d 65 6e 74 20 69 66 20 6e 65 63 65 73 73 61 72  ment if necessar
13720 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 4e  y..    */.    iN
13730 65 77 4c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c  ewLevel = iLevel
13740 2b 31 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  +1;.    rc = fts
13750 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
13760 64 78 28 70 2c 20 69 4e 65 77 4c 65 76 65 6c 2c  dx(p, iNewLevel,
13770 20 26 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28   &iIdx);.    if(
13780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13790 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
137a0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
137b0 6d 65 6e 74 43 6f 75 6e 74 28 70 2c 20 69 4c 65  mentCount(p, iLe
137c0 76 65 6c 2c 20 26 6e 53 65 67 6d 65 6e 74 29 3b  vel, &nSegment);
137d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
137e0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
137f0 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 20 20 61 73  nished;.  }.  as
13800 73 65 72 74 28 20 6e 53 65 67 6d 65 6e 74 3e 30  sert( nSegment>0
13810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e   );.  assert( iN
13820 65 77 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 0a 20  ewLevel>=0 );.. 
13830 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
13840 63 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ce for an array 
13850 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
13860 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
13870 2e 20 2a 2f 0a 20 20 61 70 53 65 67 6d 65 6e 74  . */.  apSegment
13880 20 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65   = (Fts3SegReade
13890 72 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r**)sqlite3_mall
138a0 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 53 65  oc(sizeof(Fts3Se
138b0 67 52 65 61 64 65 72 20 2a 29 2a 6e 53 65 67 6d  gReader *)*nSegm
138c0 65 6e 74 29 3b 0a 20 20 69 66 28 20 21 61 70 53  ent);.  if( !apS
138d0 65 67 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 63  egment ){.    rc
138e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
138f0 0a 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68  .    goto finish
13900 65 64 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ed;.  }.  memset
13910 28 61 70 53 65 67 6d 65 6e 74 2c 20 30 2c 20 73  (apSegment, 0, s
13920 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61  izeof(Fts3SegRea
13930 64 65 72 20 2a 29 2a 6e 53 65 67 6d 65 6e 74 29  der *)*nSegment)
13940 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
13950 20 61 20 46 74 73 33 53 65 67 52 65 61 64 65 72   a Fts3SegReader
13960 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
13970 61 63 68 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  ach segment bein
13980 67 20 6d 65 72 67 65 64 2e 20 41 20 0a 20 20 2a  g merged. A .  *
13990 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  * Fts3SegReader 
139a0 73 74 6f 72 65 73 20 74 68 65 20 73 74 61 74 65  stores the state
139b0 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74   data required t
139c0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
139d0 68 20 61 6c 6c 20 0a 20 20 2a 2a 20 65 6e 74 72  h all .  ** entr
139e0 69 65 73 20 6f 6e 20 61 6c 6c 20 6c 65 61 76 65  ies on all leave
139f0 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 73 65  s of a single se
13a00 67 6d 65 6e 74 2e 20 0a 20 20 2a 2f 0a 20 20 61  gment. .  */.  a
13a10 73 73 65 72 74 28 20 53 51 4c 5f 53 45 4c 45 43  ssert( SQL_SELEC
13a20 54 5f 4c 45 56 45 4c 2b 31 3d 3d 53 51 4c 5f 53  T_LEVEL+1==SQL_S
13a30 45 4c 45 43 54 5f 41 4c 4c 5f 4c 45 56 45 4c 29  ELECT_ALL_LEVEL)
13a40 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ;.  rc = fts3Sql
13a50 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
13a60 43 54 5f 4c 45 56 45 4c 2b 28 69 4c 65 76 65 6c  CT_LEVEL+(iLevel
13a70 3c 30 29 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  <0), &pStmt, 0);
13a80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13a90 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
13aa0 73 68 65 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  shed;.  sqlite3_
13ab0 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
13ac0 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 66 6f  1, iLevel);.  fo
13ad0 72 28 69 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f  r(i=0; SQLITE_RO
13ae0 57 3d 3d 28 73 71 6c 69 74 65 33 5f 73 74 65 70  W==(sqlite3_step
13af0 28 70 53 74 6d 74 29 29 3b 20 69 2b 2b 29 7b 0a  (pStmt)); i++){.
13b00 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
13b10 52 65 61 64 65 72 4e 65 77 28 70 2c 20 70 53 74  ReaderNew(p, pSt
13b20 6d 74 2c 20 69 2c 20 26 61 70 53 65 67 6d 65 6e  mt, i, &apSegmen
13b30 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  t[i]);.    if( r
13b40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13b50 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
13b60 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  hed;.    }.  }. 
13b70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
13b80 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
13b90 28 20 70 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20  ( pPending ){.  
13ba0 20 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 20 3d    apSegment[i] =
13bb0 20 70 50 65 6e 64 69 6e 67 3b 0a 20 20 20 20 70   pPending;.    p
13bc0 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
13bd0 0a 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  .  pStmt = 0;.  
13be0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13bf0 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65  K ) goto finishe
13c00 64 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  d;..  memset(&fi
13c10 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lter, 0, sizeof(
13c20 46 74 73 33 53 65 67 46 69 6c 74 65 72 29 29 3b  Fts3SegFilter));
13c30 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
13c40 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52  = FTS3_SEGMENT_R
13c50 45 51 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66 69  EQUIRE_POS;.  fi
13c60 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28 69  lter.flags |= (i
13c70 4c 65 76 65 6c 3c 30 20 3f 20 46 54 53 33 5f 53  Level<0 ? FTS3_S
13c80 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d  EGMENT_IGNORE_EM
13c90 50 54 59 20 3a 20 30 29 3b 0a 20 20 72 63 20 3d  PTY : 0);.  rc =
13ca0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
13cb0 65 61 64 65 72 49 74 65 72 61 74 65 28 70 2c 20  eaderIterate(p, 
13cc0 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d  apSegment, nSegm
13cd0 65 6e 74 2c 0a 20 20 20 20 20 20 26 66 69 6c 74  ent,.      &filt
13ce0 65 72 2c 20 66 74 73 33 4d 65 72 67 65 43 61 6c  er, fts3MergeCal
13cf0 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 26  lback, (void *)&
13d00 70 57 72 69 74 65 72 0a 20 20 29 3b 0a 20 20 69  pWriter.  );.  i
13d10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13d20 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
13d30 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 44 65  ;..  rc = fts3De
13d40 6c 65 74 65 53 65 67 64 69 72 28 70 2c 20 69 4c  leteSegdir(p, iL
13d50 65 76 65 6c 2c 20 61 70 53 65 67 6d 65 6e 74 2c  evel, apSegment,
13d60 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66   nSegment);.  if
13d70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13d80 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
13d90 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28 70  SegWriterFlush(p
13da0 2c 20 70 57 72 69 74 65 72 2c 20 69 4e 65 77 4c  , pWriter, iNewL
13db0 65 76 65 6c 2c 20 69 49 64 78 29 3b 0a 20 20 7d  evel, iIdx);.  }
13dc0 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 66  .. finished:.  f
13dd0 74 73 33 53 65 67 57 72 69 74 65 72 46 72 65 65  ts3SegWriterFree
13de0 28 70 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28  (pWriter);.  if(
13df0 20 61 70 53 65 67 6d 65 6e 74 20 29 7b 0a 20 20   apSegment ){.  
13e00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65    for(i=0; i<nSe
13e10 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  gment; i++){.   
13e20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65     sqlite3Fts3Se
13e30 67 52 65 61 64 65 72 46 72 65 65 28 70 2c 20 61  gReaderFree(p, a
13e40 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20  pSegment[i]);.  
13e50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
13e60 66 72 65 65 28 61 70 53 65 67 6d 65 6e 74 29 3b  free(apSegment);
13e70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
13e80 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65 28  s3SegReaderFree(
13e90 70 2c 20 70 50 65 6e 64 69 6e 67 29 3b 0a 20 20  p, pPending);.  
13ea0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
13eb0 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tmt);.  return r
13ec0 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c  c;.}.../* .** Fl
13ed0 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ush the contents
13ee0 20 6f 66 20 70 65 6e 64 69 6e 67 54 65 72 6d 73   of pendingTerms
13ef0 20 74 6f 20 61 20 6c 65 76 65 6c 20 30 20 73 65   to a level 0 se
13f00 67 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  gment..*/.int sq
13f10 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
13f20 54 65 72 6d 73 46 6c 75 73 68 28 46 74 73 33 54  TermsFlush(Fts3T
13f30 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
13f40 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13f60 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
13f70 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20  /* Index of new 
13fa0 73 65 67 6d 65 6e 74 20 63 72 65 61 74 65 64 20  segment created 
13fb0 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74  */.  SegmentWrit
13fc0 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 30 3b  er *pWriter = 0;
13fd0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
13fe0 77 72 69 74 65 20 74 68 65 20 73 65 67 6d 65 6e  write the segmen
13ff0 74 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65  t */.  Fts3SegRe
14000 61 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20  ader *pReader = 
14010 30 3b 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74  0;     /* Used t
14020 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
14030 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  h the hash table
14040 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
14050 74 65 20 61 20 53 65 67 52 65 61 64 65 72 20 6f  te a SegReader o
14060 62 6a 65 63 74 20 74 6f 20 69 74 65 72 61 74 65  bject to iterate
14070 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
14080 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 2a  tents of the.  *
14090 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  * pending-terms 
140a0 74 61 62 6c 65 2e 20 49 66 20 61 6e 20 65 72 72  table. If an err
140b0 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 69 66  or occurs, or if
140c0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 65   there are no te
140d0 72 6d 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  rms.  ** in the 
140e0 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61  pending-terms ta
140f0 62 6c 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65  ble, return imme
14100 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14110 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
14120 53 65 67 52 65 61 64 65 72 50 65 6e 64 69 6e 67  SegReaderPending
14130 28 70 2c 20 30 2c 20 30 2c 20 31 2c 20 26 70 52  (p, 0, 0, 1, &pR
14140 65 61 64 65 72 29 3b 0a 20 20 69 66 28 20 72 63  eader);.  if( rc
14150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
14160 52 65 61 64 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Reader==0 ){.   
14170 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14180 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
14190 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 61  the next index a
141a0 74 20 6c 65 76 65 6c 20 30 2e 20 49 66 20 6c 65  t level 0. If le
141b0 76 65 6c 20 30 20 69 73 20 61 6c 72 65 61 64 79  vel 0 is already
141c0 20 66 75 6c 6c 2c 20 74 68 69 73 0a 20 20 2a 2a   full, this.  **
141d0 20 63 61 6c 6c 20 6d 61 79 20 6d 65 72 67 65 20   call may merge 
141e0 61 6c 6c 20 65 78 69 73 74 69 6e 67 20 6c 65 76  all existing lev
141f0 65 6c 20 30 20 73 65 67 6d 65 6e 74 73 20 69 6e  el 0 segments in
14200 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  to a single leve
14210 6c 20 31 0a 20 20 2a 2a 20 73 65 67 6d 65 6e 74  l 1.  ** segment
14220 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ..  */.  rc = ft
14230 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72  s3AllocateSegdir
14240 49 64 78 28 70 2c 20 30 2c 20 26 69 64 78 29 3b  Idx(p, 0, &idx);
14250 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72 72  ..  /* If no err
14260 6f 72 73 20 68 61 76 65 20 6f 63 63 75 72 65 64  ors have occured
14270 2c 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  , iterate throug
14280 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
14290 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 65 6e 64  f the .  ** pend
142a0 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
142b0 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 46  able using the F
142c0 74 73 33 53 65 67 52 65 61 64 65 72 20 69 74 65  ts3SegReader ite
142d0 72 61 74 6f 72 2e 20 54 68 65 20 63 61 6c 6c 62  rator. The callb
142e0 61 63 6b 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ack.  ** writes 
142f0 65 61 63 68 20 74 65 72 6d 20 28 61 6c 6f 6e 67  each term (along
14300 20 77 69 74 68 20 69 74 73 20 64 6f 63 6c 69 73   with its doclis
14310 74 29 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  t) to the databa
14320 73 65 20 76 69 61 20 74 68 65 0a 20 20 2a 2a 20  se via the.  ** 
14330 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 68 61  SegmentWriter ha
14340 6e 64 6c 65 20 70 57 72 69 74 65 72 2e 0a 20 20  ndle pWriter..  
14350 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
14360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 6f  ITE_OK ){.    vo
14370 69 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29  id *c = (void *)
14380 26 70 57 72 69 74 65 72 3b 20 20 20 2f 2a 20 53  &pWriter;   /* S
14390 65 67 52 65 61 64 65 72 49 74 65 72 61 74 65 28  egReaderIterate(
143a0 29 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 65  ) callback conte
143b0 78 74 20 2a 2f 0a 20 20 20 20 46 74 73 33 53 65  xt */.    Fts3Se
143c0 67 46 69 6c 74 65 72 20 66 3b 20 20 20 20 20 20  gFilter f;      
143d0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 52 65          /* SegRe
143e0 61 64 65 72 49 74 65 72 61 74 65 28 29 20 70 61  aderIterate() pa
143f0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 0a 20 20 20  rameters */..   
14400 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73   memset(&f, 0, s
14410 69 7a 65 6f 66 28 46 74 73 33 53 65 67 46 69 6c  izeof(Fts3SegFil
14420 74 65 72 29 29 3b 0a 20 20 20 20 66 2e 66 6c 61  ter));.    f.fla
14430 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs = FTS3_SEGMEN
14440 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b 0a 20  T_REQUIRE_POS;. 
14450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
14460 74 73 33 53 65 67 52 65 61 64 65 72 49 74 65 72  ts3SegReaderIter
14470 61 74 65 28 70 2c 20 26 70 52 65 61 64 65 72 2c  ate(p, &pReader,
14480 20 31 2c 20 26 66 2c 20 66 74 73 33 46 6c 75 73   1, &f, fts3Flus
14490 68 43 61 6c 6c 62 61 63 6b 2c 20 63 29 3b 0a 20  hCallback, c);. 
144a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 72   }.  assert( pWr
144b0 69 74 65 72 20 7c 7c 20 72 63 21 3d 53 51 4c 49  iter || rc!=SQLI
144c0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  TE_OK );..  /* I
144d0 66 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  f no errors have
144e0 20 6f 63 63 75 72 65 64 2c 20 66 6c 75 73 68 20   occured, flush 
144f0 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65  the SegmentWrite
14500 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 0a  r object to the.
14510 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
14520 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 53  hen delete the S
14530 65 67 6d 65 6e 74 57 72 69 74 65 72 20 61 6e 64  egmentWriter and
14540 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
14550 62 6a 65 63 74 73 0a 20 20 2a 2a 20 61 6c 6c 6f  bjects.  ** allo
14560 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
14570 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nction..  */.  i
14580 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14590 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
145a0 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28  3SegWriterFlush(
145b0 70 2c 20 70 57 72 69 74 65 72 2c 20 30 2c 20 69  p, pWriter, 0, i
145c0 64 78 29 3b 0a 20 20 7d 0a 20 20 66 74 73 33 53  dx);.  }.  fts3S
145d0 65 67 57 72 69 74 65 72 46 72 65 65 28 70 57 72  egWriterFree(pWr
145e0 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  iter);.  sqlite3
145f0 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65  Fts3SegReaderFre
14600 65 28 70 2c 20 70 52 65 61 64 65 72 29 3b 0a 0a  e(p, pReader);..
14610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14620 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
14630 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72  e3Fts3PendingTer
14640 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20 20 7d 0a  msClear(p);.  }.
14650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14660 2f 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20 4e 20 69  /*.** Encode N i
14670 6e 74 65 67 65 72 73 20 61 73 20 76 61 72 69 6e  ntegers as varin
14680 74 73 20 69 6e 74 6f 20 61 20 62 6c 6f 62 2e 0a  ts into a blob..
14690 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
146a0 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61  ts3EncodeIntArra
146b0 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  y(.  int N,     
146c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
146d0 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72  umber of integer
146e0 73 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  s to encode */. 
146f0 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20   u32 *a,        
14700 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
14710 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63  er values */.  c
14720 68 61 72 20 2a 7a 42 75 66 2c 20 20 20 20 20 20  har *zBuf,      
14730 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 42    /* Write the B
14740 4c 4f 42 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  LOB here */.  in
14750 74 20 2a 70 4e 42 75 66 20 20 20 20 20 20 20 20  t *pNBuf        
14760 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72   /* Write number
14770 20 6f 66 20 62 79 74 65 73 20 69 66 20 7a 42 75   of bytes if zBu
14780 66 5b 5d 20 75 73 65 64 20 68 65 72 65 20 2a 2f  f[] used here */
14790 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
147a0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e    for(i=j=0; i<N
147b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 20 2b 3d  ; i++){.    j +=
147c0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
147d0 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20  arint(&zBuf[j], 
147e0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61  (sqlite3_int64)a
147f0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 4e 42  [i]);.  }.  *pNB
14800 75 66 20 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf = j;.}../*.**
14810 20 44 65 63 6f 64 65 20 61 20 62 6c 6f 62 20 6f   Decode a blob o
14820 66 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 4e  f varints into N
14830 20 69 6e 74 65 67 65 72 73 0a 2a 2f 0a 73 74 61   integers.*/.sta
14840 74 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 63  tic void fts3Dec
14850 6f 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20 69  odeIntArray(.  i
14860 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
14870 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
14880 6f 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20 64  of integers to d
14890 65 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a  ecode */.  u32 *
148a0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  a,            /*
148b0 20 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67   Write the integ
148c0 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63  er values */.  c
148d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c  onst char *zBuf,
148e0 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 63 6f    /* The BLOB co
148f0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 72  ntaining the var
14900 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ints */.  int nB
14910 75 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf           /* 
14920 73 69 7a 65 20 6f 66 20 74 68 65 20 42 4c 4f 42  size of the BLOB
14930 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
14940 6a 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  j;.  UNUSED_PARA
14950 4d 45 54 45 52 28 6e 42 75 66 29 3b 0a 20 20 66  METER(nBuf);.  f
14960 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69  or(i=j=0; i<N; i
14970 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
14980 5f 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 6a 20  _int64 x;.    j 
14990 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
149a0 74 56 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d  tVarint(&zBuf[j]
149b0 2c 20 26 78 29 3b 0a 20 20 20 20 61 73 73 65 72  , &x);.    asser
149c0 74 28 6a 3c 3d 6e 42 75 66 29 3b 0a 20 20 20 20  t(j<=nBuf);.    
149d0 61 5b 69 5d 20 3d 20 28 75 33 32 29 28 78 20 26  a[i] = (u32)(x &
149e0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
149f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20  }.}../*.** Fill 
14a00 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  in the document 
14a10 73 69 7a 65 20 61 75 78 69 6c 69 61 72 79 20 69  size auxiliary i
14a20 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
14a30 68 65 20 6d 61 74 63 68 69 6e 66 6f 0a 2a 2a 20  he matchinfo.** 
14a40 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
14a50 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
14a60 61 74 69 6f 6e 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ation is:.**.** 
14a70 20 20 20 4e 20 20 20 20 20 54 6f 74 61 6c 20 6e     N     Total n
14a80 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
14a90 74 73 20 69 6e 20 74 68 65 20 66 75 6c 6c 2d 74  ts in the full-t
14aa0 65 78 74 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ext index.**    
14ab0 61 30 20 20 20 20 41 76 65 72 61 67 65 20 6c 65  a0    Average le
14ac0 6e 67 74 68 20 6f 66 20 63 6f 6c 75 6d 6e 20 30  ngth of column 0
14ad0 20 6f 76 65 72 20 74 68 65 20 77 68 6f 6c 65 20   over the whole 
14ae0 69 6e 64 65 78 0a 2a 2a 20 20 20 20 6e 30 20 20  index.**    n0  
14af0 20 20 4c 65 6e 67 74 68 20 6f 66 20 63 6f 6c 75    Length of colu
14b00 6d 6e 20 30 20 6f 6e 20 74 68 65 20 6d 61 74 63  mn 0 on the matc
14b10 68 69 6e 67 20 72 6f 77 0a 2a 2a 20 20 20 20 2e  hing row.**    .
14b20 2e 2e 0a 2a 2a 20 20 20 20 61 4d 20 20 20 20 41  ...**    aM    A
14b30 76 65 72 61 67 65 20 6c 65 6e 67 74 68 20 6f 66  verage length of
14b40 20 63 6f 6c 75 6d 6e 20 4d 20 6f 76 65 72 20 74   column M over t
14b50 68 65 20 77 68 6f 6c 65 20 69 6e 64 65 78 0a 2a  he whole index.*
14b60 2a 20 20 20 20 6e 4d 20 20 20 20 4c 65 6e 67 74  *    nM    Lengt
14b70 68 20 6f 66 20 63 6f 6c 75 6d 6e 20 4d 20 6f 6e  h of column M on
14b80 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 72 6f   the matching ro
14b90 77 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 74 73 33  w.**.** The fts3
14ba0 4d 61 74 63 68 69 6e 66 6f 44 6f 63 73 69 7a 65  MatchinfoDocsize
14bb0 4c 6f 63 61 6c 28 29 20 72 6f 75 74 69 6e 65 20  Local() routine 
14bc0 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 6e 58 20  fills in the nX 
14bd0 76 61 6c 75 65 73 2e 0a 2a 2a 20 54 68 65 20 66  values..** The f
14be0 74 73 33 4d 61 74 63 68 69 6e 66 6f 44 6f 63 73  ts3MatchinfoDocs
14bf0 69 7a 65 47 6c 6f 62 61 6c 28 29 20 72 6f 75 74  izeGlobal() rout
14c00 69 6e 65 20 66 69 6c 6c 73 20 69 6e 20 4e 20 61  ine fills in N a
14c10 6e 64 20 74 68 65 20 61 58 20 76 61 6c 75 65 73  nd the aX values
14c20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14c30 46 74 73 33 4d 61 74 63 68 69 6e 66 6f 44 6f 63  Fts3MatchinfoDoc
14c40 73 69 7a 65 4c 6f 63 61 6c 28 46 74 73 33 43 75  sizeLocal(Fts3Cu
14c50 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
14c60 2a 61 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *a){.  const cha
14c70 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20  r *pBlob;       
14c80 2f 2a 20 54 68 65 20 42 4c 4f 42 20 68 6f 6c 64  /* The BLOB hold
14c90 69 6e 67 20 25 5f 64 6f 63 73 69 7a 65 20 69 6e  ing %_docsize in
14ca0 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  fo */.  int nBlo
14cb0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
14cc0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
14cd0 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65  BLOB */.  sqlite
14ce0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
14cf0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
14d00 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20  for reading and 
14d10 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  writing */.  int
14d20 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
14d30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14d40 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  unters */.  sqli
14d50 74 65 33 5f 69 6e 74 36 34 20 78 3b 20 20 20 20  te3_int64 x;    
14d60 20 20 20 20 20 2f 2a 20 56 61 72 69 6e 74 20 76       /* Varint v
14d70 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  alue */.  int rc
14d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14d90 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
14da0 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
14db0 6f 6e 73 20 2a 2f 0a 20 20 46 74 73 33 54 61 62  ons */.  Fts3Tab
14dc0 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
14dd0 20 20 2f 2a 20 54 68 65 20 46 54 53 20 74 61 62    /* The FTS tab
14de0 6c 65 20 2a 2f 0a 0a 20 20 70 20 3d 20 28 46 74  le */..  p = (Ft
14df0 73 33 54 61 62 6c 65 2a 29 70 43 75 72 2d 3e 62  s3Table*)pCur->b
14e00 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 72 63 20  ase.pVtab;.  rc 
14e10 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
14e20 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53   SQL_SELECT_DOCS
14e30 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  IZE, &pStmt, 0);
14e40 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
14e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14e60 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
14e70 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 70  nt64(pStmt, 1, p
14e80 43 75 72 2d 3e 69 50 72 65 76 49 64 29 3b 0a 20  Cur->iPrevId);. 
14e90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
14ea0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
14eb0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 6e 42 6c 6f  _ROW ){.    nBlo
14ec0 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
14ed0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
14ee0 30 29 3b 0a 20 20 20 20 70 42 6c 6f 62 20 3d 20  0);.    pBlob = 
14ef0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
14f00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
14f10 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
14f20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 70 2d 3e  for(i=j=0; i<p->
14f30 6e 43 6f 6c 75 6d 6e 20 26 26 20 6a 3c 6e 42 6c  nColumn && j<nBl
14f40 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ob; i++){.      
14f50 6a 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47  j = sqlite3Fts3G
14f60 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b  etVarint(&pBlob[
14f70 6a 5d 2c 20 26 78 29 3b 0a 20 20 20 20 20 20 61  j], &x);.      a
14f80 5b 32 2b 69 2a 32 5d 20 3d 20 28 75 33 32 29 28  [2+i*2] = (u32)(
14f90 78 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  x & 0xffffffff);
14fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
14fb0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
14fc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14fd0 54 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71  TE_OK; .}.int sq
14fe0 6c 69 74 65 33 46 74 73 33 4d 61 74 63 68 69 6e  lite3Fts3Matchin
14ff0 66 6f 44 6f 63 73 69 7a 65 47 6c 6f 62 61 6c 28  foDocsizeGlobal(
15000 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 75 72  Fts3Cursor *pCur
15010 2c 20 75 33 32 20 2a 61 29 7b 0a 20 20 63 6f 6e  , u32 *a){.  con
15020 73 74 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20  st char *pBlob; 
15030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 4c 4f        /* The BLO
15040 42 20 68 6f 6c 64 69 6e 67 20 25 5f 73 74 61 74  B holding %_stat
15050 20 69 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e   info */.  int n
15060 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
15070 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
15080 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c  he BLOB */.  sql
15090 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
150a0 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65  ;     /* Stateme
150b0 6e 74 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61  nt for reading a
150c0 6e 64 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  nd writing */.  
150d0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
150e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
150f0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
15100 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 20  qlite3_int64 x; 
15110 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6e          /* Varin
15120 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  t value */.  int
15130 20 6e 44 6f 63 3b 20 20 20 20 20 20 20 20 20 20   nDoc;          
15140 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15150 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a  of documents */.
15160 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
15170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15180 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
15190 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
151a0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 3b 20 20   Fts3Table *p;  
151b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
151c0 20 46 54 53 20 74 61 62 6c 65 20 2a 2f 0a 0a 20   FTS table */.. 
151d0 20 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a   p = (Fts3Table*
151e0 29 70 43 75 72 2d 3e 62 61 73 65 2e 70 56 74 61  )pCur->base.pVta
151f0 62 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  b;.  rc = fts3Sq
15200 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
15210 45 43 54 5f 44 4f 43 54 4f 54 41 4c 2c 20 26 70  ECT_DOCTOTAL, &p
15220 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
15230 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
15240 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73   rc;.  }.  if( s
15250 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
15260 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
15270 7b 0a 20 20 20 20 6e 42 6c 6f 62 20 3d 20 73 71  {.    nBlob = sq
15280 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
15290 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  es(pStmt, 0);.  
152a0 20 20 70 42 6c 6f 62 20 3d 20 28 63 6f 6e 73 74    pBlob = (const
152b0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
152c0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
152d0 2c 20 30 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71  , 0);.    j = sq
152e0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
152f0 6e 74 28 70 42 6c 6f 62 2c 20 26 78 29 3b 0a 20  nt(pBlob, &x);. 
15300 20 20 20 61 5b 30 5d 20 3d 20 6e 44 6f 63 20 3d     a[0] = nDoc =
15310 20 28 75 33 32 29 28 78 20 26 20 30 78 66 66 66   (u32)(x & 0xfff
15320 66 66 66 66 66 29 3b 0a 20 20 20 20 66 6f 72 28  fffff);.    for(
15330 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d  i=0; i<p->nColum
15340 6e 20 26 26 20 6a 3c 6e 42 6c 6f 62 3b 20 69 2b  n && j<nBlob; i+
15350 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71  +){.      j = sq
15360 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
15370 6e 74 28 26 70 42 6c 6f 62 5b 6a 5d 2c 20 26 78  nt(&pBlob[j], &x
15380 29 3b 0a 20 20 20 20 20 20 61 5b 31 2b 69 2a 32  );.      a[1+i*2
15390 5d 20 3d 20 28 28 75 33 32 29 28 78 20 26 20 30  ] = ((u32)(x & 0
153a0 78 66 66 66 66 66 66 66 66 29 20 2b 20 6e 44 6f  xffffffff) + nDo
153b0 63 2f 32 29 2f 6e 44 6f 63 3b 0a 20 20 20 20 7d  c/2)/nDoc;.    }
153c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
153d0 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 72  eset(pStmt);.  r
153e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
153f0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72   .}../*.** Inser
15400 74 20 74 68 65 20 73 69 7a 65 73 20 28 69 6e 20  t the sizes (in 
15410 74 6f 6b 65 6e 73 29 20 66 6f 72 20 65 61 63 68  tokens) for each
15420 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64   column of the d
15430 6f 63 75 6d 65 6e 74 0a 2a 2a 20 77 69 74 68 20  ocument.** with 
15440 64 6f 63 69 64 20 65 71 75 61 6c 20 74 6f 20 70  docid equal to p
15450 2d 3e 69 50 72 65 76 44 6f 63 69 64 2e 20 20 54  ->iPrevDocid.  T
15460 68 65 20 73 69 7a 65 73 20 61 72 65 20 65 6e 63  he sizes are enc
15470 6f 64 65 64 20 61 73 0a 2a 2a 20 61 20 62 6c 6f  oded as.** a blo
15480 62 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2f  b of varints..*/
15490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
154a0 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 0a  3InsertDocsize(.
154b0 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
154c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
154d0 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c  de */.  Fts3Tabl
154e0 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 61 62  e *p,     /* Tab
154f0 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f  le into which to
15500 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 75 33 32   insert */.  u32
15510 20 2a 61 53 7a 20 20 20 20 20 20 20 20 20 20 2f   *aSz          /
15520 2a 20 53 69 7a 65 73 20 6f 66 20 65 61 63 68 20  * Sizes of each 
15530 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63  column */.){.  c
15540 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  har *pBlob;     
15550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
15560 4c 4f 42 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  LOB encoding of 
15570 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a  the document siz
15580 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  e */.  int nBlob
15590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
155a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
155b0 65 73 20 69 6e 20 74 68 65 20 42 4c 4f 42 20 2a  es in the BLOB *
155c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
155d0 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
155e0 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  Statement used t
155f0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 65 6e 63  o insert the enc
15600 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72  oding */.  int r
15610 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
15620 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
15630 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
15640 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
15650 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
15660 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
15670 6d 61 6c 6c 6f 63 28 20 31 30 2a 70 2d 3e 6e 43  malloc( 10*p->nC
15680 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70  olumn );.  if( p
15690 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  Blob==0 ){.    *
156a0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRC = SQLITE_NOM
156b0 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
156c0 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 65    }.  fts3Encode
156d0 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e 43 6f 6c  IntArray(p->nCol
156e0 75 6d 6e 2c 20 61 53 7a 2c 20 70 42 6c 6f 62 2c  umn, aSz, pBlob,
156f0 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20 3d   &nBlob);.  rc =
15700 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
15710 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
15720 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  IZE, &pStmt, 0);
15730 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
15740 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
15750 6c 6f 62 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d  lob);.    *pRC =
15760 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
15770 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  .  }.  sqlite3_b
15780 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
15790 20 31 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69   1, p->iPrevDoci
157a0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
157b0 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32  nd_blob(pStmt, 2
157c0 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20  , pBlob, nBlob, 
157d0 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
157e0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
157f0 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73  tmt);.  *pRC = s
15800 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
15810 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mt);.}../*.** Re
15820 63 6f 72 64 20 30 20 6f 66 20 74 68 65 20 25 5f  cord 0 of the %_
15830 73 74 61 74 20 74 61 62 6c 65 20 63 6f 6e 74 61  stat table conta
15840 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69  ins a blob consi
15850 73 74 69 6e 67 20 6f 66 20 4e 20 76 61 72 69 6e  sting of N varin
15860 74 73 2c 0a 2a 2a 20 77 68 65 72 65 20 4e 20 69  ts,.** where N i
15870 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
15880 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c  user defined col
15890 75 6d 6e 73 20 69 6e 20 74 68 65 20 66 74 73 33  umns in the fts3
158a0 20 74 61 62 6c 65 20 70 6c 75 73 0a 2a 2a 20 74   table plus.** t
158b0 77 6f 2e 20 49 66 20 6e 43 6f 6c 20 69 73 20 74  wo. If nCol is t
158c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
158d0 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r defined column
158e0 73 2c 20 74 68 65 6e 20 76 61 6c 75 65 73 20 6f  s, then values o
158f0 66 20 74 68 65 20 0a 2a 2a 20 76 61 72 69 6e 74  f the .** varint
15900 73 20 61 72 65 20 73 65 74 20 61 73 20 66 6f 6c  s are set as fol
15910 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 56 61  lows:.**.**   Va
15920 72 69 6e 74 20 30 3a 20 20 20 20 20 20 20 54 6f  rint 0:       To
15930 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  tal number of ro
15940 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
15950 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20  .**.**   Varint 
15960 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72 20 65 61 63  1..nCol: For eac
15970 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 74 6f  h column, the to
15980 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
15990 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a  kens stored in.*
159a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
159b0 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66      the column f
159c0 6f 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  or all rows of t
159d0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
159e0 20 20 56 61 72 69 6e 74 20 31 2b 6e 43 6f 6c 3a    Varint 1+nCol:
159f0 20 20 54 68 65 20 74 6f 74 61 6c 20 73 69 7a 65    The total size
15a00 2c 20 69 6e 20 62 79 74 65 73 2c 20 6f 66 20 61  , in bytes, of a
15a10 6c 6c 20 74 65 78 74 20 76 61 6c 75 65 73 20 69  ll text values i
15a20 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20  n all.**        
15a30 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
15a40 6e 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20 6f  ns of all rows o
15a50 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
15a60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15a70 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f 74 61  ts3UpdateDocTota
15a80 6c 73 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20  ls(.  int *pRC, 
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15aa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
15ab0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ult code */.  Ft
15ac0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ae0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75 70 64   Table being upd
15af0 61 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61  ated */.  u32 *a
15b00 53 7a 49 6e 73 2c 20 20 20 20 20 20 20 20 20 20  SzIns,          
15b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
15b20 65 20 69 6e 63 72 65 61 73 65 73 20 2a 2f 0a 20  e increases */. 
15b30 20 75 33 32 20 2a 61 53 7a 44 65 6c 2c 20 20 20   u32 *aSzDel,   
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 2f 2a 20 53 69 7a 65 20 64 65 63 72 65 61 73   /* Size decreas
15b60 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e  es */.  int nChn
15b70 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
15b80 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
15b90 65 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  e in the number 
15ba0 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a  of documents */.
15bb0 29 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62  ){.  char *pBlob
15bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15bd0 20 53 74 6f 72 61 67 65 20 66 6f 72 20 42 4c 4f   Storage for BLO
15be0 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 25  B written into %
15bf0 5f 73 74 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  _stat */.  int n
15c00 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
15c10 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 42      /* Size of B
15c20 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  LOB written into
15c30 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 75 33 32   %_stat */.  u32
15c40 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
15c50 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
15c60 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20  f integers that 
15c70 62 65 63 6f 6d 65 73 20 74 68 65 20 42 4c 4f 42  becomes the BLOB
15c80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
15c90 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
15ca0 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  * Statement for 
15cb0 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
15cc0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ing */.  int i; 
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15cf0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
15d20 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
15d30 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 69 6e 74   */..  const int
15d40 20 6e 53 74 61 74 20 3d 20 70 2d 3e 6e 43 6f 6c   nStat = p->nCol
15d50 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66 28 20 2a 70  umn+2;..  if( *p
15d60 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
15d70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
15d80 63 28 20 28 73 69 7a 65 6f 66 28 75 33 32 29 2b  c( (sizeof(u32)+
15d90 31 30 29 2a 6e 53 74 61 74 20 29 3b 0a 20 20 69  10)*nStat );.  i
15da0 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  f( a==0 ){.    *
15db0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRC = SQLITE_NOM
15dc0 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
15dd0 20 20 7d 0a 20 20 70 42 6c 6f 62 20 3d 20 28 63    }.  pBlob = (c
15de0 68 61 72 2a 29 26 61 5b 6e 53 74 61 74 5d 3b 0a  har*)&a[nStat];.
15df0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
15e00 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
15e10 5f 44 4f 43 54 4f 54 41 4c 2c 20 26 70 53 74 6d  _DOCTOTAL, &pStm
15e20 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
15e30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
15e40 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43  ree(a);.    *pRC
15e50 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
15e60 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  n;.  }.  if( sql
15e70 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
15e80 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
15e90 20 20 20 20 66 74 73 33 44 65 63 6f 64 65 49 6e      fts3DecodeIn
15ea0 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61 2c  tArray(nStat, a,
15eb0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
15ec0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
15ed0 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  tmt, 0),.       
15ee0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
15ef0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29  _bytes(pStmt, 0)
15f00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15f10 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a  memset(a, 0, siz
15f20 65 6f 66 28 75 33 32 29 2a 28 6e 53 74 61 74 29  eof(u32)*(nStat)
15f30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
15f40 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
15f50 20 20 69 66 28 20 6e 43 68 6e 67 3c 30 20 26 26    if( nChng<0 &&
15f60 20 61 5b 30 5d 3c 28 75 33 32 29 28 2d 6e 43 68   a[0]<(u32)(-nCh
15f70 6e 67 29 20 29 7b 0a 20 20 20 20 61 5b 30 5d 20  ng) ){.    a[0] 
15f80 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
15f90 20 20 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e 67 3b    a[0] += nChng;
15fa0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
15fb0 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b 20  i<p->nColumn+1; 
15fc0 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20 78 20  i++){.    u32 x 
15fd0 3d 20 61 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66  = a[i+1];.    if
15fe0 28 20 78 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c 20  ( x+aSzIns[i] < 
15ff0 61 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20 20 20  aSzDel[i] ){.   
16000 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65     x = 0;.    }e
16010 6c 73 65 7b 0a 20 20 20 20 20 20 78 20 3d 20 78  lse{.      x = x
16020 20 2b 20 61 53 7a 49 6e 73 5b 69 5d 20 2d 20 61   + aSzIns[i] - a
16030 53 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a  SzDel[i];.    }.
16040 20 20 20 20 61 5b 69 2b 31 5d 20 3d 20 78 3b 0a      a[i+1] = x;.
16050 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 65    }.  fts3Encode
16060 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20  IntArray(nStat, 
16070 61 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62  a, pBlob, &nBlob
16080 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  );.  rc = fts3Sq
16090 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50  lStmt(p, SQL_REP
160a0 4c 41 43 45 5f 44 4f 43 54 4f 54 41 4c 2c 20 26  LACE_DOCTOTAL, &
160b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
160c0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
160d0 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20  e3_free(a);.    
160e0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
160f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
16100 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
16110 53 74 6d 74 2c 20 31 2c 20 70 42 6c 6f 62 2c 20  Stmt, 1, pBlob, 
16120 6e 42 6c 6f 62 2c 20 53 51 4c 49 54 45 5f 53 54  nBlob, SQLITE_ST
16130 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
16140 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
16150 2a 70 52 43 20 3d 20 73 71 6c 69 74 65 33 5f 72  *pRC = sqlite3_r
16160 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 73  eset(pStmt);.  s
16170 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
16180 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  }../*.** Handle 
16190 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e 53 45  a 'special' INSE
161a0 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  RT of the form:.
161b0 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52 54 20  **.**   "INSERT 
161c0 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20 56 41  INTO tbl(tbl) VA
161d0 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a 2a 2a  LUES(<expr>)".**
161e0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 61  .** Argument pVa
161f0 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  l contains the r
16200 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72 3e 2e  esult of <expr>.
16210 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f   Currently the o
16220 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 66  nly .** meaningf
16230 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e 73 65  ul value to inse
16240 72 74 20 69 73 20 74 68 65 20 74 65 78 74 20 27  rt is the text '
16250 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a 73 74  optimize'..*/.st
16260 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 70 65  atic int fts3Spe
16270 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73 33 54  cialInsert(Fts3T
16280 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  able *p, sqlite3
16290 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20  _value *pVal){. 
162a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
162d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
162e0 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zVal = (const c
162f0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
16300 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
16310 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
16320 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
16330 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20 21  (pVal);..  if( !
16340 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  zVal ){.    retu
16350 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16360 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61  .  }else if( nVa
16370 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c 69 74  l==8 && 0==sqlit
16380 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
16390 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 38 29  , "optimize", 8)
163a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
163b0 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c  3SegmentMerge(p,
163c0 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63   -1);.    if( rc
163d0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
163e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
163f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
16400 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
16410 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43  ts3PendingTermsC
16420 6c 65 61 72 28 70 29 3b 0a 20 20 20 20 7d 0a 23  lear(p);.    }.#
16430 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16440 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  T.  }else if( nV
16450 61 6c 3e 39 20 26 26 20 30 3d 3d 73 71 6c 69 74  al>9 && 0==sqlit
16460 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
16470 2c 20 22 6e 6f 64 65 73 69 7a 65 3d 22 2c 20 39  , "nodesize=", 9
16480 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4e 6f 64  ) ){.    p->nNod
16490 65 53 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a 56  eSize = atoi(&zV
164a0 61 6c 5b 39 5d 29 3b 0a 20 20 20 20 72 63 20 3d  al[9]);.    rc =
164b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
164c0 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 31 31 20  lse if( nVal>11 
164d0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
164e0 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6d 61  rnicmp(zVal, "ma
164f0 78 70 65 6e 64 69 6e 67 3d 22 2c 20 39 29 20 29  xpending=", 9) )
16500 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e  {.    p->nMaxPen
16510 64 69 6e 67 44 61 74 61 20 3d 20 61 74 6f 69 28  dingData = atoi(
16520 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a 20 20 20 20  &zVal[11]);.    
16530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16540 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
16550 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16560 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 71  ERROR;.  }..  sq
16570 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74  lite3Fts3Segment
16580 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74  sClose(p);.  ret
16590 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
165a0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 65   Return the defe
165b0 72 72 65 64 20 64 6f 63 6c 69 73 74 20 61 73 73  rred doclist ass
165c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 65 66  ociated with def
165d0 65 72 72 65 64 20 74 6f 6b 65 6e 20 70 44 65 66  erred token pDef
165e0 65 72 72 65 64 2e 0a 2a 2a 20 54 68 69 73 20 66  erred..** This f
165f0 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
16600 74 68 61 74 20 73 71 6c 69 74 65 33 46 74 73 33  that sqlite3Fts3
16610 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63  CacheDeferredDoc
16620 6c 69 73 74 73 28 29 20 68 61 73 20 61 6c 72 65  lists() has alre
16630 61 64 79 0a 2a 2a 20 62 65 65 6e 20 63 61 6c 6c  ady.** been call
16640 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ed to allocate a
16650 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
16660 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 63 68 61 72  doclist..*/.char
16670 20 2a 73 71 6c 69 74 65 33 46 74 73 33 44 65 66   *sqlite3Fts3Def
16680 65 72 72 65 64 44 6f 63 6c 69 73 74 28 46 74 73  erredDoclist(Fts
16690 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
166a0 70 44 65 66 65 72 72 65 64 2c 20 69 6e 74 20 2a  pDeferred, int *
166b0 70 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70  pnByte){.  if( p
166c0 44 65 66 65 72 72 65 64 2d 3e 70 4c 69 73 74 20  Deferred->pList 
166d0 29 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 3d  ){.    *pnByte =
166e0 20 70 44 65 66 65 72 72 65 64 2d 3e 70 4c 69 73   pDeferred->pLis
166f0 74 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 72 65  t->nData;.    re
16700 74 75 72 6e 20 70 44 65 66 65 72 72 65 64 2d 3e  turn pDeferred->
16710 70 4c 69 73 74 2d 3e 61 44 61 74 61 3b 0a 20 20  pList->aData;.  
16720 7d 0a 20 20 2a 70 6e 42 79 74 65 20 3d 20 30 3b  }.  *pnByte = 0;
16730 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
16740 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 63  /*.** Helper fuc
16750 6e 74 69 6f 6e 20 66 6f 72 20 46 72 65 65 44 65  ntion for FreeDe
16760 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 29  ferredDoclists()
16770 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
16780 72 65 6d 6f 76 65 73 20 61 6c 6c 0a 2a 2a 20 72  removes all.** r
16790 65 66 65 72 65 6e 63 65 73 20 74 6f 20 64 65 66  eferences to def
167a0 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 20 66  erred doclists f
167b0 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 74  rom within the t
167c0 72 65 65 20 6f 66 20 46 74 73 33 45 78 70 72 20  ree of Fts3Expr 
167d0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 68  .** structures h
167e0 65 61 64 65 64 20 62 79 20 0a 2a 2f 0a 73 74 61  eaded by .*/.sta
167f0 74 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 66  tic void fts3Def
16800 65 72 72 65 64 44 6f 63 6c 69 73 74 43 6c 65 61  erredDoclistClea
16810 72 28 46 74 73 33 45 78 70 72 20 2a 70 45 78 70  r(Fts3Expr *pExp
16820 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  r){.  if( pExpr 
16830 29 7b 0a 20 20 20 20 66 74 73 33 44 65 66 65 72  ){.    fts3Defer
16840 72 65 64 44 6f 63 6c 69 73 74 43 6c 65 61 72 28  redDoclistClear(
16850 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
16860 20 20 20 66 74 73 33 44 65 66 65 72 72 65 64 44     fts3DeferredD
16870 6f 63 6c 69 73 74 43 6c 65 61 72 28 70 45 78 70  oclistClear(pExp
16880 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
16890 69 66 28 20 70 45 78 70 72 2d 3e 69 73 4c 6f 61  if( pExpr->isLoa
168a0 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
168b0 69 74 65 33 5f 66 72 65 65 28 70 45 78 70 72 2d  ite3_free(pExpr-
168c0 3e 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  >aDoclist);.    
168d0 20 20 70 45 78 70 72 2d 3e 69 73 4c 6f 61 64 65    pExpr->isLoade
168e0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 45 78  d = 0;.      pEx
168f0 70 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 30  pr->aDoclist = 0
16900 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6e  ;.      pExpr->n
16910 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Doclist = 0;.   
16920 20 20 20 70 45 78 70 72 2d 3e 70 43 75 72 72 65     pExpr->pCurre
16930 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 45  nt = 0;.      pE
16940 78 70 72 2d 3e 69 43 75 72 72 65 6e 74 20 3d 20  xpr->iCurrent = 
16950 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
16960 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  /*.** Delete all
16970 20 63 61 63 68 65 64 20 64 65 66 65 72 72 65 64   cached deferred
16980 20 64 6f 63 6c 69 73 74 73 2e 20 44 65 66 65 72   doclists. Defer
16990 72 65 64 20 64 6f 63 6c 69 73 74 73 20 61 72 65  red doclists are
169a0 20 63 61 63 68 65 64 0a 2a 2a 20 28 61 6c 6c 6f   cached.** (allo
169b0 63 61 74 65 64 29 20 62 79 20 74 68 65 20 73 71  cated) by the sq
169c0 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 44 65  lite3Fts3CacheDe
169d0 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 29  ferredDoclists()
169e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
169f0 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 46 72  id sqlite3Fts3Fr
16a00 65 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73  eeDeferredDoclis
16a10 74 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70  ts(Fts3Cursor *p
16a20 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65 66 65  Csr){.  Fts3Defe
16a30 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 3b  rredToken *pDef;
16a40 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72  .  for(pDef=pCsr
16a50 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65  ->pDeferred; pDe
16a60 66 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e  f; pDef=pDef->pN
16a70 65 78 74 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ext){.    sqlite
16a80 33 5f 66 72 65 65 28 70 44 65 66 2d 3e 70 4c 69  3_free(pDef->pLi
16a90 73 74 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e 70  st);.    pDef->p
16aa0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  List = 0;.  }.  
16ab0 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72  if( pCsr->pDefer
16ac0 72 65 64 20 29 7b 0a 20 20 20 20 66 74 73 33 44  red ){.    fts3D
16ad0 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 43 6c  eferredDoclistCl
16ae0 65 61 72 28 70 43 73 72 2d 3e 70 45 78 70 72 29  ear(pCsr->pExpr)
16af0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
16b00 72 65 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ree all entries 
16b10 69 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65  in the pCsr->pDe
16b20 66 66 65 72 65 64 20 6c 69 73 74 2e 20 45 6e 74  ffered list. Ent
16b30 72 69 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ries are added t
16b40 6f 20 0a 2a 2a 20 74 68 69 73 20 6c 69 73 74 20  o .** this list 
16b50 75 73 69 6e 67 20 73 71 6c 69 74 65 33 46 74 73  using sqlite3Fts
16b60 33 44 65 66 65 72 54 6f 6b 65 6e 28 29 2e 0a 2a  3DeferToken()..*
16b70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
16b80 73 33 46 72 65 65 44 65 66 65 72 72 65 64 54 6f  s3FreeDeferredTo
16b90 6b 65 6e 73 28 46 74 73 33 43 75 72 73 6f 72 20  kens(Fts3Cursor 
16ba0 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65  *pCsr){.  Fts3De
16bb0 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
16bc0 66 3b 0a 20 20 46 74 73 33 44 65 66 65 72 72 65  f;.  Fts3Deferre
16bd0 64 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 0a 20  dToken *pNext;. 
16be0 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e   for(pDef=pCsr->
16bf0 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 3b  pDeferred; pDef;
16c00 20 70 44 65 66 3d 70 4e 65 78 74 29 7b 0a 20 20   pDef=pNext){.  
16c10 20 20 70 4e 65 78 74 20 3d 20 70 44 65 66 2d 3e    pNext = pDef->
16c20 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
16c30 65 33 5f 66 72 65 65 28 70 44 65 66 2d 3e 70 4c  e3_free(pDef->pL
16c40 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
16c50 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20  3_free(pDef);.  
16c60 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65 72  }.  pCsr->pDefer
16c70 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  red = 0;.}../*.*
16c80 2a 20 47 65 6e 65 72 61 74 65 20 64 65 66 65 72  * Generate defer
16c90 72 65 64 2d 64 6f 63 6c 69 73 74 73 20 66 6f 72  red-doclists for
16ca0 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74   all tokens in t
16cb0 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  he pCsr->pDeferr
16cc0 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73 65 64  ed list.** based
16cd0 20 6f 6e 20 74 68 65 20 72 6f 77 20 74 68 61 74   on the row that
16ce0 20 70 43 73 72 20 63 75 72 72 65 6e 74 6c 79 20   pCsr currently 
16cf0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
16d00 20 41 20 64 65 66 65 72 72 65 64 2d 64 6f 63 6c   A deferred-docl
16d10 69 73 74 20 69 73 20 6c 69 6b 65 20 61 6e 79 20  ist is like any 
16d20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 20 77 69  other doclist wi
16d30 74 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  th position info
16d40 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75  rmation.** inclu
16d50 64 65 64 2c 20 65 78 63 65 70 74 20 74 68 61 74  ded, except that
16d60 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e   it only contain
16d70 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 20  s entries for a 
16d80 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
16d90 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f 74 20  e.** table, not 
16da0 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f  for all rows..*/
16db0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
16dc0 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63  CacheDeferredDoc
16dd0 6c 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72  lists(Fts3Cursor
16de0 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72   *pCsr){.  int r
16df0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
16e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16e10 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
16e20 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  f( pCsr->pDeferr
16e30 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ed ){.    int i;
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e50 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
16e60 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
16e70 67 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  gh table columns
16e80 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
16e90 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20 20  int64 iDocid;   
16ea0 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f        /* Docid o
16eb0 66 20 74 68 65 20 72 6f 77 20 70 43 73 72 20 70  f the row pCsr p
16ec0 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20  oints to */.    
16ed0 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
16ee0 6e 20 2a 70 44 65 66 3b 20 20 20 20 20 20 2f 2a  n *pDef;      /*
16ef0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
16f00 20 74 68 72 6f 75 67 68 20 64 65 66 65 72 72 65   through deferre
16f10 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20  d tokens */.  . 
16f20 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20     Fts3Table *p 
16f30 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70  = (Fts3Table *)p
16f40 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Csr->base.pVtab;
16f50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  .    sqlite3_tok
16f60 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70 2d 3e  enizer *pT = p->
16f70 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20  pTokenizer;.    
16f80 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
16f90 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a  r_module const *
16fa0 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e 70 4d  pModule = pT->pM
16fb0 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20 20 61  odule;.   .    a
16fc0 73 73 65 72 74 28 20 70 43 73 72 2d 3e 69 73 52  ssert( pCsr->isR
16fd0 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 3b  equireSeek==0 );
16fe0 0a 20 20 20 20 69 44 6f 63 69 64 20 3d 20 73 71  .    iDocid = sq
16ff0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
17000 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  64(pCsr->pStmt, 
17010 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  0);.  .    for(i
17020 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e  =0; i<p->nColumn
17030 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
17040 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  K; i++){.      c
17050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
17060 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
17070 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
17080 74 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d 74  text(pCsr->pStmt
17090 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
170a0 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
170b0 63 75 72 73 6f 72 20 2a 70 54 43 20 3d 20 30 3b  cursor *pTC = 0;
170c0 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 70  .  .      rc = p
170d0 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 54  Module->xOpen(pT
170e0 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70 54  , zText, -1, &pT
170f0 43 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  C);.      while(
17100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17110 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
17120 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20  onst *zToken;   
17130 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
17140 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a  ntaining token *
17150 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54  /.        int nT
17160 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  oken;           
17170 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17180 20 62 79 74 65 73 20 69 6e 20 74 6f 6b 65 6e 20   bytes in token 
17190 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
171a0 44 75 6d 31 2c 20 69 44 75 6d 32 3b 20 20 20 20  Dum1, iDum2;    
171b0 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 76 61       /* Dummy va
171c0 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20  riables */.     
171d0 20 20 20 69 6e 74 20 69 50 6f 73 3b 20 20 20 20     int iPos;    
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
171f0 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
17200 6e 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 20 20  n in zText */.  
17210 0a 20 20 20 20 20 20 20 20 70 54 43 2d 3e 70 54  .        pTC->pT
17220 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 54 3b 0a 20  okenizer = pT;. 
17230 20 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64         rc = pMod
17240 75 6c 65 2d 3e 78 4e 65 78 74 28 70 54 43 2c 20  ule->xNext(pTC, 
17250 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e  &zToken, &nToken
17260 2c 20 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32  , &iDum1, &iDum2
17270 2c 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  , &iPos);.      
17280 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d    for(pDef=pCsr-
17290 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66  >pDeferred; pDef
172a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
172b0 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e  K; pDef=pDef->pN
172c0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
172d0 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20  Fts3PhraseToken 
172e0 2a 70 50 54 20 3d 20 70 44 65 66 2d 3e 70 54 6f  *pPT = pDef->pTo
172f0 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ken;.          i
17300 66 28 20 28 70 44 65 66 2d 3e 69 43 6f 6c 3e 3d  f( (pDef->iCol>=
17310 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 7c 7c 20 70 44  p->nColumn || pD
17320 65 66 2d 3e 69 43 6f 6c 3d 3d 69 29 0a 20 20 20  ef->iCol==i).   
17330 20 20 20 20 20 20 20 20 26 26 20 28 70 50 54 2d          && (pPT-
17340 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 28 70  >n==nToken || (p
17350 50 54 2d 3e 69 73 50 72 65 66 69 78 20 26 26 20  PT->isPrefix && 
17360 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29 29 0a  pPT->n<nToken)).
17370 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 30             && (0
17380 3d 3d 6d 65 6d 63 6d 70 28 7a 54 6f 6b 65 6e 2c  ==memcmp(zToken,
17390 20 70 50 54 2d 3e 7a 2c 20 70 50 54 2d 3e 6e 29   pPT->z, pPT->n)
173a0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
173b0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50             fts3P
173c0 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
173d0 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c 20 69  (&pDef->pList, i
173e0 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f 73 2c 20  Docid, i, iPos, 
173f0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &rc);.          
17400 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17410 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
17420 43 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  C ) pModule->xCl
17430 6f 73 65 28 70 54 43 29 3b 0a 20 20 20 20 20 20  ose(pTC);.      
17440 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
17450 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
17460 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  E_OK;.    }.  . 
17470 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72     for(pDef=pCsr
17480 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65  ->pDeferred; pDe
17490 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  f && rc==SQLITE_
174a0 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70  OK; pDef=pDef->p
174b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
174c0 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 29 7b 0a   pDef->pList ){.
174d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
174e0 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
174f0 6e 64 56 61 72 69 6e 74 28 26 70 44 65 66 2d 3e  ndVarint(&pDef->
17500 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20  pList, 0);.     
17510 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
17520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17530 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79  .** Add an entry
17540 20 66 6f 72 20 74 6f 6b 65 6e 20 70 54 6f 6b 65   for token pToke
17550 6e 20 74 6f 20 74 68 65 20 70 43 73 72 2d 3e 70  n to the pCsr->p
17560 44 65 66 65 72 72 65 64 20 6c 69 73 74 2e 0a 2a  Deferred list..*
17570 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
17580 33 44 65 66 65 72 54 6f 6b 65 6e 28 0a 20 20 46  3DeferToken(.  F
17590 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
175b0 2a 20 46 74 73 33 20 74 61 62 6c 65 20 63 75 72  * Fts3 table cur
175c0 73 6f 72 20 2a 2f 0a 20 20 46 74 73 33 50 68 72  sor */.  Fts3Phr
175d0 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  aseToken *pToken
175e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ,        /* Toke
175f0 6e 20 74 6f 20 64 65 66 65 72 20 2a 2f 0a 20 20  n to defer */.  
17600 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17620 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68 61 74 20 74  /* Column that t
17630 6f 6b 65 6e 20 6d 75 73 74 20 61 70 70 65 61 72  oken must appear
17640 20 69 6e 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 29   in (or -1) */.)
17650 7b 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64  {.  Fts3Deferred
17660 54 6f 6b 65 6e 20 2a 70 44 65 66 65 72 72 65 64  Token *pDeferred
17670 3b 0a 20 20 70 44 65 66 65 72 72 65 64 20 3d 20  ;.  pDeferred = 
17680 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
17690 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65 64  izeof(*pDeferred
176a0 29 29 3b 0a 20 20 69 66 28 20 21 70 44 65 66 65  ));.  if( !pDefe
176b0 72 72 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  rred ){.    retu
176c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
176d0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 44  .  }.  memset(pD
176e0 65 66 65 72 72 65 64 2c 20 30 2c 20 73 69 7a 65  eferred, 0, size
176f0 6f 66 28 2a 70 44 65 66 65 72 72 65 64 29 29 3b  of(*pDeferred));
17700 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e 70 54  .  pDeferred->pT
17710 6f 6b 65 6e 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20  oken = pToken;. 
17720 20 70 44 65 66 65 72 72 65 64 2d 3e 70 4e 65 78   pDeferred->pNex
17730 74 20 3d 20 70 43 73 72 2d 3e 70 44 65 66 65 72  t = pCsr->pDefer
17740 72 65 64 3b 20 0a 20 20 70 44 65 66 65 72 72 65  red; .  pDeferre
17750 64 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a  d->iCol = iCol;.
17760 20 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65    pCsr->pDeferre
17770 64 20 3d 20 70 44 65 66 65 72 72 65 64 3b 0a 0a  d = pDeferred;..
17780 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
17790 2d 3e 70 44 65 66 65 72 72 65 64 3d 3d 30 20 29  ->pDeferred==0 )
177a0 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66  ;.  pToken->pDef
177b0 65 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65  erred = pDeferre
177c0 64 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d;..  return SQL
177d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
177e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
177f0 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f  does the work fo
17800 72 20 74 68 65 20 78 55 70 64 61 74 65 20 6d 65  r the xUpdate me
17810 74 68 6f 64 20 6f 66 20 46 54 53 33 20 76 69 72  thod of FTS3 vir
17820 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 0a  tual.** tables..
17830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
17840 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28 0a  s3UpdateMethod(.
17850 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
17860 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20  pVtab,          
17870 20 20 2f 2a 20 46 54 53 33 20 76 74 61 62 20 6f    /* FTS3 vtab o
17880 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
17890 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
178a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
178b0 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61  ze of argument a
178c0 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rray */.  sqlite
178d0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c  3_value **apVal,
178e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
178f0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
17900 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  */.  sqlite_int6
17910 34 20 2a 70 52 6f 77 69 64 20 20 20 20 20 20 20  4 *pRowid       
17920 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65       /* OUT: The
17930 20 61 66 66 65 63 74 65 64 20 28 6f 72 20 65 66   affected (or ef
17940 66 65 63 74 65 64 29 20 72 6f 77 69 64 20 2a 2f  fected) rowid */
17950 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  .){.  Fts3Table 
17960 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
17970 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  *)pVtab;.  int r
17980 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
17990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
179a0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
179b0 6e 74 20 69 73 52 65 6d 6f 76 65 20 3d 20 30 3b  nt isRemove = 0;
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
179d0 2a 20 54 72 75 65 20 66 6f 72 20 61 6e 20 55 50  * True for an UP
179e0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
179f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
17a00 34 20 69 52 65 6d 6f 76 65 20 3d 20 30 3b 20 20  4 iRemove = 0;  
17a10 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 72 65 6d      /* Rowid rem
17a20 6f 76 65 64 20 62 79 20 55 50 44 41 54 45 20 6f  oved by UPDATE o
17a30 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 75 33  r DELETE */.  u3
17a40 32 20 2a 61 53 7a 49 6e 73 3b 20 20 20 20 20 20  2 *aSzIns;      
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17a60 20 53 69 7a 65 73 20 6f 66 20 69 6e 73 65 72 74   Sizes of insert
17a70 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a  ed documents */.
17a80 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 3b 20 20    u32 *aSzDel;  
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64 65    /* Sizes of de
17ab0 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 20  leted documents 
17ac0 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  */.  int nChng =
17ad0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17ae0 20 20 20 20 20 2f 2a 20 4e 65 74 20 63 68 61 6e       /* Net chan
17af0 67 65 20 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20  ge in number of 
17b00 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  documents */..  
17b10 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d  assert( p->pSegm
17b20 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ents==0 );..  /*
17b30 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
17b40 74 6f 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e  to hold the chan
17b50 67 65 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73  ge in document s
17b60 69 7a 65 73 20 2a 2f 0a 20 20 61 53 7a 49 6e 73  izes */.  aSzIns
17b70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
17b80 63 28 20 73 69 7a 65 6f 66 28 61 53 7a 49 6e 73  c( sizeof(aSzIns
17b90 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e  [0])*(p->nColumn
17ba0 2b 31 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61  +1)*2 );.  if( a
17bb0 53 7a 49 6e 73 3d 3d 30 20 29 20 72 65 74 75 72  SzIns==0 ) retur
17bc0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
17bd0 20 20 61 53 7a 44 65 6c 20 3d 20 26 61 53 7a 49    aSzDel = &aSzI
17be0 6e 73 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d  ns[p->nColumn+1]
17bf0 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 7a 49 6e  ;.  memset(aSzIn
17c00 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 7a  s, 0, sizeof(aSz
17c10 49 6e 73 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c  Ins[0])*(p->nCol
17c20 75 6d 6e 2b 31 29 2a 32 29 3b 0a 0a 20 20 2f 2a  umn+1)*2);..  /*
17c30 20 49 66 20 74 68 69 73 20 69 73 20 61 20 44 45   If this is a DE
17c40 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 6f  LETE or UPDATE o
17c50 70 65 72 61 74 69 6f 6e 2c 20 72 65 6d 6f 76 65  peration, remove
17c60 20 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e   the old record.
17c70 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
17c80 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
17c90 61 6c 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  al[0])!=SQLITE_N
17ca0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ULL ){.    int i
17cb0 73 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20  sEmpty = 0;.    
17cc0 72 63 20 3d 20 66 74 73 33 49 73 45 6d 70 74 79  rc = fts3IsEmpty
17cd0 28 70 2c 20 61 70 56 61 6c 2c 20 26 69 73 45 6d  (p, apVal, &isEm
17ce0 70 74 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pty);.    if( rc
17cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17d00 20 20 20 20 20 69 66 28 20 69 73 45 6d 70 74 79       if( isEmpty
17d10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
17d20 65 6c 65 74 69 6e 67 20 74 68 69 73 20 72 6f 77  eleting this row
17d30 20 6d 65 61 6e 73 20 74 68 65 20 77 68 6f 6c 65   means the whole
17d40 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
17d50 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
17d60 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20        ** delete 
17d70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
17d80 61 6c 6c 20 74 68 72 65 65 20 74 61 62 6c 65 73  all three tables
17d90 20 61 6e 64 20 74 68 72 6f 77 20 61 77 61 79 20   and throw away 
17da0 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  any.        ** d
17db0 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64 69  ata in the pendi
17dc0 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61 62  ngTerms hash tab
17dd0 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
17de0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
17df0 44 65 6c 65 74 65 41 6c 6c 28 70 29 3b 0a 20 20  DeleteAll(p);.  
17e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17e10 20 20 20 69 73 52 65 6d 6f 76 65 20 3d 20 31 3b     isRemove = 1;
17e20 0a 20 20 20 20 20 20 20 20 69 52 65 6d 6f 76 65  .        iRemove
17e30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
17e40 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29  _int64(apVal[0])
17e50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
17e60 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44  ts3PendingTermsD
17e70 6f 63 69 64 28 70 2c 20 69 52 65 6d 6f 76 65 29  ocid(p, iRemove)
17e80 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 44 65  ;.        fts3De
17e90 6c 65 74 65 54 65 72 6d 73 28 26 72 63 2c 20 70  leteTerms(&rc, p
17ea0 2c 20 61 70 56 61 6c 2c 20 61 53 7a 44 65 6c 29  , apVal, aSzDel)
17eb0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 71  ;.        fts3Sq
17ec0 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51  lExec(&rc, p, SQ
17ed0 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54  L_DELETE_CONTENT
17ee0 2c 20 61 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  , apVal);.      
17ef0 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63    if( p->bHasDoc
17f00 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  size ){.        
17f10 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72    fts3SqlExec(&r
17f20 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45  c, p, SQL_DELETE
17f30 5f 44 4f 43 53 49 5a 45 2c 20 61 70 56 61 6c 29  _DOCSIZE, apVal)
17f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17f50 20 20 20 20 6e 43 68 6e 67 2d 2d 3b 0a 20 20 20      nChng--;.   
17f60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
17f70 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  se if( sqlite3_v
17f80 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
17f90 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 21 3d  p->nColumn+2])!=
17fa0 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
17fb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17fc0 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65 74  aSzIns);.    ret
17fd0 75 72 6e 20 66 74 73 33 53 70 65 63 69 61 6c 49  urn fts3SpecialI
17fe0 6e 73 65 72 74 28 70 2c 20 61 70 56 61 6c 5b 70  nsert(p, apVal[p
17ff0 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 3b 0a 20  ->nColumn+2]);. 
18000 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68   }.  .  /* If th
18010 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20  is is an INSERT 
18020 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  or UPDATE operat
18030 69 6f 6e 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ion, insert the 
18040 6e 65 77 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20  new record. */. 
18050 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 72   if( nArg>1 && r
18060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18070 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73      rc = fts3Ins
18080 65 72 74 44 61 74 61 28 70 2c 20 61 70 56 61 6c  ertData(p, apVal
18090 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  , pRowid);.    i
180a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
180b0 20 26 26 20 28 21 69 73 52 65 6d 6f 76 65 20 7c   && (!isRemove |
180c0 7c 20 2a 70 52 6f 77 69 64 21 3d 69 52 65 6d 6f  | *pRowid!=iRemo
180d0 76 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ve) ){.      rc 
180e0 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
180f0 6d 73 44 6f 63 69 64 28 70 2c 20 2a 70 52 6f 77  msDocid(p, *pRow
18100 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
18110 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18120 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
18130 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70  ts3InsertTerms(p
18140 2c 20 61 70 56 61 6c 2c 20 61 53 7a 49 6e 73 29  , apVal, aSzIns)
18150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18160 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29  p->bHasDocsize )
18170 7b 0a 20 20 20 20 20 20 66 74 73 33 49 6e 73 65  {.      fts3Inse
18180 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20 70  rtDocsize(&rc, p
18190 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d  , aSzIns);.    }
181a0 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
181b0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73  }..  if( p->bHas
181c0 53 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73 33  Stat ){.    fts3
181d0 55 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28  UpdateDocTotals(
181e0 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20  &rc, p, aSzIns, 
181f0 61 53 7a 44 65 6c 2c 20 6e 43 68 6e 67 29 3b 0a  aSzDel, nChng);.
18200 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
18210 72 65 65 28 61 53 7a 49 6e 73 29 3b 0a 20 20 73  ree(aSzIns);.  s
18220 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e  qlite3Fts3Segmen
18230 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65  tsClose(p);.  re
18240 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
18250 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74  ** Flush any dat
18260 61 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67  a in the pending
18270 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  -terms hash tabl
18280 65 20 74 6f 20 64 69 73 6b 2e 20 49 66 20 73 75  e to disk. If su
18290 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6d 65 72  ccessful,.** mer
182a0 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  ge all segments 
182b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
182c0 28 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e  (including the n
182d0 65 77 20 73 65 67 6d 65 6e 74 2c 20 69 66 20 0a  ew segment, if .
182e0 2a 2a 20 74 68 65 72 65 20 77 61 73 20 61 6e 79  ** there was any
182f0 20 64 61 74 61 20 74 6f 20 66 6c 75 73 68 29 20   data to flush) 
18300 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 65  into a single se
18310 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69 6e 74 20 73  gment. .*/.int s
18320 71 6c 69 74 65 33 46 74 73 33 4f 70 74 69 6d 69  qlite3Fts3Optimi
18330 7a 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  ze(Fts3Table *p)
18340 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
18350 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
18360 70 2d 3e 64 62 2c 20 22 53 41 56 45 50 4f 49 4e  p->db, "SAVEPOIN
18370 54 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30  T fts3", 0, 0, 0
18380 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
183a0 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65   = fts3SegmentMe
183b0 72 67 65 28 70 2c 20 2d 31 29 3b 0a 20 20 20 20  rge(p, -1);.    
183c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
183d0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
183e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
183f0 64 62 2c 20 22 52 45 4c 45 41 53 45 20 66 74 73  db, "RELEASE fts
18400 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  3", 0, 0, 0);.  
18410 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18430 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
18440 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29  ingTermsClear(p)
18450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
18460 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
18470 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
18480 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66 74 73 33  ROLLBACK TO fts3
18490 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
184a0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
184b0 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20  p->db, "RELEASE 
184c0 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b  fts3", 0, 0, 0);
184d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
184e0 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
184f0 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74 75  Close(p);.  retu
18500 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
18510 0a                                               .