/ Hex Artifact Content
Login

Artifact 4b21a0c6f2772b261f14e3a2e80e1e3e849268b0:


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 74 79 70 65 64 65  tdlib.h>..typede
0340: 66 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e 67  f struct Pending
0350: 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73 74  List PendingList
0360: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0370: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65 67   SegmentNode Seg
0380: 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64 65  mentNode;.typede
0390: 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e 74  f struct Segment
03a0: 57 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57 72  Writer SegmentWr
03b0: 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 44 61 74  iter;../*.** Dat
03c0: 61 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  a structure used
03d0: 20 77 68 69 6c 65 20 61 63 63 75 6d 75 6c 61 74   while accumulat
03e0: 69 6e 67 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ing terms in the
03f0: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68   pending-terms h
0400: 61 73 68 0a 2a 2a 20 74 61 62 6c 65 2e 20 54 68  ash.** table. Th
0410: 65 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74  e hash table ent
0420: 72 79 20 6d 61 70 73 20 66 72 6f 6d 20 74 65 72  ry maps from ter
0430: 6d 20 28 61 20 73 74 72 69 6e 67 29 20 74 6f 20  m (a string) to 
0440: 61 20 6d 61 6c 6c 6f 63 27 64 0a 2a 2a 20 69 6e  a malloc'd.** in
0450: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
0460: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
0470: 75 63 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  uct PendingList 
0480: 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20  {.  int nData;. 
0490: 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20   char *aData;.  
04a0: 69 6e 74 20 6e 53 70 61 63 65 3b 0a 20 20 73 71  int nSpace;.  sq
04b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73  lite3_int64 iLas
04c0: 74 44 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74 65  tDocid;.  sqlite
04d0: 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 43 6f 6c  3_int64 iLastCol
04e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
04f0: 34 20 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a  4 iLastPos;.};..
0500: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0510: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
0520: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
0530: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
0540: 68 65 20 74 65 72 6d 73 20 6f 6e 0a 2a 2a 20 61  he terms on.** a
0550: 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 74 20   contiguous set 
0560: 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  of segment b-tre
0570: 65 20 6c 65 61 66 20 6e 6f 64 65 73 2e 20 41 6c  e leaf nodes. Al
0580: 74 68 6f 75 67 68 20 74 68 65 20 64 65 74 61 69  though the detai
0590: 6c 73 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74  ls of.** this st
05a0: 72 75 63 74 75 72 65 20 61 72 65 20 6f 6e 6c 79  ructure are only
05b0: 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
05c0: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
05d0: 65 2c 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65  e, opaque handle
05e0: 73 0a 2a 2a 20 6f 66 20 74 79 70 65 20 46 74 73  s.** of type Fts
05f0: 33 53 65 67 52 65 61 64 65 72 2a 20 61 72 65 20  3SegReader* are 
0600: 61 6c 73 6f 20 75 73 65 64 20 62 79 20 63 6f 64  also used by cod
0610: 65 20 69 6e 20 66 74 73 33 2e 63 20 74 6f 20 69  e in fts3.c to i
0620: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
0630: 2a 20 74 65 72 6d 73 20 77 68 65 6e 20 71 75 65  * terms when que
0640: 72 79 69 6e 67 20 74 68 65 20 66 75 6c 6c 2d 74  rying the full-t
0650: 65 78 74 20 69 6e 64 65 78 2e 20 53 65 65 20 66  ext index. See f
0660: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
0670: 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
0680: 52 65 61 64 65 72 4e 65 77 28 29 0a 2a 2a 20 20  ReaderNew().**  
0690: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
06a0: 65 61 64 65 72 46 72 65 65 28 29 0a 2a 2a 20 20  eaderFree().**  
06b0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
06c0: 65 61 64 65 72 49 74 65 72 61 74 65 28 29 0a 2a  eaderIterate().*
06d0: 2a 0a 2a 2a 20 4d 65 74 68 6f 64 73 20 75 73 65  *.** Methods use
06e0: 64 20 74 6f 20 6d 61 6e 69 70 75 6c 61 74 65 20  d to manipulate 
06f0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 73 74  Fts3SegReader st
0700: 72 75 63 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20  ructures:.**.** 
0710: 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e    fts3SegReaderN
0720: 65 78 74 28 29 0a 2a 2a 20 20 20 66 74 73 33 53  ext().**   fts3S
0730: 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f 63  egReaderFirstDoc
0740: 69 64 28 29 0a 2a 2a 20 20 20 66 74 73 33 53 65  id().**   fts3Se
0750: 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64  gReaderNextDocid
0760: 28 29 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  ().*/.struct Fts
0770: 33 53 65 67 52 65 61 64 65 72 20 7b 0a 20 20 69  3SegReader {.  i
0780: 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20  nt iIdx;        
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
07a0: 2a 20 49 6e 64 65 78 20 77 69 74 68 69 6e 20 6c  * Index within l
07b0: 65 76 65 6c 2c 20 6f 72 20 30 78 37 46 46 46 46  evel, or 0x7FFFF
07c0: 46 46 46 20 66 6f 72 20 50 54 20 2a 2f 0a 20 20  FFF for PT */.  
07d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53  sqlite3_int64 iS
07e0: 74 61 72 74 42 6c 6f 63 6b 3b 0a 20 20 73 71 6c  tartBlock;.  sql
07f0: 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42  ite3_int64 iEndB
0800: 6c 6f 63 6b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  lock;.  sqlite3_
0810: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0820: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 53          /* SQL S
0830: 74 61 74 65 6d 65 6e 74 20 74 6f 20 61 63 63 65  tatement to acce
0840: 73 73 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f  ss leaf nodes */
0850: 0a 20 20 63 68 61 72 20 2a 61 4e 6f 64 65 3b 20  .  char *aNode; 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
0880: 20 6e 6f 64 65 20 64 61 74 61 20 28 6f 72 20 4e   node data (or N
0890: 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ULL) */.  int nN
08a0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
08b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
08c0: 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 61  e of buffer at a
08d0: 4e 6f 64 65 20 28 6f 72 20 30 29 20 2a 2f 0a 20  Node (or 0) */. 
08e0: 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63 3b   int nTermAlloc;
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
0910: 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66 66  ze of zTerm buff
0920: 65 72 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68  er */.  Fts3Hash
0930: 45 6c 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65  Elem **ppNextEle
0940: 6d 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  m;..  /* Variabl
0950: 65 73 20 73 65 74 20 62 79 20 66 74 73 33 53 65  es set by fts3Se
0960: 67 52 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54  gReaderNext(). T
0970: 68 65 73 65 20 6d 61 79 20 62 65 20 72 65 61 64  hese may be read
0980: 20 64 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62   directly.  ** b
0990: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
09a0: 65 79 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f  ey are valid fro
09b0: 6d 20 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65  m the time Segme
09c0: 6e 74 52 65 61 64 65 72 4e 65 77 28 29 20 72 65  ntReaderNew() re
09d0: 74 75 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c  turns.  ** until
09e0: 20 53 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65   SegmentReaderNe
09f0: 78 74 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  xt() returns som
0a00: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
0a10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a  n SQLITE_OK.  **
0a20: 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f   (i.e. SQLITE_DO
0a30: 4e 45 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  NE)..  */.  int 
0a40: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0a60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
0a70: 6e 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  n current term *
0a80: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b  /.  char *zTerm;
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
0ab0: 6f 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  o current term *
0ac0: 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  /.  char *aDocli
0ad0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
0ae0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
0af0: 6f 20 64 6f 63 6c 69 73 74 20 6f 66 20 63 75 72  o doclist of cur
0b00: 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
0b10: 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20  int nDoclist;   
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
0b40: 73 74 20 69 6e 20 63 75 72 72 65 6e 74 20 65 6e  st in current en
0b50: 74 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  try */..  /* The
0b60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
0b70: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
0b80: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
0b90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
0ba0: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
0bb0: 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 73  pOffsetList;.  s
0bc0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
0bd0: 63 69 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  cid;.};..#define
0be0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
0bf0: 50 65 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d  Pending(p) ((p)-
0c00: 3e 70 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a  >ppNextElem!=0).
0c10: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
0c20: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
0c30: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
0c40: 63 72 65 61 74 65 20 61 20 73 65 67 6d 65 6e 74  create a segment
0c50: 20 62 2d 74 72 65 65 20 69 6e 20 74 68 65 0a 2a   b-tree in the.*
0c60: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
0c70: 69 6e 74 65 72 6e 61 6c 20 64 65 74 61 69 6c 73  internal details
0c80: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 61 72   of this type ar
0c90: 65 20 6f 6e 6c 79 20 61 63 63 65 73 73 65 64 20  e only accessed 
0ca0: 62 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  by the.** follow
0cb0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
0cc0: 2a 0a 2a 2a 20 20 20 66 74 73 33 53 65 67 57 72  *.**   fts3SegWr
0cd0: 69 74 65 72 41 64 64 28 29 0a 2a 2a 20 20 20 66  iterAdd().**   f
0ce0: 74 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73  ts3SegWriterFlus
0cf0: 68 28 29 0a 2a 2a 20 20 20 66 74 73 33 53 65 67  h().**   fts3Seg
0d00: 57 72 69 74 65 72 46 72 65 65 28 29 0a 2a 2f 0a  WriterFree().*/.
0d10: 73 74 72 75 63 74 20 53 65 67 6d 65 6e 74 57 72  struct SegmentWr
0d20: 69 74 65 72 20 7b 0a 20 20 53 65 67 6d 65 6e 74  iter {.  Segment
0d30: 4e 6f 64 65 20 2a 70 54 72 65 65 3b 20 20 20 20  Node *pTree;    
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
0d50: 74 65 72 20 74 6f 20 69 6e 74 65 72 69 6f 72 20  ter to interior 
0d60: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
0d70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
0d80: 34 20 69 46 69 72 73 74 3b 20 20 20 20 20 20 20  4 iFirst;       
0d90: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 73 6c 6f      /* First slo
0da0: 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20  t in %_segments 
0db0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c  written */.  sql
0dc0: 69 74 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65  ite3_int64 iFree
0dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0de0: 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69  Next free slot i
0df0: 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  n %_segments */.
0e00: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
0e30: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 62 75  previous term bu
0e40: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ffer */.  int nT
0e50: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
0e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0e70: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
0e80: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
0e90: 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  Malloc;         
0ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
0eb0: 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63 27 64 20 62  ze of malloc'd b
0ec0: 75 66 66 65 72 20 61 74 20 7a 4d 61 6c 6c 6f 63  uffer at zMalloc
0ed0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c   */.  char *zMal
0ee0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
0ef0: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27        /* Malloc'
0f00: 64 20 73 70 61 63 65 20 28 70 6f 73 73 69 62 6c  d space (possibl
0f10: 79 29 20 75 73 65 64 20 66 6f 72 20 7a 54 65 72  y) used for zTer
0f20: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 69 7a 65  m */.  int nSize
0f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0f40: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
0f50: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 20  f allocation at 
0f60: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  aData */.  int n
0f70: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
0f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
0f90: 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 61  tes of data in a
0fa0: 44 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Data */.  char *
0fb0: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
0fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0fd0: 6e 74 65 72 20 74 6f 20 62 6c 6f 63 6b 20 66 72  nter to block fr
0fe0: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d  om malloc() */.}
0ff0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53 65  ;../*.** Type Se
1000: 67 6d 65 6e 74 4e 6f 64 65 20 69 73 20 75 73 65  gmentNode is use
1010: 64 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d by the followi
1020: 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ng three functio
1030: 6e 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20  ns to create.** 
1040: 74 68 65 20 69 6e 74 65 72 69 6f 72 20 70 61 72  the interior par
1050: 74 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74  t of the segment
1060: 20 62 2b 2d 74 72 65 65 20 73 74 72 75 63 74 75   b+-tree structu
1070: 72 65 73 20 28 65 76 65 72 79 74 68 69 6e 67 20  res (everything 
1080: 65 78 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c 65  except.** the le
1090: 61 66 20 6e 6f 64 65 73 29 2e 20 54 68 65 73 65  af nodes). These
10a0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74   functions and t
10b0: 79 70 65 20 61 72 65 20 6f 6e 6c 79 20 65 76 65  ype are only eve
10c0: 72 20 75 73 65 64 20 62 79 20 63 6f 64 65 0a 2a  r used by code.*
10d0: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 66 74 73  * within the fts
10e0: 33 53 65 67 57 72 69 74 65 72 58 58 58 28 29 20  3SegWriterXXX() 
10f0: 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74 69  family of functi
1100: 6f 6e 73 20 64 65 73 63 72 69 62 65 64 20 61 62  ons described ab
1110: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73  ove..**.**   fts
1120: 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 29 0a 2a  3NodeAddTerm().*
1130: 2a 20 20 20 66 74 73 33 4e 6f 64 65 57 72 69 74  *   fts3NodeWrit
1140: 65 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64  e().**   fts3Nod
1150: 65 46 72 65 65 28 29 0a 2a 2f 0a 73 74 72 75 63  eFree().*/.struc
1160: 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 7b 0a  t SegmentNode {.
1170: 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
1180: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
1190: 20 20 2f 2a 20 50 61 72 65 6e 74 20 6e 6f 64 65    /* Parent node
11a0: 20 28 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 72 6f   (or NULL for ro
11b0: 6f 74 20 6e 6f 64 65 29 20 2a 2f 0a 20 20 53 65  ot node) */.  Se
11c0: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67 68  gmentNode *pRigh
11d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
11e0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 69 67 68   Pointer to righ
11f0: 74 2d 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 53  t-sibling */.  S
1200: 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 4c 65 66  egmentNode *pLef
1210: 74 6d 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f  tmost;         /
1220: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 65 66  * Pointer to lef
1230: 74 2d 6d 6f 73 74 20 6e 6f 64 65 20 6f 66 20 74  t-most node of t
1240: 68 69 73 20 64 65 70 74 68 20 2a 2f 0a 20 20 69  his depth */.  i
1250: 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1270: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1280: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6e 6f 64  s written to nod
1290: 65 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68  e so far */.  ch
12a0: 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 72 65 76   Pointer to prev
12d0: 69 6f 75 73 20 74 65 72 6d 20 62 75 66 66 65 72  ious term buffer
12e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1310: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72  of bytes in zTer
1320: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 6c 6c  m */.  int nMall
1330: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
1340: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1350: 66 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65  f malloc'd buffe
1360: 72 20 61 74 20 7a 4d 61 6c 6c 6f 63 20 2a 2f 0a  r at zMalloc */.
1370: 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b    char *zMalloc;
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 73 70    /* Malloc'd sp
13a0: 61 63 65 20 28 70 6f 73 73 69 62 6c 79 29 20 75  ace (possibly) u
13b0: 73 65 64 20 66 6f 72 20 7a 54 65 72 6d 20 2a 2f  sed for zTerm */
13c0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20  .  int nData;   
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 76     /* Bytes of v
13f0: 61 6c 69 64 20 64 61 74 61 20 73 6f 20 66 61 72  alid data so far
1400: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
1410: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1420: 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 64 61        /* Node da
1430: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
1440: 56 61 6c 69 64 20 76 61 6c 75 65 73 20 66 6f 72  Valid values for
1450: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1460: 6d 65 6e 74 20 74 6f 20 66 74 73 33 53 71 6c 53  ment to fts3SqlS
1470: 74 6d 74 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tmt()..*/.#defin
1480: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e  e SQL_DELETE_CON
1490: 54 45 4e 54 20 20 20 20 20 20 20 20 20 20 20 20  TENT            
14a0: 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 49   0.#define SQL_I
14b0: 53 5f 45 4d 50 54 59 20 20 20 20 20 20 20 20 20  S_EMPTY         
14c0: 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66            1.#def
14d0: 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41  ine SQL_DELETE_A
14e0: 4c 4c 5f 43 4f 4e 54 45 4e 54 20 20 20 20 20 20  LL_CONTENT      
14f0: 20 20 20 32 20 0a 23 64 65 66 69 6e 65 20 53 51     2 .#define SQ
1500: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47  L_DELETE_ALL_SEG
1510: 4d 45 4e 54 53 20 20 20 20 20 20 20 20 33 0a 23  MENTS        3.#
1520: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
1530: 45 5f 41 4c 4c 5f 53 45 47 44 49 52 20 20 20 20  E_ALL_SEGDIR    
1540: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
1550: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44  SQL_DELETE_ALL_D
1560: 4f 43 53 49 5a 45 20 20 20 20 20 20 20 20 20 35  OCSIZE         5
1570: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
1580: 45 54 45 5f 41 4c 4c 5f 53 54 41 54 20 20 20 20  ETE_ALL_STAT    
1590: 20 20 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e          6.#defin
15a0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e  e SQL_SELECT_CON
15b0: 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 20 20 20  TENT_BY_ROWID   
15c0: 20 37 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 4e   7.#define SQL_N
15d0: 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45  EXT_SEGMENT_INDE
15e0: 58 20 20 20 20 20 20 20 20 20 38 0a 23 64 65 66  X         8.#def
15f0: 69 6e 65 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53  ine SQL_INSERT_S
1600: 45 47 4d 45 4e 54 53 20 20 20 20 20 20 20 20 20  EGMENTS         
1610: 20 20 20 39 0a 23 64 65 66 69 6e 65 20 53 51 4c     9.#define SQL
1620: 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49  _NEXT_SEGMENTS_I
1630: 44 20 20 20 20 20 20 20 20 20 20 31 30 0a 23 64  D          10.#d
1640: 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53 45 52 54  efine SQL_INSERT
1650: 5f 53 45 47 44 49 52 20 20 20 20 20 20 20 20 20  _SEGDIR         
1660: 20 20 20 20 31 31 0a 23 64 65 66 69 6e 65 20 53      11.#define S
1670: 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 20  QL_SELECT_LEVEL 
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 32 0a               12.
1690: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
16a0: 43 54 5f 41 4c 4c 5f 4c 45 56 45 4c 20 20 20 20  CT_ALL_LEVEL    
16b0: 20 20 20 20 20 20 31 33 0a 23 64 65 66 69 6e 65        13.#define
16c0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
16d0: 4c 5f 43 4f 55 4e 54 20 20 20 20 20 20 20 20 31  L_COUNT        1
16e0: 34 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  4.#define SQL_SE
16f0: 4c 45 43 54 5f 53 45 47 44 49 52 5f 43 4f 55 4e  LECT_SEGDIR_COUN
1700: 54 5f 4d 41 58 20 20 20 31 35 0a 23 64 65 66 69  T_MAX   15.#defi
1710: 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  ne SQL_DELETE_SE
1720: 47 44 49 52 5f 42 59 5f 4c 45 56 45 4c 20 20 20  GDIR_BY_LEVEL   
1730: 20 31 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   16.#define SQL_
1740: 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f  DELETE_SEGMENTS_
1750: 52 41 4e 47 45 20 20 20 20 20 31 37 0a 23 64 65  RANGE     17.#de
1760: 66 69 6e 65 20 53 51 4c 5f 43 4f 4e 54 45 4e 54  fine SQL_CONTENT
1770: 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20  _INSERT         
1780: 20 20 20 31 38 0a 23 64 65 66 69 6e 65 20 53 51     18.#define SQ
1790: 4c 5f 47 45 54 5f 42 4c 4f 43 4b 20 20 20 20 20  L_GET_BLOCK     
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 31 39 0a 23              19.#
17b0: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
17c0: 45 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  E_DOCSIZE       
17d0: 20 20 20 20 20 32 30 0a 23 64 65 66 69 6e 65 20       20.#define 
17e0: 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
17f0: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 32 31  IZE           21
1800: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c  .#define SQL_SEL
1810: 45 43 54 5f 44 4f 43 53 49 5a 45 20 20 20 20 20  ECT_DOCSIZE     
1820: 20 20 20 20 20 20 20 32 32 0a 23 64 65 66 69 6e         22.#defin
1830: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43  e SQL_SELECT_DOC
1840: 54 4f 54 41 4c 20 20 20 20 20 20 20 20 20 20 20  TOTAL           
1850: 32 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52  23.#define SQL_R
1860: 45 50 4c 41 43 45 5f 44 4f 43 54 4f 54 41 4c 20  EPLACE_DOCTOTAL 
1870: 20 20 20 20 20 20 20 20 20 32 34 0a 0a 2f 2a 0a           24../*.
1880: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1890: 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61   is used to obta
18a0: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70 72 65  in an SQLite pre
18b0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
18c0: 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  handle.** for th
18d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64 65 6e  e statement iden
18e0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 65  tified by the se
18f0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49  cond argument. I
1900: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
1910: 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 74   *pp is set to t
1920: 68 65 20 72 65 71 75 65 73 74 65 64 20 73 74 61  he requested sta
1930: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e  tement handle an
1940: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1950: 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
1960: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
1970: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1980: 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
1990: 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
19a0: 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70 56 61  If argument apVa
19b0: 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  l is not NULL, t
19c0: 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f 69 6e  hen it must poin
19d0: 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 77 69  t to an array wi
19e0: 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 61  th.** at least a
19f0: 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 20 61  s many entries a
1a00: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
1a10: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 6f  statement has bo
1a20: 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  und .** paramete
1a30: 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73 20 61  rs. The values a
1a40: 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  re bound to the 
1a50: 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72 61 6d  statements param
1a60: 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a 2a 20  eters before.** 
1a70: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
1a80: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 71 6c  atic int fts3Sql
1a90: 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61 62 6c  Stmt(.  Fts3Tabl
1aa0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ab0: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
1ac0: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
1ad0: 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c 20  */.  int eStmt, 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
1b00: 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e 73 74  he SQL_XXX const
1b10: 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a 20 20  ants above */.  
1b20: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
1b30: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1b40: 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e  /* OUT: Statemen
1b50: 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  t handle */.  sq
1b60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1b70: 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
1b80: 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e 64 20   Values to bind 
1b90: 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  to statement */.
1ba0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1bb0: 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f 2a 20  *azSql[] = {./* 
1bc0: 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  0  */  "DELETE F
1bd0: 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  ROM %Q.'%q_conte
1be0: 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69 64 20  nt' WHERE rowid 
1bf0: 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f 20 20  = ?",./* 1  */  
1c00: 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58 49 53  "SELECT NOT EXIS
1c10: 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69 64 20  TS(SELECT docid 
1c20: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74  FROM %Q.'%q_cont
1c30: 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69 64  ent' WHERE rowid
1c40: 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a 2f 20  !=?)",./* 2  */ 
1c50: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
1c60: 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22 2c 0a  .'%q_content'",.
1c70: 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c 45 54  /* 3  */  "DELET
1c80: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  E FROM %Q.'%q_se
1c90: 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34 20 20  gments'",./* 4  
1ca0: 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  */  "DELETE FROM
1cb0: 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22   %Q.'%q_segdir'"
1cc0: 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44 45 4c  ,./* 5  */  "DEL
1cd0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
1ce0: 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20 36 20  docsize'",./* 6 
1cf0: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
1d00: 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27 22 2c  M %Q.'%q_stat'",
1d10: 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45 4c 45  ./* 7  */  "SELE
1d20: 43 54 20 2a 20 46 52 4f 4d 20 25 51 2e 27 25 71  CT * FROM %Q.'%q
1d30: 5f 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20  _content' WHERE 
1d40: 72 6f 77 69 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20  rowid=?",./* 8  
1d50: 2a 2f 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c  */  "SELECT (SEL
1d60: 45 43 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f  ECT max(idx) FRO
1d70: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
1d80: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
1d90: 29 20 2b 20 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f  ) + 1",./* 9  */
1da0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
1db0: 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 28  Q.'%q_segments'(
1dc0: 62 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20  blockid, block) 
1dd0: 56 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f  VALUES(?, ?)",./
1de0: 2a 20 31 30 20 2a 2f 20 20 22 53 45 4c 45 43 54  * 10 */  "SELECT
1df0: 20 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43   coalesce((SELEC
1e00: 54 20 6d 61 78 28 62 6c 6f 63 6b 69 64 29 20 46  T max(blockid) F
1e10: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65  ROM %Q.'%q_segme
1e20: 6e 74 73 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a  nts') + 1, 1)",.
1e30: 2f 2a 20 31 31 20 2a 2f 20 20 22 49 4e 53 45 52  /* 11 */  "INSER
1e40: 54 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65  T INTO %Q.'%q_se
1e50: 67 64 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f  gdir' VALUES(?,?
1e60: 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20  ,?,?,?,?)",..   
1e70: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e80: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64   segments in ord
1e90: 65 72 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  er from oldest t
1ea0: 6f 20 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20  o newest.*/ ./* 
1eb0: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69  12 */  "SELECT i
1ec0: 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c  dx, start_block,
1ed0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
1ee0: 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f  k, end_block, ro
1ef0: 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ot ".           
1f00: 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65   "FROM %Q.'%q_se
1f10: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
1f20: 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69  l = ? ORDER BY i
1f30: 64 78 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a  dx ASC",./* 13 *
1f40: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
1f50: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
1f60: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
1f70: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
1f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
1f90: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
1fa0: 27 20 4f 52 44 45 52 20 42 59 20 6c 65 76 65 6c  ' ORDER BY level
1fb0: 20 44 45 53 43 2c 20 69 64 78 20 41 53 43 22 2c   DESC, idx ASC",
1fc0: 0a 0a 2f 2a 20 31 34 20 2a 2f 20 20 22 53 45 4c  ../* 14 */  "SEL
1fd0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1fe0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
1ff0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
2000: 22 2c 0a 2f 2a 20 31 35 20 2a 2f 20 20 22 53 45  ",./* 15 */  "SE
2010: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  LECT count(*), m
2020: 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25  ax(level) FROM %
2030: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c 0a  Q.'%q_segdir'",.
2040: 0a 2f 2a 20 31 36 20 2a 2f 20 20 22 44 45 4c 45  ./* 16 */  "DELE
2050: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  TE FROM %Q.'%q_s
2060: 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76  egdir' WHERE lev
2070: 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31 37 20 2a  el = ?",./* 17 *
2080: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /  "DELETE FROM 
2090: 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  %Q.'%q_segments'
20a0: 20 57 48 45 52 45 20 62 6c 6f 63 6b 69 64 20 42   WHERE blockid B
20b0: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22 2c  ETWEEN ? AND ?",
20c0: 0a 2f 2a 20 31 38 20 2a 2f 20 20 22 49 4e 53 45  ./* 18 */  "INSE
20d0: 52 54 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 63  RT INTO %Q.'%q_c
20e0: 6f 6e 74 65 6e 74 27 20 56 41 4c 55 45 53 28 25  ontent' VALUES(%
20f0: 7a 29 22 2c 0a 2f 2a 20 31 39 20 2a 2f 20 20 22  z)",./* 19 */  "
2100: 53 45 4c 45 43 54 20 62 6c 6f 63 6b 20 46 52 4f  SELECT block FRO
2110: 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74  M %Q.'%q_segment
2120: 73 27 20 57 48 45 52 45 20 62 6c 6f 63 6b 69 64  s' WHERE blockid
2130: 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20 2a 2f 20   = ?",./* 20 */ 
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 20 57 48  .'%q_docsize' WH
2160: 45 52 45 20 64 6f 63 69 64 20 3d 20 3f 22 2c 0a  ERE docid = ?",.
2170: 2f 2a 20 32 31 20 2a 2f 20 20 22 52 45 50 4c 41  /* 21 */  "REPLA
2180: 43 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 64  CE INTO %Q.'%q_d
2190: 6f 63 73 69 7a 65 27 20 56 41 4c 55 45 53 28 3f  ocsize' VALUES(?
21a0: 2c 3f 29 22 2c 0a 2f 2a 20 32 32 20 2a 2f 20 20  ,?)",./* 22 */  
21b0: 22 53 45 4c 45 43 54 20 73 69 7a 65 20 46 52 4f  "SELECT size FRO
21c0: 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  M %Q.'%q_docsize
21d0: 27 20 57 48 45 52 45 20 64 6f 63 69 64 3d 3f 22  ' WHERE docid=?"
21e0: 2c 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 53 45 4c  ,./* 23 */  "SEL
21f0: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 25  ECT value FROM %
2200: 51 2e 27 25 71 5f 73 74 61 74 27 20 57 48 45 52  Q.'%q_stat' WHER
2210: 45 20 69 64 3d 30 22 2c 0a 2f 2a 20 32 34 20 2a  E id=0",./* 24 *
2220: 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f  /  "REPLACE INTO
2230: 20 25 51 2e 27 25 71 5f 73 74 61 74 27 20 56 41   %Q.'%q_stat' VA
2240: 4c 55 45 53 28 30 2c 3f 29 22 2c 0a 20 20 7d 3b  LUES(0,?)",.  };
2250: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2260: 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
2270: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
2280: 20 61 73 73 65 72 74 28 20 53 69 7a 65 6f 66 41   assert( SizeofA
2290: 72 72 61 79 28 61 7a 53 71 6c 29 3d 3d 53 69 7a  rray(azSql)==Siz
22a0: 65 6f 66 41 72 72 61 79 28 70 2d 3e 61 53 74 6d  eofArray(p->aStm
22b0: 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
22c0: 65 53 74 6d 74 3c 53 69 7a 65 6f 66 41 72 72 61  eStmt<SizeofArra
22d0: 79 28 61 7a 53 71 6c 29 20 26 26 20 65 53 74 6d  y(azSql) && eStm
22e0: 74 3e 3d 30 20 29 3b 0a 20 20 0a 20 20 70 53 74  t>=0 );.  .  pSt
22f0: 6d 74 20 3d 20 70 2d 3e 61 53 74 6d 74 5b 65 53  mt = p->aStmt[eS
2300: 74 6d 74 5d 3b 0a 20 20 69 66 28 20 21 70 53 74  tmt];.  if( !pSt
2310: 6d 74 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  mt ){.    char *
2320: 7a 53 71 6c 3b 0a 20 20 20 20 69 66 28 20 65 53  zSql;.    if( eS
2330: 74 6d 74 3d 3d 53 51 4c 5f 43 4f 4e 54 45 4e 54  tmt==SQL_CONTENT
2340: 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 20  _INSERT ){.     
2350: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2370: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2380: 65 20 2a 2f 20 20 0a 20 20 20 20 20 20 63 68 61  e */  .      cha
2390: 72 20 2a 7a 56 61 72 6c 69 73 74 3b 20 20 20 20  r *zVarlist;    
23a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23b0: 22 3f 2c 20 3f 2c 20 2e 2e 2e 22 20 73 74 72 69  "?, ?, ..." stri
23c0: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 7a 56 61 72  ng */.      zVar
23d0: 6c 69 73 74 20 3d 20 28 63 68 61 72 20 2a 29 73  list = (char *)s
23e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 32 2a  qlite3_malloc(2*
23f0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 29 3b 0a 20  p->nColumn+2);. 
2400: 20 20 20 20 20 69 66 28 20 21 7a 56 61 72 6c 69       if( !zVarli
2410: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  st ){.        *p
2420: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  p = 0;.        r
2430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2440: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2450: 20 20 7a 56 61 72 6c 69 73 74 5b 30 5d 20 3d 20    zVarlist[0] = 
2460: 27 3f 27 3b 0a 20 20 20 20 20 20 7a 56 61 72 6c  '?';.      zVarl
2470: 69 73 74 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2a 32  ist[p->nColumn*2
2480: 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
2490: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d    for(i=1; i<=p-
24a0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
24b0: 20 20 20 20 20 20 20 20 7a 56 61 72 6c 69 73 74          zVarlist
24c0: 5b 69 2a 32 2d 31 5d 20 3d 20 27 2c 27 3b 0a 20  [i*2-1] = ',';. 
24d0: 20 20 20 20 20 20 20 7a 56 61 72 6c 69 73 74 5b         zVarlist[
24e0: 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  i*2] = '?';.    
24f0: 20 20 7d 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d    }.      zSql =
2500: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2510: 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70  (azSql[eStmt], p
2520: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  ->zDb, p->zName,
2530: 20 7a 56 61 72 6c 69 73 74 29 3b 0a 20 20 20 20   zVarlist);.    
2540: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71  }else{.      zSq
2550: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2560: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d  ntf(azSql[eStmt]
2570: 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61  , p->zDb, p->zNa
2580: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  me);.    }.    i
2590: 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
25a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
25b0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
25c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25d0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
25e0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
25f0: 70 53 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20  pStmt, NULL);.  
2600: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2610: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 61 73  (zSql);.      as
2620: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2630: 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 20  _OK || pStmt==0 
2640: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 53 74 6d  );.      p->aStm
2650: 74 5b 65 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74  t[eStmt] = pStmt
2660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2670: 28 20 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 69  ( apVal ){.    i
2680: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 50  nt i;.    int nP
2690: 61 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 62  aram = sqlite3_b
26a0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
26b0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
26c0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
26d0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 50 61 72  ITE_OK && i<nPar
26e0: 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  am; i++){.      
26f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
2700: 64 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69  d_value(pStmt, i
2710: 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b 0a 20  +1, apVal[i]);. 
2720: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 20 3d     }.  }.  *pp =
2730: 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e   pStmt;.  return
2740: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69   rc;.}../*.** Si
2750: 6d 69 6c 61 72 20 74 6f 20 66 74 73 33 53 71 6c  milar to fts3Sql
2760: 53 74 6d 74 28 29 2e 20 45 78 63 65 70 74 2c 20  Stmt(). Except, 
2770: 61 66 74 65 72 20 62 69 6e 64 69 6e 67 20 74 68  after binding th
2780: 65 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 0a  e parameters in.
2790: 2a 2a 20 61 72 72 61 79 20 61 70 56 61 6c 5b 5d  ** array apVal[]
27a0: 20 74 6f 20 74 68 65 20 53 51 4c 20 73 74 61 74   to the SQL stat
27b0: 65 6d 65 6e 74 20 69 64 65 6e 74 69 66 69 65 64  ement identified
27c0: 20 62 79 20 65 53 74 6d 74 2c 20 74 68 65 20 73   by eStmt, the s
27d0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65  tatement.** is e
27e0: 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  xecuted..**.** R
27f0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2800: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
2810: 74 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  t is successfull
2820: 79 20 65 78 65 63 75 74 65 64 2c 20 6f 72 20 61  y executed, or a
2830: 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  n.** SQLite erro
2840: 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
2850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2860: 20 66 74 73 33 53 71 6c 45 78 65 63 28 0a 20 20   fts3SqlExec(.  
2870: 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20  int *pRC,       
2880: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2890: 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  lt code */.  Fts
28a0: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
28b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53        /* The FTS
28c0: 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  3 table */.  int
28d0: 20 65 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20   eStmt,         
28e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
28f0: 66 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  f statement to e
2900: 76 61 6c 75 61 74 65 20 2a 2f 0a 20 20 73 71 6c  valuate */.  sql
2910: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
2920: 61 6c 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74  al    /* Paramet
2930: 65 72 73 20 74 6f 20 62 69 6e 64 20 2a 2f 0a 29  ers to bind */.)
2940: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
2950: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
2960: 63 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  c;.  if( *pRC ) 
2970: 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66  return;.  rc = f
2980: 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 65 53  ts3SqlStmt(p, eS
2990: 74 6d 74 2c 20 26 70 53 74 6d 74 2c 20 61 70 56  tmt, &pStmt, apV
29a0: 61 6c 29 3b 20 0a 20 20 69 66 28 20 72 63 3d 3d  al); .  if( rc==
29b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29c0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
29d0: 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tmt);.    rc = s
29e0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
29f0: 6d 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20  mt);.  }.  *pRC 
2a00: 3d 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  = rc;.}.../*.** 
2a10: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 62 6c  Read a single bl
2a20: 6f 63 6b 20 66 72 6f 6d 20 74 68 65 20 25 5f 73  ock from the %_s
2a30: 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20 49  egments table. I
2a40: 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
2a50: 62 6c 6f 63 6b 0a 2a 2a 20 64 6f 65 73 20 6e 6f  block.** does no
2a60: 74 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20  t exist, return 
2a70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
2a80: 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  If some other er
2a90: 72 6f 72 20 28 6d 61 6c 6c 6f 63 2c 20 49 4f 20  ror (malloc, IO 
2aa0: 0a 2a 2a 20 65 74 63 2e 29 20 6f 63 63 75 72 73  .** etc.) occurs
2ab0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  , return the app
2ac0: 72 6f 70 72 69 61 74 65 20 53 51 4c 69 74 65 20  ropriate SQLite 
2ad0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
2ae0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
2af0: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
2b00: 2a 70 7a 42 6c 6f 63 6b 20 74 6f 20 70 6f 69 6e  *pzBlock to poin
2b10: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
2b20: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
2b30: 62 6c 6f 63 6b 20 72 65 61 64 20 66 72 6f 6d 20  block read from 
2b40: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
2b50: 64 20 2a 70 6e 42 6c 6f 63 6b 20 74 6f 20 74 68  d *pnBlock to th
2b60: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
2b70: 61 64 0a 2a 2a 20 62 6c 6f 63 6b 20 69 6e 20 62  ad.** block in b
2b80: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  ytes..**.** WARN
2b90: 49 4e 47 3a 20 54 68 65 20 72 65 74 75 72 6e 65  ING: The returne
2ba0: 64 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  d buffer is only
2bb0: 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
2bc0: 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 0a 2a   next call to .*
2bd0: 2a 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  * sqlite3Fts3Rea
2be0: 64 42 6c 6f 63 6b 28 29 2e 0a 2a 2f 0a 69 6e 74  dBlock()..*/.int
2bf0: 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
2c00: 42 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54 61 62  Block(.  Fts3Tab
2c10: 6c 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  le *p,.  sqlite3
2c20: 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 0a 20  _int64 iBlock,. 
2c30: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
2c40: 42 6c 6f 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 6e  Block,.  int *pn
2c50: 42 6c 6f 63 6b 0a 29 7b 0a 20 20 73 71 6c 69 74  Block.){.  sqlit
2c60: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
2c70: 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53    int rc = fts3S
2c80: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 47 45  qlStmt(p, SQL_GE
2c90: 54 5f 42 4c 4f 43 4b 2c 20 26 70 53 74 6d 74 2c  T_BLOCK, &pStmt,
2ca0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
2cb0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2cc0: 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  n rc;.  sqlite3_
2cd0: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20  reset(pStmt);.. 
2ce0: 20 69 66 28 20 70 7a 42 6c 6f 63 6b 20 29 7b 0a   if( pzBlock ){.
2cf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
2d00: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
2d10: 20 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   iBlock);.    rc
2d20: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
2d30: 70 53 74 6d 74 29 3b 20 0a 20 20 20 20 69 66 28  pStmt); .    if(
2d40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
2d50: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2d60: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
2d70: 20 3f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   ? SQLITE_CORRUP
2d80: 54 20 3a 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  T : rc);.    }. 
2d90: 20 0a 20 20 20 20 2a 70 6e 42 6c 6f 63 6b 20 3d   .    *pnBlock =
2da0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2db0: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b  bytes(pStmt, 0);
2dc0: 0a 20 20 20 20 2a 70 7a 42 6c 6f 63 6b 20 3d 20  .    *pzBlock = 
2dd0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2de0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
2df0: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  t, 0);.    if( s
2e00: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
2e10: 70 65 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51  pe(pStmt, 0)!=SQ
2e20: 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
2e30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e40: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a  _CORRUPT;.    }.
2e50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2e60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2e70: 20 53 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20   Set *ppStmt to 
2e80: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
2e90: 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  le that may be u
2ea0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
2eb0: 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f  hrough.** all ro
2ec0: 77 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64  ws in the %_segd
2ed0: 69 72 20 74 61 62 6c 65 2c 20 66 72 6f 6d 20 6f  ir table, from o
2ee0: 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e  ldest to newest.
2ef0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
2f00: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
2f10: 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  _OK. If an error
2f20: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 72   occurs while pr
2f30: 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
2f40: 65 6d 65 6e 74 2c 20 0a 2a 2a 20 72 65 74 75 72  ement, .** retur
2f50: 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
2f60: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
2f70: 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ere is only ever
2f80: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
2f90: 20 74 68 69 73 20 53 51 4c 20 73 74 61 74 65 6d   this SQL statem
2fa0: 65 6e 74 20 63 6f 6d 70 69 6c 65 64 20 66 6f 72  ent compiled for
2fb0: 0a 2a 2a 20 65 61 63 68 20 46 54 53 33 20 74 61  .** each FTS3 ta
2fc0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ble..**.** The s
2fd0: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
2fe0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2ff0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
3000: 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 3a 0a  %_segdir table:.
3010: 2a 2a 0a 2a 2a 20 20 20 30 3a 20 69 64 78 0a 2a  **.**   0: idx.*
3020: 2a 20 20 20 31 3a 20 73 74 61 72 74 5f 62 6c 6f  *   1: start_blo
3030: 63 6b 0a 2a 2a 20 20 20 32 3a 20 6c 65 61 76 65  ck.**   2: leave
3040: 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20  s_end_block.**  
3050: 20 33 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a   3: end_block.**
3060: 20 20 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e     4: root.*/.in
3070: 74 20 73 71 6c 69 74 65 33 46 74 73 33 41 6c 6c  t sqlite3Fts3All
3080: 53 65 67 64 69 72 73 28 46 74 73 33 54 61 62 6c  Segdirs(Fts3Tabl
3090: 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74  e *p, sqlite3_st
30a0: 6d 74 20 2a 2a 70 70 53 74 6d 74 29 7b 0a 20 20  mt **ppStmt){.  
30b0: 72 65 74 75 72 6e 20 66 74 73 33 53 71 6c 53 74  return fts3SqlSt
30c0: 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
30d0: 5f 41 4c 4c 5f 4c 45 56 45 4c 2c 20 70 70 53 74  _ALL_LEVEL, ppSt
30e0: 6d 74 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  mt, 0);.}.../*.*
30f0: 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c  * Append a singl
3100: 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20 50 65  e varint to a Pe
3110: 6e 64 69 6e 67 4c 69 73 74 20 62 75 66 66 65 72  ndingList buffer
3120: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
3130: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20 73 75  eturned.** if su
3140: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
3150: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
3160: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
3170: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3180: 20 61 6c 73 6f 20 73 65 72 76 65 73 20 74 6f 20   also serves to 
3190: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 65 6e  allocate the Pen
31a0: 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75  dingList structu
31b0: 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 46 6f  re itself..** Fo
31c0: 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 63 72  r example, to cr
31d0: 65 61 74 65 20 61 20 6e 65 77 20 50 65 6e 64 69  eate a new Pendi
31e0: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65  ngList structure
31f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 77 6f 0a   containing two.
3200: 2a 2a 20 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a  ** varints:.**.*
3210: 2a 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  *   PendingList 
3220: 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20 20 66 74 73  *p = 0;.**   fts
3230: 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
3240: 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29 3b  ndVarint(&p, 1);
3250: 0a 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e  .**   fts3Pendin
3260: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
3270: 74 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73 74 61  t(&p, 2);.*/.sta
3280: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
3290: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
32a0: 69 6e 74 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69  int(.  PendingLi
32b0: 73 74 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  st **pp,        
32c0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
32d0: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 50 65 6e  : Pointer to Pen
32e0: 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 20  dingList struct 
32f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
3300: 36 34 20 69 20 20 20 20 20 20 20 20 20 20 20 20  64 i            
3310: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
3320: 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
3330: 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c  */.){.  PendingL
3340: 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 0a 20  ist *p = *pp;.. 
3350: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20   /* Allocate or 
3360: 67 72 6f 77 20 74 68 65 20 50 65 6e 64 69 6e 67  grow the Pending
3370: 4c 69 73 74 20 61 73 20 72 65 71 75 69 72 65 64  List as required
3380: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 20 29 7b  . */.  if( !p ){
3390: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
33a0: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
33b0: 70 29 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69  p) + 100);.    i
33c0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 72  f( !p ){.      r
33d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33e0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  EM;.    }.    p-
33f0: 3e 6e 53 70 61 63 65 20 3d 20 31 30 30 3b 0a 20  >nSpace = 100;. 
3400: 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63     p->aData = (c
3410: 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  har *)&p[1];.   
3420: 20 70 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20   p->nData = 0;. 
3430: 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70 2d   }.  else if( p-
3440: 3e 6e 44 61 74 61 2b 46 54 53 33 5f 56 41 52 49  >nData+FTS3_VARI
3450: 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53 70 61  NT_MAX+1>p->nSpa
3460: 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e  ce ){.    int nN
3470: 65 77 20 3d 20 70 2d 3e 6e 53 70 61 63 65 20 2a  ew = p->nSpace *
3480: 20 32 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   2;.    p = sqli
3490: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 73  te3_realloc(p, s
34a0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e 4e 65 77  izeof(*p) + nNew
34b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b  );.    if( !p ){
34c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
34d0: 72 65 65 28 2a 70 70 29 3b 0a 20 20 20 20 20 20  ree(*pp);.      
34e0: 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  *pp = 0;.      r
34f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3500: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  EM;.    }.    p-
3510: 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65 77 3b 0a  >nSpace = nNew;.
3520: 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28      p->aData = (
3530: 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20  char *)&p[1];.  
3540: 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
3550: 68 65 20 6e 65 77 20 73 65 72 69 61 6c 69 7a 65  he new serialize
3560: 64 20 76 61 72 69 6e 74 20 74 6f 20 74 68 65 20  d varint to the 
3570: 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 2e  end of the list.
3580: 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74 61 20 2b   */.  p->nData +
3590: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
35a0: 56 61 72 69 6e 74 28 26 70 2d 3e 61 44 61 74 61  Varint(&p->aData
35b0: 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20 69 29 3b 0a  [p->nData], i);.
35c0: 20 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44    p->aData[p->nD
35d0: 61 74 61 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 2a  ata] = '\0';.  *
35e0: 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e  pp = p;.  return
35f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3600: 2a 0a 2a 2a 20 41 64 64 20 61 20 64 6f 63 69 64  *.** Add a docid
3610: 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69 6f 6e  /column/position
3620: 20 65 6e 74 72 79 20 74 6f 20 61 20 50 65 6e 64   entry to a Pend
3630: 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72  ingList structur
3640: 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  e. Non-zero.** i
3650: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
3660: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
3670: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 65 64  qlite3_realloced
3680: 20 61 73 20 70 61 72 74 20 6f 66 20 61 64 64 69   as part of addi
3690: 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 2e  ng.** the entry.
36a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f   Otherwise, zero
36b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
36c0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
36d0: 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53  *pRc is set to S
36e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f  QLITE_NOMEM befo
36f0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
3700: 20 5a 65 72 6f 20 69 73 20 61 6c 77 61 79 73 20   Zero is always 
3710: 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73  returned in this
3720: 20 63 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65   case. Otherwise
3730: 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20 65 72 72 6f  , if no OOM erro
3740: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  r occurs,.** it 
3750: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
3760: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
3770: 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  nt fts3PendingLi
3780: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 65 6e 64  stAppend(.  Pend
3790: 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20  ingList **pp,   
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
37b0: 4e 2f 4f 55 54 3a 20 50 65 6e 64 69 6e 67 4c 69  N/OUT: PendingLi
37c0: 73 74 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  st structure */.
37d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
37e0: 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20  iDocid,         
37f0: 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20 65    /* Docid for e
3800: 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20  ntry to add */. 
3810: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
3820: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
3830: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 65   /* Column for e
3840: 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20  ntry to add */. 
3850: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
3860: 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Pos,            
3870: 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   /* Position of 
3880: 74 65 72 6d 20 66 6f 72 20 65 6e 74 72 79 20 74  term for entry t
3890: 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  o add */.  int *
38a0: 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
38b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
38c0: 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  T: Return code *
38d0: 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69  /.){.  PendingLi
38e0: 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69  st *p = *pp;.  i
38f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
3900: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
3910: 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69   || p->iLastDoci
3920: 64 3c 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20  d<=iDocid );..  
3930: 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61  if( !p || p->iLa
3940: 73 74 44 6f 63 69 64 21 3d 69 44 6f 63 69 64 20  stDocid!=iDocid 
3950: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
3960: 6e 74 36 34 20 69 44 65 6c 74 61 20 3d 20 69 44  nt64 iDelta = iD
3970: 6f 63 69 64 20 2d 20 28 70 20 3f 20 70 2d 3e 69  ocid - (p ? p->i
3980: 4c 61 73 74 44 6f 63 69 64 20 3a 20 30 29 3b 0a  LastDocid : 0);.
3990: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
39a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 44     assert( p->nD
39b0: 61 74 61 3c 70 2d 3e 6e 53 70 61 63 65 20 29 3b  ata<p->nSpace );
39c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
39d0: 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61  ->aData[p->nData
39e0: 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d  ]==0 );.      p-
39f0: 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20 20 20 7d 0a  >nData++;.    }.
3a00: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
3a10: 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e  K!=(rc = fts3Pen
3a20: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
3a30: 72 69 6e 74 28 26 70 2c 20 69 44 65 6c 74 61 29  rint(&p, iDelta)
3a40: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
3a50: 70 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e  pendinglistappen
3a60: 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  d_out;.    }.   
3a70: 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 2d   p->iLastCol = -
3a80: 31 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50  1;.    p->iLastP
3a90: 6f 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 69  os = 0;.    p->i
3aa0: 4c 61 73 74 44 6f 63 69 64 20 3d 20 69 44 6f 63  LastDocid = iDoc
3ab0: 69 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  id;.  }.  if( iC
3ac0: 6f 6c 3e 30 20 26 26 20 70 2d 3e 69 4c 61 73 74  ol>0 && p->iLast
3ad0: 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20 20 20  Col!=iCol ){.   
3ae0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
3af0: 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e  (rc = fts3Pendin
3b00: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
3b10: 74 28 26 70 2c 20 31 29 29 0a 20 20 20 20 20 7c  t(&p, 1)).     |
3b20: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
3b30: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69   = fts3PendingLi
3b40: 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  stAppendVarint(&
3b50: 70 2c 20 69 43 6f 6c 29 29 0a 20 20 20 20 29 7b  p, iCol)).    ){
3b60: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65 6e 64  .      goto pend
3b70: 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75  inglistappend_ou
3b80: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  t;.    }.    p->
3b90: 69 4c 61 73 74 43 6f 6c 20 3d 20 69 43 6f 6c 3b  iLastCol = iCol;
3ba0: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73  .    p->iLastPos
3bb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
3bc0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 61  iCol>=0 ){.    a
3bd0: 73 73 65 72 74 28 20 69 50 6f 73 3e 70 2d 3e 69  ssert( iPos>p->i
3be0: 4c 61 73 74 50 6f 73 20 7c 7c 20 28 69 50 6f 73  LastPos || (iPos
3bf0: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 50  ==0 && p->iLastP
3c00: 6f 73 3d 3d 30 29 20 29 3b 0a 20 20 20 20 72 63  os==0) );.    rc
3c10: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69   = fts3PendingLi
3c20: 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  stAppendVarint(&
3c30: 70 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e 69 4c 61  p, 2+iPos-p->iLa
3c40: 73 74 50 6f 73 29 3b 0a 20 20 20 20 69 66 28 20  stPos);.    if( 
3c50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3c60: 0a 20 20 20 20 20 20 70 2d 3e 69 4c 61 73 74 50  .      p->iLastP
3c70: 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20 20 20 7d  os = iPos;.    }
3c80: 0a 20 20 7d 0a 0a 20 70 65 6e 64 69 6e 67 6c 69  .  }.. pendingli
3c90: 73 74 61 70 70 65 6e 64 5f 6f 75 74 3a 0a 20 20  stappend_out:.  
3ca0: 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 69 66 28  *pRc = rc;.  if(
3cb0: 20 70 21 3d 2a 70 70 20 29 7b 0a 20 20 20 20 2a   p!=*pp ){.    *
3cc0: 70 70 20 3d 20 70 3b 0a 20 20 20 20 72 65 74 75  pp = p;.    retu
3cd0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
3ce0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
3cf0: 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d  okenize the nul-
3d00: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
3d10: 67 20 7a 54 65 78 74 20 61 6e 64 20 61 64 64 20  g zText and add 
3d20: 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68  all tokens to th
3d30: 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72  e.** pending-ter
3d40: 6d 73 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 54  ms hash-table. T
3d50: 68 65 20 64 6f 63 69 64 20 75 73 65 64 20 69 73  he docid used is
3d60: 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
3d70: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e  stored in.** p->
3d80: 69 50 72 65 76 44 6f 63 69 64 2c 20 61 6e 64 20  iPrevDocid, and 
3d90: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70  the column is sp
3da0: 65 63 69 66 69 65 64 20 62 79 20 61 72 67 75 6d  ecified by argum
3db0: 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20  ent iCol..**.** 
3dc0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
3dd0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
3de0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
3df0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
3e00: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
3e10: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
3e20: 54 65 72 6d 73 41 64 64 28 0a 20 20 46 74 73 33  TermsAdd(.  Fts3
3e30: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
3e40: 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65 20     /* FTS table 
3e50: 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78 74 20  into which text 
3e60: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
3e70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3e80: 20 2a 7a 54 65 78 74 2c 20 20 20 20 20 2f 2a 20   *zText,     /* 
3e90: 54 65 78 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74  Text of document
3ea0: 20 74 6f 20 62 65 20 69 6e 73 65 74 65 64 20 2a   to be inseted *
3eb0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
3ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3ed0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 74 6f  lumn number into
3ee0: 20 77 68 69 63 68 20 74 65 78 74 20 69 73 20 69   which text is i
3ef0: 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 75 33 32  nserted */.  u32
3f00: 20 2a 70 6e 57 6f 72 64 20 20 20 20 20 20 20 20   *pnWord        
3f10: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
3f20: 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 73  er of tokens ins
3f30: 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  erted */.){.  in
3f40: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 53 74 61  t rc;.  int iSta
3f50: 72 74 3b 0a 20 20 69 6e 74 20 69 45 6e 64 3b 0a  rt;.  int iEnd;.
3f60: 20 20 69 6e 74 20 69 50 6f 73 3b 0a 20 20 69 6e    int iPos;.  in
3f70: 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a 0a 20 20  t nWord = 0;..  
3f80: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b  char const *zTok
3f90: 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  en;.  int nToken
3fa0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  ;..  sqlite3_tok
3fb0: 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a  enizer *pTokeniz
3fc0: 65 72 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a  er = p->pTokeniz
3fd0: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f  er;.  sqlite3_to
3fe0: 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63  kenizer_module c
3ff0: 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  onst *pModule = 
4000: 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64  pTokenizer->pMod
4010: 75 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  ule;.  sqlite3_t
4020: 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20  okenizer_cursor 
4030: 2a 70 43 73 72 3b 0a 20 20 69 6e 74 20 28 2a 78  *pCsr;.  int (*x
4040: 4e 65 78 74 29 28 73 71 6c 69 74 65 33 5f 74 6f  Next)(sqlite3_to
4050: 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a  kenizer_cursor *
4060: 70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 63  pCursor,.      c
4070: 6f 6e 73 74 20 63 68 61 72 2a 2a 2c 69 6e 74 2a  onst char**,int*
4080: 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29  ,int*,int*,int*)
4090: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
40a0: 6b 65 6e 69 7a 65 72 20 26 26 20 70 4d 6f 64 75  kenizer && pModu
40b0: 6c 65 20 29 3b 0a 0a 20 20 72 63 20 3d 20 70 4d  le );..  rc = pM
40c0: 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 54 6f  odule->xOpen(pTo
40d0: 6b 65 6e 69 7a 65 72 2c 20 7a 54 65 78 74 2c 20  kenizer, zText, 
40e0: 2d 31 2c 20 26 70 43 73 72 29 3b 0a 20 20 69 66  -1, &pCsr);.  if
40f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4100: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
4110: 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 70 54  ;.  }.  pCsr->pT
4120: 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65  okenizer = pToke
4130: 6e 69 7a 65 72 3b 0a 0a 20 20 78 4e 65 78 74 20  nizer;..  xNext 
4140: 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74  = pModule->xNext
4150: 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  ;.  while( SQLIT
4160: 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 26  E_OK==rc.      &
4170: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
4180: 20 3d 20 78 4e 65 78 74 28 70 43 73 72 2c 20 26   = xNext(pCsr, &
4190: 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c  zToken, &nToken,
41a0: 20 26 69 53 74 61 72 74 2c 20 26 69 45 6e 64 2c   &iStart, &iEnd,
41b0: 20 26 69 50 6f 73 29 29 0a 20 20 29 7b 0a 20 20   &iPos)).  ){.  
41c0: 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70    PendingList *p
41d0: 4c 69 73 74 3b 0a 20 0a 20 20 20 20 69 66 28 20  List;. .    if( 
41e0: 69 50 6f 73 3e 3d 6e 57 6f 72 64 20 29 20 6e 57  iPos>=nWord ) nW
41f0: 6f 72 64 20 3d 20 69 50 6f 73 2b 31 3b 0a 0a 20  ord = iPos+1;.. 
4200: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 73 20     /* Positions 
4210: 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69  cannot be negati
4220: 76 65 3b 20 77 65 20 75 73 65 20 2d 31 20 61 73  ve; we use -1 as
4230: 20 61 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 6e   a terminator in
4240: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a  ternally..    **
4250: 20 54 6f 6b 65 6e 73 20 6d 75 73 74 20 68 61 76   Tokens must hav
4260: 65 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e  e a non-zero len
4270: 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  gth..    */.    
4280: 69 66 28 20 69 50 6f 73 3c 30 20 7c 7c 20 21 7a  if( iPos<0 || !z
4290: 54 6f 6b 65 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c  Token || nToken<
42a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
42b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
42c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
42d0: 7d 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 28  }..    pList = (
42e0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74  PendingList *)ft
42f0: 73 33 48 61 73 68 46 69 6e 64 28 26 70 2d 3e 70  s3HashFind(&p->p
4300: 65 6e 64 69 6e 67 54 65 72 6d 73 2c 20 7a 54 6f  endingTerms, zTo
4310: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
4320: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
4330: 20 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67       p->nPending
4340: 44 61 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e  Data -= (pList->
4350: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
4360: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
4370: 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Elem));.    }.  
4380: 20 20 69 66 28 20 66 74 73 33 50 65 6e 64 69 6e    if( fts3Pendin
4390: 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c 69  gListAppend(&pLi
43a0: 73 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69  st, p->iPrevDoci
43b0: 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26  d, iCol, iPos, &
43c0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rc) ){.      if(
43d0: 20 70 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68   pList==fts3Hash
43e0: 49 6e 73 65 72 74 28 26 70 2d 3e 70 65 6e 64 69  Insert(&p->pendi
43f0: 6e 67 54 65 72 6d 73 2c 20 7a 54 6f 6b 65 6e 2c  ngTerms, zToken,
4400: 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20   nToken, pList) 
4410: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ){.        /* Ma
4420: 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68 69 6c  lloc failed whil
4430: 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 20  e inserting the 
4440: 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69 73 20  new entry. This 
4450: 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20  can only .      
4460: 20 20 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74    ** happen if t
4470: 68 65 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76  here was no prev
4480: 69 6f 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74  ious entry for t
4490: 68 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20  his token..     
44a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
44b0: 73 65 72 74 28 20 30 3d 3d 66 74 73 33 48 61 73  sert( 0==fts3Has
44c0: 68 46 69 6e 64 28 26 70 2d 3e 70 65 6e 64 69 6e  hFind(&p->pendin
44d0: 67 54 65 72 6d 73 2c 20 7a 54 6f 6b 65 6e 2c 20  gTerms, zToken, 
44e0: 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 20  nToken) );.     
44f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4500: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
4510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
4520: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
4530: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
4540: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4550: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
4560: 2b 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61  += (pList->nData
4570: 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65   + nToken + size
4580: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29  of(Fts3HashElem)
4590: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
45a0: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
45b0: 70 43 73 72 29 3b 0a 20 20 2a 70 6e 57 6f 72 64  pCsr);.  *pnWord
45c0: 20 3d 20 6e 57 6f 72 64 3b 0a 20 20 72 65 74 75   = nWord;.  retu
45d0: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
45e0: 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
45f0: 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  : rc);.}../* .**
4600: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   Calling this fu
4610: 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73  nction indicates
4620: 20 74 68 61 74 20 73 75 62 73 65 71 75 65 6e 74   that subsequent
4630: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 66 74   calls to .** ft
4640: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
4650: 64 28 29 20 61 72 65 20 74 6f 20 61 64 64 20 74  d() are to add t
4660: 65 72 6d 2f 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  erm/position-lis
4670: 74 20 70 61 69 72 73 20 66 6f 72 20 74 68 65 0a  t pairs for the.
4680: 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
4690: 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
46a0: 20 64 6f 63 69 64 20 69 44 6f 63 69 64 2e 0a 2a   docid iDocid..*
46b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
46c0: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63  3PendingTermsDoc
46d0: 69 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  id(Fts3Table *p,
46e0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 44   sqlite_int64 iD
46f0: 6f 63 69 64 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  ocid){.  /* TODO
4700: 28 73 68 65 73 73 29 20 45 78 70 6c 6f 72 65 20  (shess) Explore 
4710: 77 68 65 74 68 65 72 20 70 61 72 74 69 61 6c 6c  whether partiall
4720: 79 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20 62  y flushing the b
4730: 75 66 66 65 72 20 6f 6e 0a 20 20 2a 2a 20 66 6f  uffer on.  ** fo
4740: 72 63 65 64 2d 66 6c 75 73 68 20 77 6f 75 6c 64  rced-flush would
4750: 20 70 72 6f 76 69 64 65 20 62 65 74 74 65 72 20   provide better 
4760: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 49 20  performance.  I 
4770: 73 75 73 70 65 63 74 20 74 68 61 74 20 69 66 0a  suspect that if.
4780: 20 20 2a 2a 20 77 65 20 6f 72 64 65 72 65 64 20    ** we ordered 
4790: 74 68 65 20 64 6f 63 6c 69 73 74 73 20 62 79 20  the doclists by 
47a0: 73 69 7a 65 20 61 6e 64 20 66 6c 75 73 68 65 64  size and flushed
47b0: 20 74 68 65 20 6c 61 72 67 65 73 74 20 75 6e 74   the largest unt
47c0: 69 6c 20 74 68 65 0a 20 20 2a 2a 20 62 75 66 66  il the.  ** buff
47d0: 65 72 20 77 61 73 20 68 61 6c 66 20 65 6d 70 74  er was half empt
47e0: 79 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6c 65  y, that would le
47f0: 74 20 74 68 65 20 6c 65 73 73 20 66 72 65 71 75  t the less frequ
4800: 65 6e 74 20 74 65 72 6d 73 0a 20 20 2a 2a 20 67  ent terms.  ** g
4810: 65 6e 65 72 61 74 65 20 6c 6f 6e 67 65 72 20 64  enerate longer d
4820: 6f 63 6c 69 73 74 73 2e 0a 20 20 2a 2f 0a 20 20  oclists..  */.  
4830: 69 66 28 20 69 44 6f 63 69 64 3c 3d 70 2d 3e 69  if( iDocid<=p->i
4840: 50 72 65 76 44 6f 63 69 64 20 7c 7c 20 70 2d 3e  PrevDocid || p->
4850: 6e 50 65 6e 64 69 6e 67 44 61 74 61 3e 70 2d 3e  nPendingData>p->
4860: 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20  nMaxPendingData 
4870: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
4880: 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
4890: 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b  ngTermsFlush(p);
48a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
48b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
48c0: 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72  rc;.  }.  p->iPr
48d0: 65 76 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64  evDocid = iDocid
48e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
48f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  E_OK;.}..void sq
4900: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
4910: 54 65 72 6d 73 43 6c 65 61 72 28 46 74 73 33 54  TermsClear(Fts3T
4920: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 46 74 73 33  able *p){.  Fts3
4930: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
4940: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 66 74 73  .  for(pElem=fts
4950: 33 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e 70  3HashFirst(&p->p
4960: 65 6e 64 69 6e 67 54 65 72 6d 73 29 3b 20 70 45  endingTerms); pE
4970: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48  lem; pElem=fts3H
4980: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
4990: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
49a0: 65 28 66 74 73 33 48 61 73 68 44 61 74 61 28 70  e(fts3HashData(p
49b0: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 66 74  Elem));.  }.  ft
49c0: 73 33 48 61 73 68 43 6c 65 61 72 28 26 70 2d 3e  s3HashClear(&p->
49d0: 70 65 6e 64 69 6e 67 54 65 72 6d 73 29 3b 0a 20  pendingTerms);. 
49e0: 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
49f0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
4a00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4a10: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55  called by the xU
4a20: 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 20 61  pdate() method a
4a30: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53  s part of an INS
4a40: 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ERT.** operation
4a50: 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72 69 65  . It adds entrie
4a60: 73 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  s for each term 
4a70: 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  in the new recor
4a80: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e 64  d to the.** pend
4a90: 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61  ingTerms hash ta
4aa0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ble..**.** Argum
4ab0: 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74 68 65  ent apVal is the
4ac0: 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 69 6d   same as the sim
4ad0: 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61 72 67  ilarly named arg
4ae0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 0a  ument passed to.
4af0: 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44 61 74  ** fts3InsertDat
4b00: 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69  a(). Parameter i
4b10: 44 6f 63 69 64 20 69 73 20 74 68 65 20 64 6f 63  Docid is the doc
4b20: 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f  id of the new ro
4b30: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
4b40: 20 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73   fts3InsertTerms
4b50: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73  (Fts3Table *p, s
4b60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4b70: 70 56 61 6c 2c 20 75 33 32 20 2a 61 53 7a 29 7b  pVal, u32 *aSz){
4b80: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
4bb0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  ariable */.  for
4bc0: 28 69 3d 32 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75  (i=2; i<p->nColu
4bd0: 6d 6e 2b 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mn+2; i++){.    
4be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
4bf0: 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  t = (const char 
4c00: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
4c10: 74 65 78 74 28 61 70 56 61 6c 5b 69 5d 29 3b 0a  text(apVal[i]);.
4c20: 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b      if( zText ){
4c30: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
4c40: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
4c50: 41 64 64 28 70 2c 20 7a 54 65 78 74 2c 20 69 2d  Add(p, zText, i-
4c60: 32 2c 20 26 61 53 7a 5b 69 2d 32 5d 29 3b 0a 20  2, &aSz[i-2]);. 
4c70: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
4c80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4c90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
4ca0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4cb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4cc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
4cd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4ce0: 6c 65 64 20 62 79 20 74 68 65 20 78 55 70 64 61  led by the xUpda
4cf0: 74 65 28 29 20 6d 65 74 68 6f 64 20 66 6f 72 20  te() method for 
4d00: 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  an INSERT operat
4d10: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 61 70 56 61  ion..** The apVa
4d20: 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  l parameter is p
4d30: 61 73 73 65 64 20 61 20 63 6f 70 79 20 6f 66 20  assed a copy of 
4d40: 74 68 65 20 61 70 56 61 6c 20 61 72 67 75 6d 65  the apVal argume
4d50: 6e 74 20 70 61 73 73 65 64 20 62 79 0a 2a 2a 20  nt passed by.** 
4d60: 53 51 4c 69 74 65 20 74 6f 20 74 68 65 20 78 55  SQLite to the xU
4d70: 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 20  pdate() method. 
4d80: 69 2e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56  i.e:.**.**   apV
4d90: 61 6c 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  al[0]           
4da0: 20 20 20 20 20 4e 6f 74 20 75 73 65 64 20 66 6f       Not used fo
4db0: 72 20 49 4e 53 45 52 54 2e 0a 2a 2a 20 20 20 61  r INSERT..**   a
4dc0: 70 56 61 6c 5b 31 5d 20 20 20 20 20 20 20 20 20  pVal[1]         
4dd0: 20 20 20 20 20 20 20 72 6f 77 69 64 0a 2a 2a 20         rowid.** 
4de0: 20 20 61 70 56 61 6c 5b 32 5d 20 20 20 20 20 20    apVal[2]      
4df0: 20 20 20 20 20 20 20 20 20 20 4c 65 66 74 2d 6d            Left-m
4e00: 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ost user-defined
4e10: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e   column.**   ...
4e20: 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e  .**   apVal[p->n
4e30: 43 6f 6c 75 6d 6e 2b 31 5d 20 20 20 20 20 52 69  Column+1]     Ri
4e40: 67 68 74 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65  ght-most user-de
4e50: 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  fined column.** 
4e60: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
4e70: 6d 6e 2b 32 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+2]     Hidden
4e80: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 73 61 6d   column with sam
4e90: 65 20 6e 61 6d 65 20 61 73 20 74 61 62 6c 65 0a  e name as table.
4ea0: 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43  **   apVal[p->nC
4eb0: 6f 6c 75 6d 6e 2b 33 5d 20 20 20 20 20 48 69 64  olumn+3]     Hid
4ec0: 64 65 6e 20 22 64 6f 63 69 64 22 20 63 6f 6c 75  den "docid" colu
4ed0: 6d 6e 20 28 61 6c 69 61 73 20 66 6f 72 20 72 6f  mn (alias for ro
4ee0: 77 69 64 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  wid).*/.static i
4ef0: 6e 74 20 66 74 73 33 49 6e 73 65 72 74 44 61 74  nt fts3InsertDat
4f00: 61 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  a(.  Fts3Table *
4f10: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4f20: 20 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78       /* Full-tex
4f30: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  t table */.  sql
4f40: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
4f50: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al,          /* 
4f60: 41 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20  Array of values 
4f70: 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 73  to insert */.  s
4f80: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
4f90: 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20 2f  Docid          /
4fa0: 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20 66 6f 72  * OUT: Docid for
4fb0: 20 72 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74   row just insert
4fc0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
4fd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4ff0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
5000: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f  qlite3_stmt *pCo
5010: 6e 74 65 6e 74 49 6e 73 65 72 74 3b 20 20 20 2f  ntentInsert;   /
5020: 2a 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f  * INSERT INTO %_
5030: 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 2e  content VALUES(.
5040: 2e 2e 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 63  ..) */..  /* Loc
5050: 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ate the statemen
5060: 74 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74 6f  t handle used to
5070: 20 69 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   insert data int
5080: 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 0a  o the %_content.
5090: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
50a0: 53 51 4c 20 66 6f 72 20 74 68 69 73 20 73 74 61  SQL for this sta
50b0: 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 2a 2a 0a  tement is:.  **.
50c0: 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
50d0: 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c  TO %_content VAL
50e0: 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e  UES(?, ?, ?, ...
50f0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
5100: 73 74 61 74 65 6d 65 6e 74 20 66 65 61 74 75 72  statement featur
5110: 65 73 20 4e 20 27 3f 27 20 76 61 72 69 61 62 6c  es N '?' variabl
5120: 65 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  es, where N is t
5130: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
5140: 72 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 63  r.  ** defined c
5150: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54  olumns in the FT
5160: 53 33 20 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f  S3 table, plus o
5170: 6e 65 20 66 6f 72 20 74 68 65 20 64 6f 63 69 64  ne for the docid
5180: 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72   field..  */.  r
5190: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
51a0: 70 2c 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49  p, SQL_CONTENT_I
51b0: 4e 53 45 52 54 2c 20 26 70 43 6f 6e 74 65 6e 74  NSERT, &pContent
51c0: 49 6e 73 65 72 74 2c 20 26 61 70 56 61 6c 5b 31  Insert, &apVal[1
51d0: 5d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ]);.  if( rc!=SQ
51e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
51f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
5200: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 61 20 71   /* There is a q
5210: 75 69 72 6b 20 68 65 72 65 2e 20 54 68 65 20 75  uirk here. The u
5220: 73 65 72 73 20 49 4e 53 45 52 54 20 73 74 61 74  sers INSERT stat
5230: 65 6d 65 6e 74 20 6d 61 79 20 68 61 76 65 20 73  ement may have s
5240: 70 65 63 69 66 69 65 64 0a 20 20 2a 2a 20 61 20  pecified.  ** a 
5250: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 22 72  value for the "r
5260: 6f 77 69 64 22 20 66 69 65 6c 64 2c 20 66 6f 72  owid" field, for
5270: 20 74 68 65 20 22 64 6f 63 69 64 22 20 66 69 65   the "docid" fie
5280: 6c 64 2c 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e  ld, or for both.
5290: 0a 20 20 2a 2a 20 57 68 69 63 68 20 69 73 20 61  .  ** Which is a
52a0: 20 70 72 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20   problem, since 
52b0: 22 72 6f 77 69 64 22 20 61 6e 64 20 22 64 6f 63  "rowid" and "doc
52c0: 69 64 22 20 61 72 65 20 61 6c 69 61 73 65 73 20  id" are aliases 
52d0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
52e0: 65 20 76 61 6c 75 65 2e 20 46 6f 72 20 65 78 61  e value. For exa
52f0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
5300: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74    INSERT INTO ft
5310: 73 33 74 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63  s3tbl(rowid, doc
5320: 69 64 29 20 56 41 4c 55 45 53 28 31 2c 20 32 29  id) VALUES(1, 2)
5330: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46  ;.  **.  ** In F
5340: 54 53 33 2c 20 74 68 69 73 20 69 73 20 61 6e 20  TS3, this is an 
5350: 65 72 72 6f 72 2e 20 49 74 20 69 73 20 61 6e 20  error. It is an 
5360: 65 72 72 6f 72 20 74 6f 20 73 70 65 63 69 66 79  error to specify
5370: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73   non-NULL values
5380: 0a 20 20 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64  .  ** for both d
5390: 6f 63 69 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74  ocid and some ot
53a0: 68 65 72 20 72 6f 77 69 64 20 61 6c 69 61 73 2e  her rowid alias.
53b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
53c0: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
53d0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
53e0: 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29  l[3+p->nColumn])
53f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
5400: 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33  TE_NULL==sqlite3
5410: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
5420: 6c 5b 30 5d 29 0a 20 20 20 20 20 26 26 20 53 51  l[0]).     && SQ
5430: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
5440: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
5450: 56 61 6c 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20  Val[1]).    ){. 
5460: 20 20 20 20 20 2f 2a 20 41 20 72 6f 77 69 64 2f       /* A rowid/
5470: 64 6f 63 69 64 20 63 6f 6e 66 6c 69 63 74 2e 20  docid conflict. 
5480: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
5490: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
54a0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
54b0: 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
54c0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20  pContentInsert, 
54d0: 31 2c 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43  1, apVal[3+p->nC
54e0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28  olumn]);.    if(
54f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5510: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
5520: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  e statement to i
5530: 6e 73 65 72 74 20 74 68 65 20 72 65 63 6f 72 64  nsert the record
5540: 2e 20 53 65 74 20 2a 70 69 44 6f 63 69 64 20 74  . Set *piDocid t
5550: 6f 20 74 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20  o the .  ** new 
5560: 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 0a 20 20  docid value. .  
5570: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  */.  sqlite3_ste
5580: 70 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74  p(pContentInsert
5590: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
55a0: 33 5f 72 65 73 65 74 28 70 43 6f 6e 74 65 6e 74  3_reset(pContent
55b0: 49 6e 73 65 72 74 29 3b 0a 0a 20 20 2a 70 69 44  Insert);..  *piD
55c0: 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  ocid = sqlite3_l
55d0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
55e0: 28 70 2d 3e 64 62 29 3b 0a 20 20 72 65 74 75 72  (p->db);.  retur
55f0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  n rc;.}..../*.**
5600: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
5610: 20 66 72 6f 6d 20 74 68 65 20 46 54 53 33 20 74   from the FTS3 t
5620: 61 62 6c 65 2e 20 43 6c 65 61 72 20 74 68 65 20  able. Clear the 
5630: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
5640: 69 6e 69 6e 67 0a 2a 2a 20 70 65 6e 64 69 6e 67  ining.** pending
5650: 20 74 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69   terms..*/.stati
5660: 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65  c int fts3Delete
5670: 41 6c 6c 28 46 74 73 33 54 61 62 6c 65 20 2a 70  All(Fts3Table *p
5680: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5690: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
56a0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
56b0: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 69 73  ode */..  /* Dis
56c0: 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
56d0: 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
56e0: 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  -terms hash tabl
56f0: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
5700: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43  ts3PendingTermsC
5710: 6c 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44  lear(p);..  /* D
5720: 65 6c 65 74 65 20 65 76 65 72 79 74 68 69 6e 67  elete everything
5730: 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 74   from the %_cont
5740: 65 6e 74 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20  ent, %_segments 
5750: 61 6e 64 20 25 5f 73 65 67 64 69 72 20 74 61 62  and %_segdir tab
5760: 6c 65 73 2e 20 2a 2f 0a 20 20 66 74 73 33 53 71  les. */.  fts3Sq
5770: 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51  lExec(&rc, p, SQ
5780: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e  L_DELETE_ALL_CON
5790: 54 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73 33  TENT, 0);.  fts3
57a0: 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20  SqlExec(&rc, p, 
57b0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
57c0: 45 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20 66  EGMENTS, 0);.  f
57d0: 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20  ts3SqlExec(&rc, 
57e0: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
57f0: 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20  L_SEGDIR, 0);.  
5800: 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69  if( p->bHasDocsi
5810: 7a 65 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71  ze ){.    fts3Sq
5820: 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51  lExec(&rc, p, SQ
5830: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43  L_DELETE_ALL_DOC
5840: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 66 74  SIZE, 0);.    ft
5850: 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
5860: 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  , SQL_DELETE_ALL
5870: 5f 53 54 41 54 2c 20 30 29 3b 0a 20 20 7d 0a 20  _STAT, 0);.  }. 
5880: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5890: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 65  *.** The first e
58a0: 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 70  lement in the ap
58b0: 56 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 61  Val[] array is a
58c0: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
58d0: 6e 20 74 68 65 20 64 6f 63 69 64 0a 2a 2a 20 28  n the docid.** (
58e0: 61 6e 20 69 6e 74 65 67 65 72 29 20 6f 66 20 61  an integer) of a
58f0: 20 72 6f 77 20 61 62 6f 75 74 20 74 6f 20 62 65   row about to be
5900: 20 64 65 6c 65 74 65 64 2e 20 52 65 6d 6f 76 65   deleted. Remove
5910: 20 61 6c 6c 20 74 65 72 6d 73 20 66 72 6f 6d 20   all terms from 
5920: 74 68 65 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78 74  the.** full-text
5930: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
5940: 63 20 76 6f 69 64 20 66 74 73 33 44 65 6c 65 74  c void fts3Delet
5950: 65 54 65 72 6d 73 28 0a 20 20 69 6e 74 20 2a 70  eTerms(.  int *p
5960: 52 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  RC,             
5970: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
5980: 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
5990: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
59a0: 20 54 68 65 20 46 54 53 20 74 61 62 6c 65 20 74   The FTS table t
59b0: 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f  o delete from */
59c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
59d0: 20 2a 2a 61 70 56 61 6c 2c 20 20 2f 2a 20 61 70   **apVal,  /* ap
59e0: 56 61 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 74  Val[] contains t
59f0: 68 65 20 64 6f 63 69 64 20 74 6f 20 62 65 20 64  he docid to be d
5a00: 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 33 32 20  eleted */.  u32 
5a10: 2a 61 53 7a 20 20 20 20 20 20 20 20 20 20 20 20  *aSz            
5a20: 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
5a30: 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e 74  deleted document
5a40: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
5a50: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
5a60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
5a70: 65 6c 65 63 74 3b 0a 0a 20 20 69 66 28 20 2a 70  elect;..  if( *p
5a80: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72  RC ) return;.  r
5a90: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
5aa0: 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f  p, SQL_SELECT_CO
5ab0: 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20  NTENT_BY_ROWID, 
5ac0: 26 70 53 65 6c 65 63 74 2c 20 61 70 56 61 6c 29  &pSelect, apVal)
5ad0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5ae0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
5af0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
5b00: 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
5b10: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t) ){.      int 
5b20: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  i;.      for(i=1
5b30: 3b 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ; i<=p->nColumn;
5b40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
5b50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
5b60: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
5b70: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
5b80: 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29  text(pSelect, i)
5b90: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
5ba0: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41  ts3PendingTermsA
5bb0: 64 64 28 70 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  dd(p, zText, -1,
5bc0: 20 26 61 53 7a 5b 69 2d 31 5d 29 3b 0a 20 20 20   &aSz[i-1]);.   
5bd0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
5be0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
5bf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
5c00: 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  t(pSelect);.    
5c10: 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
5c20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5c30: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
5c40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
5c50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
5c60: 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  t(pSelect);.  }e
5c70: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
5c80: 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
5c90: 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63  .  }.  *pRC = rc
5ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
5cb0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  rd declaration t
5cc0: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
5cd0: 65 20 63 69 72 63 75 6c 61 72 20 64 65 70 65 6e  e circular depen
5ce0: 64 65 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a  dency between.**
5cf0: 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 33 53   functions fts3S
5d00: 65 67 6d 65 6e 74 4d 65 72 67 65 28 29 20 61 6e  egmentMerge() an
5d10: 64 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  d fts3AllocateSe
5d20: 67 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74  gdirIdx()..*/.st
5d30: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
5d40: 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61  mentMerge(Fts3Ta
5d50: 62 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ble *, int);../*
5d60: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
5d70: 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e  on allocates a n
5d80: 65 77 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  ew level iLevel 
5d90: 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 65 67  index in the seg
5da0: 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 20 55 73  dir table..** Us
5db0: 75 61 6c 6c 79 2c 20 69 6e 64 65 78 65 73 20 61  ually, indexes a
5dc0: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74  re allocated wit
5dd0: 68 69 6e 20 61 20 6c 65 76 65 6c 20 73 65 71 75  hin a level sequ
5de0: 65 6e 74 69 61 6c 6c 79 20 73 74 61 72 74 69 6e  entially startin
5df0: 67 0a 2a 2a 20 77 69 74 68 20 30 2c 20 73 6f 20  g.** with 0, so 
5e00: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  the allocated in
5e10: 64 65 78 20 69 73 20 6f 6e 65 20 67 72 65 61 74  dex is one great
5e20: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
5e30: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
5e40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
5e50: 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20 25   max(idx) FROM %
5e60: 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65  _segdir WHERE le
5e70: 76 65 6c 20 3d 20 3a 69 4c 65 76 65 6c 0a 2a 2a  vel = :iLevel.**
5e80: 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
5e90: 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
5ea0: 79 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55  y FTS3_MERGE_COU
5eb0: 4e 54 20 69 6e 64 65 78 65 73 20 61 74 20 74 68  NT indexes at th
5ec0: 65 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 6c  e requested.** l
5ed0: 65 76 65 6c 2c 20 74 68 65 79 20 61 72 65 20 6d  evel, they are m
5ee0: 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  erged into a sin
5ef0: 67 6c 65 20 6c 65 76 65 6c 20 28 69 4c 65 76 65  gle level (iLeve
5f00: 6c 2b 31 29 20 73 65 67 6d 65 6e 74 20 61 6e 64  l+1) segment and
5f10: 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
5f20: 65 64 20 69 6e 64 65 78 20 69 73 20 30 2e 0a 2a  ed index is 0..*
5f30: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
5f40: 75 6c 2c 20 2a 70 69 49 64 78 20 69 73 20 73 65  ul, *piIdx is se
5f50: 74 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  t to the allocat
5f60: 65 64 20 69 6e 64 65 78 20 73 6c 6f 74 20 61 6e  ed index slot an
5f70: 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 72  d SQLITE_OK.** r
5f80: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
5f90: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
5fa0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5fb0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
5fc0: 69 6e 74 20 66 74 73 33 41 6c 6c 6f 63 61 74 65  int fts3Allocate
5fd0: 53 65 67 64 69 72 49 64 78 28 46 74 73 33 54 61  SegdirIdx(Fts3Ta
5fe0: 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 4c 65 76  ble *p, int iLev
5ff0: 65 6c 2c 20 69 6e 74 20 2a 70 69 49 64 78 29 7b  el, int *piIdx){
6000: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
6030: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
6040: 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b 20 20  tmt *pNextIdx;  
6050: 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
6060: 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61 74 20  for next idx at 
6070: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a 2f 0a  level iLevel */.
6080: 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20 30 3b    int iNext = 0;
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 71    /* Result of q
60b0: 75 65 72 79 20 70 4e 65 78 74 49 64 78 20 2a 2f  uery pNextIdx */
60c0: 0a 0a 20 20 2f 2a 20 53 65 74 20 76 61 72 69 61  ..  /* Set varia
60d0: 62 6c 65 20 69 4e 65 78 74 20 74 6f 20 74 68 65  ble iNext to the
60e0: 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
60f0: 73 65 67 64 69 72 20 69 6e 64 65 78 20 61 74 20  segdir index at 
6100: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 2a 2f  level iLevel. */
6110: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
6120: 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f  tmt(p, SQL_NEXT_
6130: 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26  SEGMENT_INDEX, &
6140: 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20  pNextIdx, 0);.  
6150: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6160: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6170: 5f 62 69 6e 64 5f 69 6e 74 28 70 4e 65 78 74 49  _bind_int(pNextI
6180: 64 78 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a  dx, 1, iLevel);.
6190: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
61a0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
61b0: 28 70 4e 65 78 74 49 64 78 29 20 29 7b 0a 20 20  (pNextIdx) ){.  
61c0: 20 20 20 20 69 4e 65 78 74 20 3d 20 73 71 6c 69      iNext = sqli
61d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
61e0: 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 20  NextIdx, 0);.   
61f0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
6200: 74 65 33 5f 72 65 73 65 74 28 70 4e 65 78 74 49  te3_reset(pNextI
6210: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  dx);.  }..  if( 
6220: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6230: 0a 20 20 20 20 2f 2a 20 49 66 20 69 4e 65 78 74  .    /* If iNext
6240: 20 69 73 20 46 54 53 33 5f 4d 45 52 47 45 5f 43   is FTS3_MERGE_C
6250: 4f 55 4e 54 2c 20 69 6e 64 69 63 61 74 69 6e 67  OUNT, indicating
6260: 20 74 68 61 74 20 6c 65 76 65 6c 20 69 4c 65 76   that level iLev
6270: 65 6c 20 69 73 20 61 6c 72 65 61 64 79 0a 20 20  el is already.  
6280: 20 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72 67 65    ** full, merge
6290: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
62a0: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e   level iLevel in
62b0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76  to a single iLev
62c0: 65 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65 67 6d  el+1.    ** segm
62d0: 65 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ent and allocate
62e0: 20 28 6e 65 77 6c 79 20 66 72 65 65 64 29 20 69   (newly freed) i
62f0: 6e 64 65 78 20 30 20 61 74 20 6c 65 76 65 6c 20  ndex 0 at level 
6300: 69 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77 69 73  iLevel. Otherwis
6310: 65 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69 4e 65  e,.    ** if iNe
6320: 78 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  xt is less than 
6330: 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
6340: 2c 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64 65 78  , allocate index
6350: 20 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20   iNext..    */. 
6360: 20 20 20 69 66 28 20 69 4e 65 78 74 3e 3d 46 54     if( iNext>=FT
6370: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29  S3_MERGE_COUNT )
6380: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
6390: 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c  3SegmentMerge(p,
63a0: 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   iLevel);.      
63b0: 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  *piIdx = 0;.    
63c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 69  }else{.      *pi
63d0: 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a 20 20 20  Idx = iNext;.   
63e0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
63f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
6400: 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
6410: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
6420: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
6430: 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69 6e  the next term in
6440: 20 74 68 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e   the.** segment.
6450: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
6460: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
6470: 75 72 6e 65 64 2e 20 49 66 20 74 68 65 72 65 20  urned. If there 
6480: 69 73 20 6e 6f 20 6e 65 78 74 20 74 65 72 6d 2c  is no next term,
6490: 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  .** SQLITE_DONE.
64a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
64b0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
64c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
64d0: 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
64e0: 74 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  t(Fts3SegReader 
64f0: 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 63 68 61  *pReader){.  cha
6500: 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  r *pNext;       
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6520: 43 75 72 73 6f 72 20 76 61 72 69 61 62 6c 65 20  Cursor variable 
6530: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
6540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6560: 66 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20  f bytes in term 
6570: 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20  prefix */.  int 
6580: 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20  nSuffix;        
6590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
65a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
65b0: 6e 20 74 65 72 6d 20 73 75 66 66 69 78 20 2a 2f  n term suffix */
65c0: 0a 0a 20 20 69 66 28 20 21 70 52 65 61 64 65 72  ..  if( !pReader
65d0: 2d 3e 61 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  ->aDoclist ){.  
65e0: 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61 64 65    pNext = pReade
65f0: 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 65 6c 73  r->aNode;.  }els
6600: 65 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 26  e{.    pNext = &
6610: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
6620: 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  t[pReader->nDocl
6630: 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ist];.  }..  if(
6640: 20 21 70 4e 65 78 74 20 7c 7c 20 70 4e 65 78 74   !pNext || pNext
6650: 3e 3d 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  >=&pReader->aNod
6660: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  e[pReader->nNode
6670: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ] ){.    int rc;
6680: 0a 20 20 20 20 69 66 28 20 66 74 73 33 53 65 67  .    if( fts3Seg
6690: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
66a0: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
66b0: 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a    Fts3HashElem *
66c0: 70 45 6c 65 6d 20 3d 20 2a 28 70 52 65 61 64 65  pElem = *(pReade
66d0: 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 29 3b 0a  r->ppNextElem);.
66e0: 20 20 20 20 20 20 69 66 28 20 70 45 6c 65 6d 3d        if( pElem=
66f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  =0 ){.        pR
6700: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30  eader->aNode = 0
6710: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6720: 20 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c 69         PendingLi
6730: 73 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e  st *pList = (Pen
6740: 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48  dingList *)fts3H
6750: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
6760: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
6770: 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a  >zTerm = (char *
6780: 29 66 74 73 33 48 61 73 68 4b 65 79 28 70 45 6c  )fts3HashKey(pEl
6790: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  em);.        pRe
67a0: 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 66 74  ader->nTerm = ft
67b0: 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 70 45  s3HashKeysize(pE
67c0: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 52  lem);.        pR
67d0: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 70  eader->nNode = p
67e0: 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74  Reader->nDoclist
67f0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20   = pList->nData 
6800: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 52 65  + 1;.        pRe
6810: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52  ader->aNode = pR
6820: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20  eader->aDoclist 
6830: 3d 20 70 4c 69 73 74 2d 3e 61 44 61 74 61 3b 0a  = pList->aData;.
6840: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
6850: 3e 70 70 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20  >ppNextElem++;. 
6860: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6870: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b  Reader->aNode );
6880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
6890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
68a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
68b0: 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 20 29  pReader->pStmt )
68c0: 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  {.      pReader-
68d0: 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >aNode = 0;.    
68e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
68f0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OK;.    }.    rc
6900: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
6910: 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 29 3b  pReader->pStmt);
6920: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
6930: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
6940: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20   pReader->aNode 
6950: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
6960: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
6970: 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
6980: 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   rc);.    }.    
6990: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d  pReader->nNode =
69a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
69b0: 62 79 74 65 73 28 70 52 65 61 64 65 72 2d 3e 70  bytes(pReader->p
69c0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 52  Stmt, 0);.    pR
69d0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28  eader->aNode = (
69e0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
69f0: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 52 65 61 64  olumn_blob(pRead
6a00: 65 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20  er->pStmt, 0);. 
6a10: 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61 64     pNext = pRead
6a20: 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a 20  er->aNode;.  }. 
6a30: 20 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c   .  pNext += sql
6a40: 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
6a50: 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 50 72 65  t32(pNext, &nPre
6a60: 66 69 78 29 3b 0a 20 20 70 4e 65 78 74 20 2b 3d  fix);.  pNext +=
6a70: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
6a80: 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26  arint32(pNext, &
6a90: 6e 53 75 66 66 69 78 29 3b 0a 0a 20 20 69 66 28  nSuffix);..  if(
6aa0: 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78   nPrefix+nSuffix
6ab0: 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41  >pReader->nTermA
6ac0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
6ad0: 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66 69 78 2b  nNew = (nPrefix+
6ae0: 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20 20 20 20  nSuffix)*2;.    
6af0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c  char *zNew = sql
6b00: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 52 65  ite3_realloc(pRe
6b10: 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65  ader->zTerm, nNe
6b20: 77 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4e 65  w);.    if( !zNe
6b30: 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  w ){.      retur
6b40: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6b50: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65      }.    pReade
6b60: 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b  r->zTerm = zNew;
6b70: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54  .    pReader->nT
6b80: 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  ermAlloc = nNew;
6b90: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
6ba0: 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 5b 6e 50  Reader->zTerm[nP
6bb0: 72 65 66 69 78 5d 2c 20 70 4e 65 78 74 2c 20 6e  refix], pNext, n
6bc0: 53 75 66 66 69 78 29 3b 0a 20 20 70 52 65 61 64  Suffix);.  pRead
6bd0: 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 50 72 65  er->nTerm = nPre
6be0: 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20 20 70  fix+nSuffix;.  p
6bf0: 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66 69 78 3b  Next += nSuffix;
6c00: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69  .  pNext += sqli
6c10: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
6c20: 33 32 28 70 4e 65 78 74 2c 20 26 70 52 65 61 64  32(pNext, &pRead
6c30: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  er->nDoclist);. 
6c40: 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 3c 26   assert( pNext<&
6c50: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70  pReader->aNode[p
6c60: 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 29  Reader->nNode] )
6c70: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f  ;.  pReader->aDo
6c80: 63 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  clist = pNext;. 
6c90: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
6ca0: 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 72 65 74  tList = 0;.  ret
6cb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6cc0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
6cd0: 53 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69  SegReader to poi
6ce0: 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
6cf0: 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63  docid in the doc
6d00: 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a  list associated.
6d10: 2a 2a 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ** with the curr
6d20: 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  ent term..*/.sta
6d30: 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67  tic void fts3Seg
6d40: 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64  ReaderFirstDocid
6d50: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
6d60: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20  pReader){.  int 
6d70: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  n;.  assert( pRe
6d80: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29  ader->aDoclist )
6d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52 65  ;.  assert( !pRe
6da0: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
6db0: 74 20 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  t );.  n = sqlit
6dc0: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
6dd0: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
6de0: 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f  t, &pReader->iDo
6df0: 63 69 64 29 3b 0a 20 20 70 52 65 61 64 65 72 2d  cid);.  pReader-
6e00: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 26  >pOffsetList = &
6e10: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
6e20: 74 5b 6e 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  t[n];.}../*.** A
6e30: 64 76 61 6e 63 65 20 74 68 65 20 53 65 67 52 65  dvance the SegRe
6e40: 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ader to point to
6e50: 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20   the next docid 
6e60: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a  in the doclist.*
6e70: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
6e80: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  h the current te
6e90: 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 61 72  rm..** .** If ar
6ea0: 67 75 6d 65 6e 74 73 20 70 70 4f 66 66 73 65 74  guments ppOffset
6eb0: 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66 66 73 65  List and pnOffse
6ec0: 74 4c 69 73 74 20 61 72 65 20 6e 6f 74 20 4e 55  tList are not NU
6ed0: 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a 70 70  LL, then .** *pp
6ee0: 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20 73 65  OffsetList is se
6ef0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
6f00: 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2d 6f  e first column-o
6f10: 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a 20 69 6e  ffset list.** in
6f20: 20 74 68 65 20 64 6f 63 6c 69 73 74 20 65 6e 74   the doclist ent
6f30: 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65 64 69 61  ry (i.e. immedia
6f40: 74 65 6c 79 20 70 61 73 74 20 74 68 65 20 64 6f  tely past the do
6f50: 63 69 64 20 76 61 72 69 6e 74 29 2e 0a 2a 2a 20  cid varint)..** 
6f60: 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 69 73  *pnOffsetList is
6f70: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 65 6e 67   set to the leng
6f80: 74 68 20 6f 66 20 74 68 65 20 73 65 74 20 6f 66  th of the set of
6f90: 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 0a 2a   column-offset.*
6fa0: 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20 69 6e 63  * lists, not inc
6fb0: 6c 75 64 69 6e 67 20 74 68 65 20 6e 75 6c 2d 74  luding the nul-t
6fc0: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 2e 20  erminator byte. 
6fd0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2f 0a  For example:.*/.
6fe0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
6ff0: 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63  SegReaderNextDoc
7000: 69 64 28 0a 20 20 46 74 73 33 53 65 67 52 65 61  id(.  Fts3SegRea
7010: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 0a 20 20  der *pReader,.  
7020: 63 68 61 72 20 2a 2a 70 70 4f 66 66 73 65 74 4c  char **ppOffsetL
7030: 69 73 74 2c 0a 20 20 69 6e 74 20 2a 70 6e 4f 66  ist,.  int *pnOf
7040: 66 73 65 74 4c 69 73 74 0a 29 7b 0a 20 20 63 68  fsetList.){.  ch
7050: 61 72 20 2a 70 20 3d 20 70 52 65 61 64 65 72 2d  ar *p = pReader-
7060: 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20  >pOffsetList;.  
7070: 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20 2f  char c = 0;..  /
7080: 2a 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72  * Pointer p curr
7090: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20  ently points at 
70a0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
70b0: 66 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74  f an offset list
70c0: 2e 20 54 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  . The.  ** follo
70d0: 77 69 6e 67 20 74 77 6f 20 6c 69 6e 65 73 20 61  wing two lines a
70e0: 64 76 61 6e 63 65 20 69 74 20 74 6f 20 70 6f 69  dvance it to poi
70f0: 6e 74 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74  nt one byte past
7100: 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 2a 2a   the end of.  **
7110: 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65 74   the same offset
7120: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 77 68   list..  */.  wh
7130: 69 6c 65 28 20 2a 70 20 7c 20 63 20 29 20 63 20  ile( *p | c ) c 
7140: 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20  = *p++ & 0x80;. 
7150: 20 70 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 66 20 72   p++;..  /* If r
7160: 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
7170: 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
7180: 69 61 62 6c 65 73 20 77 69 74 68 20 61 20 70 6f  iables with a po
7190: 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65  inter to and the
71a0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
71b0: 65 20 70 72 65 76 69 6f 75 73 20 6f 66 66 73 65  e previous offse
71c0: 74 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  t-list..  */.  i
71d0: 66 28 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f( ppOffsetList 
71e0: 29 7b 0a 20 20 20 20 2a 70 70 4f 66 66 73 65 74  ){.    *ppOffset
71f0: 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e  List = pReader->
7200: 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20  pOffsetList;.   
7210: 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d   *pnOffsetList =
7220: 20 28 69 6e 74 29 28 70 20 2d 20 70 52 65 61 64   (int)(p - pRead
7230: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
7240: 2d 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  - 1);.  }..  /* 
7250: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
7260: 6d 6f 72 65 20 65 6e 74 72 69 65 73 20 69 6e 20  more entries in 
7270: 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 73 65 74  the doclist, set
7280: 20 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 0a   pOffsetList to.
7290: 20 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68 65 72    ** NULL. Other
72a0: 77 69 73 65 2c 20 73 65 74 20 46 74 73 33 53 65  wise, set Fts3Se
72b0: 67 52 65 61 64 65 72 2e 69 44 6f 63 69 64 20 74  gReader.iDocid t
72c0: 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64  o the next docid
72d0: 20 61 6e 64 0a 20 20 2a 2a 20 46 74 73 33 53 65   and.  ** Fts3Se
72e0: 67 52 65 61 64 65 72 2e 70 4f 66 66 73 65 74 4c  gReader.pOffsetL
72f0: 69 73 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ist to point to 
7300: 74 68 65 20 6e 65 78 74 20 6f 66 66 73 65 74 20  the next offset 
7310: 6c 69 73 74 20 62 65 66 6f 72 65 0a 20 20 2a 2a  list before.  **
7320: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
7330: 0a 20 20 69 66 28 20 70 3e 3d 26 70 52 65 61 64  .  if( p>=&pRead
7340: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65  er->aDoclist[pRe
7350: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 20  ader->nDoclist] 
7360: 29 7b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e  ){.    pReader->
7370: 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b  pOffsetList = 0;
7380: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7390: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
73a0: 74 61 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d  ta;.    pReader-
73b0: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70  >pOffsetList = p
73c0: 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   + sqlite3Fts3Ge
73d0: 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44 65 6c  tVarint(p, &iDel
73e0: 74 61 29 3b 0a 20 20 20 20 70 52 65 61 64 65 72  ta);.    pReader
73f0: 2d 3e 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c  ->iDocid += iDel
7400: 74 61 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta;.  }.}../*.**
7410: 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61   Free all alloca
7420: 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
7430: 20 77 69 74 68 20 74 68 65 20 69 74 65 72 61 74   with the iterat
7440: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
7450: 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75   .** second argu
7460: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
7470: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
7480: 65 72 46 72 65 65 28 46 74 73 33 54 61 62 6c 65  erFree(Fts3Table
7490: 20 2a 70 2c 20 46 74 73 33 53 65 67 52 65 61 64   *p, Fts3SegRead
74a0: 65 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20  er *pReader){.  
74b0: 69 66 28 20 70 52 65 61 64 65 72 20 29 7b 0a 20  if( pReader ){. 
74c0: 20 20 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e     if( pReader->
74d0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 2f  pStmt ){.      /
74e0: 2a 20 4d 6f 76 65 20 74 68 65 20 6c 65 61 66 2d  * Move the leaf-
74f0: 72 61 6e 67 65 20 53 45 4c 45 43 54 20 73 74 61  range SELECT sta
7500: 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 4c  tement to the aL
7510: 65 61 76 65 73 53 74 6d 74 5b 5d 20 61 72 72 61  eavesStmt[] arra
7520: 79 2c 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 74  y,.      ** so t
7530: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
7540: 75 73 65 64 20 77 68 65 6e 20 72 65 71 75 69 72  used when requir
7550: 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 71 75  ed by another qu
7560: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
7570: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
7580: 4c 65 61 76 65 73 53 74 6d 74 3c 70 2d 3e 6e 4c  LeavesStmt<p->nL
7590: 65 61 76 65 73 54 6f 74 61 6c 20 29 3b 0a 20 20  eavesTotal );.  
75a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
75b0: 74 28 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74  t(pReader->pStmt
75c0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4c 65 61  );.      p->aLea
75d0: 76 65 73 53 74 6d 74 5b 70 2d 3e 6e 4c 65 61 76  vesStmt[p->nLeav
75e0: 65 73 53 74 6d 74 2b 2b 5d 20 3d 20 70 52 65 61  esStmt++] = pRea
75f0: 64 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  der->pStmt;.    
7600: 7d 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53  }.    if( !fts3S
7610: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
7620: 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20  g(pReader) ){.  
7630: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7640: 28 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 29  (pReader->zTerm)
7650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7660: 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65 72  te3_free(pReader
7670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7680: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
7690: 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 2e  egReader object.
76a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
76b0: 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 28  ts3SegReaderNew(
76c0: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
76f0: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
7700: 69 6e 74 20 69 41 67 65 2c 20 20 20 20 20 20 20  int iAge,       
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7720: 2f 2a 20 53 65 67 6d 65 6e 74 20 22 61 67 65 22  /* Segment "age"
7730: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  . */.  sqlite3_i
7740: 6e 74 36 34 20 69 53 74 61 72 74 4c 65 61 66 2c  nt64 iStartLeaf,
7750: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
7760: 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65  leaf to traverse
7770: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
7780: 74 36 34 20 69 45 6e 64 4c 65 61 66 2c 20 20 20  t64 iEndLeaf,   
7790: 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6c        /* Final l
77a0: 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65 20  eaf to traverse 
77b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
77c0: 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20  64 iEndBlock,   
77d0: 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 62 6c       /* Final bl
77e0: 6f 63 6b 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ock of segment *
77f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7800: 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  zRoot,          
7810: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
7820: 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f  ntaining root no
7830: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f  de */.  int nRoo
7840: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
7850: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
7860: 6f 66 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  of buffer contai
7870: 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a  ning root node *
7880: 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  /.  Fts3SegReade
7890: 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20  r **ppReader    
78a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f      /* OUT: Allo
78b0: 63 61 74 65 64 20 46 74 73 33 53 65 67 52 65 61  cated Fts3SegRea
78c0: 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  der */.){.  int 
78d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
78f0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
7900: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
7910: 52 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20  Reader;         
7920: 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
7930: 65 64 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ed SegReader obj
7940: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ect */.  int nEx
7950: 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
7960: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7970: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65  s to allocate se
7980: 67 6d 65 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20  gment root node 
7990: 2a 2f 0a 0a 20 20 69 66 28 20 69 53 74 61 72 74  */..  if( iStart
79a0: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  Leaf==0 ){.    n
79b0: 45 78 74 72 61 20 3d 20 6e 52 6f 6f 74 3b 0a 20  Extra = nRoot;. 
79c0: 20 7d 0a 0a 20 20 70 52 65 61 64 65 72 20 3d 20   }..  pReader = 
79d0: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
79e0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
79f0: 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65  sizeof(Fts3SegRe
7a00: 61 64 65 72 29 20 2b 20 6e 45 78 74 72 61 29 3b  ader) + nExtra);
7a10: 0a 20 20 69 66 28 20 21 70 52 65 61 64 65 72 20  .  if( !pReader 
7a20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7a30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
7a40: 20 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72    memset(pReader
7a50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
7a60: 53 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 70  SegReader));.  p
7a70: 52 65 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c  Reader->iStartBl
7a80: 6f 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66  ock = iStartLeaf
7a90: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64  ;.  pReader->iId
7aa0: 78 20 3d 20 69 41 67 65 3b 0a 20 20 70 52 65 61  x = iAge;.  pRea
7ab0: 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d  der->iEndBlock =
7ac0: 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69   iEndBlock;..  i
7ad0: 66 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 20 20  f( nExtra ){.   
7ae0: 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 73   /* The entire s
7af0: 65 67 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  egment is stored
7b00: 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   in the root nod
7b10: 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61 64 65  e. */.    pReade
7b20: 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68 61 72  r->aNode = (char
7b30: 20 2a 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a   *)&pReader[1];.
7b40: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f      pReader->nNo
7b50: 64 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20  de = nRoot;.    
7b60: 6d 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e  memcpy(pReader->
7b70: 61 4e 6f 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52  aNode, zRoot, nR
7b80: 6f 6f 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oot);.  }else{. 
7b90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 65 78     /* If the tex
7ba0: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
7bb0: 74 65 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74  tement to iterat
7bc0: 65 20 74 68 72 6f 75 67 68 20 61 20 63 6f 6e 74  e through a cont
7bd0: 69 67 75 6f 75 73 0a 20 20 20 20 2a 2a 20 73 65  iguous.    ** se
7be0: 74 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  t of entries in 
7bf0: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
7c00: 61 62 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  able has not yet
7c10: 20 62 65 65 6e 20 63 6f 6d 70 6f 73 65 64 2c 0a   been composed,.
7c20: 20 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 65 20 69      ** compose i
7c30: 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  t now..    */.  
7c40: 20 20 69 66 28 20 21 70 2d 3e 7a 53 65 6c 65 63    if( !p->zSelec
7c50: 74 4c 65 61 76 65 73 20 29 7b 0a 20 20 20 20 20  tLeaves ){.     
7c60: 20 70 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76 65   p->zSelectLeave
7c70: 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
7c80: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
7c90: 53 45 4c 45 43 54 20 62 6c 6f 63 6b 20 46 52 4f  SELECT block FRO
7ca0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74  M %Q.'%q_segment
7cb0: 73 27 20 57 48 45 52 45 20 62 6c 6f 63 6b 69 64  s' WHERE blockid
7cc0: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
7cd0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52   ".          "OR
7ce0: 44 45 52 20 42 59 20 62 6c 6f 63 6b 69 64 22 2c  DER BY blockid",
7cf0: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
7d00: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
7d10: 20 69 66 28 20 21 70 2d 3e 7a 53 65 6c 65 63 74   if( !p->zSelect
7d20: 4c 65 61 76 65 73 20 29 7b 0a 20 20 20 20 20 20  Leaves ){.      
7d30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
7d40: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
7d50: 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  o finished;.    
7d60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
7d70: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
7d80: 6f 20 66 72 65 65 20 73 74 61 74 65 6d 65 6e 74  o free statement
7d90: 73 20 69 6e 20 74 68 65 20 61 4c 65 61 76 65 73  s in the aLeaves
7da0: 53 74 6d 74 5b 5d 20 61 72 72 61 79 2c 20 70 72  Stmt[] array, pr
7db0: 65 70 61 72 65 0a 20 20 20 20 2a 2a 20 61 20 6e  epare.    ** a n
7dc0: 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6e 6f 77  ew statement now
7dd0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75  . Otherwise, reu
7de0: 73 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74  se a prepared st
7df0: 61 74 65 6d 65 6e 74 20 66 72 6f 6d 0a 20 20 20  atement from.   
7e00: 20 2a 2a 20 61 4c 65 61 76 65 73 53 74 6d 74 5b   ** aLeavesStmt[
7e10: 5d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ]..    */.    if
7e20: 28 20 70 2d 3e 6e 4c 65 61 76 65 73 53 74 6d 74  ( p->nLeavesStmt
7e30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
7e40: 20 70 2d 3e 6e 4c 65 61 76 65 73 54 6f 74 61 6c   p->nLeavesTotal
7e50: 3d 3d 70 2d 3e 6e 4c 65 61 76 65 73 41 6c 6c 6f  ==p->nLeavesAllo
7e60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  c ){.        int
7e70: 20 6e 4e 65 77 20 3d 20 70 2d 3e 6e 4c 65 61 76   nNew = p->nLeav
7e80: 65 73 41 6c 6c 6f 63 20 2b 20 31 36 3b 0a 20 20  esAlloc + 16;.  
7e90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
7ea0: 6d 74 20 2a 2a 61 4e 65 77 20 3d 20 28 73 71 6c  mt **aNew = (sql
7eb0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 29 73 71 6c  ite3_stmt **)sql
7ec0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
7ed0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4c 65            p->aLe
7ee0: 61 76 65 73 53 74 6d 74 2c 20 6e 4e 65 77 2a 73  avesStmt, nNew*s
7ef0: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 73 74  izeof(sqlite3_st
7f00: 6d 74 20 2a 29 0a 20 20 20 20 20 20 20 20 29 3b  mt *).        );
7f10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 4e  .        if( !aN
7f20: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
7f30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7f40: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  M;.          got
7f50: 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  o finished;.    
7f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
7f70: 3e 6e 4c 65 61 76 65 73 41 6c 6c 6f 63 20 3d 20  >nLeavesAlloc = 
7f80: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 2d  nNew;.        p-
7f90: 3e 61 4c 65 61 76 65 73 53 74 6d 74 20 3d 20 61  >aLeavesStmt = a
7fa0: 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
7fb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7fc0: 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
7fd0: 2c 20 70 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76  , p->zSelectLeav
7fe0: 65 73 2c 20 2d 31 2c 20 26 70 52 65 61 64 65 72  es, -1, &pReader
7ff0: 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  ->pStmt, 0);.   
8000: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8010: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8020: 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
8030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
8040: 6e 4c 65 61 76 65 73 54 6f 74 61 6c 2b 2b 3b 0a  nLeavesTotal++;.
8050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8060: 20 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 20   pReader->pStmt 
8070: 3d 20 70 2d 3e 61 4c 65 61 76 65 73 53 74 6d 74  = p->aLeavesStmt
8080: 5b 2d 2d 70 2d 3e 6e 4c 65 61 76 65 73 53 74 6d  [--p->nLeavesStm
8090: 74 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  t];.    }..    /
80a0: 2a 20 42 69 6e 64 20 74 68 65 20 73 74 61 72 74  * Bind the start
80b0: 20 61 6e 64 20 65 6e 64 20 6c 65 61 66 20 62 6c   and end leaf bl
80c0: 6f 63 6b 69 64 73 20 74 6f 20 74 68 65 20 70 72  ockids to the pr
80d0: 65 70 61 72 65 64 20 53 51 4c 20 73 74 61 74 65  epared SQL state
80e0: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ment. */.    sql
80f0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
8100: 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 2c 20  pReader->pStmt, 
8110: 31 2c 20 69 53 74 61 72 74 4c 65 61 66 29 3b 0a  1, iStartLeaf);.
8120: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
8130: 5f 69 6e 74 36 34 28 70 52 65 61 64 65 72 2d 3e  _int64(pReader->
8140: 70 53 74 6d 74 2c 20 32 2c 20 69 45 6e 64 4c 65  pStmt, 2, iEndLe
8150: 61 66 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  af);.  }.  rc = 
8160: 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
8170: 74 28 70 52 65 61 64 65 72 29 3b 0a 0a 20 66 69  t(pReader);.. fi
8180: 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
8190: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
81a0: 20 20 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70     *ppReader = p
81b0: 52 65 61 64 65 72 3b 0a 20 20 7d 65 6c 73 65 7b  Reader;.  }else{
81c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
81d0: 53 65 67 52 65 61 64 65 72 46 72 65 65 28 70 2c  SegReaderFree(p,
81e0: 20 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20   pReader);.  }. 
81f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8200: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
8210: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
8220: 6f 6e 20 75 73 65 64 20 61 73 20 61 20 71 73 6f  on used as a qso
8230: 72 74 28 29 20 63 61 6c 6c 62 61 63 6b 20 77 68  rt() callback wh
8240: 65 6e 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 61 6e  en sorting.** an
8250: 20 61 72 72 61 79 20 6f 66 20 70 65 6e 64 69 6e   array of pendin
8260: 67 20 74 65 72 6d 73 20 62 79 20 74 65 72 6d 2e  g terms by term.
8270: 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 73 20   This occurs as 
8280: 70 61 72 74 20 6f 66 20 66 6c 75 73 68 69 6e 67  part of flushing
8290: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
82a0: 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   of the pending-
82b0: 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65  terms hash table
82c0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
82d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
82e0: 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42  fts3CompareElemB
82f0: 79 54 65 72 6d 28 63 6f 6e 73 74 20 76 6f 69 64  yTerm(const void
8300: 20 2a 6c 68 73 2c 20 63 6f 6e 73 74 20 76 6f 69   *lhs, const voi
8310: 64 20 2a 72 68 73 29 7b 0a 20 20 63 68 61 72 20  d *rhs){.  char 
8320: 2a 7a 31 20 3d 20 66 74 73 33 48 61 73 68 4b 65  *z1 = fts3HashKe
8330: 79 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d  y(*(Fts3HashElem
8340: 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 63 68 61 72   **)lhs);.  char
8350: 20 2a 7a 32 20 3d 20 66 74 73 33 48 61 73 68 4b   *z2 = fts3HashK
8360: 65 79 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65  ey(*(Fts3HashEle
8370: 6d 20 2a 2a 29 72 68 73 29 3b 0a 20 20 69 6e 74  m **)rhs);.  int
8380: 20 6e 31 20 3d 20 66 74 73 33 48 61 73 68 4b 65   n1 = fts3HashKe
8390: 79 73 69 7a 65 28 2a 28 46 74 73 33 48 61 73 68  ysize(*(Fts3Hash
83a0: 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20  Elem **)lhs);.  
83b0: 69 6e 74 20 6e 32 20 3d 20 66 74 73 33 48 61 73  int n2 = fts3Has
83c0: 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33 48  hKeysize(*(Fts3H
83d0: 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b  ashElem **)rhs);
83e0: 0a 0a 20 20 69 6e 74 20 6e 20 3d 20 28 6e 31 3c  ..  int n = (n1<
83f0: 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20  n2 ? n1 : n2);. 
8400: 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28   int c = memcmp(
8410: 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a 20 20 69 66  z1, z2, n);.  if
8420: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20  ( c==0 ){.    c 
8430: 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20  = n1 - n2;.  }. 
8440: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a   return c;.}../*
8450: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8460: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  n is used to all
8470: 6f 63 61 74 65 20 61 6e 20 46 74 73 33 53 65 67  ocate an Fts3Seg
8480: 52 65 61 64 65 72 20 74 68 61 74 20 69 74 65 72  Reader that iter
8490: 61 74 65 73 20 74 68 72 6f 75 67 68 0a 2a 2a 20  ates through.** 
84a0: 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20  a subset of the 
84b0: 74 65 72 6d 73 20 73 74 6f 72 65 64 20 69 6e 20  terms stored in 
84c0: 74 68 65 20 46 74 73 33 54 61 62 6c 65 2e 70 65  the Fts3Table.pe
84d0: 6e 64 69 6e 67 54 65 72 6d 73 20 61 72 72 61 79  ndingTerms array
84e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
84f0: 46 74 73 33 53 65 67 52 65 61 64 65 72 50 65 6e  Fts3SegReaderPen
8500: 64 69 6e 67 28 0a 20 20 46 74 73 33 54 61 62 6c  ding(.  Fts3Tabl
8510: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
8520: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
8530: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
8540: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8550: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
8560: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
8570: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20  search for */.  
8580: 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
85b0: 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  r zTerm */.  int
85c0: 20 69 73 50 72 65 66 69 78 2c 20 20 20 20 20 20   isPrefix,      
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85e0: 54 72 75 65 20 66 6f 72 20 61 20 74 65 72 6d 2d  True for a term-
85f0: 70 72 65 66 69 78 20 71 75 65 72 79 20 2a 2f 0a  prefix query */.
8600: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
8610: 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20 20  **ppReader      
8620: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61    /* OUT: SegRea
8630: 64 65 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d  der for pending-
8640: 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74  terms */.){.  Ft
8650: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
8660: 61 64 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ader = 0;     /*
8670: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
8680: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
8690: 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65  */.  Fts3HashEle
86a0: 6d 20 2a 2a 61 45 6c 65 6d 20 3d 20 30 3b 20 20  m **aElem = 0;  
86b0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
86c0: 20 74 65 72 6d 20 68 61 73 68 20 65 6e 74 72 69   term hash entri
86d0: 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20  es to scan */.  
86e0: 69 6e 74 20 6e 45 6c 65 6d 20 3d 20 30 3b 20 20  int nElem = 0;  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
8710: 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 20 20 69   at aElem */.  i
8720: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8730: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
8740: 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
8750: 0a 0a 20 20 69 66 28 20 69 73 50 72 65 66 69 78  ..  if( isPrefix
8760: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c   ){.    int nAll
8770: 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  oc = 0;         
8780: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8790: 20 61 6c 6c 6f 63 61 74 65 64 20 61 72 72 61 79   allocated array
87a0: 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 20 20 20   at aElem */.   
87b0: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70   Fts3HashElem *p
87c0: 45 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  E = 0;         /
87d0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
87e0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  ble */..    for(
87f0: 70 45 3d 66 74 73 33 48 61 73 68 46 69 72 73 74  pE=fts3HashFirst
8800: 28 26 70 2d 3e 70 65 6e 64 69 6e 67 54 65 72 6d  (&p->pendingTerm
8810: 73 29 3b 20 70 45 3b 20 70 45 3d 66 74 73 33 48  s); pE; pE=fts3H
8820: 61 73 68 4e 65 78 74 28 70 45 29 29 7b 0a 20 20  ashNext(pE)){.  
8830: 20 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d      char *zKey =
8840: 20 28 63 68 61 72 20 2a 29 66 74 73 33 48 61 73   (char *)fts3Has
8850: 68 4b 65 79 28 70 45 29 3b 0a 20 20 20 20 20 20  hKey(pE);.      
8860: 69 6e 74 20 6e 4b 65 79 20 3d 20 66 74 73 33 48  int nKey = fts3H
8870: 61 73 68 4b 65 79 73 69 7a 65 28 70 45 29 3b 0a  ashKeysize(pE);.
8880: 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d        if( nTerm=
8890: 3d 30 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65  =0 || (nKey>=nTe
88a0: 72 6d 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  rm && 0==memcmp(
88b0: 7a 4b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  zKey, zTerm, nTe
88c0: 72 6d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rm)) ){.        
88d0: 69 66 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f  if( nElem==nAllo
88e0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46  c ){.          F
88f0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45  ts3HashElem **aE
8900: 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 20 20  lem2;.          
8910: 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20  nAlloc += 16;.  
8920: 20 20 20 20 20 20 20 20 61 45 6c 65 6d 32 20 3d          aElem2 =
8930: 20 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a   (Fts3HashElem *
8940: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
8950: 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c(.             
8960: 20 61 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73   aElem, nAlloc*s
8970: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
8980: 65 6d 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20  em *).          
8990: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
89a0: 20 21 61 45 6c 65 6d 32 20 29 7b 0a 20 20 20 20   !aElem2 ){.    
89b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
89c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
89d0: 20 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 30         nElem = 0
89e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
89f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
8a00: 0a 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d  .          aElem
8a10: 20 3d 20 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20   = aElem2;.     
8a20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 45 6c     }.        aEl
8a30: 65 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45  em[nElem++] = pE
8a40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8a50: 0a 20 20 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20  .    /* If more 
8a60: 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61  than one term ma
8a70: 74 63 68 65 73 20 74 68 65 20 70 72 65 66 69 78  tches the prefix
8a80: 2c 20 73 6f 72 74 20 74 68 65 20 46 74 73 33 48  , sort the Fts3H
8a90: 61 73 68 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f  ashElem.    ** o
8aa0: 62 6a 65 63 74 73 20 69 6e 20 74 65 72 6d 20 6f  bjects in term o
8ab0: 72 64 65 72 20 75 73 69 6e 67 20 71 73 6f 72 74  rder using qsort
8ac0: 28 29 2e 20 54 68 69 73 20 75 73 65 73 20 74 68  (). This uses th
8ad0: 65 20 73 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f  e same compariso
8ae0: 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63  n.    ** callbac
8af0: 6b 20 61 73 20 69 73 20 75 73 65 64 20 77 68 65  k as is used whe
8b00: 6e 20 66 6c 75 73 68 69 6e 67 20 74 65 72 6d 73  n flushing terms
8b10: 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   to disk..    */
8b20: 0a 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31  .    if( nElem>1
8b30: 20 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74 28   ){.      qsort(
8b40: 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69  aElem, nElem, si
8b50: 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65  zeof(Fts3HashEle
8b60: 6d 20 2a 29 2c 20 66 74 73 33 43 6f 6d 70 61 72  m *), fts3Compar
8b70: 65 45 6c 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20  eElemByTerm);.  
8b80: 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
8b90: 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a    Fts3HashElem *
8ba0: 70 45 20 3d 20 66 74 73 33 48 61 73 68 46 69 6e  pE = fts3HashFin
8bb0: 64 45 6c 65 6d 28 26 70 2d 3e 70 65 6e 64 69 6e  dElem(&p->pendin
8bc0: 67 54 65 72 6d 73 2c 20 7a 54 65 72 6d 2c 20 6e  gTerms, zTerm, n
8bd0: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
8be0: 45 20 29 7b 0a 20 20 20 20 20 20 61 45 6c 65 6d  E ){.      aElem
8bf0: 20 3d 20 26 70 45 3b 0a 20 20 20 20 20 20 6e 45   = &pE;.      nE
8c00: 6c 65 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  lem = 1;.    }. 
8c10: 20 7d 0a 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e   }..  if( nElem>
8c20: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  0 ){.    int nBy
8c30: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33  te = sizeof(Fts3
8c40: 53 65 67 52 65 61 64 65 72 29 20 2b 20 28 6e 45  SegReader) + (nE
8c50: 6c 65 6d 2b 31 29 2a 73 69 7a 65 6f 66 28 46 74  lem+1)*sizeof(Ft
8c60: 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 3b 0a 20  s3HashElem *);. 
8c70: 20 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74     pReader = (Ft
8c80: 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71  s3SegReader *)sq
8c90: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
8ca0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 52  te);.    if( !pR
8cb0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 72  eader ){.      r
8cc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8cd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8ce0: 20 20 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65     memset(pReade
8cf0: 72 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  r, 0, nByte);.  
8d00: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64      pReader->iId
8d10: 78 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a  x = 0x7FFFFFFF;.
8d20: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
8d30: 70 4e 65 78 74 45 6c 65 6d 20 3d 20 28 46 74 73  pNextElem = (Fts
8d40: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 26 70 52  3HashElem **)&pR
8d50: 65 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20 20 20  eader[1];.      
8d60: 6d 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e  memcpy(pReader->
8d70: 70 70 4e 65 78 74 45 6c 65 6d 2c 20 61 45 6c 65  ppNextElem, aEle
8d80: 6d 2c 20 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66 28  m, nElem*sizeof(
8d90: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 29  Fts3HashElem *))
8da0: 3b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52  ;.      fts3SegR
8db0: 65 61 64 65 72 4e 65 78 74 28 70 52 65 61 64 65  eaderNext(pReade
8dc0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
8dd0: 20 69 66 28 20 69 73 50 72 65 66 69 78 20 29 7b   if( isPrefix ){
8de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8df0: 65 28 61 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20  e(aElem);.  }.  
8e00: 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52 65 61  *ppReader = pRea
8e10: 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  der;.  return rc
8e20: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
8e30: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
8e40: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
8e50: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
8e60: 62 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  be a statement o
8e70: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  f.** the form:.*
8e80: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 0a 2a  *.**   SELECT .*
8e90: 2a 20 20 20 20 20 69 64 78 2c 20 20 20 20 20 20  *     idx,      
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63              -- c
8eb0: 6f 6c 20 30 0a 2a 2a 20 20 20 20 20 73 74 61 72  ol 0.**     star
8ec0: 74 5f 62 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  t_block,        
8ed0: 20 20 2d 2d 20 63 6f 6c 20 31 0a 2a 2a 20 20 20    -- col 1.**   
8ee0: 20 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f    leaves_end_blo
8ef0: 63 6b 2c 20 20 20 20 20 2d 2d 20 63 6f 6c 20 32  ck,     -- col 2
8f00: 0a 2a 2a 20 20 20 20 20 65 6e 64 5f 62 6c 6f 63  .**     end_bloc
8f10: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d  k,            --
8f20: 20 63 6f 6c 20 33 0a 2a 2a 20 20 20 20 20 72 6f   col 3.**     ro
8f30: 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
8f40: 20 20 20 20 2d 2d 20 63 6f 6c 20 34 0a 2a 2a 20      -- col 4.** 
8f50: 20 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20    FROM %_segdir 
8f60: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ....**.** This f
8f70: 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
8f80: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
8f90: 73 20 61 20 46 74 73 33 53 65 67 52 65 61 64 65  s a Fts3SegReade
8fa0: 72 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  r structure to.*
8fb0: 2a 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  * iterate throug
8fc0: 68 20 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72  h the terms stor
8fd0: 65 64 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ed in the segmen
8fe0: 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
8ff0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 72  the.** current r
9000: 6f 77 20 74 68 61 74 20 70 53 74 6d 74 20 69 73  ow that pStmt is
9010: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 0a 2a   pointing to. .*
9020: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
9030: 75 6c 2c 20 74 68 65 20 46 74 73 33 53 65 67 52  ul, the Fts3SegR
9040: 65 61 64 65 72 20 69 73 20 6c 65 66 74 20 70 6f  eader is left po
9050: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
9060: 72 73 74 20 74 65 72 6d 0a 2a 2a 20 69 6e 20 74  rst term.** in t
9070: 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 53  he segment and S
9080: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
9090: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
90a0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
90b0: 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
90c0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
90d0: 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65  int fts3SegReade
90e0: 72 4e 65 77 28 0a 20 20 46 74 73 33 54 61 62 6c  rNew(.  Fts3Tabl
90f0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
9100: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
9110: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
9120: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
9130: 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20 20  t *pStmt,       
9140: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
9150: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 41 67 65 2c  e */.  int iAge,
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
9180: 74 20 22 61 67 65 22 2e 20 2a 2f 0a 20 20 46 74  t "age". */.  Ft
9190: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70  s3SegReader **pp
91a0: 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a  Reader        /*
91b0: 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20   OUT: Allocated 
91c0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2f  Fts3SegReader */
91d0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
91e0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
91f0: 72 4e 65 77 28 70 2c 20 69 41 67 65 2c 20 0a 20  rNew(p, iAge, . 
9200: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
9210: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
9220: 20 31 29 2c 0a 20 20 20 20 20 20 73 71 6c 69 74   1),.      sqlit
9230: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
9240: 70 53 74 6d 74 2c 20 32 29 2c 0a 20 20 20 20 20  pStmt, 2),.     
9250: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9260: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 29 2c  int64(pStmt, 3),
9270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
9280: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
9290: 2c 20 34 29 2c 0a 20 20 20 20 20 20 73 71 6c 69  , 4),.      sqli
92a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
92b0: 28 70 53 74 6d 74 2c 20 34 29 2c 0a 20 20 20 20  (pStmt, 4),.    
92c0: 20 20 70 70 52 65 61 64 65 72 0a 20 20 29 3b 0a    ppReader.  );.
92d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
92e0: 20 74 68 65 20 65 6e 74 72 69 65 73 20 70 6f 69   the entries poi
92f0: 6e 74 65 64 20 74 6f 20 62 79 20 74 77 6f 20 46  nted to by two F
9300: 74 73 33 53 65 67 52 65 61 64 65 72 20 73 74 72  ts3SegReader str
9310: 75 63 74 75 72 65 73 2e 20 0a 2a 2a 20 43 6f 6d  uctures. .** Com
9320: 70 61 72 69 73 6f 6e 20 69 73 20 61 73 20 66 6f  parison is as fo
9330: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  llows:.**.**   1
9340: 29 20 45 4f 46 20 69 73 20 67 72 65 61 74 65 72  ) EOF is greater
9350: 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a   than not EOF..*
9360: 2a 0a 2a 2a 20 20 20 32 29 20 54 68 65 20 63 75  *.**   2) The cu
9370: 72 72 65 6e 74 20 74 65 72 6d 73 20 28 69 66 20  rrent terms (if 
9380: 61 6e 79 29 20 61 72 65 20 63 6f 6d 70 61 72 65  any) are compare
9390: 64 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  d using memcmp()
93a0: 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  . If one.**     
93b0: 20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66 69   term is a prefi
93c0: 78 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 74 68  x of another, th
93d0: 65 20 6c 6f 6e 67 65 72 20 74 65 72 6d 20 69 73  e longer term is
93e0: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65 0a   considered the.
93f0: 2a 2a 20 20 20 20 20 20 6c 61 72 67 65 72 2e 0a  **      larger..
9400: 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20 73 65  **.**   3) By se
9410: 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c  gment age. An ol
9420: 64 65 72 20 73 65 67 6d 65 6e 74 20 69 73 20 63  der segment is c
9430: 6f 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65 72  onsidered larger
9440: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9450: 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d 70  fts3SegReaderCmp
9460: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
9470: 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65 61  pLhs, Fts3SegRea
9480: 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e  der *pRhs){.  in
9490: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 4c 68 73  t rc;.  if( pLhs
94a0: 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d  ->aNode && pRhs-
94b0: 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  >aNode ){.    in
94c0: 74 20 72 63 32 20 3d 20 70 4c 68 73 2d 3e 6e 54  t rc2 = pLhs->nT
94d0: 65 72 6d 20 2d 20 70 52 68 73 2d 3e 6e 54 65 72  erm - pRhs->nTer
94e0: 6d 3b 0a 20 20 20 20 69 66 28 20 72 63 32 3c 30  m;.    if( rc2<0
94f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
9500: 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72  emcmp(pLhs->zTer
9510: 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20  m, pRhs->zTerm, 
9520: 70 4c 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20  pLhs->nTerm);.  
9530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
9540: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d  c = memcmp(pLhs-
9550: 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54  >zTerm, pRhs->zT
9560: 65 72 6d 2c 20 70 52 68 73 2d 3e 6e 54 65 72 6d  erm, pRhs->nTerm
9570: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9580: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc==0 ){.      
9590: 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
95a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
95b0: 3d 20 28 70 4c 68 73 2d 3e 61 4e 6f 64 65 3d 3d  = (pLhs->aNode==
95c0: 30 29 20 2d 20 28 70 52 68 73 2d 3e 61 4e 6f 64  0) - (pRhs->aNod
95d0: 65 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  e==0);.  }.  if(
95e0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
95f0: 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20   = pRhs->iIdx - 
9600: 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 7d 0a  pLhs->iIdx;.  }.
9610: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
9620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
9630: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 64 69 66 66 65  }../*.** A diffe
9640: 72 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  rent comparison 
9650: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 53 65 67  function for Seg
9660: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
9670: 73 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 76 65  s. In this.** ve
9680: 72 73 69 6f 6e 2c 20 69 74 20 69 73 20 61 73 73  rsion, it is ass
9690: 75 6d 65 64 20 74 68 61 74 20 65 61 63 68 20 53  umed that each S
96a0: 65 67 52 65 61 64 65 72 20 70 6f 69 6e 74 73 20  egReader points 
96b0: 74 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e 0a 2a  to an entry in.*
96c0: 2a 20 61 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  * a doclist for 
96d0: 69 64 65 6e 74 69 63 61 6c 20 74 65 72 6d 73 2e  identical terms.
96e0: 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   Comparison is m
96f0: 61 64 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ade as follows:.
9700: 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 28  **.**   1) EOF (
9710: 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  end of doclist i
9720: 6e 20 74 68 69 73 20 63 61 73 65 29 20 69 73 20  n this case) is 
9730: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 6f 74  greater than not
9740: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29   EOF..**.**   2)
9750: 20 42 79 20 63 75 72 72 65 6e 74 20 64 6f 63 69   By current doci
9760: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79  d..**.**   3) By
9770: 20 73 65 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e   segment age. An
9780: 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74 20 69   older segment i
9790: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 61 72  s considered lar
97a0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
97b0: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
97c0: 44 6f 63 6c 69 73 74 43 6d 70 28 46 74 73 33 53  DoclistCmp(Fts3S
97d0: 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20  egReader *pLhs, 
97e0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
97f0: 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Rhs){.  int rc =
9800: 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c   (pLhs->pOffsetL
9810: 69 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70  ist==0)-(pRhs->p
9820: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a  OffsetList==0);.
9830: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
9840: 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f     if( pLhs->iDo
9850: 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69  cid==pRhs->iDoci
9860: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
9870: 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68  pRhs->iIdx - pLh
9880: 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c  s->iIdx;.    }el
9890: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  se{.      rc = (
98a0: 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3e 20 70  pLhs->iDocid > p
98b0: 52 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31  Rhs->iDocid) ? 1
98c0: 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   : -1;.    }.  }
98d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 68 73 2d  .  assert( pLhs-
98e0: 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e  >aNode && pRhs->
98f0: 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72  aNode );.  retur
9900: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
9910: 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20  ompare the term 
9920: 74 68 61 74 20 74 68 65 20 46 74 73 33 53 65 67  that the Fts3Seg
9930: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61  Reader object pa
9940: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
9950: 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f  t argument.** po
9960: 69 6e 74 73 20 74 6f 20 77 69 74 68 20 74 68 65  ints to with the
9970: 20 74 65 72 6d 20 73 70 65 63 69 66 69 65 64 20   term specified 
9980: 62 79 20 61 72 67 75 6d 65 6e 74 73 20 7a 54 65  by arguments zTe
9990: 72 6d 20 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a  rm and nTerm. .*
99a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 67  *.** If the pSeg
99b0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 6c 72   iterator is alr
99c0: 65 61 64 79 20 61 74 20 45 4f 46 2c 20 72 65 74  eady at EOF, ret
99d0: 75 72 6e 20 30 2e 20 4f 74 68 65 72 77 69 73 65  urn 0. Otherwise
99e0: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20  , return.** -ve 
99f0: 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d  if the pSeg term
9a00: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 54   is less than zT
9a10: 65 72 6d 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20  erm/nTerm, 0 if 
9a20: 74 68 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72  the two terms ar
9a30: 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b  e.** equal, or +
9a40: 76 65 20 69 66 20 74 68 65 20 70 53 65 67 20 74  ve if the pSeg t
9a50: 65 72 6d 20 69 73 20 67 72 65 61 74 65 72 20 74  erm is greater t
9a60: 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e  han zTerm/nTerm.
9a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
9a80: 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d  ts3SegReaderTerm
9a90: 43 6d 70 28 0a 20 20 46 74 73 33 53 65 67 52 65  Cmp(.  Fts3SegRe
9aa0: 61 64 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20  ader *pSeg,     
9ab0: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
9ac0: 74 20 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20  t reader object 
9ad0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9ae0: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
9af0: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
9b00: 63 6f 6d 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20  compare to */.  
9b10: 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20  int nTerm       
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
9b40: 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
9b50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  /.){.  int res =
9b60: 20 30 3b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e   0;.  if( pSeg->
9b70: 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  aNode ){.    if(
9b80: 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65   pSeg->nTerm>nTe
9b90: 72 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  rm ){.      res 
9ba0: 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a  = memcmp(pSeg->z
9bb0: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
9bc0: 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rm);.    }else{.
9bd0: 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
9be0: 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20  mp(pSeg->zTerm, 
9bf0: 7a 54 65 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65  zTerm, pSeg->nTe
9c00: 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rm);.    }.    i
9c10: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
9c20: 20 20 20 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e     res = pSeg->n
9c30: 54 65 72 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20  Term-nTerm;.    
9c40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
9c50: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  es;.}../*.** Arg
9c60: 75 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e 74 20  ument apSegment 
9c70: 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  is an array of n
9c80: 53 65 67 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73  Segment elements
9c90: 2e 20 49 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68  . It is known th
9ca0: 61 74 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  at.** the final 
9cb0: 28 6e 53 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65  (nSegment-nSuspe
9cc0: 63 74 29 20 6d 65 6d 62 65 72 73 20 61 72 65 20  ct) members are 
9cd0: 61 6c 72 65 61 64 79 20 69 6e 20 73 6f 72 74 65  already in sorte
9ce0: 64 20 6f 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f  d order.** (acco
9cf0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
9d00: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
9d10: 20 70 72 6f 76 69 64 65 64 29 2e 20 54 68 69 73   provided). This
9d20: 20 66 75 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c   function shuffl
9d30: 65 73 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  es.** the array 
9d40: 61 72 6f 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c  around until all
9d50: 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
9d60: 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f  sorted order..*/
9d70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9d80: 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 0a  3SegReaderSort(.
9d90: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
9da0: 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20  **apSegment,    
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 73 6f 72   /* Array to sor
9dd0: 74 20 65 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a  t entries of */.
9de0: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20    int nSegment, 
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53 65   /* Size of apSe
9e20: 67 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  gment array */. 
9e30: 20 69 6e 74 20 6e 53 75 73 70 65 63 74 2c 20 20   int nSuspect,  
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 2f 2a 20 55 6e 73 6f 72 74 65 64 20 65 6e 74 72  /* Unsorted entr
9e70: 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74  y count */.  int
9e80: 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67   (*xCmp)(Fts3Seg
9e90: 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65  Reader *, Fts3Se
9ea0: 67 52 65 61 64 65 72 20 2a 29 20 20 2f 2a 20 43  gReader *)  /* C
9eb0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
9ec0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  on */.){.  int i
9ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
9ef0: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
9f00: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53  */..  assert( nS
9f10: 75 73 70 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74  uspect<=nSegment
9f20: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53 75 73 70   );..  if( nSusp
9f30: 65 63 74 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20  ect==nSegment ) 
9f40: 6e 53 75 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f  nSuspect--;.  fo
9f50: 72 28 69 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20  r(i=nSuspect-1; 
9f60: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
9f70: 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a  int j;.    for(j
9f80: 3d 69 3b 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d  =i; j<(nSegment-
9f90: 31 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  1); j++){.      
9fa0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
9fb0: 54 6d 70 3b 0a 20 20 20 20 20 20 69 66 28 20 78  Tmp;.      if( x
9fc0: 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d  Cmp(apSegment[j]
9fd0: 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d  , apSegment[j+1]
9fe0: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )<0 ) break;.   
9ff0: 20 20 20 70 54 6d 70 20 3d 20 61 70 53 65 67 6d     pTmp = apSegm
a000: 65 6e 74 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20  ent[j+1];.      
a010: 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d  apSegment[j+1] =
a020: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20   apSegment[j];. 
a030: 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a       apSegment[j
a040: 5d 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a  ] = pTmp;.    }.
a050: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
a060: 42 55 47 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  BUG.  /* Check t
a070: 68 61 74 20 74 68 65 20 6c 69 73 74 20 72 65 61  hat the list rea
a080: 6c 6c 79 20 69 73 20 73 6f 72 74 65 64 20 6e 6f  lly is sorted no
a090: 77 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  w. */.  for(i=0;
a0a0: 20 69 3c 28 6e 53 75 73 70 65 63 74 2d 31 29 3b   i<(nSuspect-1);
a0b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
a0c0: 74 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65 6e  t( xCmp(apSegmen
a0d0: 74 5b 69 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b  t[i], apSegment[
a0e0: 69 2b 31 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23  i+1])<0 );.  }.#
a0f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
a100: 49 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64 20  Insert a record 
a110: 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d 65  into the %_segme
a120: 6e 74 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  nts table..*/.st
a130: 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72 69  atic int fts3Wri
a140: 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73  teSegment(.  Fts
a150: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a170: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
a180: 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
a190: 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20  3_int64 iBlock, 
a1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
a1b0: 63 6b 20 69 64 20 66 6f 72 20 6e 65 77 20 62 6c  ck id for new bl
a1c0: 6f 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ock */.  char *z
a1d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a1f0: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
a200: 6e 74 61 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64  ntaining block d
a210: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  ata */.  int n  
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
a240: 20 6f 66 20 62 75 66 66 65 72 20 7a 20 69 6e 20   of buffer z in 
a250: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  bytes */.){.  sq
a260: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
a270: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74  t;.  int rc = ft
a280: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
a290: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53  _INSERT_SEGMENTS
a2a0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
a2b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a2c0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
a2d0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
a2e0: 74 2c 20 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20  t, 1, iBlock);. 
a2f0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a300: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a  blob(pStmt, 2, z
a310: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
a320: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
a330: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
a340: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
a350: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d  eset(pStmt);.  }
a360: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a370: 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ./* .** Insert a
a380: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
a390: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
a3a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a3b0: 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 0a  ts3WriteSegdir(.
a3c0: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
a3f0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
a400: 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a420: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
a430: 65 6c 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  el" field */.  i
a440: 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a460: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 69 64 78  * Value for "idx
a470: 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  " field */.  sql
a480: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
a490: 74 42 6c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20  tBlock,      /* 
a4a0: 56 61 6c 75 65 20 66 6f 72 20 22 73 74 61 72 74  Value for "start
a4b0: 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f  _block" field */
a4c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
a4d0: 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20   iLeafEndBlock, 
a4e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
a4f0: 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63  "leaves_end_bloc
a500: 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71  k" field */.  sq
a510: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64  lite3_int64 iEnd
a520: 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a  Block,        /*
a530: 20 56 61 6c 75 65 20 66 6f 72 20 22 65 6e 64 5f   Value for "end_
a540: 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a  block" field */.
a550: 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c 20 20    char *zRoot,  
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 20 20 2f 2a 20 42 6c 6f 62 20 76 61 6c 75 65 20    /* Blob value 
a580: 66 6f 72 20 22 72 6f 6f 74 22 20 66 69 65 6c 64  for "root" field
a590: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 20   */.  int nRoot 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a5c0: 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75 66 66  of bytes in buff
a5d0: 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20  er zRoot */.){. 
a5e0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a5f0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Stmt;.  int rc =
a600: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
a610: 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49  SQL_INSERT_SEGDI
a620: 52 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  R, &pStmt, 0);. 
a630: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a640: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
a650: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
a660: 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20  , 1, iLevel);.  
a670: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
a680: 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20 69 49 64  nt(pStmt, 2, iId
a690: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
a6a0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
a6b0: 2c 20 33 2c 20 69 53 74 61 72 74 42 6c 6f 63 6b  , 3, iStartBlock
a6c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
a6d0: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
a6e0: 20 34 2c 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63   4, iLeafEndBloc
a6f0: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  k);.    sqlite3_
a700: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
a710: 2c 20 35 2c 20 69 45 6e 64 42 6c 6f 63 6b 29 3b  , 5, iEndBlock);
a720: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
a730: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 36 2c  d_blob(pStmt, 6,
a740: 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 53   zRoot, nRoot, S
a750: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
a760: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
a770: 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d  pStmt);.    rc =
a780: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
a790: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Stmt);.  }.  ret
a7a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a7b0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
a7c0: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70   of the common p
a7d0: 72 65 66 69 78 20 28 69 66 20 61 6e 79 29 20 73  refix (if any) s
a7e0: 68 61 72 65 64 20 62 79 20 7a 50 72 65 76 20 61  hared by zPrev a
a7f0: 6e 64 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69 6e 20  nd.** zNext, in 
a800: 62 79 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  bytes. For examp
a810: 6c 65 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73  le, .**.**   fts
a820: 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
a830: 22 61 62 63 22 2c 20 33 2c 20 22 61 62 63 64 65  "abc", 3, "abcde
a840: 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75  f", 6)   // retu
a850: 72 6e 73 20 33 0a 2a 2a 20 20 20 66 74 73 33 50  rns 3.**   fts3P
a860: 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61  refixCompress("a
a870: 62 58 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22  bX", 3, "abcdef"
a880: 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e  , 6)   // return
a890: 73 20 32 0a 2a 2a 20 20 20 66 74 73 33 50 72 65  s 2.**   fts3Pre
a8a0: 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58  fixCompress("abX
a8b0: 22 2c 20 33 2c 20 22 58 62 63 64 65 66 22 2c 20  ", 3, "Xbcdef", 
a8c0: 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20  6)   // returns 
a8d0: 30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  0.*/.static int 
a8e0: 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
a8f0: 73 73 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ss(.  const char
a900: 20 2a 7a 50 72 65 76 2c 20 20 20 20 20 20 20 20   *zPrev,        
a910: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
a920: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69  containing previ
a930: 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ous term */.  in
a940: 74 20 6e 50 72 65 76 2c 20 20 20 20 20 20 20 20  t nPrev,        
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a960: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
a970: 7a 50 72 65 76 20 69 6e 20 62 79 74 65 73 20 2a  zPrev in bytes *
a980: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
a990: 7a 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  zNext,          
a9a0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
a9b0: 6e 74 61 69 6e 69 6e 67 20 6e 65 78 74 20 74 65  ntaining next te
a9c0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 78  rm */.  int nNex
a9d0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
a9e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a9f0: 6f 66 20 62 75 66 66 65 72 20 7a 4e 65 78 74 20  of buffer zNext 
aa00: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
aa10: 20 69 6e 74 20 6e 3b 0a 20 20 55 4e 55 53 45 44   int n;.  UNUSED
aa20: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 65 78 74  _PARAMETER(nNext
aa30: 29 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  );.  for(n=0; n<
aa40: 6e 50 72 65 76 20 26 26 20 7a 50 72 65 76 5b 6e  nPrev && zPrev[n
aa50: 5d 3d 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e 2b 2b  ]==zNext[n]; n++
aa60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
aa70: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 65 72 6d  ../*.** Add term
aa80: 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 20 53 65   zTerm to the Se
aa90: 67 6d 65 6e 74 4e 6f 64 65 2e 20 49 74 20 69 73  gmentNode. It is
aaa0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
aab0: 20 7a 54 65 72 6d 20 69 73 20 6c 61 72 67 65 72   zTerm is larger
aac0: 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74  .** (according t
aad0: 6f 20 6d 65 6d 63 6d 70 29 20 74 68 61 6e 20 74  o memcmp) than t
aae0: 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
aaf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ab00: 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28  fts3NodeAddTerm(
ab10: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab30: 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
ab40: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d  handle */.  Segm
ab50: 65 6e 74 4e 6f 64 65 20 2a 2a 70 70 54 72 65 65  entNode **ppTree
ab60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
ab70: 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74 4e 6f  N/OUT: SegmentNo
ab80: 64 65 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20  de handle */ .  
ab90: 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20  int isCopyTerm, 
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 2f 2a 20 54 72 75 65 20 69 66 20 7a 54 65 72 6d  /* True if zTerm
abc0: 2f 6e 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69  /nTerm is transi
abd0: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
abe0: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
abf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
ac00: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
ac10: 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f  ntaining term */
ac20: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  .  int nTerm    
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
ac50: 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  rm in bytes */.)
ac60: 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  {.  SegmentNode 
ac70: 2a 70 54 72 65 65 20 3d 20 2a 70 70 54 72 65 65  *pTree = *ppTree
ac80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 53 65  ;.  int rc;.  Se
ac90: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 4e 65 77 3b  gmentNode *pNew;
aca0: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79  ..  /* First try
acb0: 20 74 6f 20 61 70 70 65 6e 64 20 74 68 65 20 74   to append the t
acc0: 65 72 6d 20 74 6f 20 74 68 65 20 63 75 72 72 65  erm to the curre
acd0: 6e 74 20 6e 6f 64 65 2e 20 52 65 74 75 72 6e 20  nt node. Return 
ace0: 65 61 72 6c 79 20 69 66 20 0a 20 20 2a 2a 20 74  early if .  ** t
acf0: 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2e  his is possible.
ad00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 72 65  .  */.  if( pTre
ad10: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 61  e ){.    int nDa
ad20: 74 61 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74  ta = pTree->nDat
ad30: 61 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  a;     /* Curren
ad40: 74 20 73 69 7a 65 20 6f 66 20 6e 6f 64 65 20 69  t size of node i
ad50: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
ad60: 6e 74 20 6e 52 65 71 20 3d 20 6e 44 61 74 61 3b  nt nReq = nData;
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad80: 52 65 71 75 69 72 65 64 20 73 70 61 63 65 20 61  Required space a
ad90: 66 74 65 72 20 61 64 64 69 6e 67 20 7a 54 65 72  fter adding zTer
ada0: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 72  m */.    int nPr
adb0: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
adc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
add0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 72 65   of bytes of pre
ade0: 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  fix compression 
adf0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 66 66  */.    int nSuff
ae00: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
ae10: 20 20 20 20 20 2f 2a 20 53 75 66 66 69 78 20 6c       /* Suffix l
ae20: 65 6e 67 74 68 20 2a 2f 0a 0a 20 20 20 20 6e 50  ength */..    nP
ae30: 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 65 66  refix = fts3Pref
ae40: 69 78 43 6f 6d 70 72 65 73 73 28 70 54 72 65 65  ixCompress(pTree
ae50: 2d 3e 7a 54 65 72 6d 2c 20 70 54 72 65 65 2d 3e  ->zTerm, pTree->
ae60: 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  nTerm, zTerm, nT
ae70: 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66 66 69  erm);.    nSuffi
ae80: 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69  x = nTerm-nPrefi
ae90: 78 3b 0a 0a 20 20 20 20 6e 52 65 71 20 2b 3d 20  x;..    nReq += 
aea0: 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
aeb0: 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 2b 73 71  tLen(nPrefix)+sq
aec0: 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
aed0: 65 6e 28 6e 53 75 66 66 69 78 29 2b 6e 53 75 66  en(nSuffix)+nSuf
aee0: 66 69 78 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  fix;.    if( nRe
aef0: 71 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20  q<=p->nNodeSize 
af00: 7c 7c 20 21 70 54 72 65 65 2d 3e 7a 54 65 72 6d  || !pTree->zTerm
af10: 20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e   ){..      if( n
af20: 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  Req>p->nNodeSize
af30: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
af40: 6e 20 75 6e 75 73 75 61 6c 20 63 61 73 65 3a 20  n unusual case: 
af50: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
af60: 74 20 74 65 72 6d 20 74 6f 20 62 65 20 61 64 64  t term to be add
af70: 65 64 20 74 6f 20 74 68 65 20 6e 6f 64 65 0a 20  ed to the node. 
af80: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68         ** and th
af90: 65 20 73 74 61 74 69 63 20 6e 6f 64 65 20 62 75  e static node bu
afa0: 66 66 65 72 20 28 70 2d 3e 6e 4e 6f 64 65 53 69  ffer (p->nNodeSi
afb0: 7a 65 20 62 79 74 65 73 29 20 69 73 20 6e 6f 74  ze bytes) is not
afc0: 20 6c 61 72 67 65 0a 20 20 20 20 20 20 20 20 2a   large.        *
afd0: 2a 20 65 6e 6f 75 67 68 2e 20 55 73 65 20 61 20  * enough. Use a 
afe0: 73 65 70 61 72 61 74 65 6c 79 20 6d 61 6c 6c 6f  separately mallo
aff0: 63 65 64 20 62 75 66 66 65 72 20 69 6e 73 74 65  ced buffer inste
b000: 61 64 20 54 68 69 73 20 77 61 73 74 65 73 0a 20  ad This wastes. 
b010: 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6e 4e 6f         ** p->nNo
b020: 64 65 53 69 7a 65 20 62 79 74 65 73 2c 20 62 75  deSize bytes, bu
b030: 74 20 73 69 6e 63 65 20 74 68 69 73 20 73 63 65  t since this sce
b040: 6e 61 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d 65 73  nario only comes
b050: 20 61 62 6f 75 74 20 77 68 65 6e 0a 20 20 20 20   about when.    
b060: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
b070: 61 73 65 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20  ase contain two 
b080: 74 65 72 6d 73 20 74 68 61 74 20 73 68 61 72 65  terms that share
b090: 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6c 6d   a prefix of alm
b0a0: 6f 73 74 20 32 4b 42 2c 20 0a 20 20 20 20 20 20  ost 2KB, .      
b0b0: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74    ** this is not
b0c0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20   expected to be 
b0d0: 61 20 73 65 72 69 6f 75 73 20 70 72 6f 62 6c 65  a serious proble
b0e0: 6d 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  m. .        */. 
b0f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b100: 54 72 65 65 2d 3e 61 44 61 74 61 3d 3d 28 63 68  Tree->aData==(ch
b110: 61 72 20 2a 29 26 70 54 72 65 65 5b 31 5d 20 29  ar *)&pTree[1] )
b120: 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d  ;.        pTree-
b130: 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a  >aData = (char *
b140: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
b150: 6e 52 65 71 29 3b 0a 20 20 20 20 20 20 20 20 69  nReq);.        i
b160: 66 28 20 21 70 54 72 65 65 2d 3e 61 44 61 74 61  f( !pTree->aData
b170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
b180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b190: 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
b1a0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
b1b0: 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a  pTree->zTerm ){.
b1c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
b1d0: 20 69 73 20 6e 6f 20 70 72 65 66 69 78 2d 6c 65   is no prefix-le
b1e0: 6e 67 74 68 20 66 69 65 6c 64 20 66 6f 72 20 66  ngth field for f
b1f0: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 61 20 6e  irst term in a n
b200: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  ode */.        n
b210: 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46  Data += sqlite3F
b220: 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54  ts3PutVarint(&pT
b230: 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ree->aData[nData
b240: 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 20  ], nPrefix);.   
b250: 20 20 20 7d 0a 0a 20 20 20 20 20 20 6e 44 61 74     }..      nDat
b260: 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
b270: 50 75 74 56 61 72 69 6e 74 28 26 70 54 72 65 65  PutVarint(&pTree
b280: 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
b290: 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20  nSuffix);.      
b2a0: 6d 65 6d 63 70 79 28 26 70 54 72 65 65 2d 3e 61  memcpy(&pTree->a
b2b0: 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54  Data[nData], &zT
b2c0: 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53  erm[nPrefix], nS
b2d0: 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 70 54  uffix);.      pT
b2e0: 72 65 65 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61  ree->nData = nDa
b2f0: 74 61 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20  ta + nSuffix;.  
b300: 20 20 20 20 70 54 72 65 65 2d 3e 6e 45 6e 74 72      pTree->nEntr
b310: 79 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  y++;..      if( 
b320: 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20  isCopyTerm ){.  
b330: 20 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d        if( pTree-
b340: 3e 6e 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d 20 29  >nMalloc<nTerm )
b350: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
b360: 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *zNew = sqlite3
b370: 5f 72 65 61 6c 6c 6f 63 28 70 54 72 65 65 2d 3e  _realloc(pTree->
b380: 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32  zMalloc, nTerm*2
b390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
b3a0: 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !zNew ){.      
b3b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b3c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
b3d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b3e0: 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 20   pTree->nMalloc 
b3f0: 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20  = nTerm*2;.     
b400: 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c       pTree->zMal
b410: 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  loc = zNew;.    
b420: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
b430: 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 70 54 72  ree->zTerm = pTr
b440: 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20  ee->zMalloc;.   
b450: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 72 65       memcpy(pTre
b460: 65 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  e->zTerm, zTerm,
b470: 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   nTerm);.       
b480: 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20   pTree->nTerm = 
b490: 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  nTerm;.      }el
b4a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 65  se{.        pTre
b4b0: 65 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72  e->zTerm = (char
b4c0: 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20   *)zTerm;.      
b4d0: 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d    pTree->nTerm =
b4e0: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   nTerm;.      }.
b4f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b500: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
b510: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
b520: 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65 72 65  ol flows to here
b530: 2c 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  , it was not pos
b540: 73 69 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  sible to append 
b550: 7a 54 65 72 6d 20 74 6f 20 74 68 65 0a 20 20 2a  zTerm to the.  *
b560: 2a 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20  * current node. 
b570: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6e 6f 64  Create a new nod
b580: 65 20 28 61 20 72 69 67 68 74 2d 73 69 62 6c 69  e (a right-sibli
b590: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
b5a0: 74 20 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20 49 66  t node)..  ** If
b5b0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
b5c0: 73 74 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74  st node in the t
b5d0: 72 65 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73  ree, the term is
b5e0: 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 20 20   added to it..  
b5f0: 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  **.  ** Otherwis
b600: 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  e, the term is n
b610: 6f 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ot added to the 
b620: 6e 65 77 20 6e 6f 64 65 2c 20 69 74 20 69 73 20  new node, it is 
b630: 6c 65 66 74 20 65 6d 70 74 79 20 66 6f 72 0a 20  left empty for. 
b640: 20 2a 2a 20 6e 6f 77 2e 20 49 6e 73 74 65 61 64   ** now. Instead
b650: 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 69 6e  , the term is in
b660: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
b670: 70 61 72 65 6e 74 20 6f 66 20 70 54 72 65 65 2e  parent of pTree.
b680: 20 49 66 20 70 54 72 65 65 20 0a 20 20 2a 2a 20   If pTree .  ** 
b690: 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 2c 20 6f  has no parent, o
b6a0: 6e 65 20 69 73 20 63 72 65 61 74 65 64 20 68 65  ne is created he
b6b0: 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65 77 20  re..  */.  pNew 
b6c0: 3d 20 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a  = (SegmentNode *
b6d0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
b6e0: 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f  sizeof(SegmentNo
b6f0: 64 65 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65 53 69  de) + p->nNodeSi
b700: 7a 65 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77  ze);.  if( !pNew
b710: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b720: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
b730: 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
b740: 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  0, sizeof(Segmen
b750: 74 4e 6f 64 65 29 29 3b 0a 20 20 70 4e 65 77 2d  tNode));.  pNew-
b760: 3e 6e 44 61 74 61 20 3d 20 31 20 2b 20 46 54 53  >nData = 1 + FTS
b770: 33 5f 56 41 52 49 4e 54 5f 4d 41 58 3b 0a 20 20  3_VARINT_MAX;.  
b780: 70 4e 65 77 2d 3e 61 44 61 74 61 20 3d 20 28 63  pNew->aData = (c
b790: 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  har *)&pNew[1];.
b7a0: 0a 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a  .  if( pTree ){.
b7b0: 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20      SegmentNode 
b7c0: 2a 70 50 61 72 65 6e 74 20 3d 20 70 54 72 65 65  *pParent = pTree
b7d0: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 72  ->pParent;.    r
b7e0: 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54  c = fts3NodeAddT
b7f0: 65 72 6d 28 70 2c 20 26 70 50 61 72 65 6e 74 2c  erm(p, &pParent,
b800: 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65   isCopyTerm, zTe
b810: 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
b820: 69 66 28 20 70 54 72 65 65 2d 3e 70 50 61 72 65  if( pTree->pPare
b830: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nt==0 ){.      p
b840: 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Tree->pParent = 
b850: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 20  pParent;.    }. 
b860: 20 20 20 70 54 72 65 65 2d 3e 70 52 69 67 68 74     pTree->pRight
b870: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
b880: 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70  w->pLeftmost = p
b890: 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b  Tree->pLeftmost;
b8a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 65  .    pNew->pPare
b8b0: 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  nt = pParent;.  
b8c0: 20 20 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f 63 20    pNew->zMalloc 
b8d0: 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63  = pTree->zMalloc
b8e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4d 61 6c  ;.    pNew->nMal
b8f0: 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 6e 4d 61  loc = pTree->nMa
b900: 6c 6c 6f 63 3b 0a 20 20 20 20 70 54 72 65 65 2d  lloc;.    pTree-
b910: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
b920: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
b930: 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 4e 65  >pLeftmost = pNe
b940: 77 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  w;.    rc = fts3
b950: 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26  NodeAddTerm(p, &
b960: 70 4e 65 77 2c 20 69 73 43 6f 70 79 54 65 72 6d  pNew, isCopyTerm
b970: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
b980: 20 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 72 65 65   .  }..  *ppTree
b990: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
b9a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  n rc;.}../*.** H
b9b0: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
b9c0: 6f 72 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65  or fts3NodeWrite
b9d0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
b9e0: 74 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68  t fts3TreeFinish
b9f0: 4e 6f 64 65 28 0a 20 20 53 65 67 6d 65 6e 74 4e  Node(.  SegmentN
ba00: 6f 64 65 20 2a 70 54 72 65 65 2c 20 0a 20 20 69  ode *pTree, .  i
ba10: 6e 74 20 69 48 65 69 67 68 74 2c 20 0a 20 20 73  nt iHeight, .  s
ba20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
ba30: 66 74 43 68 69 6c 64 0a 29 7b 0a 20 20 69 6e 74  ftChild.){.  int
ba40: 20 6e 53 74 61 72 74 3b 0a 20 20 61 73 73 65 72   nStart;.  asser
ba50: 74 28 20 69 48 65 69 67 68 74 3e 3d 31 20 26 26  t( iHeight>=1 &&
ba60: 20 69 48 65 69 67 68 74 3c 31 32 38 20 29 3b 0a   iHeight<128 );.
ba70: 20 20 6e 53 74 61 72 74 20 3d 20 46 54 53 33 5f    nStart = FTS3_
ba80: 56 41 52 49 4e 54 5f 4d 41 58 20 2d 20 73 71 6c  VARINT_MAX - sql
ba90: 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
baa0: 6e 28 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20  n(iLeftChild);. 
bab0: 20 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53   pTree->aData[nS
bac0: 74 61 72 74 5d 20 3d 20 28 63 68 61 72 29 69 48  tart] = (char)iH
bad0: 65 69 67 68 74 3b 0a 20 20 73 71 6c 69 74 65 33  eight;.  sqlite3
bae0: 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
baf0: 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61  Tree->aData[nSta
bb00: 72 74 2b 31 5d 2c 20 69 4c 65 66 74 43 68 69 6c  rt+1], iLeftChil
bb10: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 53 74  d);.  return nSt
bb20: 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  art;.}../*.** Wr
bb30: 69 74 65 20 74 68 65 20 62 75 66 66 65 72 20 66  ite the buffer f
bb40: 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6e  or the segment n
bb50: 6f 64 65 20 70 54 72 65 65 20 61 6e 64 20 61 6c  ode pTree and al
bb60: 6c 20 6f 66 20 69 74 73 20 70 65 65 72 73 20 74  l of its peers t
bb70: 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
bb80: 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 74 68 69  e. Then call thi
bb90: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 63 75 72  s function recur
bba0: 73 69 76 65 6c 79 20 74 6f 20 77 72 69 74 65 20  sively to write 
bbb0: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 0a 2a  the parent of .*
bbc0: 2a 20 70 54 72 65 65 20 61 6e 64 20 69 74 73 20  * pTree and its 
bbd0: 70 65 65 72 73 20 74 6f 20 74 68 65 20 64 61 74  peers to the dat
bbe0: 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  abase. .**.** Ex
bbf0: 63 65 70 74 2c 20 69 66 20 70 54 72 65 65 20 69  cept, if pTree i
bc00: 73 20 61 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 64  s a root node, d
bc10: 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74  o not write it t
bc20: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
bc30: 49 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 65 74 20  Instead,.** set 
bc40: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
bc50: 20 2a 70 61 52 6f 6f 74 20 61 6e 64 20 2a 70 6e   *paRoot and *pn
bc60: 52 6f 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20  Root to contain 
bc70: 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a  the root node..*
bc80: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
bc90: 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
bca0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75   returned and ou
bcb0: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
bcc0: 69 4c 61 73 74 20 69 73 0a 2a 2a 20 73 65 74 20  iLast is.** set 
bcd0: 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 62  to the largest b
bce0: 6c 6f 63 6b 69 64 20 77 72 69 74 74 65 6e 20 74  lockid written t
bcf0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
bd00: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 2a 2a  or zero if no.**
bd10: 20 62 6c 6f 63 6b 73 20 77 65 72 65 20 77 72 69   blocks were wri
bd20: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 62 29 2e  tten to the db).
bd30: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
bd40: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
bd50: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
bd60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd70: 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20  fts3NodeWrite(. 
bd80: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
bdb0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65  e handle */.  Se
bdc0: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
bdd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
bde0: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e   SegmentNode han
bdf0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65  dle */.  int iHe
be00: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
be10: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67           /* Heig
be20: 68 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20  ht of this node 
be30: 69 6e 20 74 72 65 65 20 2a 2f 0a 20 20 73 71 6c  in tree */.  sql
be40: 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66  ite3_int64 iLeaf
be50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
be60: 42 6c 6f 63 6b 20 69 64 20 6f 66 20 66 69 72 73  Block id of firs
be70: 74 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20  t leaf node */. 
be80: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
be90: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
bea0: 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20   /* Block id of 
beb0: 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69  next free slot i
bec0: 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  n %_segments */.
bed0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
bee0: 2a 70 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20  *piLast,        
bef0: 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20    /* OUT: Block 
bf00: 69 64 20 6f 66 20 6c 61 73 74 20 65 6e 74 72 79  id of last entry
bf10: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63 68   written */.  ch
bf20: 61 72 20 2a 2a 70 61 52 6f 6f 74 2c 20 20 20 20  ar **paRoot,    
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf40: 20 4f 55 54 3a 20 44 61 74 61 20 66 6f 72 20 72   OUT: Data for r
bf50: 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  oot node */.  in
bf60: 74 20 2a 70 6e 52 6f 6f 74 20 20 20 20 20 20 20  t *pnRoot       
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf80: 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 72 6f   OUT: Size of ro
bf90: 6f 74 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73  ot node in bytes
bfa0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
bfb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bfc0: 69 66 28 20 21 70 54 72 65 65 2d 3e 70 50 61 72  if( !pTree->pPar
bfd0: 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f  ent ){.    /* Ro
bfe0: 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 74  ot node of the t
bff0: 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
c000: 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54 72 65  nStart = fts3Tre
c010: 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 54 72 65  eFinishNode(pTre
c020: 65 2c 20 69 48 65 69 67 68 74 2c 20 69 4c 65 61  e, iHeight, iLea
c030: 66 29 3b 0a 20 20 20 20 2a 70 69 4c 61 73 74 20  f);.    *piLast 
c040: 3d 20 69 46 72 65 65 2d 31 3b 0a 20 20 20 20 2a  = iFree-1;.    *
c050: 70 6e 52 6f 6f 74 20 3d 20 70 54 72 65 65 2d 3e  pnRoot = pTree->
c060: 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a  nData - nStart;.
c070: 20 20 20 20 2a 70 61 52 6f 6f 74 20 3d 20 26 70      *paRoot = &p
c080: 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61  Tree->aData[nSta
c090: 72 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rt];.  }else{.  
c0a0: 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
c0b0: 49 74 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  Iter;.    sqlite
c0c0: 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 46 72 65  3_int64 iNextFre
c0d0: 65 20 3d 20 69 46 72 65 65 3b 0a 20 20 20 20 73  e = iFree;.    s
c0e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65  qlite3_int64 iNe
c0f0: 78 74 4c 65 61 66 20 3d 20 69 4c 65 61 66 3b 0a  xtLeaf = iLeaf;.
c100: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 54      for(pIter=pT
c110: 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 20  ree->pLeftmost; 
c120: 70 49 74 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  pIter && rc==SQL
c130: 49 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d 70 49  ITE_OK; pIter=pI
c140: 74 65 72 2d 3e 70 52 69 67 68 74 29 7b 0a 20 20  ter->pRight){.  
c150: 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d      int nStart =
c160: 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e   fts3TreeFinishN
c170: 6f 64 65 28 70 49 74 65 72 2c 20 69 48 65 69 67  ode(pIter, iHeig
c180: 68 74 2c 20 69 4e 65 78 74 4c 65 61 66 29 3b 0a  ht, iNextLeaf);.
c190: 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
c1a0: 20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20   = pIter->nData 
c1b0: 2d 20 6e 53 74 61 72 74 3b 0a 20 20 0a 20 20 20  - nStart;.  .   
c1c0: 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74     rc = fts3Writ
c1d0: 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 78  eSegment(p, iNex
c1e0: 74 46 72 65 65 2c 20 26 70 49 74 65 72 2d 3e 61  tFree, &pIter->a
c1f0: 44 61 74 61 5b 6e 53 74 61 72 74 5d 2c 20 6e 57  Data[nStart], nW
c200: 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 4e 65  rite);.      iNe
c210: 78 74 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20  xtFree++;.      
c220: 69 4e 65 78 74 4c 65 61 66 20 2b 3d 20 28 70 49  iNextLeaf += (pI
c230: 74 65 72 2d 3e 6e 45 6e 74 72 79 2b 31 29 3b 0a  ter->nEntry+1);.
c240: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
c250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c260: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4e 65       assert( iNe
c270: 78 74 4c 65 61 66 3d 3d 69 46 72 65 65 20 29 3b  xtLeaf==iFree );
c280: 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
c290: 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 20 20 20  NodeWrite(.     
c2a0: 20 20 20 20 20 70 2c 20 70 54 72 65 65 2d 3e 70       p, pTree->p
c2b0: 50 61 72 65 6e 74 2c 20 69 48 65 69 67 68 74 2b  Parent, iHeight+
c2c0: 31 2c 20 69 46 72 65 65 2c 20 69 4e 65 78 74 46  1, iFree, iNextF
c2d0: 72 65 65 2c 20 70 69 4c 61 73 74 2c 20 70 61 52  ree, piLast, paR
c2e0: 6f 6f 74 2c 20 70 6e 52 6f 6f 74 0a 20 20 20 20  oot, pnRoot.    
c2f0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
c300: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c310: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
c320: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
c330: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
c340: 68 20 74 68 65 20 74 72 65 65 20 70 54 72 65 65  h the tree pTree
c350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c360: 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28 53 65   fts3NodeFree(Se
c370: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
c380: 29 7b 0a 20 20 69 66 28 20 70 54 72 65 65 20 29  ){.  if( pTree )
c390: 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64  {.    SegmentNod
c3a0: 65 20 2a 70 20 3d 20 70 54 72 65 65 2d 3e 70 4c  e *p = pTree->pL
c3b0: 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 66 74 73  eftmost;.    fts
c3c0: 33 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70 50 61  3NodeFree(p->pPa
c3d0: 72 65 6e 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  rent);.    while
c3e0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 53 65 67  ( p ){.      Seg
c3f0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67 68 74  mentNode *pRight
c400: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
c410: 20 20 20 20 69 66 28 20 70 2d 3e 61 44 61 74 61      if( p->aData
c420: 21 3d 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 20  !=(char *)&p[1] 
c430: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c440: 65 33 5f 66 72 65 65 28 70 2d 3e 61 44 61 74 61  e3_free(p->aData
c450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c460: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 3d   assert( pRight=
c470: 3d 30 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  =0 || p->zMalloc
c480: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
c490: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4d 61  ite3_free(p->zMa
c4a0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 73 71 6c  lloc);.      sql
c4b0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
c4c0: 20 20 20 20 70 20 3d 20 70 52 69 67 68 74 3b 0a      p = pRight;.
c4d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c4e0: 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f  ** Add a term to
c4f0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69   the segment bei
c500: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
c510: 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69  y the SegmentWri
c520: 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 2a 70  ter object.** *p
c530: 70 57 72 69 74 65 72 2e 20 57 68 65 6e 20 61 64  pWriter. When ad
c540: 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 74  ding the first t
c550: 65 72 6d 20 74 6f 20 61 20 73 65 67 6d 65 6e 74  erm to a segment
c560: 2c 20 2a 70 70 57 72 69 74 65 72 20 73 68 6f 75  , *ppWriter shou
c570: 6c 64 0a 2a 2a 20 62 65 20 70 61 73 73 65 64 20  ld.** be passed 
c580: 4e 55 4c 4c 2e 20 54 68 69 73 20 66 75 6e 63 74  NULL. This funct
c590: 69 6f 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74  ion will allocat
c5a0: 65 20 61 20 6e 65 77 20 53 65 67 6d 65 6e 74 57  e a new SegmentW
c5b0: 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  riter object.** 
c5c0: 61 6e 64 20 72 65 74 75 72 6e 20 69 74 20 76 69  and return it vi
c5d0: 61 20 74 68 65 20 69 6e 70 75 74 2f 6f 75 74 70  a the input/outp
c5e0: 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70 57  ut variable *ppW
c5f0: 72 69 74 65 72 20 69 6e 20 74 68 69 73 20 63 61  riter in this ca
c600: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  se..**.** If suc
c610: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
c620: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
c630: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
c640: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
c650: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c660: 74 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28  ts3SegWriterAdd(
c670: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
c6a0: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
c6b0: 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a  SegmentWriter **
c6c0: 70 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  ppWriter,       
c6d0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65  /* IN/OUT: Segme
c6e0: 6e 74 57 72 69 74 65 72 20 68 61 6e 64 6c 65 20  ntWriter handle 
c6f0: 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79  */ .  int isCopy
c700: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
c710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
c720: 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20 6d 75   buffer zTerm mu
c730: 73 74 20 62 65 20 63 6f 70 69 65 64 20 2a 2f 0a  st be copied */.
c740: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
c750: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
c760: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
c770: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
c780: 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  g term */.  int 
c790: 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c7b0: 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
c7c0: 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ytes */.  const 
c7d0: 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20  char *aDoclist, 
c7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
c7f0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
c800: 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73  ontaining doclis
c810: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  t */.  int nDocl
c820: 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
c830: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c840: 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
c850: 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  es */.){.  int n
c860: 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
c870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
c880: 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69  ze of term prefi
c890: 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  x in bytes */.  
c8a0: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 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 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
c8d0: 73 75 66 66 69 78 20 69 6e 20 62 79 74 65 73 20  suffix in bytes 
c8e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b 20 20  */.  int nReq;  
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c910: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
c920: 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 2a 2f   on leaf page */
c930: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
c940: 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70  SegmentWriter *p
c950: 57 72 69 74 65 72 20 3d 20 2a 70 70 57 72 69 74  Writer = *ppWrit
c960: 65 72 3b 0a 0a 20 20 69 66 28 20 21 70 57 72 69  er;..  if( !pWri
c970: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
c980: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
c990: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20  tmt *pStmt;..   
c9a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
c9b0: 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 73   SegmentWriter s
c9c0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
c9d0: 70 57 72 69 74 65 72 20 3d 20 28 53 65 67 6d 65  pWriter = (Segme
c9e0: 6e 74 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74  ntWriter *)sqlit
c9f0: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
ca00: 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29  (SegmentWriter))
ca10: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72 69 74  ;.    if( !pWrit
ca20: 65 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  er ) return SQLI
ca30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
ca40: 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c  mset(pWriter, 0,
ca50: 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57   sizeof(SegmentW
ca60: 72 69 74 65 72 29 29 3b 0a 20 20 20 20 2a 70 70  riter));.    *pp
ca70: 57 72 69 74 65 72 20 3d 20 70 57 72 69 74 65 72  Writer = pWriter
ca80: 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
ca90: 74 65 20 61 20 62 75 66 66 65 72 20 69 6e 20 77  te a buffer in w
caa0: 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61  hich to accumula
cab0: 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 70  te data */.    p
cac0: 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20  Writer->aData = 
cad0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
cae0: 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64 65 53  malloc(p->nNodeS
caf0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
cb00: 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20 29 20  Writer->aData ) 
cb10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cb20: 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72  MEM;.    pWriter
cb30: 2d 3e 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e 4e 6f  ->nSize = p->nNo
cb40: 64 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 20  deSize;..    /* 
cb50: 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 66 72  Find the next fr
cb60: 65 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20 74 68  ee blockid in th
cb70: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
cb80: 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
cb90: 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
cba0: 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f  L_NEXT_SEGMENTS_
cbb0: 49 44 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  ID, &pStmt, 0);.
cbc0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cbd0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
cbe0: 63 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  c;.    if( SQLIT
cbf0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
cc00: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
cc10: 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 72      pWriter->iFr
cc20: 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ee = sqlite3_col
cc30: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
cc40: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74   0);.      pWrit
cc50: 65 72 2d 3e 69 46 69 72 73 74 20 3d 20 70 57 72  er->iFirst = pWr
cc60: 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20  iter->iFree;.   
cc70: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
cc80: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
cc90: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
cca0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
ccb0: 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61 74 61   rc;.  }.  nData
ccc0: 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74   = pWriter->nDat
ccd0: 61 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d 20  a;..  nPrefix = 
cce0: 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
ccf0: 73 73 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  ss(pWriter->zTer
cd00: 6d 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72  m, pWriter->nTer
cd10: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
cd20: 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54  ;.  nSuffix = nT
cd30: 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20  erm-nPrefix;..  
cd40: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
cd50: 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65  w many bytes are
cd60: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
cd70: 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  s new entry */. 
cd80: 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46   nReq = sqlite3F
cd90: 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72  ts3VarintLen(nPr
cda0: 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20 76 61  efix) +    /* va
cdb0: 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rint containing 
cdc0: 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20  prefix size */. 
cdd0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61     sqlite3Fts3Va
cde0: 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29  rintLen(nSuffix)
cdf0: 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61   +         /* va
ce00: 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rint containing 
ce10: 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20  suffix size */. 
ce20: 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20 20 20     nSuffix +    
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
ce50: 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20  rm suffix */.   
ce60: 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
ce70: 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20  ntLen(nDoclist) 
ce80: 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  +        /* Size
ce90: 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   of doclist */. 
cea0: 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20     nDoclist;    
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
ced0: 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 0a 20  clist data */.. 
cee0: 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26 26 20   if( nData>0 && 
cef0: 6e 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e 6e 4e  nData+nReq>p->nN
cf00: 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  odeSize ){.    i
cf10: 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 54  nt rc;..    /* T
cf20: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
cf30: 6e 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20 57 72  node is full. Wr
cf40: 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
cf50: 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20  e database. */. 
cf60: 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74     rc = fts3Writ
cf70: 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69  eSegment(p, pWri
cf80: 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57  ter->iFree++, pW
cf90: 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 44  riter->aData, nD
cfa0: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ata);.    if( rc
cfb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
cfc0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f 2a  turn rc;..    /*
cfd0: 20 41 64 64 20 74 68 65 20 63 75 72 72 65 6e 74   Add the current
cfe0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 69 6e 74   term to the int
cff0: 65 72 69 6f 72 20 6e 6f 64 65 20 74 72 65 65 2e  erior node tree.
d000: 20 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20   The term added 
d010: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  to.    ** the in
d020: 74 65 72 69 6f 72 20 74 72 65 65 20 6d 75 73 74  terior tree must
d030: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
d040: 20 20 61 29 20 62 65 20 67 72 65 61 74 65 72 20    a) be greater 
d050: 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
d060: 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61   term on the lea
d070: 66 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74  f node just writ
d080: 74 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ten.    **      
d090: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
d0a0: 28 73 74 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65  (still available
d0b0: 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 7a 54 65   in pWriter->zTe
d0c0: 72 6d 29 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 0a  rm), and.    **.
d0d0: 20 20 20 20 2a 2a 20 20 20 62 29 20 62 65 20 6c      **   b) be l
d0e0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
d0f0: 6c 20 74 6f 20 74 68 65 20 74 65 72 6d 20 61 62  l to the term ab
d100: 6f 75 74 20 74 6f 20 62 65 20 61 64 64 65 64 20  out to be added 
d110: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
d120: 2a 20 20 20 20 20 20 6c 65 61 66 20 6e 6f 64 65  *      leaf node
d130: 20 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a   (zTerm/nTerm)..
d140: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
d150: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
d160: 20 6d 75 73 74 20 62 65 20 74 68 65 20 70 72 65   must be the pre
d170: 66 69 78 20 6f 66 20 7a 54 65 72 6d 20 31 20 62  fix of zTerm 1 b
d180: 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a  yte longer than.
d190: 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f      ** the commo
d1a0: 6e 20 70 72 65 66 69 78 20 28 69 66 20 61 6e 79  n prefix (if any
d1b0: 29 20 6f 66 20 7a 54 65 72 6d 20 61 6e 64 20 70  ) of zTerm and p
d1c0: 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20  Writer->zTerm.. 
d1d0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
d1e0: 28 20 6e 50 72 65 66 69 78 3c 6e 54 65 72 6d 20  ( nPrefix<nTerm 
d1f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  );.    rc = fts3
d200: 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26  NodeAddTerm(p, &
d210: 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 2c 20  pWriter->pTree, 
d220: 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72  isCopyTerm, zTer
d230: 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a 20  m, nPrefix+1);. 
d240: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d250: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
d260: 3b 0a 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  ;..    nData = 0
d270: 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e  ;.    pWriter->n
d280: 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 6e  Term = 0;..    n
d290: 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20  Prefix = 0;.    
d2a0: 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b  nSuffix = nTerm;
d2b0: 0a 20 20 20 20 6e 52 65 71 20 3d 20 31 20 2b 20  .    nReq = 1 + 
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d2e0: 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
d2f0: 67 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f  g prefix size */
d300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
d310: 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 54 65 72  s3VarintLen(nTer
d320: 6d 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  m) +         /* 
d330: 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
d340: 67 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f  g suffix size */
d350: 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 2b 20 20  .      nTerm +  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d380: 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20  Term suffix */. 
d390: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33       sqlite3Fts3
d3a0: 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69  VarintLen(nDocli
d3b0: 73 74 29 20 2b 20 20 20 20 20 20 2f 2a 20 53 69  st) +      /* Si
d3c0: 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f  ze of doclist */
d3d0: 0a 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b  .      nDoclist;
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d400: 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a  Doclist data */.
d410: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
d420: 20 62 75 66 66 65 72 20 63 75 72 72 65 6e 74 6c   buffer currentl
d430: 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 73 20 74  y allocated is t
d440: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 69  oo small for thi
d450: 73 20 65 6e 74 72 79 2c 20 72 65 61 6c 6c 6f 63  s entry, realloc
d460: 0a 20 20 2a 2a 20 74 68 65 20 62 75 66 66 65 72  .  ** the buffer
d470: 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 61 72 67   to make it larg
d480: 65 20 65 6e 6f 75 67 68 2e 0a 20 20 2a 2f 0a 20  e enough..  */. 
d490: 20 69 66 28 20 6e 52 65 71 3e 70 57 72 69 74 65   if( nReq>pWrite
d4a0: 72 2d 3e 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20  r->nSize ){.    
d4b0: 63 68 61 72 20 2a 61 4e 65 77 20 3d 20 73 71 6c  char *aNew = sql
d4c0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72  ite3_realloc(pWr
d4d0: 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 52 65  iter->aData, nRe
d4e0: 71 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65  q);.    if( !aNe
d4f0: 77 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  w ) return SQLIT
d500: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72  E_NOMEM;.    pWr
d510: 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 4e  iter->aData = aN
d520: 65 77 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  ew;.    pWriter-
d530: 3e 6e 53 69 7a 65 20 3d 20 6e 52 65 71 3b 0a 20  >nSize = nReq;. 
d540: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61   }.  assert( nDa
d550: 74 61 2b 6e 52 65 71 3c 3d 70 57 72 69 74 65 72  ta+nReq<=pWriter
d560: 2d 3e 6e 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a  ->nSize );..  /*
d570: 20 41 70 70 65 6e 64 20 74 68 65 20 70 72 65 66   Append the pref
d580: 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 74 65  ix-compressed te
d590: 72 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 20 74  rm and doclist t
d5a0: 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 2a 2f  o the buffer. */
d5b0: 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69  .  nData += sqli
d5c0: 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
d5d0: 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  (&pWriter->aData
d5e0: 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66 69 78  [nData], nPrefix
d5f0: 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71  );.  nData += sq
d600: 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
d610: 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  nt(&pWriter->aDa
d620: 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66  ta[nData], nSuff
d630: 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ix);.  memcpy(&p
d640: 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
d650: 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ata], &zTerm[nPr
d660: 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
d670: 0a 20 20 6e 44 61 74 61 20 2b 3d 20 6e 53 75 66  .  nData += nSuf
d680: 66 69 78 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20  fix;.  nData += 
d690: 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
d6a0: 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61  rint(&pWriter->a
d6b0: 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 44 6f  Data[nData], nDo
d6c0: 63 6c 69 73 74 29 3b 0a 20 20 6d 65 6d 63 70 79  clist);.  memcpy
d6d0: 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  (&pWriter->aData
d6e0: 5b 6e 44 61 74 61 5d 2c 20 61 44 6f 63 6c 69 73  [nData], aDoclis
d6f0: 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
d700: 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 20 3d  pWriter->nData =
d710: 20 6e 44 61 74 61 20 2b 20 6e 44 6f 63 6c 69 73   nData + nDoclis
d720: 74 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68  t;..  /* Save th
d730: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 73  e current term s
d740: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
d750: 20 75 73 65 64 20 74 6f 20 70 72 65 66 69 78 2d   used to prefix-
d760: 63 6f 6d 70 72 65 73 73 20 74 68 65 20 6e 65 78  compress the nex
d770: 74 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  t..  ** If the i
d780: 73 43 6f 70 79 54 65 72 6d 20 70 61 72 61 6d 65  sCopyTerm parame
d790: 74 65 72 20 69 73 20 74 72 75 65 2c 20 74 68 65  ter is true, the
d7a0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
d7b0: 6e 74 65 64 20 74 6f 20 62 79 0a 20 20 2a 2a 20  nted to by.  ** 
d7c0: 7a 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69 65  zTerm is transie
d7d0: 6e 74 2c 20 73 6f 20 74 61 6b 65 20 61 20 63 6f  nt, so take a co
d7e0: 70 79 20 6f 66 20 74 68 65 20 74 65 72 6d 20 64  py of the term d
d7f0: 61 74 61 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ata. Otherwise, 
d800: 6a 75 73 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20  just.  ** store 
d810: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
d820: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  inter..  */.  if
d830: 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a  ( isCopyTerm ){.
d840: 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3e 70 57      if( nTerm>pW
d850: 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 29  riter->nMalloc )
d860: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
d870: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
d880: 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 7a 4d  lloc(pWriter->zM
d890: 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b  alloc, nTerm*2);
d8a0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77  .      if( !zNew
d8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d8c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d8d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d8e0: 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20  Writer->nMalloc 
d8f0: 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20  = nTerm*2;.     
d900: 20 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f   pWriter->zMallo
d910: 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20  c = zNew;.      
d920: 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d  pWriter->zTerm =
d930: 20 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20   zNew;.    }.   
d940: 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
d950: 2d 3e 7a 54 65 72 6d 3d 3d 70 57 72 69 74 65 72  ->zTerm==pWriter
d960: 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20  ->zMalloc );.   
d970: 20 6d 65 6d 63 70 79 28 70 57 72 69 74 65 72 2d   memcpy(pWriter-
d980: 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e  >zTerm, zTerm, n
d990: 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Term);.  }else{.
d9a0: 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54 65      pWriter->zTe
d9b0: 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65  rm = (char *)zTe
d9c0: 72 6d 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65  rm;.  }.  pWrite
d9d0: 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d  r->nTerm = nTerm
d9e0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
d9f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
da00: 46 6c 75 73 68 20 61 6c 6c 20 64 61 74 61 20 61  Flush all data a
da10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
da20: 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  he SegmentWriter
da30: 20 6f 62 6a 65 63 74 20 70 57 72 69 74 65 72 20   object pWriter 
da40: 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
da50: 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
da60: 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  n must be called
da70: 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72 6d 73   after all terms
da80: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
da90: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 65 67 6d 65  .** to the segme
daa0: 6e 74 20 75 73 69 6e 67 20 66 74 73 33 53 65 67  nt using fts3Seg
dab0: 57 72 69 74 65 72 41 64 64 28 29 2e 20 49 66 20  WriterAdd(). If 
dac0: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
dad0: 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75  TE_OK is.** retu
dae0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
daf0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
db00: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
db10: 20 69 6e 74 20 66 74 73 33 53 65 67 57 72 69 74   int fts3SegWrit
db20: 65 72 46 6c 75 73 68 28 0a 20 20 46 74 73 33 54  erFlush(.  Fts3T
db30: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
db40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
db50: 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
db60: 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57  le */.  SegmentW
db70: 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
db80: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
db90: 6e 74 57 72 69 74 65 72 20 74 6f 20 66 6c 75 73  ntWriter to flus
dba0: 68 20 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20  h to the db */. 
dbb0: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 27 6c   /* Value for 'l
dbe0: 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel' column of 
dbf0: 25 5f 73 65 67 64 69 72 20 2a 2f 0a 20 20 69 6e  %_segdir */.  in
dc00: 74 20 69 49 64 78 20 20 20 20 20 20 20 20 20 20  t iIdx          
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc20: 20 56 61 6c 75 65 20 66 6f 72 20 27 69 64 78 27   Value for 'idx'
dc30: 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67   column of %_seg
dc40: 64 69 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  dir */.){.  int 
dc50: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
dc70: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
dc80: 69 66 28 20 70 57 72 69 74 65 72 2d 3e 70 54 72  if( pWriter->pTr
dc90: 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
dca0: 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 20 3d 20  3_int64 iLast = 
dcb0: 30 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65  0;      /* Large
dcc0: 73 74 20 62 6c 6f 63 6b 20 69 64 20 77 72 69 74  st block id writ
dcd0: 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
dce0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
dcf0: 6e 74 36 34 20 69 4c 61 73 74 4c 65 61 66 3b 20  nt64 iLastLeaf; 
dd00: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
dd10: 6c 65 61 66 20 62 6c 6f 63 6b 20 69 64 20 77 72  leaf block id wr
dd20: 69 74 74 65 6e 20 74 6f 20 64 62 20 2a 2f 0a 20  itten to db */. 
dd30: 20 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d     char *zRoot =
dd40: 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
dd50: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
dd60: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
dd70: 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
dd80: 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b    int nRoot = 0;
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
ddb0: 72 20 7a 52 6f 6f 74 20 2a 2f 0a 0a 20 20 20 20  r zRoot */..    
ddc0: 69 4c 61 73 74 4c 65 61 66 20 3d 20 70 57 72 69  iLastLeaf = pWri
ddd0: 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20  ter->iFree;.    
dde0: 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
ddf0: 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72  gment(p, pWriter
de00: 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72 69 74  ->iFree++, pWrit
de10: 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74  er->aData, pWrit
de20: 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20  er->nData);.    
de30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
de40: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
de50: 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 70 2c  fts3NodeWrite(p,
de60: 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 2c   pWriter->pTree,
de70: 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 70 57   1,.          pW
de80: 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c 20 70  riter->iFirst, p
de90: 57 72 69 74 65 72 2d 3e 69 46 72 65 65 2c 20 26  Writer->iFree, &
dea0: 69 4c 61 73 74 2c 20 26 7a 52 6f 6f 74 2c 20 26  iLast, &zRoot, &
deb0: 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nRoot);.    }.  
dec0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ded0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
dee0: 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69  = fts3WriteSegdi
def0: 72 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20  r(.          p, 
df00: 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 70 57  iLevel, iIdx, pW
df10: 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c 20 69  riter->iFirst, i
df20: 4c 61 73 74 4c 65 61 66 2c 20 69 4c 61 73 74 2c  LastLeaf, iLast,
df30: 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a   zRoot, nRoot);.
df40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
df50: 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
df60: 20 74 72 65 65 20 66 69 74 73 20 6f 6e 20 74 68   tree fits on th
df70: 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 57 72 69  e root node. Wri
df80: 74 65 20 69 74 20 74 6f 20 74 68 65 20 73 65 67  te it to the seg
df90: 64 69 72 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  dir table. */.  
dfa0: 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
dfb0: 53 65 67 64 69 72 28 0a 20 20 20 20 20 20 20 20  Segdir(.        
dfc0: 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c  p, iLevel, iIdx,
dfd0: 20 30 2c 20 30 2c 20 30 2c 20 70 57 72 69 74 65   0, 0, 0, pWrite
dfe0: 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74 65  r->aData, pWrite
dff0: 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20  r->nData);.  }. 
e000: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e010: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
e020: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
e030: 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65  the SegmentWrite
e040: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
e050: 61 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  as the .** first
e060: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
e070: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65  atic void fts3Se
e080: 67 57 72 69 74 65 72 46 72 65 65 28 53 65 67 6d  gWriterFree(Segm
e090: 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74  entWriter *pWrit
e0a0: 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74  er){.  if( pWrit
e0b0: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
e0c0: 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
e0d0: 61 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  aData);.    sqli
e0e0: 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
e0f0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
e100: 66 74 73 33 4e 6f 64 65 46 72 65 65 28 70 57 72  fts3NodeFree(pWr
e110: 69 74 65 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20  iter->pTree);.  
e120: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e130: 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  Writer);.  }.}..
e140: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
e150: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 70 56  value in the apV
e160: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73  al[] array is as
e170: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
e180: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20   an integer..** 
e190: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 65  This function te
e1a0: 73 74 73 20 69 66 20 74 68 65 72 65 20 65 78 69  sts if there exi
e1b0: 73 74 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73  st any documents
e1c0: 20 77 69 74 68 20 64 6f 63 69 64 20 76 61 6c 75   with docid valu
e1d0: 65 73 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 64  es that.** are d
e1e0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
e1f0: 61 74 20 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e  at integer. i.e.
e200: 20 69 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   if deleting the
e210: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64   document with d
e220: 6f 63 69 64 0a 2a 2a 20 61 70 56 61 6c 5b 30 5d  ocid.** apVal[0]
e230: 20 77 6f 75 6c 64 20 6d 65 61 6e 20 74 68 65 20   would mean the 
e240: 46 54 53 33 20 74 61 62 6c 65 20 77 65 72 65 20  FTS3 table were 
e250: 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
e260: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 73  successful, *pis
e270: 45 6d 70 74 79 20 69 73 20 73 65 74 20 74 6f 20  Empty is set to 
e280: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
e290: 65 20 69 73 20 65 6d 70 74 79 20 65 78 63 65 70  e is empty excep
e2a0: 74 20 66 6f 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e  t for.** documen
e2b0: 74 20 61 70 56 61 6c 5b 30 5d 2c 20 6f 72 20 66  t apVal[0], or f
e2c0: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2c 20  alse otherwise, 
e2d0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
e2e0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
e2f0: 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
e300: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
e310: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
e320: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e330: 74 20 66 74 73 33 49 73 45 6d 70 74 79 28 46 74  t fts3IsEmpty(Ft
e340: 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69  s3Table *p, sqli
e350: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
e360: 6c 2c 20 69 6e 74 20 2a 70 69 73 45 6d 70 74 79  l, int *pisEmpty
e370: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
e380: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
e390: 72 63 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53  rc;.  rc = fts3S
e3a0: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53  qlStmt(p, SQL_IS
e3b0: 5f 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c 20  _EMPTY, &pStmt, 
e3c0: 61 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  apVal);.  if( rc
e3d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e3e0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
e3f0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
e400: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
e410: 2a 70 69 73 45 6d 70 74 79 20 3d 20 73 71 6c 69  *pisEmpty = sqli
e420: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
e430: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
e440: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e450: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
e460: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
e470: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e  }../*.** Set *pn
e480: 53 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e  Segment to the n
e490: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
e4a0: 73 20 6f 66 20 6c 65 76 65 6c 20 69 4c 65 76 65  s of level iLeve
e4b0: 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  l in the databas
e4c0: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
e4d0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
e4e0: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
e4f0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
e500: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
e510: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65  ic int fts3Segme
e520: 6e 74 43 6f 75 6e 74 28 46 74 73 33 54 61 62 6c  ntCount(Fts3Tabl
e530: 65 20 2a 70 2c 20 69 6e 74 20 69 4c 65 76 65 6c  e *p, int iLevel
e540: 2c 20 69 6e 74 20 2a 70 6e 53 65 67 6d 65 6e 74  , int *pnSegment
e550: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
e560: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
e570: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rc;..  assert( i
e580: 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 20 20 72 63  Level>=0 );.  rc
e590: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
e5a0: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56  , SQL_SELECT_LEV
e5b0: 45 4c 5f 43 4f 55 4e 54 2c 20 26 70 53 74 6d 74  EL_COUNT, &pStmt
e5c0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
e5d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
e5e0: 72 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  rn rc;.  sqlite3
e5f0: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
e600: 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 69   1, iLevel);.  i
e610: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
e620: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
e630: 74 29 20 29 7b 0a 20 20 20 20 2a 70 6e 53 65 67  t) ){.    *pnSeg
e640: 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  ment = sqlite3_c
e650: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
e660: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
e670: 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  n sqlite3_reset(
e680: 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pStmt);.}../*.**
e690: 20 53 65 74 20 2a 70 6e 53 65 67 6d 65 6e 74 20   Set *pnSegment 
e6a0: 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
e6b0: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
e6c0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
e6d0: 20 53 65 74 0a 2a 2a 20 2a 70 6e 4d 61 78 20 74   Set.** *pnMax t
e6e0: 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 73 65  o the largest se
e6f0: 67 6d 65 6e 74 20 6c 65 76 65 6c 20 69 6e 20 74  gment level in t
e700: 68 65 20 64 61 74 61 62 61 73 65 20 28 73 65 67  he database (seg
e710: 6d 65 6e 74 20 6c 65 76 65 6c 73 0a 2a 2a 20 61  ment levels.** a
e720: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
e730: 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20   'level' column 
e740: 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  of the %_segdir 
e750: 74 61 62 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  table)..**.** Re
e760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
e770: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
e780: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
e790: 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f   code if not..*/
e7a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
e7b0: 53 65 67 6d 65 6e 74 43 6f 75 6e 74 4d 61 78 28  SegmentCountMax(
e7c0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e  Fts3Table *p, in
e7d0: 74 20 2a 70 6e 53 65 67 6d 65 6e 74 2c 20 69 6e  t *pnSegment, in
e7e0: 74 20 2a 70 6e 4d 61 78 29 7b 0a 20 20 73 71 6c  t *pnMax){.  sql
e7f0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
e800: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
e810: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
e820: 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45  p, SQL_SELECT_SE
e830: 47 44 49 52 5f 43 4f 55 4e 54 5f 4d 41 58 2c 20  GDIR_COUNT_MAX, 
e840: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
e850: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e860: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
e870: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
e880: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
e890: 74 29 20 29 7b 0a 20 20 20 20 2a 70 6e 53 65 67  t) ){.    *pnSeg
e8a0: 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  ment = sqlite3_c
e8b0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
e8c0: 20 30 29 3b 0a 20 20 20 20 2a 70 6e 4d 61 78 20   0);.    *pnMax 
e8d0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e8e0: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  _int(pStmt, 1);.
e8f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
e900: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
e910: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e920: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
e930: 64 20 61 66 74 65 72 20 6d 65 72 67 69 6e 67 20  d after merging 
e940: 6d 75 6c 74 69 70 6c 65 20 73 65 67 6d 65 6e 74  multiple segment
e950: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
e960: 6c 61 72 67 65 0a 2a 2a 20 73 65 67 6d 65 6e 74  large.** segment
e970: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6f   to delete the o
e980: 6c 64 2c 20 6e 6f 77 20 72 65 64 75 6e 64 61 6e  ld, now redundan
e990: 74 2c 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  t, segment b-tre
e9a0: 65 73 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  es. Specifically
e9b0: 2c 0a 2a 2a 20 69 74 3a 0a 2a 2a 20 0a 2a 2a 20  ,.** it:.** .** 
e9c0: 20 20 31 29 20 44 65 6c 65 74 65 73 20 61 6c 6c    1) Deletes all
e9d0: 20 25 5f 73 65 67 6d 65 6e 74 73 20 65 6e 74 72   %_segments entr
e9e0: 69 65 73 20 66 6f 72 20 74 68 65 20 73 65 67 6d  ies for the segm
e9f0: 65 6e 74 73 20 61 73 73 6f 63 69 61 74 65 64 20  ents associated 
ea00: 77 69 74 68 20 0a 2a 2a 20 20 20 20 20 20 65 61  with .**      ea
ea10: 63 68 20 6f 66 20 74 68 65 20 53 65 67 52 65 61  ch of the SegRea
ea20: 64 65 72 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  der objects in t
ea30: 68 65 20 61 72 72 61 79 20 70 61 73 73 65 64 20  he array passed 
ea40: 61 73 20 74 68 65 20 74 68 69 72 64 20 0a 2a 2a  as the third .**
ea50: 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74 2c 20        argument, 
ea60: 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 64  and.**.**   2) d
ea70: 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67  eletes all %_seg
ea80: 64 69 72 20 65 6e 74 72 69 65 73 20 77 69 74 68  dir entries with
ea90: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2c 20 6f   level iLevel, o
eaa0: 72 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 0a 2a  r all %_segdir.*
eab0: 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 72  *      entries r
eac0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6c 65 76  egardless of lev
ead0: 65 6c 20 69 66 20 28 69 4c 65 76 65 6c 3c 30 29  el if (iLevel<0)
eae0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
eaf0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
eb00: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 74 68   successful, oth
eb10: 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
eb20: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
eb30: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
eb40: 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20 20 46  eleteSegdir(.  F
eb50: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb70: 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
eb80: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
eb90: 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ebb0: 65 76 65 6c 20 6f 66 20 25 5f 73 65 67 64 69 72  evel of %_segdir
ebc0: 20 65 6e 74 72 69 65 73 20 74 6f 20 64 65 6c 65   entries to dele
ebd0: 74 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52  te */.  Fts3SegR
ebe0: 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e  eader **apSegmen
ebf0: 74 2c 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  t,      /* Array
ec00: 20 6f 66 20 53 65 67 52 65 61 64 65 72 20 6f 62   of SegReader ob
ec10: 6a 65 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  jects */.  int n
ec20: 52 65 61 64 65 72 20 20 20 20 20 20 20 20 20 20  Reader          
ec30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
ec40: 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 53 65  ze of array apSe
ec50: 67 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  gment */.){.  in
ec60: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ec80: 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
ec90: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
ecc0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  riable */.  sqli
ecd0: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
ece0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
ecf0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
ed00: 64 65 6c 65 74 65 20 72 6f 77 73 20 2a 2f 0a 0a  delete rows */..
ed10: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
ed20: 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45  mt(p, SQL_DELETE
ed30: 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c  _SEGMENTS_RANGE,
ed40: 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20   &pDelete, 0);. 
ed50: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
ed60: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 52 65  LITE_OK && i<nRe
ed70: 61 64 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ader; i++){.    
ed80: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
ed90: 53 65 67 6d 65 6e 74 20 3d 20 61 70 53 65 67 6d  Segment = apSegm
eda0: 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ent[i];.    if( 
edb0: 70 53 65 67 6d 65 6e 74 2d 3e 69 53 74 61 72 74  pSegment->iStart
edc0: 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73  Block ){.      s
edd0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
ede0: 34 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 70 53  4(pDelete, 1, pS
edf0: 65 67 6d 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c  egment->iStartBl
ee00: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ock);.      sqli
ee10: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
ee20: 44 65 6c 65 74 65 2c 20 32 2c 20 70 53 65 67 6d  Delete, 2, pSegm
ee30: 65 6e 74 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b  ent->iEndBlock);
ee40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
ee50: 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  tep(pDelete);.  
ee60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ee70: 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b  _reset(pDelete);
ee80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
ee90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
eea0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
eeb0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4c 65 76  .  }..  if( iLev
eec0: 65 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  el>=0 ){.    rc 
eed0: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
eee0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
eef0: 49 52 5f 42 59 5f 4c 45 56 45 4c 2c 20 26 70 44  IR_BY_LEVEL, &pD
ef00: 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69  elete, 0);.    i
ef10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ef20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ef30: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65  3_bind_int(pDele
ef40: 74 65 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a  te, 1, iLevel);.
ef50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
ef60: 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20  ep(pDelete);.   
ef70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ef80: 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a  reset(pDelete);.
ef90: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
efa0: 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26     fts3SqlExec(&
efb0: 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
efc0: 45 5f 41 4c 4c 5f 53 45 47 44 49 52 2c 20 30 29  E_ALL_SEGDIR, 0)
efd0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
efe0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  rc;.}../*.** Whe
eff0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
f000: 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 66 66 65  is called, buffe
f010: 72 20 2a 70 70 4c 69 73 74 20 28 73 69 7a 65 20  r *ppList (size 
f020: 2a 70 6e 4c 69 73 74 20 62 79 74 65 73 29 20 63  *pnList bytes) c
f030: 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20 70 6f  ontains .** a po
f040: 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74  sition list that
f050: 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e 6f 74   may (or may not
f060: 29 20 66 65 61 74 75 72 65 20 6d 75 6c 74 69 70  ) feature multip
f070: 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  le columns. This
f080: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 64 6a  .** function adj
f090: 75 73 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72  usts the pointer
f0a0: 20 2a 70 70 4c 69 73 74 20 61 6e 64 20 74 68 65   *ppList and the
f0b0: 20 6c 65 6e 67 74 68 20 2a 70 6e 4c 69 73 74 20   length *pnList 
f0c0: 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  so that they.** 
f0d0: 69 64 65 6e 74 69 66 79 20 74 68 65 20 73 75 62  identify the sub
f0e0: 73 65 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74  set of the posit
f0f0: 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 63 6f  ion list that co
f100: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 63 6f 6c  rresponds to col
f110: 75 6d 6e 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20  umn iCol..**.** 
f120: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
f130: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69  entries in the i
f140: 6e 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  nput position li
f150: 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43  st for column iC
f160: 6f 6c 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c  ol, then.** *pnL
f170: 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ist is set to ze
f180: 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ro before return
f190: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
f1a0: 6f 69 64 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69  oid fts3ColumnFi
f1b0: 6c 74 65 72 28 0a 20 20 69 6e 74 20 69 43 6f 6c  lter(.  int iCol
f1c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f1d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
f1e0: 6e 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a  n to filter on *
f1f0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4c 69 73  /.  char **ppLis
f200: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f210: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
f220: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69  ointer to positi
f230: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  on list */.  int
f240: 20 2a 70 6e 4c 69 73 74 20 20 20 20 20 20 20 20   *pnList        
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f260: 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  IN/OUT: Size of 
f270: 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74 20 69  buffer *ppList i
f280: 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
f290: 63 68 61 72 20 2a 70 4c 69 73 74 20 3d 20 2a 70  char *pList = *p
f2a0: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 4c 69  pList;.  int nLi
f2b0: 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b 0a 20 20  st = *pnList;.  
f2c0: 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 4c  char *pEnd = &pL
f2d0: 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20 20 69 6e  ist[nList];.  in
f2e0: 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a  t iCurrent = 0;.
f2f0: 20 20 63 68 61 72 20 2a 70 20 3d 20 70 4c 69 73    char *p = pLis
f300: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43  t;..  assert( iC
f310: 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  ol>=0 );.  while
f320: 28 20 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ( 1 ){.    char 
f330: 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  c = 0;.    while
f340: 28 20 70 3c 70 45 6e 64 20 26 26 20 28 63 20 7c  ( p<pEnd && (c |
f350: 20 2a 70 29 26 30 78 46 45 20 29 20 63 20 3d 20   *p)&0xFE ) c = 
f360: 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 0a  *p++ & 0x80;.  .
f370: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 69 43      if( iCol==iC
f380: 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  urrent ){.      
f390: 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 20  nList = (int)(p 
f3a0: 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  - pList);.      
f3b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
f3c0: 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69 6e 74 29    nList -= (int)
f3d0: 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20  (p - pList);.   
f3e0: 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20   pList = p;.    
f3f0: 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( nList==0 ){.
f400: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f410: 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 4c 69 73   }.    p = &pLis
f420: 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b 3d 20 73  t[1];.    p += s
f430: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
f440: 69 6e 74 33 32 28 70 2c 20 26 69 43 75 72 72 65  int32(p, &iCurre
f450: 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4c  nt);.  }..  *ppL
f460: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 2a  ist = pList;.  *
f470: 70 6e 4c 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a  pnList = nList;.
f480: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
f490: 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74 65  Fts3SegReaderIte
f4a0: 72 61 74 65 28 29 20 63 61 6c 6c 62 61 63 6b 20  rate() callback 
f4b0: 75 73 65 64 20 77 68 65 6e 20 6d 65 72 67 69 6e  used when mergin
f4c0: 67 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 73  g multiple .** s
f4d0: 65 67 6d 65 6e 74 73 20 74 6f 20 63 72 65 61 74  egments to creat
f4e0: 65 20 61 20 73 69 6e 67 6c 65 2c 20 6c 61 72 67  e a single, larg
f4f0: 65 72 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  er segment..*/.s
f500: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4d 65  tatic int fts3Me
f510: 72 67 65 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  rgeCallback(.  F
f520: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f540: 2a 20 46 54 53 33 20 56 69 72 74 75 61 6c 20 74  * FTS3 Virtual t
f550: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
f560: 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
f590: 65 67 6d 65 6e 74 57 72 69 74 65 72 2a 20 74 6f  egmentWriter* to
f5a0: 20 77 72 69 74 65 20 77 69 74 68 20 2a 2f 0a 20   write with */. 
f5b0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 2f 2a 20 54 65 72 6d 20 74 6f 20 77 72 69 74   /* Term to writ
f5e0: 65 20 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20  e to the db */. 
f5f0: 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
f620: 74 65 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a  tes in zTerm */.
f630: 20 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74    char *aDoclist
f640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f650: 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 61 73 73    /* Doclist ass
f660: 6f 63 69 61 74 65 64 20 77 69 74 68 20 7a 54 65  ociated with zTe
f670: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63  rm */.  int nDoc
f680: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
f690: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f6a0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 64 6f  r of bytes in do
f6b0: 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  clist */.){.  Se
f6c0: 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 70 70  gmentWriter **pp
f6d0: 57 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74  W = (SegmentWrit
f6e0: 65 72 20 2a 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  er **)pContext;.
f6f0: 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 65 67    return fts3Seg
f700: 57 72 69 74 65 72 41 64 64 28 70 2c 20 70 70 57  WriterAdd(p, ppW
f710: 2c 20 31 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  , 1, zTerm, nTer
f720: 6d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  m, aDoclist, nDo
f730: 63 6c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  clist);.}../*.**
f740: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
f750: 65 61 64 65 72 49 74 65 72 61 74 65 28 29 20 63  eaderIterate() c
f760: 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65  allback used whe
f770: 6e 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20 63  n flushing the c
f780: 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
f790: 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  e pending-terms 
f7a0: 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 74 68  hash table to th
f7b0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
f7c0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 46 6c  tatic int fts3Fl
f7d0: 75 73 68 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  ushCallback(.  F
f7e0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f800: 2a 20 46 54 53 33 20 56 69 72 74 75 61 6c 20 74  * FTS3 Virtual t
f810: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
f820: 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
f850: 65 67 6d 65 6e 74 57 72 69 74 65 72 2a 20 74 6f  egmentWriter* to
f860: 20 77 72 69 74 65 20 77 69 74 68 20 2a 2f 0a 20   write with */. 
f870: 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 2f 2a 20 54 65 72 6d 20 74 6f 20 77 72 69 74   /* Term to writ
f8a0: 65 20 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20  e to the db */. 
f8b0: 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
f8e0: 74 65 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a  tes in zTerm */.
f8f0: 20 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74    char *aDoclist
f900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f910: 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 61 73 73    /* Doclist ass
f920: 6f 63 69 61 74 65 64 20 77 69 74 68 20 7a 54 65  ociated with zTe
f930: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63  rm */.  int nDoc
f940: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
f950: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f960: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 64 6f  r of bytes in do
f970: 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  clist */.){.  Se
f980: 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 70 70  gmentWriter **pp
f990: 57 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74  W = (SegmentWrit
f9a0: 65 72 20 2a 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  er **)pContext;.
f9b0: 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 65 67    return fts3Seg
f9c0: 57 72 69 74 65 72 41 64 64 28 70 2c 20 70 70 57  WriterAdd(p, ppW
f9d0: 2c 20 30 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  , 0, zTerm, nTer
f9e0: 6d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  m, aDoclist, nDo
f9f0: 63 6c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  clist);.}../*.**
fa00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
fa10: 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
fa20: 65 20 74 68 72 6f 75 67 68 20 61 20 63 6f 6e 74  e through a cont
fa30: 69 67 75 6f 75 73 20 73 65 74 20 6f 66 20 74 65  iguous set of te
fa40: 72 6d 73 20 0a 2a 2a 20 73 74 6f 72 65 64 20 69  rms .** stored i
fa50: 6e 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  n the full-text 
fa60: 69 6e 64 65 78 2e 20 49 74 20 6d 65 72 67 65 73  index. It merges
fa70: 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 65 64 20   data contained 
fa80: 69 6e 20 6f 6e 65 20 6f 72 20 0a 2a 2a 20 6d 6f  in one or .** mo
fa90: 72 65 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 73  re segments to s
faa0: 75 70 70 6f 72 74 20 74 68 69 73 2e 0a 2a 2a 0a  upport this..**.
fab0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
fac0: 67 75 6d 65 6e 74 20 69 73 20 70 61 73 73 65 64  gument is passed
fad0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
fae0: 6e 74 65 72 73 20 74 6f 20 53 65 67 52 65 61 64  nters to SegRead
faf0: 65 72 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 61 6c  er objects.** al
fb00: 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73 71 6c  located with sql
fb10: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
fb20: 72 4e 65 77 28 29 2e 20 54 68 69 73 20 66 75 6e  rNew(). This fun
fb30: 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65  ction merges the
fb40: 20 72 61 6e 67 65 20 0a 2a 2a 20 6f 66 20 74 65   range .** of te
fb50: 72 6d 73 20 73 65 6c 65 63 74 65 64 20 62 79 20  rms selected by 
fb60: 65 61 63 68 20 53 65 67 52 65 61 64 65 72 2e 20  each SegReader. 
fb70: 49 66 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  If a single term
fb80: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a   is present in.*
fb90: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
fba0: 73 65 67 6d 65 6e 74 2c 20 74 68 65 20 61 73 73  segment, the ass
fbb0: 6f 63 69 61 74 65 64 20 64 6f 63 6c 69 73 74 73  ociated doclists
fbc0: 20 61 72 65 20 6d 65 72 67 65 64 2e 20 46 6f 72   are merged. For
fbd0: 20 65 61 63 68 0a 2a 2a 20 74 65 72 6d 20 61 6e   each.** term an
fbe0: 64 20 28 70 6f 73 73 69 62 6c 79 20 6d 65 72 67  d (possibly merg
fbf0: 65 64 29 20 64 6f 63 6c 69 73 74 20 69 6e 20 74  ed) doclist in t
fc00: 68 65 20 6d 65 72 67 65 64 20 72 61 6e 67 65 2c  he merged range,
fc10: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a   the callback.**
fc20: 20 66 75 6e 63 74 69 6f 6e 20 78 46 75 6e 63 20   function xFunc 
fc30: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
fc40: 69 74 73 20 61 72 67 75 6d 65 6e 74 73 20 73 65  its arguments se
fc50: 74 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a  t as follows..**
fc60: 0a 2a 2a 20 20 20 61 72 67 20 30 3a 20 43 6f 70  .**   arg 0: Cop
fc70: 79 20 6f 66 20 27 70 27 20 70 61 72 61 6d 65 74  y of 'p' paramet
fc80: 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  er passed to thi
fc90: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  s function.**   
fca0: 61 72 67 20 31 3a 20 43 6f 70 79 20 6f 66 20 27  arg 1: Copy of '
fcb0: 70 43 6f 6e 74 65 78 74 27 20 70 61 72 61 6d 65  pContext' parame
fcc0: 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  ter passed to th
fcd0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20  is function.**  
fce0: 20 61 72 67 20 32 3a 20 50 6f 69 6e 74 65 72 20   arg 2: Pointer 
fcf0: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
fd00: 6e 69 6e 67 20 74 65 72 6d 0a 2a 2a 20 20 20 61  ning term.**   a
fd10: 72 67 20 33 3a 20 53 69 7a 65 20 6f 66 20 61 72  rg 3: Size of ar
fd20: 67 20 32 20 62 75 66 66 65 72 20 69 6e 20 62 79  g 2 buffer in by
fd30: 74 65 73 0a 2a 2a 20 20 20 61 72 67 20 34 3a 20  tes.**   arg 4: 
fd40: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
fd50: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63  r containing doc
fd60: 6c 69 73 74 0a 2a 2a 20 20 20 61 72 67 20 35 3a  list.**   arg 5:
fd70: 20 53 69 7a 65 20 6f 66 20 61 72 67 20 32 20 62   Size of arg 2 b
fd80: 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 0a 2a  uffer in bytes.*
fd90: 2a 0a 2a 2a 20 54 68 65 20 34 74 68 20 61 72 67  *.** The 4th arg
fda0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
fdb0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 6f 69 6e  nction is a poin
fdc0: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
fdd0: 72 65 20 6f 66 20 74 79 70 65 0a 2a 2a 20 46 74  re of type.** Ft
fde0: 73 33 53 65 67 46 69 6c 74 65 72 2c 20 64 65 66  s3SegFilter, def
fdf0: 69 6e 65 64 20 69 6e 20 66 74 73 33 49 6e 74 2e  ined in fts3Int.
fe00: 68 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  h. The contents 
fe10: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
fe20: 65 0a 2a 2a 20 66 75 72 74 68 65 72 20 72 65 73  e.** further res
fe30: 74 72 69 63 74 20 74 68 65 20 72 61 6e 67 65 20  trict the range 
fe40: 6f 66 20 74 65 72 6d 73 20 74 68 61 74 20 63 61  of terms that ca
fe50: 6c 6c 62 61 63 6b 73 20 61 72 65 20 6d 61 64 65  llbacks are made
fe60: 20 66 6f 72 20 61 6e 64 0a 2a 2a 20 6d 6f 64 69   for and.** modi
fe70: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 75 72  fy the behaviour
fe80: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
fe90: 6e 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  n. See comments 
fea0: 61 62 6f 76 65 20 73 74 72 75 63 74 75 72 65 0a  above structure.
feb0: 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  ** definition fo
fec0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  r details..*/.in
fed0: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
fee0: 52 65 61 64 65 72 49 74 65 72 61 74 65 28 0a 20  ReaderIterate(. 
fef0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
ff20: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
ff30: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70  s3SegReader **ap
ff40: 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 2f 2a  Segment,      /*
ff50: 20 41 72 72 61 79 20 6f 66 20 46 74 73 33 53 65   Array of Fts3Se
ff60: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20  gReader objects 
ff70: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
ff80: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
ff90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
ffa0: 61 70 53 65 67 6d 65 6e 74 20 61 72 72 61 79 20  apSegment array 
ffb0: 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
ffc0: 65 72 20 2a 70 46 69 6c 74 65 72 2c 20 20 20 20  er *pFilter,    
ffd0: 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
ffe0: 69 6f 6e 73 20 6f 6e 20 72 61 6e 67 65 20 6f 66  ions on range of
fff0: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
10000 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 46 74 73  int (*xFunc)(Fts
10010 33 54 61 62 6c 65 20 2a 2c 20 76 6f 69 64 20 2a  3Table *, void *
10020 2c 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 63  , char *, int, c
10030 68 61 72 20 2a 2c 20 69 6e 74 29 2c 20 20 2f 2a  har *, int),  /*
10040 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76   Callback */.  v
10050 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 20 20 20  oid *pContext   
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10070 2a 20 43 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 65  * Callback conte
10080 78 74 20 28 32 6e 64 20 61 72 67 75 6d 65 6e 74  xt (2nd argument
10090 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  ) */.){.  int i;
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
100c0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
100d0 2f 0a 20 20 63 68 61 72 20 2a 61 42 75 66 66 65  /.  char *aBuffe
100e0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
100f0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
10100 20 6d 65 72 67 65 20 64 6f 63 6c 69 73 74 73 20   merge doclists 
10110 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  in */.  int nAll
10120 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  oc = 0;         
10130 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
10140 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 42 75  ated size of aBu
10150 66 66 65 72 20 62 75 66 66 65 72 20 2a 2f 0a 20  ffer buffer */. 
10160 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10170 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
10180 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10190 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 49 67 6e 6f  */..  int isIgno
101a0 72 65 45 6d 70 74 79 20 3d 20 20 28 70 46 69 6c  reEmpty =  (pFil
101b0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
101c0 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45  3_SEGMENT_IGNORE
101d0 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74 20 69  _EMPTY);.  int i
101e0 73 52 65 71 75 69 72 65 50 6f 73 20 3d 20 20 20  sRequirePos =   
101f0 28 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  (pFilter->flags 
10200 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52  & FTS3_SEGMENT_R
10210 45 51 55 49 52 45 5f 50 4f 53 29 3b 0a 20 20 69  EQUIRE_POS);.  i
10220 6e 74 20 69 73 43 6f 6c 46 69 6c 74 65 72 20 3d  nt isColFilter =
10230 20 20 20 20 28 70 46 69 6c 74 65 72 2d 3e 66 6c      (pFilter->fl
10240 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
10250 4e 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52  NT_COLUMN_FILTER
10260 29 3b 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69  );.  int isPrefi
10270 78 20 3d 20 20 20 20 20 20 20 28 70 46 69 6c 74  x =       (pFilt
10280 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33  er->flags & FTS3
10290 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 58 29  _SEGMENT_PREFIX)
102a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
102b0 20 61 72 65 20 7a 65 72 6f 20 73 65 67 6d 65 6e   are zero segmen
102c0 74 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ts, this functio
102d0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  n is a no-op. Th
102e0 69 73 20 73 63 65 6e 61 72 69 6f 0a 20 20 2a 2a  is scenario.  **
102f0 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 6f 6e 6c   comes about onl
10300 79 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 66  y when reading f
10310 72 6f 6d 20 61 6e 20 65 6d 70 74 79 20 64 61 74  rom an empty dat
10320 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
10330 28 20 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20  ( nSegment==0 ) 
10340 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 0a  goto finished;..
10350 20 20 2f 2a 20 49 66 20 74 68 65 20 46 74 73 33    /* If the Fts3
10360 53 65 67 46 69 6c 74 65 72 20 64 65 66 69 6e 65  SegFilter define
10370 73 20 61 20 73 70 65 63 69 66 69 63 20 74 65 72  s a specific ter
10380 6d 20 28 6f 72 20 74 65 72 6d 20 70 72 65 66 69  m (or term prefi
10390 78 29 20 74 6f 20 73 65 61 72 63 68 20 0a 20 20  x) to search .  
103a0 2a 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61 64 76  ** for, then adv
103b0 61 6e 63 65 20 65 61 63 68 20 73 65 67 6d 65 6e  ance each segmen
103c0 74 20 69 74 65 72 61 74 6f 72 20 75 6e 74 69 6c  t iterator until
103d0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20   it points to a 
103e0 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65 71 75  term of.  ** equ
103f0 61 6c 20 6f 72 20 67 72 65 61 74 65 72 20 76 61  al or greater va
10400 6c 75 65 20 74 68 61 6e 20 74 68 65 20 73 70 65  lue than the spe
10410 63 69 66 69 65 64 20 74 65 72 6d 2e 20 54 68 69  cified term. Thi
10420 73 20 70 72 65 76 65 6e 74 73 20 6d 61 6e 79 0a  s prevents many.
10430 20 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79    ** unnecessary
10440 20 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70 65 72   merge/sort oper
10450 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 63  ations for the c
10460 61 73 65 20 77 68 65 72 65 20 73 69 6e 67 6c 65  ase where single
10470 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20 62 2d   segment.  ** b-
10480 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 20  tree leaf nodes 
10490 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 68 61  contain more tha
104a0 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20 2a 2f  n one term..  */
104b0 0a 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e  .  if( pFilter->
104c0 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 6e 74  zTerm ){.    int
104d0 20 6e 54 65 72 6d 20 3d 20 70 46 69 6c 74 65 72   nTerm = pFilter
104e0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  ->nTerm;.    con
104f0 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
10500 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 3b   pFilter->zTerm;
10510 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10520 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a  nSegment; i++){.
10530 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65 61        Fts3SegRea
10540 64 65 72 20 2a 70 53 65 67 20 3d 20 61 70 53 65  der *pSeg = apSe
10550 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 20 20  gment[i];.      
10560 77 68 69 6c 65 28 20 66 74 73 33 53 65 67 52 65  while( fts3SegRe
10570 61 64 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67  aderTermCmp(pSeg
10580 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3c  , zTerm, nTerm)<
10590 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
105a0 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  = fts3SegReaderN
105b0 65 78 74 28 70 53 65 67 29 3b 0a 20 20 20 20 20  ext(pSeg);.     
105c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
105d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
105e0 73 68 65 64 3b 20 7d 0a 20 20 20 20 7d 0a 20 20  shed; }.    }.  
105f0 7d 0a 0a 20 20 66 74 73 33 53 65 67 52 65 61 64  }..  fts3SegRead
10600 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74  erSort(apSegment
10610 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67  , nSegment, nSeg
10620 6d 65 6e 74 2c 20 66 74 73 33 53 65 67 52 65 61  ment, fts3SegRea
10630 64 65 72 43 6d 70 29 3b 0a 20 20 77 68 69 6c 65  derCmp);.  while
10640 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  ( apSegment[0]->
10650 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  aNode ){.    int
10660 20 6e 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65   nTerm = apSegme
10670 6e 74 5b 30 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20  nt[0]->nTerm;.  
10680 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20    char *zTerm = 
10690 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54  apSegment[0]->zT
106a0 65 72 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 65  erm;.    int nMe
106b0 72 67 65 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  rge = 1;..    /*
106c0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70 72   If this is a pr
106d0 65 66 69 78 2d 73 65 61 72 63 68 2c 20 61 6e 64  efix-search, and
106e0 20 69 66 20 74 68 65 20 74 65 72 6d 20 74 68 61   if the term tha
106f0 74 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 70  t apSegment[0] p
10700 6f 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 6f 20  oints.    ** to 
10710 64 6f 65 73 20 6e 6f 74 20 73 68 61 72 65 20 61  does not share a
10720 20 73 75 66 66 69 78 20 77 69 74 68 20 70 46 69   suffix with pFi
10730 6c 74 65 72 2d 3e 7a 54 65 72 6d 2f 6e 54 65 72  lter->zTerm/nTer
10740 6d 2c 20 74 68 65 6e 20 61 6c 6c 20 0a 20 20 20  m, then all .   
10750 20 2a 2a 20 72 65 71 75 69 72 65 64 20 63 61 6c   ** required cal
10760 6c 62 61 63 6b 73 20 68 61 76 65 20 62 65 65 6e  lbacks have been
10770 20 6d 61 64 65 2e 20 49 6e 20 74 68 69 73 20 63   made. In this c
10780 61 73 65 20 65 78 69 74 20 65 61 72 6c 79 2e 0a  ase exit early..
10790 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69      **.    ** Si
107a0 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 69 73  milarly, if this
107b0 20 69 73 20 61 20 73 65 61 72 63 68 20 66 6f 72   is a search for
107c0 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 2c   an exact match,
107d0 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 74   and the first t
107e0 65 72 6d 0a 20 20 20 20 2a 2a 20 6f 66 20 73 65  erm.    ** of se
107f0 67 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e 74 5b  gment apSegment[
10800 30 5d 20 69 73 20 6e 6f 74 20 61 20 6d 61 74 63  0] is not a matc
10810 68 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 0a 20  h, exit early.. 
10820 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
10830 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 20 29 7b 0a  ilter->zTerm ){.
10840 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c        if( nTerm<
10850 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 20 0a  pFilter->nTerm .
10860 20 20 20 20 20 20 20 7c 7c 20 28 21 69 73 50 72         || (!isPr
10870 65 66 69 78 20 26 26 20 6e 54 65 72 6d 3e 70 46  efix && nTerm>pF
10880 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20 20  ilter->nTerm).  
10890 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a       || memcmp(z
108a0 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 7a  Term, pFilter->z
108b0 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 6e  Term, pFilter->n
108c0 54 65 72 6d 29 20 0a 20 20 20 20 29 7b 0a 20 20  Term) .    ){.  
108d0 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
108e0 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
108f0 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   }..    while( n
10900 4d 65 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20 0a  Merge<nSegment .
10910 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67          && apSeg
10920 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e  ment[nMerge]->aN
10930 6f 64 65 0a 20 20 20 20 20 20 20 20 26 26 20 61  ode.        && a
10940 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d  pSegment[nMerge]
10950 2d 3e 6e 54 65 72 6d 3d 3d 6e 54 65 72 6d 20 0a  ->nTerm==nTerm .
10960 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 6d 65          && 0==me
10970 6d 63 6d 70 28 7a 54 65 72 6d 2c 20 61 70 53 65  mcmp(zTerm, apSe
10980 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 7a  gment[nMerge]->z
10990 54 65 72 6d 2c 20 6e 54 65 72 6d 29 0a 20 20 20  Term, nTerm).   
109a0 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67 65   ){.      nMerge
109b0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  ++;.    }..    a
109c0 73 73 65 72 74 28 20 69 73 49 67 6e 6f 72 65 45  ssert( isIgnoreE
109d0 6d 70 74 79 20 7c 7c 20 28 69 73 52 65 71 75 69  mpty || (isRequi
109e0 72 65 50 6f 73 20 26 26 20 21 69 73 43 6f 6c 46  rePos && !isColF
109f0 69 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 69 66  ilter) );.    if
10a00 28 20 6e 4d 65 72 67 65 3d 3d 31 20 26 26 20 21  ( nMerge==1 && !
10a10 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 29 7b  isIgnoreEmpty ){
10a20 0a 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65  .      Fts3SegRe
10a30 61 64 65 72 20 2a 70 30 20 3d 20 61 70 53 65 67  ader *p0 = apSeg
10a40 6d 65 6e 74 5b 30 5d 3b 0a 20 20 20 20 20 20 72  ment[0];.      r
10a50 63 20 3d 20 78 46 75 6e 63 28 70 2c 20 70 43 6f  c = xFunc(p, pCo
10a60 6e 74 65 78 74 2c 20 7a 54 65 72 6d 2c 20 6e 54  ntext, zTerm, nT
10a70 65 72 6d 2c 20 70 30 2d 3e 61 44 6f 63 6c 69 73  erm, p0->aDoclis
10a80 74 2c 20 70 30 2d 3e 6e 44 6f 63 6c 69 73 74 29  t, p0->nDoclist)
10a90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
10ab0 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d   finished;.    }
10ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
10ad0 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20 20 20  nDoclist = 0;   
10ae0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10af0 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
10b00 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
10b10 34 20 69 50 72 65 76 20 3d 20 30 3b 20 20 20 20  4 iPrev = 0;    
10b20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69  /* Previous doci
10b30 64 20 73 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c  d stored in docl
10b40 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ist */..      /*
10b50 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   The current ter
10b60 6d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  m of the first n
10b70 4d 65 72 67 65 20 65 6e 74 72 69 65 73 20 69 6e  Merge entries in
10b80 20 74 68 65 20 61 72 72 61 79 0a 20 20 20 20 20   the array.     
10b90 20 2a 2a 20 6f 66 20 46 74 73 33 53 65 67 52 65   ** of Fts3SegRe
10ba0 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 73 20  ader objects is 
10bb0 74 68 65 20 73 61 6d 65 2e 20 54 68 65 20 64 6f  the same. The do
10bc0 63 6c 69 73 74 73 20 6d 75 73 74 20 62 65 20 6d  clists must be m
10bd0 65 72 67 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  erged.      ** a
10be0 6e 64 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  nd a single term
10bf0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65   added to the ne
10c00 77 20 73 65 67 6d 65 6e 74 2e 0a 20 20 20 20 20  w segment..     
10c10 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
10c20 30 3b 20 69 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b  0; i<nMerge; i++
10c30 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53  ){.        fts3S
10c40 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f 63  egReaderFirstDoc
10c50 69 64 28 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29  id(apSegment[i])
10c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10c70 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
10c80 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  t(apSegment, nMe
10c90 72 67 65 2c 20 6e 4d 65 72 67 65 2c 20 66 74 73  rge, nMerge, fts
10ca0 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
10cb0 74 43 6d 70 29 3b 0a 20 20 20 20 20 20 77 68 69  tCmp);.      whi
10cc0 6c 65 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  le( apSegment[0]
10cd0 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b  ->pOffsetList ){
10ce0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 20  .        int j; 
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10d10 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 73 68  segments that sh
10d20 61 72 65 20 61 20 64 6f 63 69 64 20 2a 2f 0a 20  are a docid */. 
10d30 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69         char *pLi
10d40 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  st;.        int 
10d50 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  nList;.        i
10d60 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  nt nByte;.      
10d70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10d80 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67 6d 65  iDocid = apSegme
10d90 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20  nt[0]->iDocid;. 
10da0 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
10db0 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 61 70  aderNextDocid(ap
10dc0 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69  Segment[0], &pLi
10dd0 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
10de0 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20       j = 1;.    
10df0 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e 4d 65      while( j<nMe
10e00 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rge.            
10e10 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
10e20 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20 20 20  >pOffsetList.   
10e30 20 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65           && apSe
10e40 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64  gment[j]->iDocid
10e50 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20 20 20 20  ==iDocid.       
10e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
10e70 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
10e80 6f 63 69 64 28 61 70 53 65 67 6d 65 6e 74 5b 6a  ocid(apSegment[j
10e90 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
10ea0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
10eb0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
10ec0 69 73 43 6f 6c 46 69 6c 74 65 72 20 29 7b 0a 20  isColFilter ){. 
10ed0 20 20 20 20 20 20 20 20 20 66 74 73 33 43 6f 6c           fts3Col
10ee0 75 6d 6e 46 69 6c 74 65 72 28 70 46 69 6c 74 65  umnFilter(pFilte
10ef0 72 2d 3e 69 43 6f 6c 2c 20 26 70 4c 69 73 74 2c  r->iCol, &pList,
10f00 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
10f10 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
10f20 20 21 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20   !isIgnoreEmpty 
10f30 7c 7c 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 20 20  || nList>0 ){.  
10f40 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
10f50 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
10f60 74 4c 65 6e 28 69 44 6f 63 69 64 2d 69 50 72 65  tLen(iDocid-iPre
10f70 76 29 20 2b 20 28 69 73 52 65 71 75 69 72 65 50  v) + (isRequireP
10f80 6f 73 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a 20  os?nList+1:0);. 
10f90 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 6f           if( nDo
10fa0 63 6c 69 73 74 2b 6e 42 79 74 65 3e 6e 41 6c 6c  clist+nByte>nAll
10fb0 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  oc ){.          
10fc0 20 20 63 68 61 72 20 2a 61 4e 65 77 3b 0a 20 20    char *aNew;.  
10fd0 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63            nAlloc
10fe0 20 3d 20 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74   = nDoclist+nByt
10ff0 65 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e*2;.           
11000 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
11010 72 65 61 6c 6c 6f 63 28 61 42 75 66 66 65 72 2c  realloc(aBuffer,
11020 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20   nAlloc);.      
11030 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20        if( !aNew 
11040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
11050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11060 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
11070 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b    goto finished;
11080 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
11090 20 20 20 20 20 20 20 20 20 20 20 61 42 75 66 66             aBuff
110a0 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  er = aNew;.     
110b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
110c0 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 73 71 6c   nDoclist += sql
110d0 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
110e0 74 28 26 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c  t(&aBuffer[nDocl
110f0 69 73 74 5d 2c 20 69 44 6f 63 69 64 2d 69 50 72  ist], iDocid-iPr
11100 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ev);.          i
11110 50 72 65 76 20 3d 20 69 44 6f 63 69 64 3b 0a 20  Prev = iDocid;. 
11120 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
11130 65 71 75 69 72 65 50 6f 73 20 29 7b 0a 20 20 20  equirePos ){.   
11140 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
11150 26 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73  &aBuffer[nDoclis
11160 74 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74  t], pList, nList
11170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
11180 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73 74  Doclist += nList
11190 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 42  ;.            aB
111a0 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b  uffer[nDoclist++
111b0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
111c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
111d0 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67  .        fts3Seg
111e0 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65 67  ReaderSort(apSeg
111f0 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c  ment, nMerge, j,
11200 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
11210 63 6c 69 73 74 43 6d 70 29 3b 0a 20 20 20 20 20  clistCmp);.     
11220 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 44   }..      if( nD
11230 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20  oclist>0 ){.    
11240 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70      rc = xFunc(p
11250 2c 20 70 43 6f 6e 74 65 78 74 2c 20 7a 54 65 72  , pContext, zTer
11260 6d 2c 20 6e 54 65 72 6d 2c 20 61 42 75 66 66 65  m, nTerm, aBuffe
11270 72 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  r, nDoclist);.  
11280 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11290 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
112a0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
112b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
112c0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 65 72  f there is a ter
112d0 6d 20 73 70 65 63 69 66 69 65 64 20 74 6f 20 66  m specified to f
112e0 69 6c 74 65 72 20 6f 6e 2c 20 61 6e 64 20 74 68  ilter on, and th
112f0 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 65 66  is is not a pref
11300 69 78 0a 20 20 20 20 2a 2a 20 73 65 61 72 63 68  ix.    ** search
11310 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
11320 65 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  e callback that 
11330 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
11340 68 65 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  he required.    
11350 2a 2a 20 74 65 72 6d 20 28 69 66 20 73 75 63 68  ** term (if such
11360 20 61 20 74 65 72 6d 20 65 78 69 73 74 73 20 69   a term exists i
11370 6e 20 74 68 65 20 69 6e 64 65 78 29 20 68 61 73  n the index) has
11380 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
11390 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  de..    */.    i
113a0 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72  f( pFilter->zTer
113b0 6d 20 26 26 20 21 69 73 50 72 65 66 69 78 20 29  m && !isPrefix )
113c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e  {.      goto fin
113d0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ished;.    }..  
113e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65    for(i=0; i<nMe
113f0 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rge; i++){.     
11400 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
11410 64 65 72 4e 65 78 74 28 61 70 53 65 67 6d 65 6e  derNext(apSegmen
11420 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  t[i]);.      if(
11430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11440 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
11450 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53 65      }.    fts3Se
11460 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65  gReaderSort(apSe
11470 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c  gment, nSegment,
11480 20 6e 4d 65 72 67 65 2c 20 66 74 73 33 53 65 67   nMerge, fts3Seg
11490 52 65 61 64 65 72 43 6d 70 29 3b 0a 20 20 7d 0a  ReaderCmp);.  }.
114a0 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 73 71  . finished:.  sq
114b0 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 66  lite3_free(aBuff
114c0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
114d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
114e0 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65 76 65   all level iLeve
114f0 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
11500 65 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  e database into 
11510 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69 4c 65  a single .** iLe
11520 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e 20 4f  vel+1 segment. O
11530 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30 2c 20  r, if iLevel<0, 
11540 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
11550 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ts into a.** sin
11560 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68  gle segment with
11570 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c 20 74   a level equal t
11580 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  o the numericall
11590 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 20  y largest level 
115a0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 72  .** currently pr
115b0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
115c0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
115d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
115e0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69 4c 65   called with iLe
115f0 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65 72 65  vel<0, but there
11600 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20   is only one.** 
11610 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64  segment in the d
11620 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f  atabase, SQLITE_
11630 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
11640 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 2a   immediately. .*
11650 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
11660 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
11670 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11680 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
11690 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20 53 51  ccurs, .** an SQ
116a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
116b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
116c0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
116d0 65 67 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33  egmentMerge(Fts3
116e0 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 4c  Table *p, int iL
116f0 65 76 65 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 20  evel){.  int i; 
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11710 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
11720 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
11730 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
11760 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  e */.  int iIdx;
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11790 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 2a  of new segment *
117a0 2f 0a 20 20 69 6e 74 20 69 4e 65 77 4c 65 76 65  /.  int iNewLeve
117b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
117c0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
117d0 63 72 65 61 74 65 20 6e 65 77 20 73 65 67 6d 65  create new segme
117e0 6e 74 20 61 74 20 2a 2f 0a 20 20 73 71 6c 69 74  nt at */.  sqlit
117f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
11800 20 30 3b 0a 20 20 53 65 67 6d 65 6e 74 57 72 69   0;.  SegmentWri
11810 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 30  ter *pWriter = 0
11820 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  ;.  int nSegment
11830 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11840 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11850 20 73 65 67 6d 65 6e 74 73 20 62 65 69 6e 67 20   segments being 
11860 6d 65 72 67 65 64 20 2a 2f 0a 20 20 46 74 73 33  merged */.  Fts3
11870 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65  SegReader **apSe
11880 67 6d 65 6e 74 20 3d 20 30 3b 20 20 2f 2a 20 41  gment = 0;  /* A
11890 72 72 61 79 20 6f 66 20 53 65 67 6d 65 6e 74 20  rray of Segment 
118a0 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 46  iterators */.  F
118b0 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 50  ts3SegReader *pP
118c0 65 6e 64 69 6e 67 20 3d 20 30 3b 20 20 20 20 2f  ending = 0;    /
118d0 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 70  * Iterator for p
118e0 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 2a 2f 0a  ending-terms */.
118f0 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20    Fts3SegFilter 
11900 66 69 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20  filter;         
11910 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 65 72    /* Segment ter
11920 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64 69 74 69  m filter conditi
11930 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 69 4c 65  on */..  if( iLe
11940 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  vel<0 ){.    /* 
11950 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  This call is to 
11960 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
11970 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
11980 73 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 20  se to a single. 
11990 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54     ** segment. T
119a0 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
119b0 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20 65  new segment is e
119c0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 68 65 20  qual to the the 
119d0 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 20  numerically .   
119e0 20 2a 2a 20 67 72 65 61 74 65 73 74 20 73 65 67   ** greatest seg
119f0 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75 72 72 65  ment level curre
11a00 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20  ntly present in 
11a10 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68  the database. Th
11a20 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 6f  e index.    ** o
11a30 66 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  f the new segmen
11a40 74 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 20  t is always 0.. 
11a50 20 20 20 2a 2f 0a 20 20 20 20 69 49 64 78 20 3d     */.    iIdx =
11a60 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
11a70 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
11a80 72 50 65 6e 64 69 6e 67 28 70 2c 20 30 2c 20 30  rPending(p, 0, 0
11a90 2c 20 31 2c 20 26 70 50 65 6e 64 69 6e 67 29 3b  , 1, &pPending);
11aa0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11ab0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
11ac0 6e 69 73 68 65 64 3b 0a 20 20 20 20 72 63 20 3d  nished;.    rc =
11ad0 20 66 74 73 33 53 65 67 6d 65 6e 74 43 6f 75 6e   fts3SegmentCoun
11ae0 74 4d 61 78 28 70 2c 20 26 6e 53 65 67 6d 65 6e  tMax(p, &nSegmen
11af0 74 2c 20 26 69 4e 65 77 4c 65 76 65 6c 29 3b 0a  t, &iNewLevel);.
11b00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11b10 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e  TE_OK ) goto fin
11b20 69 73 68 65 64 3b 0a 20 20 20 20 6e 53 65 67 6d  ished;.    nSegm
11b30 65 6e 74 20 2b 3d 20 28 70 50 65 6e 64 69 6e 67  ent += (pPending
11b40 21 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  !=0);.    if( nS
11b50 65 67 6d 65 6e 74 3c 3d 31 20 29 7b 0a 20 20 20  egment<=1 ){.   
11b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11b70 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
11b80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
11b90 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72  s call is to mer
11ba0 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  ge all segments 
11bb0 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e  at level iLevel.
11bc0 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 0a 20   Find the next. 
11bd0 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20     ** available 
11be0 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 61 74  segment index at
11bf0 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 2e   level iLevel+1.
11c00 20 54 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20   The call to.   
11c10 20 2a 2a 20 66 74 73 33 41 6c 6c 6f 63 61 74 65   ** fts3Allocate
11c20 53 65 67 64 69 72 49 64 78 28 29 20 77 69 6c 6c  SegdirIdx() will
11c30 20 6d 65 72 67 65 20 74 68 65 20 73 65 67 6d 65   merge the segme
11c40 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65  nts at level iLe
11c50 76 65 6c 2b 31 20 74 6f 20 0a 20 20 20 20 2a 2a  vel+1 to .    **
11c60 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c   a single iLevel
11c70 2b 32 20 73 65 67 6d 65 6e 74 20 69 66 20 6e 65  +2 segment if ne
11c80 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
11c90 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20      iNewLevel = 
11ca0 69 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 72 63  iLevel+1;.    rc
11cb0 20 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53   = fts3AllocateS
11cc0 65 67 64 69 72 49 64 78 28 70 2c 20 69 4e 65 77  egdirIdx(p, iNew
11cd0 4c 65 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20  Level, &iIdx);. 
11ce0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11cf0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
11d00 73 68 65 64 3b 0a 20 20 20 20 72 63 20 3d 20 66  shed;.    rc = f
11d10 74 73 33 53 65 67 6d 65 6e 74 43 6f 75 6e 74 28  ts3SegmentCount(
11d20 70 2c 20 69 4c 65 76 65 6c 2c 20 26 6e 53 65 67  p, iLevel, &nSeg
11d30 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  ment);.    if( r
11d40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11d50 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20  oto finished;.  
11d60 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 65 67  }.  assert( nSeg
11d70 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
11d80 72 74 28 20 69 4e 65 77 4c 65 76 65 6c 3e 3d 30  rt( iNewLevel>=0
11d90 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
11da0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  te space for an 
11db0 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
11dc0 73 20 74 6f 20 73 65 67 6d 65 6e 74 20 69 74 65  s to segment ite
11dd0 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 61 70 53  rators. */.  apS
11de0 65 67 6d 65 6e 74 20 3d 20 28 46 74 73 33 53 65  egment = (Fts3Se
11df0 67 52 65 61 64 65 72 2a 2a 29 73 71 6c 69 74 65  gReader**)sqlite
11e00 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
11e10 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
11e20 2a 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66  *nSegment);.  if
11e30 28 20 21 61 70 53 65 67 6d 65 6e 74 20 29 7b 0a  ( !apSegment ){.
11e40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11e50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
11e60 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 20 20  finished;.  }.  
11e70 6d 65 6d 73 65 74 28 61 70 53 65 67 6d 65 6e 74  memset(apSegment
11e80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
11e90 53 65 67 52 65 61 64 65 72 20 2a 29 2a 6e 53 65  SegReader *)*nSe
11ea0 67 6d 65 6e 74 29 3b 0a 0a 20 20 2f 2a 20 41 6c  gment);..  /* Al
11eb0 6c 6f 63 61 74 65 20 61 20 46 74 73 33 53 65 67  locate a Fts3Seg
11ec0 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
11ed0 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d 65 6e   for each segmen
11ee0 74 20 62 65 69 6e 67 20 6d 65 72 67 65 64 2e 20  t being merged. 
11ef0 41 20 0a 20 20 2a 2a 20 46 74 73 33 53 65 67 52  A .  ** Fts3SegR
11f00 65 61 64 65 72 20 73 74 6f 72 65 73 20 74 68 65  eader stores the
11f10 20 73 74 61 74 65 20 64 61 74 61 20 72 65 71 75   state data requ
11f20 69 72 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  ired to iterate 
11f30 74 68 72 6f 75 67 68 20 61 6c 6c 20 0a 20 20 2a  through all .  *
11f40 2a 20 65 6e 74 72 69 65 73 20 6f 6e 20 61 6c 6c  * entries on all
11f50 20 6c 65 61 76 65 73 20 6f 66 20 61 20 73 69 6e   leaves of a sin
11f60 67 6c 65 20 73 65 67 6d 65 6e 74 2e 20 0a 20 20  gle segment. .  
11f70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
11f80 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2b 31 3d  _SELECT_LEVEL+1=
11f90 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f  =SQL_SELECT_ALL_
11fa0 4c 45 56 45 4c 29 3b 0a 20 20 72 63 20 3d 20 66  LEVEL);.  rc = f
11fb0 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
11fc0 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2b 28  L_SELECT_LEVEL+(
11fd0 69 4c 65 76 65 6c 3c 30 29 2c 20 26 70 53 74 6d  iLevel<0), &pStm
11fe0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
11ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
12000 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 73 71  o finished;.  sq
12010 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
12020 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76 65 6c 29  Stmt, 1, iLevel)
12030 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 53 51 4c  ;.  for(i=0; SQL
12040 49 54 45 5f 52 4f 57 3d 3d 28 73 71 6c 69 74 65  ITE_ROW==(sqlite
12050 33 5f 73 74 65 70 28 70 53 74 6d 74 29 29 3b 20  3_step(pStmt)); 
12060 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  i++){.    rc = f
12070 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 28  ts3SegReaderNew(
12080 70 2c 20 70 53 74 6d 74 2c 20 69 2c 20 26 61 70  p, pStmt, i, &ap
12090 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Segment[i]);.   
120a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
120b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
120c0 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d   finished;.    }
120d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
120e0 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
120f0 3b 0a 20 20 69 66 28 20 70 50 65 6e 64 69 6e 67  ;.  if( pPending
12100 20 29 7b 0a 20 20 20 20 61 70 53 65 67 6d 65 6e   ){.    apSegmen
12110 74 5b 69 5d 20 3d 20 70 50 65 6e 64 69 6e 67 3b  t[i] = pPending;
12120 0a 20 20 20 20 70 50 65 6e 64 69 6e 67 20 3d 20  .    pPending = 
12130 30 3b 0a 20 20 7d 0a 20 20 70 53 74 6d 74 20 3d  0;.  }.  pStmt =
12140 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
12150 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
12160 69 6e 69 73 68 65 64 3b 0a 0a 20 20 6d 65 6d 73  inished;..  mems
12170 65 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73  et(&filter, 0, s
12180 69 7a 65 6f 66 28 46 74 73 33 53 65 67 46 69 6c  izeof(Fts3SegFil
12190 74 65 72 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e  ter));.  filter.
121a0 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47  flags = FTS3_SEG
121b0 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53  MENT_REQUIRE_POS
121c0 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73  ;.  filter.flags
121d0 20 7c 3d 20 28 69 4c 65 76 65 6c 3c 30 20 3f 20   |= (iLevel<0 ? 
121e0 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e  FTS3_SEGMENT_IGN
121f0 4f 52 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a  ORE_EMPTY : 0);.
12200 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
12210 73 33 53 65 67 52 65 61 64 65 72 49 74 65 72 61  s3SegReaderItera
12220 74 65 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 2c  te(p, apSegment,
12230 20 6e 53 65 67 6d 65 6e 74 2c 0a 20 20 20 20 20   nSegment,.     
12240 20 26 66 69 6c 74 65 72 2c 20 66 74 73 33 4d 65   &filter, fts3Me
12250 72 67 65 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  rgeCallback, (vo
12260 69 64 20 2a 29 26 70 57 72 69 74 65 72 0a 20 20  id *)&pWriter.  
12270 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12280 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
12290 6e 69 73 68 65 64 3b 0a 0a 20 20 72 63 20 3d 20  nished;..  rc = 
122a0 66 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72  fts3DeleteSegdir
122b0 28 70 2c 20 69 4c 65 76 65 6c 2c 20 61 70 53 65  (p, iLevel, apSe
122c0 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 29  gment, nSegment)
122d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
122e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
122f0 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46  = fts3SegWriterF
12300 6c 75 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c  lush(p, pWriter,
12310 20 69 4e 65 77 4c 65 76 65 6c 2c 20 69 49 64 78   iNewLevel, iIdx
12320 29 3b 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65  );.  }.. finishe
12330 64 3a 0a 20 20 66 74 73 33 53 65 67 57 72 69 74  d:.  fts3SegWrit
12340 65 72 46 72 65 65 28 70 57 72 69 74 65 72 29 3b  erFree(pWriter);
12350 0a 20 20 69 66 28 20 61 70 53 65 67 6d 65 6e 74  .  if( apSegment
12360 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
12370 20 69 3c 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b   i<nSegment; i++
12380 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12390 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65  Fts3SegReaderFre
123a0 65 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69  e(p, apSegment[i
123b0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
123c0 6c 69 74 65 33 5f 66 72 65 65 28 61 70 53 65 67  lite3_free(apSeg
123d0 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ment);.  }.  sql
123e0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
123f0 72 46 72 65 65 28 70 2c 20 70 50 65 6e 64 69 6e  rFree(p, pPendin
12400 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  g);.  sqlite3_re
12410 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  set(pStmt);.  re
12420 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20  turn rc;.}.../* 
12430 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
12440 6e 74 65 6e 74 73 20 6f 66 20 70 65 6e 64 69 6e  ntents of pendin
12450 67 54 65 72 6d 73 20 74 6f 20 61 20 6c 65 76 65  gTerms to a leve
12460 6c 20 30 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  l 0 segment..*/.
12470 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 50  int sqlite3Fts3P
12480 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68  endingTermsFlush
12490 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a  (Fts3Table *p){.
124a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
124d0 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20   */.  int idx;  
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12500 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 63 72  f new segment cr
12510 65 61 74 65 64 20 2a 2f 0a 20 20 53 65 67 6d 65  eated */.  Segme
12520 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  ntWriter *pWrite
12530 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73  r = 0;     /* Us
12540 65 64 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ed to write the 
12550 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
12560 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
12570 64 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  der = 0;     /* 
12580 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
12590 74 68 72 6f 75 67 68 20 74 68 65 20 68 61 73 68  through the hash
125a0 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20   table */..  /* 
125b0 41 6c 6c 6f 63 61 74 65 20 61 20 53 65 67 52 65  Allocate a SegRe
125c0 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 69  ader object to i
125d0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
125e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
125f0 68 65 0a 20 20 2a 2a 20 70 65 6e 64 69 6e 67 2d  he.  ** pending-
12600 74 65 72 6d 73 20 74 61 62 6c 65 2e 20 49 66 20  terms table. If 
12610 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
12620 20 6f 72 20 69 66 20 74 68 65 72 65 20 61 72 65   or if there are
12630 20 6e 6f 20 74 65 72 6d 73 0a 20 20 2a 2a 20 69   no terms.  ** i
12640 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  n the pending-te
12650 72 6d 73 20 74 61 62 6c 65 2c 20 72 65 74 75 72  rms table, retur
12660 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
12670 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
12680 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 50  e3Fts3SegReaderP
12690 65 6e 64 69 6e 67 28 70 2c 20 30 2c 20 30 2c 20  ending(p, 0, 0, 
126a0 31 2c 20 26 70 52 65 61 64 65 72 29 3b 0a 20 20  1, &pReader);.  
126b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
126c0 4b 20 7c 7c 20 70 52 65 61 64 65 72 3d 3d 30 20  K || pReader==0 
126d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
126e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
126f0 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 69  rmine the next i
12700 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 30 2e  ndex at level 0.
12710 20 49 66 20 6c 65 76 65 6c 20 30 20 69 73 20 61   If level 0 is a
12720 6c 72 65 61 64 79 20 66 75 6c 6c 2c 20 74 68 69  lready full, thi
12730 73 0a 20 20 2a 2a 20 63 61 6c 6c 20 6d 61 79 20  s.  ** call may 
12740 6d 65 72 67 65 20 61 6c 6c 20 65 78 69 73 74 69  merge all existi
12750 6e 67 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65  ng level 0 segme
12760 6e 74 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  nts into a singl
12770 65 20 6c 65 76 65 6c 20 31 0a 20 20 2a 2a 20 73  e level 1.  ** s
12780 65 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72  egment..  */.  r
12790 63 20 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65  c = fts3Allocate
127a0 53 65 67 64 69 72 49 64 78 28 70 2c 20 30 2c 20  SegdirIdx(p, 0, 
127b0 26 69 64 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  &idx);..  /* If 
127c0 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 20 6f  no errors have o
127d0 63 63 75 72 65 64 2c 20 69 74 65 72 61 74 65 20  ccured, iterate 
127e0 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74  through the cont
127f0 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 20 20 2a  ents of the .  *
12800 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  * pending-terms 
12810 68 61 73 68 20 74 61 62 6c 65 20 75 73 69 6e 67  hash table using
12820 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61 64   the Fts3SegRead
12830 65 72 20 69 74 65 72 61 74 6f 72 2e 20 54 68 65  er iterator. The
12840 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   callback.  ** w
12850 72 69 74 65 73 20 65 61 63 68 20 74 65 72 6d 20  rites each term 
12860 28 61 6c 6f 6e 67 20 77 69 74 68 20 69 74 73 20  (along with its 
12870 64 6f 63 6c 69 73 74 29 20 74 6f 20 74 68 65 20  doclist) to the 
12880 64 61 74 61 62 61 73 65 20 76 69 61 20 74 68 65  database via the
12890 0a 20 20 2a 2a 20 53 65 67 6d 65 6e 74 57 72 69  .  ** SegmentWri
128a0 74 65 72 20 68 61 6e 64 6c 65 20 70 57 72 69 74  ter handle pWrit
128b0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
128c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
128d0 20 20 20 20 76 6f 69 64 20 2a 63 20 3d 20 28 76      void *c = (v
128e0 6f 69 64 20 2a 29 26 70 57 72 69 74 65 72 3b 20  oid *)&pWriter; 
128f0 20 20 2f 2a 20 53 65 67 52 65 61 64 65 72 49 74    /* SegReaderIt
12900 65 72 61 74 65 28 29 20 63 61 6c 6c 62 61 63 6b  erate() callback
12910 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20   context */.    
12920 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 66 3b  Fts3SegFilter f;
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12940 20 53 65 67 52 65 61 64 65 72 49 74 65 72 61 74   SegReaderIterat
12950 65 28 29 20 70 61 72 61 6d 65 74 65 72 73 20 2a  e() parameters *
12960 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  /..    memset(&f
12970 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
12980 53 65 67 46 69 6c 74 65 72 29 29 3b 0a 20 20 20  SegFilter));.   
12990 20 66 2e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f   f.flags = FTS3_
129a0 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f  SEGMENT_REQUIRE_
129b0 50 4f 53 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  POS;.    rc = sq
129c0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
129d0 65 72 49 74 65 72 61 74 65 28 70 2c 20 26 70 52  erIterate(p, &pR
129e0 65 61 64 65 72 2c 20 31 2c 20 26 66 2c 20 66 74  eader, 1, &f, ft
129f0 73 33 46 6c 75 73 68 43 61 6c 6c 62 61 63 6b 2c  s3FlushCallback,
12a00 20 63 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   c);.  }.  asser
12a10 74 28 20 70 57 72 69 74 65 72 20 7c 7c 20 72 63  t( pWriter || rc
12a20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  !=SQLITE_OK );..
12a30 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72    /* If no error
12a40 73 20 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20  s have occured, 
12a50 66 6c 75 73 68 20 74 68 65 20 53 65 67 6d 65 6e  flush the Segmen
12a60 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74  tWriter object t
12a70 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
12a80 61 73 65 2e 20 54 68 65 6e 20 64 65 6c 65 74 65  ase. Then delete
12a90 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74   the SegmentWrit
12aa0 65 72 20 61 6e 64 20 46 74 73 33 53 65 67 52 65  er and Fts3SegRe
12ab0 61 64 65 72 20 6f 62 6a 65 63 74 73 0a 20 20 2a  ader objects.  *
12ac0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
12ad0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
12ae0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
12af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
12b00 20 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72   = fts3SegWriter
12b10 46 6c 75 73 68 28 70 2c 20 70 57 72 69 74 65 72  Flush(p, pWriter
12b20 2c 20 30 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20  , 0, idx);.  }. 
12b30 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46 72   fts3SegWriterFr
12b40 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20 20 73  ee(pWriter);.  s
12b50 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
12b60 64 65 72 46 72 65 65 28 70 2c 20 70 52 65 61 64  derFree(p, pRead
12b70 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  er);..  if( rc==
12b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12b90 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
12ba0 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29  ingTermsClear(p)
12bb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12bc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f  c;.}../*.** Enco
12bd0 64 65 20 4e 20 69 6e 74 65 67 65 72 73 20 61 73  de N integers as
12be0 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 61 20   varints into a 
12bf0 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
12c00 76 6f 69 64 20 66 74 73 33 45 6e 63 6f 64 65 49  void fts3EncodeI
12c10 6e 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e  ntArray(.  int N
12c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12c30 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   The number of i
12c40 6e 74 65 67 65 72 73 20 74 6f 20 65 6e 63 6f 64  ntegers to encod
12c50 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20  e */.  u32 *a,  
12c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12c70 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
12c80 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 2c  */.  char *zBuf,
12c90 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
12ca0 20 74 68 65 20 42 4c 4f 42 20 68 65 72 65 20 2a   the BLOB here *
12cb0 2f 0a 20 20 69 6e 74 20 2a 70 4e 42 75 66 20 20  /.  int *pNBuf  
12cc0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
12cd0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
12ce0 69 66 20 7a 42 75 66 5b 5d 20 75 73 65 64 20 68  if zBuf[] used h
12cf0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
12d00 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
12d10 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<N; i++){.  
12d20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    j += sqlite3Ft
12d30 73 33 50 75 74 56 61 72 69 6e 74 28 26 7a 42 75  s3PutVarint(&zBu
12d40 66 5b 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f 69  f[j], (sqlite3_i
12d50 6e 74 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d 0a  nt64)a[i]);.  }.
12d60 20 20 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d 0a    *pNBuf = j;.}.
12d70 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
12d80 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73 20  blob of varints 
12d90 69 6e 74 6f 20 4e 20 69 6e 74 65 67 65 72 73 0a  into N integers.
12da0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12db0 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61  ts3DecodeIntArra
12dc0 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  y(.  int N,     
12dd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
12de0 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72  umber of integer
12df0 73 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  s to decode */. 
12e00 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20   u32 *a,        
12e10 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
12e20 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
12e30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12e40 2a 7a 42 75 66 2c 20 20 2f 2a 20 54 68 65 20 42  *zBuf,  /* The B
12e50 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  LOB containing t
12e60 68 65 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20 20  he varints */.  
12e70 69 6e 74 20 6e 42 75 66 20 20 20 20 20 20 20 20  int nBuf        
12e80 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74 68     /* size of th
12e90 65 20 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20 69  e BLOB */.){.  i
12ea0 6e 74 20 69 2c 20 6a 3b 0a 20 20 55 4e 55 53 45  nt i, j;.  UNUSE
12eb0 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75 66  D_PARAMETER(nBuf
12ec0 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
12ed0 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  i<N; i++){.    s
12ee0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a  qlite3_int64 x;.
12ef0 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33      j += sqlite3
12f00 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26 7a  Fts3GetVarint(&z
12f10 42 75 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20 20  Buf[j], &x);.   
12f20 20 61 73 73 65 72 74 28 6a 3c 3d 6e 42 75 66 29   assert(j<=nBuf)
12f30 3b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 28 75 33  ;.    a[i] = (u3
12f40 32 29 28 78 20 26 20 30 78 66 66 66 66 66 66 66  2)(x & 0xfffffff
12f50 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  f);.  }.}../*.**
12f60 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 64 6f 63   Fill in the doc
12f70 75 6d 65 6e 74 20 73 69 7a 65 20 61 75 78 69 6c  ument size auxil
12f80 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
12f90 20 66 6f 72 20 74 68 65 20 6d 61 74 63 68 69 6e   for the matchin
12fa0 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
12fb0 20 20 54 68 65 20 61 75 78 69 6c 69 61 72 79 20    The auxiliary 
12fc0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 3a 0a  information is:.
12fd0 2a 2a 0a 2a 2a 20 20 20 20 4e 20 20 20 20 20 54  **.**    N     T
12fe0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 64  otal number of d
12ff0 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  ocuments in the 
13000 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a  full-text index.
13010 2a 2a 20 20 20 20 61 30 20 20 20 20 41 76 65 72  **    a0    Aver
13020 61 67 65 20 6c 65 6e 67 74 68 20 6f 66 20 63 6f  age length of co
13030 6c 75 6d 6e 20 30 20 6f 76 65 72 20 74 68 65 20  lumn 0 over the 
13040 77 68 6f 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 20  whole index.**  
13050 20 20 6e 30 20 20 20 20 4c 65 6e 67 74 68 20 6f    n0    Length o
13060 66 20 63 6f 6c 75 6d 6e 20 30 20 6f 6e 20 74 68  f column 0 on th
13070 65 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 0a 2a  e matching row.*
13080 2a 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 61  *    ....**    a
13090 4d 20 20 20 20 41 76 65 72 61 67 65 20 6c 65 6e  M    Average len
130a0 67 74 68 20 6f 66 20 63 6f 6c 75 6d 6e 20 4d 20  gth of column M 
130b0 6f 76 65 72 20 74 68 65 20 77 68 6f 6c 65 20 69  over the whole i
130c0 6e 64 65 78 0a 2a 2a 20 20 20 20 6e 4d 20 20 20  ndex.**    nM   
130d0 20 4c 65 6e 67 74 68 20 6f 66 20 63 6f 6c 75 6d   Length of colum
130e0 6e 20 4d 20 6f 6e 20 74 68 65 20 6d 61 74 63 68  n M on the match
130f0 69 6e 67 20 72 6f 77 0a 2a 2a 0a 2a 2a 20 54 68  ing row.**.** Th
13100 65 20 66 74 73 33 4d 61 74 63 68 69 6e 66 6f 44  e fts3MatchinfoD
13110 6f 63 73 69 7a 65 4c 6f 63 61 6c 28 29 20 72 6f  ocsizeLocal() ro
13120 75 74 69 6e 65 20 66 69 6c 6c 73 20 69 6e 20 74  utine fills in t
13130 68 65 20 6e 58 20 76 61 6c 75 65 73 2e 0a 2a 2a  he nX values..**
13140 20 54 68 65 20 66 74 73 33 4d 61 74 63 68 69 6e   The fts3Matchin
13150 66 6f 44 6f 63 73 69 7a 65 47 6c 6f 62 61 6c 28  foDocsizeGlobal(
13160 29 20 72 6f 75 74 69 6e 65 20 66 69 6c 6c 73 20  ) routine fills 
13170 69 6e 20 4e 20 61 6e 64 20 74 68 65 20 61 58 20  in N and the aX 
13180 76 61 6c 75 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  values..*/.int s
13190 71 6c 69 74 65 33 46 74 73 33 4d 61 74 63 68 69  qlite3Fts3Matchi
131a0 6e 66 6f 44 6f 63 73 69 7a 65 4c 6f 63 61 6c 28  nfoDocsizeLocal(
131b0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 75 72  Fts3Cursor *pCur
131c0 2c 20 75 33 32 20 2a 61 29 7b 0a 20 20 63 6f 6e  , u32 *a){.  con
131d0 73 74 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20  st char *pBlob; 
131e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 4c 4f        /* The BLO
131f0 42 20 68 6f 6c 64 69 6e 67 20 25 5f 64 6f 63 73  B holding %_docs
13200 69 7a 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 69 6e  ize info */.  in
13210 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  t nBlob;        
13220 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13230 66 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20  f the BLOB */.  
13240 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13250 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74  tmt;     /* Stat
13260 65 6d 65 6e 74 20 66 6f 72 20 72 65 61 64 69 6e  ement for readin
13270 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20 2a 2f  g and writing */
13280 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
13290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
132a0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
132b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
132c0 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  x;         /* Va
132d0 72 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  rint value */.  
132e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
132f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
13300 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
13310 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 46  functions */.  F
13320 74 73 33 54 61 62 6c 65 20 2a 70 3b 20 20 20 20  ts3Table *p;    
13330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
13340 54 53 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 70  TS table */..  p
13350 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70   = (Fts3Table*)p
13360 43 75 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Cur->base.pVtab;
13370 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
13380 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
13390 54 5f 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d  T_DOCSIZE, &pStm
133a0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
133b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
133c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
133d0 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
133e0 2c 20 31 2c 20 70 43 75 72 2d 3e 69 50 72 65 76  , 1, pCur->iPrev
133f0 49 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  Id);.  if( sqlit
13400 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
13410 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
13420 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    nBlob = sqlite
13430 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
13440 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 42  Stmt, 0);.    pB
13450 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  lob = (const cha
13460 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
13470 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29  n_blob(pStmt, 0)
13480 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ;.    for(i=j=0;
13490 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26   i<p->nColumn &&
134a0 20 6a 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a   j<nBlob; i++){.
134b0 20 20 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65        j = sqlite
134c0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26  3Fts3GetVarint(&
134d0 70 42 6c 6f 62 5b 6a 5d 2c 20 26 78 29 3b 0a 20  pBlob[j], &x);. 
134e0 20 20 20 20 20 61 5b 32 2b 69 2a 32 5d 20 3d 20       a[2+i*2] = 
134f0 28 75 33 32 29 28 78 20 26 20 30 78 66 66 66 66  (u32)(x & 0xffff
13500 66 66 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ffff);.    }.  }
13510 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  .  sqlite3_reset
13520 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72  (pStmt);.  retur
13530 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
13540 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
13550 61 74 63 68 69 6e 66 6f 44 6f 63 73 69 7a 65 47  atchinfoDocsizeG
13560 6c 6f 62 61 6c 28 46 74 73 33 43 75 72 73 6f 72  lobal(Fts3Cursor
13570 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 61 29 7b   *pCur, u32 *a){
13580 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
13590 42 6c 6f 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  Blob;       /* T
135a0 68 65 20 42 4c 4f 42 20 68 6f 6c 64 69 6e 67 20  he BLOB holding 
135b0 25 5f 73 74 61 74 20 69 6e 66 6f 20 2a 2f 0a 20  %_stat info */. 
135c0 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
135d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
135e0 65 20 6f 66 20 74 68 65 20 42 4c 4f 42 20 2a 2f  e of the BLOB */
135f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
13600 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53  *pStmt;     /* S
13610 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 72 65 61  tatement for rea
13620 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
13630 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13650 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
13660 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
13670 36 34 20 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  64 x;         /*
13680 20 56 61 72 69 6e 74 20 76 61 6c 75 65 20 2a 2f   Varint value */
13690 0a 20 20 69 6e 74 20 6e 44 6f 63 3b 20 20 20 20  .  int nDoc;    
136a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
136b0 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
136c0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ts */.  int rc; 
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
136f0 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
13700 73 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65  s */.  Fts3Table
13710 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13720 2f 2a 20 54 68 65 20 46 54 53 20 74 61 62 6c 65  /* The FTS table
13730 20 2a 2f 0a 0a 20 20 70 20 3d 20 28 46 74 73 33   */..  p = (Fts3
13740 54 61 62 6c 65 2a 29 70 43 75 72 2d 3e 62 61 73  Table*)pCur->bas
13750 65 2e 70 56 74 61 62 3b 0a 20 20 72 63 20 3d 20  e.pVtab;.  rc = 
13760 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
13770 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54 4f 54  QL_SELECT_DOCTOT
13780 41 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  AL, &pStmt, 0);.
13790 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
137a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
137b0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
137c0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
137d0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 6e 42 6c 6f  _ROW ){.    nBlo
137e0 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
137f0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
13800 30 29 3b 0a 20 20 20 20 70 42 6c 6f 62 20 3d 20  0);.    pBlob = 
13810 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
13820 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
13830 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
13840 6a 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47  j = sqlite3Fts3G
13850 65 74 56 61 72 69 6e 74 28 70 42 6c 6f 62 2c 20  etVarint(pBlob, 
13860 26 78 29 3b 0a 20 20 20 20 61 5b 30 5d 20 3d 20  &x);.    a[0] = 
13870 6e 44 6f 63 20 3d 20 28 75 33 32 29 28 78 20 26  nDoc = (u32)(x &
13880 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
13890 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
138a0 6e 43 6f 6c 75 6d 6e 20 26 26 20 6a 3c 6e 42 6c  nColumn && j<nBl
138b0 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ob; i++){.      
138c0 6a 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47  j = sqlite3Fts3G
138d0 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b  etVarint(&pBlob[
138e0 6a 5d 2c 20 26 78 29 3b 0a 20 20 20 20 20 20 61  j], &x);.      a
138f0 5b 31 2b 69 2a 32 5d 20 3d 20 28 28 75 33 32 29  [1+i*2] = ((u32)
13900 28 78 20 26 20 30 78 66 66 66 66 66 66 66 66 29  (x & 0xffffffff)
13910 20 2b 20 6e 44 6f 63 2f 32 29 2f 6e 44 6f 63 3b   + nDoc/2)/nDoc;
13920 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
13930 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
13940 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
13950 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_OK; .}../*.**
13960 20 49 6e 73 65 72 74 20 74 68 65 20 73 69 7a 65   Insert the size
13970 73 20 28 69 6e 20 74 6f 6b 65 6e 73 29 20 66 6f  s (in tokens) fo
13980 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
13990 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a   the document.**
139a0 20 77 69 74 68 20 64 6f 63 69 64 20 65 71 75 61   with docid equa
139b0 6c 20 74 6f 20 70 2d 3e 69 50 72 65 76 44 6f 63  l to p->iPrevDoc
139c0 69 64 2e 20 20 54 68 65 20 73 69 7a 65 73 20 61  id.  The sizes a
139d0 72 65 20 65 6e 63 6f 64 65 64 20 61 73 0a 2a 2a  re encoded as.**
139e0 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e   a blob of varin
139f0 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
13a00 69 64 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63  id fts3InsertDoc
13a10 73 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 43  size(.  int *pRC
13a20 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ,         /* Res
13a30 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ult code */.  Ft
13a40 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
13a50 2f 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68  /* Table into wh
13a60 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  ich to insert */
13a70 0a 20 20 75 33 32 20 2a 61 53 7a 20 20 20 20 20  .  u32 *aSz     
13a80 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
13a90 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
13aa0 29 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62  ){.  char *pBlob
13ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13ac0 20 54 68 65 20 42 4c 4f 42 20 65 6e 63 6f 64 69   The BLOB encodi
13ad0 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65  ng of the docume
13ae0 6e 74 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  nt size */.  int
13af0 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
13b00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13b10 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
13b20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65  BLOB */.  sqlite
13b30 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
13b40 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
13b50 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74  used to insert t
13b60 68 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  he encoding */. 
13b70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13b90 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
13ba0 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
13bb0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
13bc0 72 6e 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71  rn;.  pBlob = sq
13bd0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 31 30  lite3_malloc( 10
13be0 2a 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  *p->nColumn );. 
13bf0 20 69 66 28 20 70 42 6c 6f 62 3d 3d 30 20 29 7b   if( pBlob==0 ){
13c00 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
13c10 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65  TE_NOMEM;.    re
13c20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 74 73 33  turn;.  }.  fts3
13c30 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79 28 70  EncodeIntArray(p
13c40 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 61 53 7a 2c 20  ->nColumn, aSz, 
13c50 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a  pBlob, &nBlob);.
13c60 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
13c70 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43  mt(p, SQL_REPLAC
13c80 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d  E_DOCSIZE, &pStm
13c90 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
13ca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13cb0 72 65 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20  ree(pBlob);.    
13cc0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
13cd0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
13ce0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
13cf0 70 53 74 6d 74 2c 20 31 2c 20 70 2d 3e 69 50 72  pStmt, 1, p->iPr
13d00 65 76 44 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69  evDocid);.  sqli
13d10 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
13d20 74 6d 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e  tmt, 2, pBlob, n
13d30 42 6c 6f 62 2c 20 73 71 6c 69 74 65 33 5f 66 72  Blob, sqlite3_fr
13d40 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ee);.  sqlite3_s
13d50 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70  tep(pStmt);.  *p
13d60 52 43 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  RC = sqlite3_res
13d70 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a  et(pStmt);.}../*
13d80 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 30  .** Update the 0
13d90 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 25   record of the %
13da0 5f 73 74 61 74 20 74 61 62 6c 65 20 73 6f 20 74  _stat table so t
13db0 68 61 74 20 69 74 20 68 6f 6c 64 73 20 61 20 62  hat it holds a b
13dc0 6c 6f 62 0a 2a 2a 20 77 68 69 63 68 20 63 6f 6e  lob.** which con
13dd0 74 61 69 6e 73 20 74 68 65 20 64 6f 63 75 6d 65  tains the docume
13de0 6e 74 20 63 6f 75 6e 74 20 66 6f 6c 6c 6f 77 65  nt count followe
13df0 64 20 62 79 20 74 68 65 20 63 75 6d 75 6c 61 74  d by the cumulat
13e00 69 76 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20  ive.** document 
13e10 73 69 7a 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  sizes for all co
13e20 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
13e30 20 76 6f 69 64 20 66 74 73 33 55 70 64 61 74 65   void fts3Update
13e40 44 6f 63 54 6f 74 61 6c 73 28 0a 20 20 69 6e 74  DocTotals(.  int
13e50 20 2a 70 52 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pRC,       /* 
13e60 54 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  The result code 
13e70 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  */.  Fts3Table *
13e80 70 2c 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65  p,   /* Table be
13e90 69 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 20  ing updated */. 
13ea0 20 75 33 32 20 2a 61 53 7a 49 6e 73 2c 20 20 20   u32 *aSzIns,   
13eb0 20 2f 2a 20 53 69 7a 65 20 69 6e 63 72 65 61 73   /* Size increas
13ec0 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a  es */.  u32 *aSz
13ed0 44 65 6c 2c 20 20 20 20 2f 2a 20 53 69 7a 65 20  Del,    /* Size 
13ee0 64 65 63 72 65 61 73 65 73 20 2a 2f 0a 20 20 69  decreases */.  i
13ef0 6e 74 20 6e 43 68 6e 67 20 20 20 20 20 20 20 2f  nt nChng       /
13f00 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20  * Change in the 
13f10 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65  number of docume
13f20 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
13f30 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20   *pBlob;        
13f40 20 20 20 20 20 2f 2a 20 53 74 6f 72 61 67 65 20       /* Storage 
13f50 66 6f 72 20 42 4c 4f 42 20 77 72 69 74 74 65 6e  for BLOB written
13f60 20 69 6e 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a   into %_stat */.
13f70 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20    int nBlob;    
13f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
13f90 7a 65 20 6f 66 20 42 4c 4f 42 20 77 72 69 74 74  ze of BLOB writt
13fa0 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61 74 20 2a  en into %_stat *
13fb0 2f 0a 20 20 75 33 32 20 2a 61 3b 20 20 20 20 20  /.  u32 *a;     
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fd0 41 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  Array of integer
13fe0 73 20 74 68 61 74 20 62 65 63 6f 6d 65 73 20 74  s that becomes t
13ff0 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c  he BLOB */.  sql
14000 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
14010 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65  ;     /* Stateme
14020 6e 74 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61  nt for reading a
14030 6e 64 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  nd writing */.  
14040 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
14050 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14060 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
14070 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14080 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
14090 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
140a0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
140b0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
140c0 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  a = sqlite3_m
140d0 61 6c 6c 6f 63 28 20 28 73 69 7a 65 6f 66 28 75  alloc( (sizeof(u
140e0 33 32 29 2b 31 30 29 2a 28 70 2d 3e 6e 43 6f 6c  32)+10)*(p->nCol
140f0 75 6d 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  umn+1) );.  if( 
14100 61 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  a==0 ){.    *pRC
14110 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
14120 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
14130 0a 20 20 70 42 6c 6f 62 20 3d 20 28 63 68 61 72  .  pBlob = (char
14140 2a 29 26 61 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  *)&a[p->nColumn+
14150 31 5d 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53  1];.  rc = fts3S
14160 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
14170 4c 45 43 54 5f 44 4f 43 54 4f 54 41 4c 2c 20 26  LECT_DOCTOTAL, &
14180 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
14190 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
141a0 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20  e3_free(a);.    
141b0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
141c0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
141d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
141e0 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
141f0 20 29 7b 0a 20 20 20 20 66 74 73 33 44 65 63 6f   ){.    fts3Deco
14200 64 65 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e 43  deIntArray(p->nC
14210 6f 6c 75 6d 6e 2b 31 2c 20 61 2c 0a 20 20 20 20  olumn+1, a,.    
14220 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
14230 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
14240 30 29 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  0),.         sql
14250 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
14260 73 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  s(pStmt, 0));.  
14270 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
14280 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(a, 0, sizeof(u
14290 33 32 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  32)*(p->nColumn+
142a0 31 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  1) );.  }.  sqli
142b0 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
142c0 3b 0a 20 20 69 66 28 20 6e 43 68 6e 67 3c 30 20  ;.  if( nChng<0 
142d0 26 26 20 61 5b 30 5d 3c 28 75 33 32 29 28 2d 6e  && a[0]<(u32)(-n
142e0 43 68 6e 67 29 20 29 7b 0a 20 20 20 20 61 5b 30  Chng) ){.    a[0
142f0 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ] = 0;.  }else{.
14300 20 20 20 20 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e      a[0] += nChn
14310 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  g;.  }.  for(i=0
14320 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  ; i<p->nColumn; 
14330 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20 78 20  i++){.    u32 x 
14340 3d 20 61 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66  = a[i+1];.    if
14350 28 20 78 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c 20  ( x+aSzIns[i] < 
14360 61 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20 20 20  aSzDel[i] ){.   
14370 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65     x = 0;.    }e
14380 6c 73 65 7b 0a 20 20 20 20 20 20 78 20 3d 20 78  lse{.      x = x
14390 20 2b 20 61 53 7a 49 6e 73 5b 69 5d 20 2d 20 61   + aSzIns[i] - a
143a0 53 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a  SzDel[i];.    }.
143b0 20 20 20 20 61 5b 69 2b 31 5d 20 3d 20 78 3b 0a      a[i+1] = x;.
143c0 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 65    }.  fts3Encode
143d0 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e 43 6f 6c  IntArray(p->nCol
143e0 75 6d 6e 2b 31 2c 20 61 2c 20 70 42 6c 6f 62 2c  umn+1, a, pBlob,
143f0 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20 3d   &nBlob);.  rc =
14400 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
14410 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 54  SQL_REPLACE_DOCT
14420 4f 54 41 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  OTAL, &pStmt, 0)
14430 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
14440 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
14450 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  );.    *pRC = rc
14460 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
14470 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  }.  sqlite3_bind
14480 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 31 2c 20  _blob(pStmt, 1, 
14490 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 53 51  pBlob, nBlob, SQ
144a0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
144b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
144c0 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71  mt);.  *pRC = sq
144d0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
144e0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
144f0 65 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(a);.}../*.** 
14500 48 61 6e 64 6c 65 20 61 20 27 73 70 65 63 69 61  Handle a 'specia
14510 6c 27 20 49 4e 53 45 52 54 20 6f 66 20 74 68 65  l' INSERT of the
14520 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
14530 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 28  INSERT INTO tbl(
14540 74 62 6c 29 20 56 41 4c 55 45 53 28 3c 65 78 70  tbl) VALUES(<exp
14550 72 3e 29 22 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  r>)".**.** Argum
14560 65 6e 74 20 70 56 61 6c 20 63 6f 6e 74 61 69 6e  ent pVal contain
14570 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
14580 3c 65 78 70 72 3e 2e 20 43 75 72 72 65 6e 74 6c  <expr>. Currentl
14590 79 20 74 68 65 20 6f 6e 6c 79 20 0a 2a 2a 20 6d  y the only .** m
145a0 65 61 6e 69 6e 67 66 75 6c 20 76 61 6c 75 65 20  eaningful value 
145b0 74 6f 20 69 6e 73 65 72 74 20 69 73 20 74 68 65  to insert is the
145c0 20 74 65 78 74 20 27 6f 70 74 69 6d 69 7a 65 27   text 'optimize'
145d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
145e0 66 74 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72  fts3SpecialInser
145f0 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  t(Fts3Table *p, 
14600 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
14610 56 61 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Val){.  int rc; 
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14630 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
14640 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  n Code */.  cons
14650 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28  t char *zVal = (
14660 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
14670 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
14680 70 56 61 6c 29 3b 0a 20 20 69 6e 74 20 6e 56 61  pVal);.  int nVa
14690 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
146a0 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 0a  e_bytes(pVal);..
146b0 20 20 69 66 28 20 21 7a 56 61 6c 20 29 7b 0a 20    if( !zVal ){. 
146c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
146d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 20  _NOMEM;.  }else 
146e0 69 66 28 20 6e 56 61 6c 3d 3d 38 20 26 26 20 30  if( nVal==8 && 0
146f0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
14700 6d 70 28 7a 56 61 6c 2c 20 22 6f 70 74 69 6d 69  mp(zVal, "optimi
14710 7a 65 22 2c 20 38 29 20 29 7b 0a 20 20 20 20 72  ze", 8) ){.    r
14720 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d  c = fts3SegmentM
14730 65 72 67 65 28 70 2c 20 2d 31 29 3b 0a 20 20 20  erge(p, -1);.   
14740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14750 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
14760 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
14780 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
14790 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a  gTermsClear(p);.
147a0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
147b0 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c 73 65  ITE_TEST.  }else
147c0 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26 20 30   if( nVal>9 && 0
147d0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
147e0 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65 73 69  mp(zVal, "nodesi
147f0 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20  ze=", 9) ){.    
14800 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d 20 61  p->nNodeSize = a
14810 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20  toi(&zVal[9]);. 
14820 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14830 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  K;.  }else if( n
14840 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73 71 6c  Val>11 && 0==sql
14850 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
14860 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e 67 3d  al, "maxpending=
14870 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 9) ){.    p->
14880 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20  nMaxPendingData 
14890 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31 31 5d  = atoi(&zVal[11]
148a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
148b0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  TE_OK;.#endif.  
148c0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
148d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
148e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
148f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
14900 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
14910 77 6f 72 6b 20 66 6f 72 20 74 68 65 20 78 55 70  work for the xUp
14920 64 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20 46  date method of F
14930 54 53 33 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  TS3 virtual.** t
14940 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ables..*/.int sq
14950 6c 69 74 65 33 46 74 73 33 55 70 64 61 74 65 4d  lite3Fts3UpdateM
14960 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
14970 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20  _vtab *pVtab,   
14980 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
14990 20 76 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a   vtab object */.
149a0 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67    /* Size of arg
149d0 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
149e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
149f0 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20  *apVal,         
14a00 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
14a10 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  uments */.  sqli
14a20 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64  te_int64 *pRowid
14a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14a40 55 54 3a 20 54 68 65 20 61 66 66 65 63 74 65 64  UT: The affected
14a50 20 28 6f 72 20 65 66 66 65 63 74 65 64 29 20 72   (or effected) r
14a60 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  owid */.){.  Fts
14a70 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73  3Table *p = (Fts
14a80 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a  3Table *)pVtab;.
14a90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14aa0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
14ab0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
14ac0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 6d 6f   */.  int isRemo
14ad0 76 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ve = 0;         
14ae0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
14af0 72 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  r an UPDATE or D
14b00 45 4c 45 54 45 20 2a 2f 0a 20 20 73 71 6c 69 74  ELETE */.  sqlit
14b10 65 33 5f 69 6e 74 36 34 20 69 52 65 6d 6f 76 65  e3_int64 iRemove
14b20 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 6f   = 0;      /* Ro
14b30 77 69 64 20 72 65 6d 6f 76 65 64 20 62 79 20 55  wid removed by U
14b40 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
14b50 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e 73  */.  u32 *aSzIns
14b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14b70 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
14b80 20 69 6e 73 65 72 74 65 64 20 64 6f 63 75 6d 65   inserted docume
14b90 6e 74 73 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53  nts */.  u32 *aS
14ba0 7a 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zDel;           
14bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
14bc0 73 20 6f 66 20 64 65 6c 65 74 65 64 20 64 6f 63  s of deleted doc
14bd0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
14be0 6e 43 68 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  nChng = 0;      
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14c00 65 74 20 63 68 61 6e 67 65 20 69 6e 20 6e 75 6d  et change in num
14c10 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ber of documents
14c20 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   */...  /* Alloc
14c30 61 74 65 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  ate space to hol
14c40 64 20 74 68 65 20 63 68 61 6e 67 65 20 69 6e 20  d the change in 
14c50 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65 73 20 2a  document sizes *
14c60 2f 0a 20 20 61 53 7a 49 6e 73 20 3d 20 73 71 6c  /.  aSzIns = sql
14c70 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
14c80 65 6f 66 28 61 53 7a 49 6e 73 5b 30 5d 29 2a 70  eof(aSzIns[0])*p
14c90 2d 3e 6e 43 6f 6c 75 6d 6e 2a 32 20 29 3b 0a 20  ->nColumn*2 );. 
14ca0 20 69 66 28 20 61 53 7a 49 6e 73 3d 3d 30 20 29   if( aSzIns==0 )
14cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14cc0 4f 4d 45 4d 3b 0a 20 20 61 53 7a 44 65 6c 20 3d  OMEM;.  aSzDel =
14cd0 20 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e 43 6f 6c   &aSzIns[p->nCol
14ce0 75 6d 6e 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  umn];.  memset(a
14cf0 53 7a 49 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66  SzIns, 0, sizeof
14d00 28 61 53 7a 49 6e 73 5b 30 5d 29 2a 70 2d 3e 6e  (aSzIns[0])*p->n
14d10 43 6f 6c 75 6d 6e 2a 32 29 3b 0a 0a 20 20 2f 2a  Column*2);..  /*
14d20 20 49 66 20 74 68 69 73 20 69 73 20 61 20 44 45   If this is a DE
14d30 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 6f  LETE or UPDATE o
14d40 70 65 72 61 74 69 6f 6e 2c 20 72 65 6d 6f 76 65  peration, remove
14d50 20 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e   the old record.
14d60 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
14d70 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
14d80 61 6c 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  al[0])!=SQLITE_N
14d90 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ULL ){.    int i
14da0 73 45 6d 70 74 79 3b 0a 20 20 20 20 72 63 20 3d  sEmpty;.    rc =
14db0 20 66 74 73 33 49 73 45 6d 70 74 79 28 70 2c 20   fts3IsEmpty(p, 
14dc0 61 70 56 61 6c 2c 20 26 69 73 45 6d 70 74 79 29  apVal, &isEmpty)
14dd0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14df0 20 69 66 28 20 69 73 45 6d 70 74 79 20 29 7b 0a   if( isEmpty ){.
14e00 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
14e10 69 6e 67 20 74 68 69 73 20 72 6f 77 20 6d 65 61  ing this row mea
14e20 6e 73 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62  ns the whole tab
14e30 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 49 6e 20  le is empty. In 
14e40 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 20 20  this case.      
14e50 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
14e60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20  contents of all 
14e70 74 68 72 65 65 20 74 61 62 6c 65 73 20 61 6e 64  three tables and
14e80 20 74 68 72 6f 77 20 61 77 61 79 20 61 6e 79 0a   throw away any.
14e90 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
14ea0 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 54 65  in the pendingTe
14eb0 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  rms hash table..
14ec0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14ed0 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
14ee0 74 65 41 6c 6c 28 70 29 3b 0a 20 20 20 20 20 20  teAll(p);.      
14ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
14f00 73 52 65 6d 6f 76 65 20 3d 20 31 3b 0a 20 20 20  sRemove = 1;.   
14f10 20 20 20 20 20 69 52 65 6d 6f 76 65 20 3d 20 73       iRemove = s
14f20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
14f30 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  64(apVal[0]);.  
14f40 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50        rc = fts3P
14f50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64  endingTermsDocid
14f60 28 70 2c 20 69 52 65 6d 6f 76 65 29 3b 0a 20 20  (p, iRemove);.  
14f70 20 20 20 20 20 20 66 74 73 33 44 65 6c 65 74 65        fts3Delete
14f80 54 65 72 6d 73 28 26 72 63 2c 20 70 2c 20 61 70  Terms(&rc, p, ap
14f90 56 61 6c 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20  Val, aSzDel);.  
14fa0 20 20 20 20 20 20 66 74 73 33 53 71 6c 45 78 65        fts3SqlExe
14fb0 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
14fc0 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 61 70  LETE_CONTENT, ap
14fd0 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Val);.        if
14fe0 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65  ( p->bHasDocsize
14ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
15000 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
15010 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 44 4f 43  , SQL_DELETE_DOC
15020 53 49 5a 45 2c 20 61 70 56 61 6c 29 3b 0a 20 20  SIZE, apVal);.  
15030 20 20 20 20 20 20 20 20 6e 43 68 6e 67 2d 2d 3b          nChng--;
15040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15050 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
15060 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
15070 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 70 2d  ue_type(apVal[p-
15080 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 21 3d 53 51  >nColumn+2])!=SQ
15090 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
150a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 53   sqlite3_free(aS
150b0 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72  zIns);.    retur
150c0 6e 20 66 74 73 33 53 70 65 63 69 61 6c 49 6e 73  n fts3SpecialIns
150d0 65 72 74 28 70 2c 20 61 70 56 61 6c 5b 70 2d 3e  ert(p, apVal[p->
150e0 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 3b 0a 20 20 7d  nColumn+2]);.  }
150f0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  .  .  /* If this
15100 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   is an INSERT or
15110 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
15120 6e 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 65  n, insert the ne
15130 77 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69  w record. */.  i
15140 66 28 20 6e 41 72 67 3e 31 20 26 26 20 72 63 3d  f( nArg>1 && rc=
15150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15160 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72    rc = fts3Inser
15170 74 44 61 74 61 28 70 2c 20 61 70 56 61 6c 2c 20  tData(p, apVal, 
15180 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  pRowid);.    if(
15190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
151a0 26 20 28 21 69 73 52 65 6d 6f 76 65 20 7c 7c 20  & (!isRemove || 
151b0 2a 70 52 6f 77 69 64 21 3d 69 52 65 6d 6f 76 65  *pRowid!=iRemove
151c0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
151d0 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
151e0 44 6f 63 69 64 28 70 2c 20 2a 70 52 6f 77 69 64  Docid(p, *pRowid
151f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
15200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15210 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
15220 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70 2c 20  3InsertTerms(p, 
15230 61 70 56 61 6c 2c 20 61 53 7a 49 6e 73 29 3b 0a  apVal, aSzIns);.
15240 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
15250 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a  >bHasDocsize ){.
15260 20 20 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20        nChng++;. 
15270 20 20 20 20 20 66 74 73 33 49 6e 73 65 72 74 44       fts3InsertD
15280 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c 20 61  ocsize(&rc, p, a
15290 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20  SzIns);.    }.  
152a0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73  }..  if( p->bHas
152b0 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 66  Docsize ){.    f
152c0 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f 74 61  ts3UpdateDocTota
152d0 6c 73 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e  ls(&rc, p, aSzIn
152e0 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 43 68 6e 67  s, aSzDel, nChng
152f0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
15300 33 5f 66 72 65 65 28 61 53 7a 49 6e 73 29 3b 0a  3_free(aSzIns);.
15310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15320 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79  /* .** Flush any
15330 20 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e   data in the pen
15340 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
15350 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20 49  table to disk. I
15360 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
15370 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65   merge all segme
15380 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  nts in the datab
15390 61 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74  ase (including t
153a0 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20  he new segment, 
153b0 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61 73  if .** there was
153c0 20 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c 75   any data to flu
153d0 73 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  sh) into a singl
153e0 65 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69  e segment. .*/.i
153f0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70  nt sqlite3Fts3Op
15400 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65  timize(Fts3Table
15410 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
15420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15430 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45  xec(p->db, "SAVE
15440 50 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c 20  POINT fts3", 0, 
15450 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
15460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15470 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65    rc = fts3Segme
15480 6e 74 4d 65 72 67 65 28 70 2c 20 2d 31 29 3b 0a  ntMerge(p, -1);.
15490 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
154a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
154b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
154c0 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
154d0 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29   fts3", 0, 0, 0)
154e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
154f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15500 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33       sqlite3Fts3
15510 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
15520 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r(p);.      }.  
15530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
15540 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
15550 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  b, "ROLLBACK TO 
15560 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b  fts3", 0, 0, 0);
15570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
15580 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45  xec(p->db, "RELE
15590 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30 2c  ASE fts3", 0, 0,
155a0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
155b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
155c0 65 6e 64 69 66 0a                                endif.