/ Hex Artifact Content
Login

Artifact c2e0ef39df121b291fda42992ef1387f7938dea1:


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 53 45 4c 45 43 54 5f 43 4f 4e 54 45  SQL_SELECT_CONTE
1560: 4e 54 5f 42 59 5f 52 4f 57 49 44 20 20 20 20 35  NT_BY_ROWID    5
1570: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58  .#define SQL_NEX
1580: 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 20  T_SEGMENT_INDEX 
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 49 4e 53 45 52 54 5f 53 45 47  e SQL_INSERT_SEG
15b0: 4d 45 4e 54 53 20 20 20 20 20 20 20 20 20 20 20  MENTS           
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 53 5f 49 44 20  EXT_SEGMENTS_ID 
15e0: 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65 66            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 44 49 52 20 20 20 20 20 20 20 20 20 20 20  EGDIR           
1610: 20 20 20 39 0a 23 64 65 66 69 6e 65 20 53 51 4c     9.#define SQL
1620: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 20 20 20  _SELECT_LEVEL   
1630: 20 20 20 20 20 20 20 20 20 20 20 31 30 0a 23 64             10.#d
1640: 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54  efine SQL_SELECT
1650: 5f 41 4c 4c 5f 4c 45 56 45 4c 20 20 20 20 20 20  _ALL_LEVEL      
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 5f  QL_SELECT_LEVEL_
1680: 43 4f 55 4e 54 20 20 20 20 20 20 20 20 31 32 0a  COUNT        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 53 45 47 44 49 52 5f 43 4f 55 4e 54 5f  CT_SEGDIR_COUNT_
16b0: 4d 41 58 20 20 20 31 33 0a 23 64 65 66 69 6e 65  MAX   13.#define
16c0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
16d0: 49 52 5f 42 59 5f 4c 45 56 45 4c 20 20 20 20 31  IR_BY_LEVEL    1
16e0: 34 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45  4.#define SQL_DE
16f0: 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41  LETE_SEGMENTS_RA
1700: 4e 47 45 20 20 20 20 20 31 35 0a 23 64 65 66 69  NGE     15.#defi
1710: 6e 65 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49  ne SQL_CONTENT_I
1720: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
1730: 20 31 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   16.#define SQL_
1740: 47 45 54 5f 42 4c 4f 43 4b 20 20 20 20 20 20 20  GET_BLOCK       
1750: 20 20 20 20 20 20 20 20 20 20 31 37 0a 0a 2f 2a            17../*
1760: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1770: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62 74  n is used to obt
1780: 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70 72  ain an SQLite pr
1790: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17a0: 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 74   handle.** for t
17b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64 65  he statement ide
17c0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
17d0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
17e0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
17f0: 2a 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  * *pp is set to 
1800: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 74  the requested st
1810: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61  atement handle a
1820: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1830: 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  urned..** Otherw
1840: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
1850: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1860: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
1870: 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a   set to 0..**.**
1880: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70 56   If argument apV
1890: 61 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  al is not NULL, 
18a0: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f 69  then it must poi
18b0: 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 77  nt to an array w
18c0: 69 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20  ith.** at least 
18d0: 61 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 20  as many entries 
18e0: 61 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  as the requested
18f0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
1900: 6f 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  ound .** paramet
1910: 65 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73 20  ers. The values 
1920: 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  are bound to the
1930: 20 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72 61   statements para
1940: 6d 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a 2a  meters before.**
1950: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1960: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 71  tatic int fts3Sq
1970: 6c 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61 62  lStmt(.  Fts3Tab
1980: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
1990: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
19a0: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
19b0: 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c   */.  int eStmt,
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
19e0: 74 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e 73  the SQL_XXX cons
19f0: 74 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a 20  tants above */. 
1a00: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
1a10: 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pp,             
1a20: 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65   /* OUT: Stateme
1a30: 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  nt handle */.  s
1a40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1a50: 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
1a60: 2a 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e 64  * Values to bind
1a70: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f   to statement */
1a80: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1a90: 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f 2a   *azSql[] = {./*
1aa0: 20 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20   0  */  "DELETE 
1ab0: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74  FROM %Q.'%q_cont
1ac0: 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69 64  ent' WHERE rowid
1ad0: 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f 20   = ?",./* 1  */ 
1ae0: 20 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58 49   "SELECT NOT EXI
1af0: 53 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69 64  STS(SELECT docid
1b00: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e   FROM %Q.'%q_con
1b10: 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69  tent' WHERE rowi
1b20: 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a 2f  d!=?)",./* 2  */
1b30: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1b40: 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22 2c  Q.'%q_content'",
1b50: 0a 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c 45  ./* 3  */  "DELE
1b60: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  TE FROM %Q.'%q_s
1b70: 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34 20  egments'",./* 4 
1b80: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
1b90: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
1ba0: 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 53 45  ",./* 5  */  "SE
1bb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 51 2e 27  LECT * FROM %Q.'
1bc0: 25 71 5f 63 6f 6e 74 65 6e 74 27 20 57 48 45 52  %q_content' WHER
1bd0: 45 20 72 6f 77 69 64 3d 3f 22 2c 0a 2f 2a 20 36  E rowid=?",./* 6
1be0: 20 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f    */  "SELECT co
1bf0: 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78 29 2b  alesce(max(idx)+
1c00: 31 2c 20 30 29 20 46 52 4f 4d 20 25 51 2e 27 25  1, 0) FROM %Q.'%
1c10: 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
1c20: 6c 65 76 65 6c 3d 3f 22 2c 0a 2f 2a 20 37 20 20  level=?",./* 7  
1c30: 2a 2f 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  */  "INSERT INTO
1c40: 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73   %Q.'%q_segments
1c50: 27 28 62 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b  '(blockid, block
1c60: 29 20 56 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c  ) VALUES(?, ?)",
1c70: 0a 2f 2a 20 38 20 20 2a 2f 20 20 22 53 45 4c 45  ./* 8  */  "SELE
1c80: 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28  CT coalesce(max(
1c90: 62 6c 6f 63 6b 69 64 29 2b 31 2c 20 31 29 20 46  blockid)+1, 1) F
1ca0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65  ROM %Q.'%q_segme
1cb0: 6e 74 73 27 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20  nts'",./* 9  */ 
1cc0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
1cd0: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 56 41 4c  .'%q_segdir' VAL
1ce0: 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29  UES(?,?,?,?,?,?)
1cf0: 22 2c 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ",..          /*
1d00: 20 52 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73   Return segments
1d10: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f   in order from o
1d20: 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e  ldest to newest.
1d30: 2a 2f 20 0a 2f 2a 20 31 30 20 2a 2f 20 20 22 53  */ ./* 10 */  "S
1d40: 45 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74  ELECT idx, start
1d50: 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65  _block, leaves_e
1d60: 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c  nd_block, end_bl
1d70: 6f 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20  ock, root ".    
1d80: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
1d90: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
1da0: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44  RE level = ? ORD
1db0: 45 52 20 42 59 20 69 64 78 20 41 53 43 22 2c 0a  ER BY idx ASC",.
1dc0: 2f 2a 20 31 31 20 2a 2f 20 20 22 53 45 4c 45 43  /* 11 */  "SELEC
1dd0: 54 20 69 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f  T idx, start_blo
1de0: 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62  ck, leaves_end_b
1df0: 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c  lock, end_block,
1e00: 20 72 6f 6f 74 20 22 0a 20 20 20 20 20 20 20 20   root ".        
1e10: 20 20 20 20 22 46 52 4f 4d 20 25 51 2e 27 25 71      "FROM %Q.'%q
1e20: 5f 73 65 67 64 69 72 27 20 4f 52 44 45 52 20 42  _segdir' ORDER B
1e30: 59 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64  Y level DESC, id
1e40: 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31 32 20 2a  x ASC",../* 12 *
1e50: 2f 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  /  "SELECT count
1e60: 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  (*) FROM %Q.'%q_
1e70: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
1e80: 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31 33 20  vel = ?",./* 13 
1e90: 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  */  "SELECT coun
1ea0: 74 28 2a 29 2c 20 6d 61 78 28 6c 65 76 65 6c 29  t(*), max(level)
1eb0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
1ec0: 64 69 72 27 22 2c 0a 0a 2f 2a 20 31 34 20 2a 2f  dir'",../* 14 */
1ed0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1ee0: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
1ef0: 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a  ERE level = ?",.
1f00: 2f 2a 20 31 35 20 2a 2f 20 20 22 44 45 4c 45 54  /* 15 */  "DELET
1f10: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  E FROM %Q.'%q_se
1f20: 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20 62 6c  gments' WHERE bl
1f30: 6f 63 6b 69 64 20 42 45 54 57 45 45 4e 20 3f 20  ockid BETWEEN ? 
1f40: 41 4e 44 20 3f 22 2c 0a 2f 2a 20 31 36 20 2a 2f  AND ?",./* 16 */
1f50: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
1f60: 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 56  Q.'%q_content' V
1f70: 41 4c 55 45 53 28 25 7a 29 22 2c 0a 2f 2a 20 31  ALUES(%z)",./* 1
1f80: 37 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 62 6c  7 */  "SELECT bl
1f90: 6f 63 6b 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ock FROM %Q.'%q_
1fa0: 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20  segments' WHERE 
1fb0: 62 6c 6f 63 6b 69 64 20 3d 20 3f 22 2c 0a 20 20  blockid = ?",.  
1fc0: 7d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  };.  int rc = SQ
1fd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
1fe0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 53 69 7a 65 6f  .  assert( Sizeo
2000: 66 41 72 72 61 79 28 61 7a 53 71 6c 29 3d 3d 53  fArray(azSql)==S
2010: 69 7a 65 6f 66 41 72 72 61 79 28 70 2d 3e 61 53  izeofArray(p->aS
2020: 74 6d 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tmt) );.  assert
2030: 28 20 65 53 74 6d 74 3c 53 69 7a 65 6f 66 41 72  ( eStmt<SizeofAr
2040: 72 61 79 28 61 7a 53 71 6c 29 20 26 26 20 65 53  ray(azSql) && eS
2050: 74 6d 74 3e 3d 30 20 29 3b 0a 20 20 0a 20 20 70  tmt>=0 );.  .  p
2060: 53 74 6d 74 20 3d 20 70 2d 3e 61 53 74 6d 74 5b  Stmt = p->aStmt[
2070: 65 53 74 6d 74 5d 3b 0a 20 20 69 66 28 20 21 70  eStmt];.  if( !p
2080: 53 74 6d 74 20 29 7b 0a 20 20 20 20 63 68 61 72  Stmt ){.    char
2090: 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 69 66 28 20   *zSql;.    if( 
20a0: 65 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f 4e 54 45  eStmt==SQL_CONTE
20b0: 4e 54 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20  NT_INSERT ){.   
20c0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20e0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
20f0: 62 6c 65 20 2a 2f 20 20 0a 20 20 20 20 20 20 63  ble */  .      c
2100: 68 61 72 20 2a 7a 56 61 72 6c 69 73 74 3b 20 20  har *zVarlist;  
2110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2120: 65 20 22 3f 2c 20 3f 2c 20 2e 2e 2e 22 20 73 74  e "?, ?, ..." st
2130: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 7a 56  ring */.      zV
2140: 61 72 6c 69 73 74 20 3d 20 28 63 68 61 72 20 2a  arlist = (char *
2150: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2160: 32 2a 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 29 3b  2*p->nColumn+2);
2170: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 56 61 72  .      if( !zVar
2180: 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  list ){.        
2190: 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *pp = 0;.       
21a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
21b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
21c0: 20 20 20 20 7a 56 61 72 6c 69 73 74 5b 30 5d 20      zVarlist[0] 
21d0: 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 7a 56 61  = '?';.      zVa
21e0: 72 6c 69 73 74 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e  rlist[p->nColumn
21f0: 2a 32 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  *2+1] = '\0';.  
2200: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
2210: 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  p->nColumn; i++)
2220: 7b 0a 20 20 20 20 20 20 20 20 7a 56 61 72 6c 69  {.        zVarli
2230: 73 74 5b 69 2a 32 2d 31 5d 20 3d 20 27 2c 27 3b  st[i*2-1] = ',';
2240: 0a 20 20 20 20 20 20 20 20 7a 56 61 72 6c 69 73  .        zVarlis
2250: 74 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20 20  t[i*2] = '?';.  
2260: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 71 6c      }.      zSql
2270: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2280: 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c  tf(azSql[eStmt],
2290: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
22a0: 65 2c 20 7a 56 61 72 6c 69 73 74 29 3b 0a 20 20  e, zVarlist);.  
22b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
22c0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
22d0: 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d  rintf(azSql[eStm
22e0: 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  t], p->zDb, p->z
22f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
2300: 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20   if( !zSql ){.  
2310: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2320: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2330: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2340: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2350: 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
2360: 20 26 70 53 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a   &pStmt, NULL);.
2370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2380: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ee(zSql);.      
2390: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
23a0: 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d  TE_OK || pStmt==
23b0: 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 53  0 );.      p->aS
23c0: 74 6d 74 5b 65 53 74 6d 74 5d 20 3d 20 70 53 74  tmt[eStmt] = pSt
23d0: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  mt;.    }.  }.  
23e0: 69 66 28 20 61 70 56 61 6c 20 29 7b 0a 20 20 20  if( apVal ){.   
23f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
2400: 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74 65 33  nParam = sqlite3
2410: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2420: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
2430: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
2440: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 50  QLITE_OK && i<nP
2450: 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aram; i++){.    
2460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2470: 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c  ind_value(pStmt,
2480: 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b   i+1, apVal[i]);
2490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
24a0: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   = pStmt;.  retu
24b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24c0: 53 69 6d 69 6c 61 72 20 74 6f 20 66 74 73 33 53  Similar to fts3S
24d0: 71 6c 53 74 6d 74 28 29 2e 20 45 78 63 65 70 74  qlStmt(). Except
24e0: 2c 20 61 66 74 65 72 20 62 69 6e 64 69 6e 67 20  , after binding 
24f0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 69  the parameters i
2500: 6e 0a 2a 2a 20 61 72 72 61 79 20 61 70 56 61 6c  n.** array apVal
2510: 5b 5d 20 74 6f 20 74 68 65 20 53 51 4c 20 73 74  [] to the SQL st
2520: 61 74 65 6d 65 6e 74 20 69 64 65 6e 74 69 66 69  atement identifi
2530: 65 64 20 62 79 20 65 53 74 6d 74 2c 20 74 68 65  ed by eStmt, the
2540: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73   statement.** is
2550: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a   executed..**.**
2560: 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   Returns SQLITE_
2570: 4f 4b 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  OK if the statem
2580: 65 6e 74 20 69 73 20 73 75 63 63 65 73 73 66 75  ent is successfu
2590: 6c 6c 79 20 65 78 65 63 75 74 65 64 2c 20 6f 72  lly executed, or
25a0: 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72   an.** SQLite er
25b0: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
25c0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
25d0: 74 20 66 74 73 33 53 71 6c 45 78 65 63 28 46 74  t fts3SqlExec(Ft
25e0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20  s3Table *p, int 
25f0: 65 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 76  eStmt, sqlite3_v
2600: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20  alue **apVal){. 
2610: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2620: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Stmt;.  int rc =
2630: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
2640: 65 53 74 6d 74 2c 20 26 70 53 74 6d 74 2c 20 61  eStmt, &pStmt, a
2650: 70 56 61 6c 29 3b 20 0a 20 20 69 66 28 20 72 63  pVal); .  if( rc
2660: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2670: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
2680: 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d  pStmt);.    rc =
2690: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
26a0: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Stmt);.  }.  ret
26b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
26c0: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
26d0: 62 6c 6f 63 6b 20 66 72 6f 6d 20 74 68 65 20 25  block from the %
26e0: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e  _segments table.
26f0: 20 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65   If the specifie
2700: 64 20 62 6c 6f 63 6b 0a 2a 2a 20 64 6f 65 73 20  d block.** does 
2710: 6e 6f 74 20 65 78 69 73 74 2c 20 72 65 74 75 72  not exist, retur
2720: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2730: 2e 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  . If some other 
2740: 65 72 72 6f 72 20 28 6d 61 6c 6c 6f 63 2c 20 49  error (malloc, I
2750: 4f 20 0a 2a 2a 20 65 74 63 2e 29 20 6f 63 63 75  O .** etc.) occu
2760: 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 61  rs, return the a
2770: 70 70 72 6f 70 72 69 61 74 65 20 53 51 4c 69 74  ppropriate SQLit
2780: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
2790: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
27a0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
27b0: 74 20 2a 70 7a 42 6c 6f 63 6b 20 74 6f 20 70 6f  t *pzBlock to po
27c0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
27d0: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68  containing.** th
27e0: 65 20 62 6c 6f 63 6b 20 72 65 61 64 20 66 72 6f  e block read fro
27f0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
2800: 61 6e 64 20 2a 70 6e 42 6c 6f 63 6b 20 74 6f 20  and *pnBlock to 
2810: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
2820: 72 65 61 64 0a 2a 2a 20 62 6c 6f 63 6b 20 69 6e  read.** block in
2830: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 41   bytes..**.** WA
2840: 52 4e 49 4e 47 3a 20 54 68 65 20 72 65 74 75 72  RNING: The retur
2850: 6e 65 64 20 62 75 66 66 65 72 20 69 73 20 6f 6e  ned buffer is on
2860: 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ly valid until t
2870: 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
2880: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 33 52  .** sqlite3Fts3R
2890: 65 61 64 42 6c 6f 63 6b 28 29 2e 0a 2a 2f 0a 69  eadBlock()..*/.i
28a0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 52 65  nt sqlite3Fts3Re
28b0: 61 64 42 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54  adBlock(.  Fts3T
28c0: 61 62 6c 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74  able *p,.  sqlit
28d0: 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c  e3_int64 iBlock,
28e0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
28f0: 70 7a 42 6c 6f 63 6b 2c 0a 20 20 69 6e 74 20 2a  pzBlock,.  int *
2900: 70 6e 42 6c 6f 63 6b 0a 29 7b 0a 20 20 73 71 6c  pnBlock.){.  sql
2910: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2920: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
2930: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
2940: 47 45 54 5f 42 4c 4f 43 4b 2c 20 26 70 53 74 6d  GET_BLOCK, &pStm
2950: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
2960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2970: 75 72 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  urn rc;.  sqlite
2980: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
2990: 0a 20 20 69 66 28 20 70 7a 42 6c 6f 63 6b 20 29  .  if( pzBlock )
29a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
29b0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
29c0: 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  1, iBlock);.    
29d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
29e0: 70 28 70 53 74 6d 74 29 3b 20 0a 20 20 20 20 69  p(pStmt); .    i
29f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
2a00: 57 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  W ){.      retur
2a10: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
2a20: 4e 45 20 3f 20 53 51 4c 49 54 45 5f 43 4f 52 52  NE ? SQLITE_CORR
2a30: 55 50 54 20 3a 20 72 63 29 3b 0a 20 20 20 20 7d  UPT : rc);.    }
2a40: 0a 20 20 0a 20 20 20 20 2a 70 6e 42 6c 6f 63 6b  .  .    *pnBlock
2a50: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2a60: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30  n_bytes(pStmt, 0
2a70: 29 3b 0a 20 20 20 20 2a 70 7a 42 6c 6f 63 6b 20  );.    *pzBlock 
2a80: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
2a90: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
2aa0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
2ab0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2ac0: 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 21 3d  type(pStmt, 0)!=
2ad0: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
2ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2af0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
2b00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
2b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2b20: 2a 2a 20 53 65 74 20 2a 70 70 53 74 6d 74 20 74  ** Set *ppStmt t
2b30: 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  o a statement ha
2b40: 6e 64 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  ndle that may be
2b50: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
2b60: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
2b70: 72 6f 77 73 20 69 6e 20 74 68 65 20 25 5f 73 65  rows in the %_se
2b80: 67 64 69 72 20 74 61 62 6c 65 2c 20 66 72 6f 6d  gdir table, from
2b90: 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73   oldest to newes
2ba0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
2bb0: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
2bc0: 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72  TE_OK. If an err
2bd0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2be0: 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74  preparing the st
2bf0: 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a 20 72 65 74  atement, .** ret
2c00: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
2c10: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
2c20: 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  There is only ev
2c30: 65 72 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  er one instance 
2c40: 6f 66 20 74 68 69 73 20 53 51 4c 20 73 74 61 74  of this SQL stat
2c50: 65 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 64 20 66  ement compiled f
2c60: 6f 72 0a 2a 2a 20 65 61 63 68 20 46 54 53 33 20  or.** each FTS3 
2c70: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
2c80: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
2c90: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
2ca0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
2cb0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
2cc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 69 64 78  :.**.**   0: idx
2cd0: 0a 2a 2a 20 20 20 31 3a 20 73 74 61 72 74 5f 62  .**   1: start_b
2ce0: 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a 20 6c 65 61  lock.**   2: lea
2cf0: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a  ves_end_block.**
2d00: 20 20 20 33 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a     3: end_block.
2d10: 2a 2a 20 20 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a  **   4: root.*/.
2d20: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 41  int sqlite3Fts3A
2d30: 6c 6c 53 65 67 64 69 72 73 28 46 74 73 33 54 61  llSegdirs(Fts3Ta
2d40: 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ble *p, sqlite3_
2d50: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 29 7b 0a  stmt **ppStmt){.
2d60: 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 71 6c    return fts3Sql
2d70: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
2d80: 43 54 5f 41 4c 4c 5f 4c 45 56 45 4c 2c 20 70 70  CT_ALL_LEVEL, pp
2d90: 53 74 6d 74 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Stmt, 0);.}.../*
2da0: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e  .** Append a sin
2db0: 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20  gle varint to a 
2dc0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 62 75 66 66  PendingList buff
2dd0: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
2de0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20   returned.** if 
2df0: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
2e00: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
2e10: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
2e20: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2e30: 6f 6e 20 61 6c 73 6f 20 73 65 72 76 65 73 20 74  on also serves t
2e40: 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
2e50: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
2e60: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  ture itself..** 
2e70: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  For example, to 
2e80: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 65 6e  create a new Pen
2e90: 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75  dingList structu
2ea0: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 77  re containing tw
2eb0: 6f 0a 2a 2a 20 76 61 72 69 6e 74 73 3a 0a 2a 2a  o.** varints:.**
2ec0: 0a 2a 2a 20 20 20 50 65 6e 64 69 6e 67 4c 69 73  .**   PendingLis
2ed0: 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20 20 66  t *p = 0;.**   f
2ee0: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
2ef0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31  pendVarint(&p, 1
2f00: 29 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65 6e 64  );.**   fts3Pend
2f10: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
2f20: 69 6e 74 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73  int(&p, 2);.*/.s
2f30: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65  tatic int fts3Pe
2f40: 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56  ndingListAppendV
2f50: 61 72 69 6e 74 28 0a 20 20 50 65 6e 64 69 6e 67  arint(.  Pending
2f60: 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20 20  List **pp,      
2f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2f80: 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 50  UT: Pointer to P
2f90: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
2fa0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
2fb0: 6e 74 36 34 20 69 20 20 20 20 20 20 20 20 20 20  nt64 i          
2fc0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2fd0: 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
2fe0: 61 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e  a */.){.  Pendin
2ff0: 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a  gList *p = *pp;.
3000: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  .  /* Allocate o
3010: 72 20 67 72 6f 77 20 74 68 65 20 50 65 6e 64 69  r grow the Pendi
3020: 6e 67 4c 69 73 74 20 61 73 20 72 65 71 75 69 72  ngList as requir
3030: 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 20  ed. */.  if( !p 
3040: 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
3050: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
3060: 28 2a 70 29 20 2b 20 31 30 30 29 3b 0a 20 20 20  (*p) + 100);.   
3070: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20   if( !p ){.     
3080: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
3090: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
30a0: 70 2d 3e 6e 53 70 61 63 65 20 3d 20 31 30 30 3b  p->nSpace = 100;
30b0: 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20  .    p->aData = 
30c0: 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20  (char *)&p[1];. 
30d0: 20 20 20 70 2d 3e 6e 44 61 74 61 20 3d 20 30 3b     p->nData = 0;
30e0: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
30f0: 70 2d 3e 6e 44 61 74 61 2b 46 54 53 33 5f 56 41  p->nData+FTS3_VA
3100: 52 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53  RINT_MAX+1>p->nS
3110: 70 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  pace ){.    int 
3120: 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53 70 61 63 65  nNew = p->nSpace
3130: 20 2a 20 32 3b 0a 20 20 20 20 70 20 3d 20 73 71   * 2;.    p = sq
3140: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c  lite3_realloc(p,
3150: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e 4e   sizeof(*p) + nN
3160: 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20  ew);.    if( !p 
3170: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3180: 5f 66 72 65 65 28 2a 70 70 29 3b 0a 20 20 20 20  _free(*pp);.    
3190: 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 20    *pp = 0;.     
31a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
31b0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
31c0: 70 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65 77  p->nSpace = nNew
31d0: 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d  ;.    p->aData =
31e0: 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a   (char *)&p[1];.
31f0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
3200: 20 74 68 65 20 6e 65 77 20 73 65 72 69 61 6c 69   the new seriali
3210: 7a 65 64 20 76 61 72 69 6e 74 20 74 6f 20 74 68  zed varint to th
3220: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
3230: 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74 61  t. */.  p->nData
3240: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
3250: 75 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 44 61  utVarint(&p->aDa
3260: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20 69 29  ta[p->nData], i)
3270: 3b 0a 20 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e  ;.  p->aData[p->
3280: 6e 44 61 74 61 5d 20 3d 20 27 5c 30 27 3b 0a 20  nData] = '\0';. 
3290: 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75   *pp = p;.  retu
32a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 64 6f 63  ./*.** Add a doc
32c0: 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69  id/column/positi
32d0: 6f 6e 20 65 6e 74 72 79 20 74 6f 20 61 20 50 65  on entry to a Pe
32e0: 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74  ndingList struct
32f0: 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  ure. Non-zero.**
3300: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
3310: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  the structure is
3320: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
3330: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 64  ed as part of ad
3340: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 74 72  ding.** the entr
3350: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65  y. Otherwise, ze
3360: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ro..**.** If an 
3370: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
3380: 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  , *pRc is set to
3390: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65   SQLITE_NOMEM be
33a0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
33b0: 2a 2a 20 5a 65 72 6f 20 69 73 20 61 6c 77 61 79  ** Zero is alway
33c0: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  s returned in th
33d0: 69 73 20 63 61 73 65 2e 20 4f 74 68 65 72 77 69  is case. Otherwi
33e0: 73 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20 65 72  se, if no OOM er
33f0: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ror occurs,.** i
3400: 74 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  t is set to SQLI
3410: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
3420: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
3430: 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 65  ListAppend(.  Pe
3440: 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20  ndingList **pp, 
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3460: 20 49 4e 2f 4f 55 54 3a 20 50 65 6e 64 69 6e 67   IN/OUT: Pending
3470: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 2a  List structure *
3480: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
3490: 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  4 iDocid,       
34a0: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f 72      /* Docid for
34b0: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
34c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
34d0: 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
34e0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72     /* Column for
34f0: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
3500: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
3510: 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
3520: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
3530: 66 20 74 65 72 6d 20 66 6f 72 20 65 6e 74 72 79  f term for entry
3540: 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74   to add */.  int
3550: 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3570: 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65  OUT: Return code
3580: 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67   */.){.  Pending
3590: 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 20  List *p = *pp;. 
35a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35b0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
35c0: 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44 6f  !p || p->iLastDo
35d0: 63 69 64 3c 3d 69 44 6f 63 69 64 20 29 3b 0a 0a  cid<=iDocid );..
35e0: 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e 69    if( !p || p->i
35f0: 4c 61 73 74 44 6f 63 69 64 21 3d 69 44 6f 63 69  LastDocid!=iDoci
3600: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
3610: 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 20 3d 20  _int64 iDelta = 
3620: 69 44 6f 63 69 64 20 2d 20 28 70 20 3f 20 70 2d  iDocid - (p ? p-
3630: 3e 69 4c 61 73 74 44 6f 63 69 64 20 3a 20 30 29  >iLastDocid : 0)
3640: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
3650: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
3660: 6e 44 61 74 61 3c 70 2d 3e 6e 53 70 61 63 65 20  nData<p->nSpace 
3670: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3680: 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61   p->aData[p->nDa
3690: 74 61 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ta]==0 );.      
36a0: 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20 20 20  p->nData++;.    
36b0: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
36c0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
36d0: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
36e0: 56 61 72 69 6e 74 28 26 70 2c 20 69 44 65 6c 74  Varint(&p, iDelt
36f0: 61 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  a)) ){.      got
3700: 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70 70  o pendinglistapp
3710: 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  end_out;.    }. 
3720: 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d     p->iLastCol =
3730: 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73   -1;.    p->iLas
3740: 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d  tPos = 0;.    p-
3750: 3e 69 4c 61 73 74 44 6f 63 69 64 20 3d 20 69 44  >iLastDocid = iD
3760: 6f 63 69 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ocid;.  }.  if( 
3770: 69 43 6f 6c 3e 30 20 26 26 20 70 2d 3e 69 4c 61  iCol>0 && p->iLa
3780: 73 74 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20  stCol!=iCol ){. 
3790: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
37a0: 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64  !=(rc = fts3Pend
37b0: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
37c0: 69 6e 74 28 26 70 2c 20 31 29 29 0a 20 20 20 20  int(&p, 1)).    
37d0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
37e0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
37f0: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
3800: 28 26 70 2c 20 69 43 6f 6c 29 29 0a 20 20 20 20  (&p, iCol)).    
3810: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65  ){.      goto pe
3820: 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f  ndinglistappend_
3830: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
3840: 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 69 43 6f  ->iLastCol = iCo
3850: 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50  l;.    p->iLastP
3860: 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  os = 0;.  }.  if
3870: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
3880: 20 61 73 73 65 72 74 28 20 69 50 6f 73 3e 70 2d   assert( iPos>p-
3890: 3e 69 4c 61 73 74 50 6f 73 20 7c 7c 20 28 69 50  >iLastPos || (iP
38a0: 6f 73 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 61 73  os==0 && p->iLas
38b0: 74 50 6f 73 3d 3d 30 29 20 29 3b 0a 20 20 20 20  tPos==0) );.    
38c0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
38d0: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
38e0: 28 26 70 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e 69  (&p, 2+iPos-p->i
38f0: 4c 61 73 74 50 6f 73 29 3b 0a 20 20 20 20 69 66  LastPos);.    if
3900: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3910: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 61 73  ){.      p->iLas
3920: 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20 20  tPos = iPos;.   
3930: 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64 69 6e 67   }.  }.. pending
3940: 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3a 0a  listappend_out:.
3950: 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 69    *pRc = rc;.  i
3960: 66 28 20 70 21 3d 2a 70 70 20 29 7b 0a 20 20 20  f( p!=*pp ){.   
3970: 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20 72 65   *pp = p;.    re
3980: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
3990: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
39a0: 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e 75   Tokenize the nu
39b0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
39c0: 69 6e 67 20 7a 54 65 78 74 20 61 6e 64 20 61 64  ing zText and ad
39d0: 64 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f 20  d all tokens to 
39e0: 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d 74  the.** pending-t
39f0: 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65 2e  erms hash-table.
3a00: 20 54 68 65 20 64 6f 63 69 64 20 75 73 65 64 20   The docid used 
3a10: 69 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  is that currentl
3a20: 79 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70  y stored in.** p
3a30: 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 61 6e  ->iPrevDocid, an
3a40: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  d the column is 
3a50: 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72 67  specified by arg
3a60: 75 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a  ument iCol..**.*
3a70: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
3a80: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
3a90: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
3aa0: 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
3ab0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
3ac0: 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69  ic int fts3Pendi
3ad0: 6e 67 54 65 72 6d 73 41 64 64 28 46 74 73 33 54  ngTermsAdd(Fts3T
3ae0: 61 62 6c 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  able *p, const c
3af0: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
3b00: 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b  iCol){.  int rc;
3b10: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 3b 0a 20  .  int iStart;. 
3b20: 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 69 6e 74   int iEnd;.  int
3b30: 20 69 50 6f 73 3b 0a 0a 20 20 63 68 61 72 20 63   iPos;..  char c
3b40: 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20  onst *zToken;.  
3b50: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 73  int nToken;..  s
3b60: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
3b70: 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70   *pTokenizer = p
3b80: 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20  ->pTokenizer;.  
3b90: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
3ba0: 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a  r_module const *
3bb0: 70 4d 6f 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e  pModule = pToken
3bc0: 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  izer->pModule;. 
3bd0: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
3be0: 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 3b  er_cursor *pCsr;
3bf0: 0a 20 20 69 6e 74 20 28 2a 78 4e 65 78 74 29 28  .  int (*xNext)(
3c00: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
3c10: 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  r_cursor *pCurso
3c20: 72 2c 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  r,.      const c
3c30: 68 61 72 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c  har**,int*,int*,
3c40: 69 6e 74 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61  int*,int*);..  a
3c50: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65  ssert( pTokenize
3c60: 72 20 26 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a  r && pModule );.
3c70: 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d  .  rc = pModule-
3c80: 3e 78 4f 70 65 6e 28 70 54 6f 6b 65 6e 69 7a 65  >xOpen(pTokenize
3c90: 72 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70  r, zText, -1, &p
3ca0: 43 73 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Csr);.  if( rc!=
3cb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3cc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
3cd0: 20 20 70 43 73 72 2d 3e 70 54 6f 6b 65 6e 69 7a    pCsr->pTokeniz
3ce0: 65 72 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 3b  er = pTokenizer;
3cf0: 0a 0a 20 20 78 4e 65 78 74 20 3d 20 70 4d 6f 64  ..  xNext = pMod
3d00: 75 6c 65 2d 3e 78 4e 65 78 74 3b 0a 20 20 77 68  ule->xNext;.  wh
3d10: 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ile( SQLITE_OK==
3d20: 72 63 0a 20 20 20 20 20 20 26 26 20 53 51 4c 49  rc.      && SQLI
3d30: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e 65  TE_OK==(rc = xNe
3d40: 78 74 28 70 43 73 72 2c 20 26 7a 54 6f 6b 65 6e  xt(pCsr, &zToken
3d50: 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 53 74 61  , &nToken, &iSta
3d60: 72 74 2c 20 26 69 45 6e 64 2c 20 26 69 50 6f 73  rt, &iEnd, &iPos
3d70: 29 29 0a 20 20 29 7b 0a 20 20 20 20 50 65 6e 64  )).  ){.    Pend
3d80: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  ingList *pList;.
3d90: 0a 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e  .    /* Position
3da0: 73 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61  s cannot be nega
3db0: 74 69 76 65 3b 20 77 65 20 75 73 65 20 2d 31 20  tive; we use -1 
3dc0: 61 73 20 61 20 74 65 72 6d 69 6e 61 74 6f 72 20  as a terminator 
3dd0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 20 20  internally..    
3de0: 2a 2a 20 54 6f 6b 65 6e 73 20 6d 75 73 74 20 68  ** Tokens must h
3df0: 61 76 65 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 6c  ave a non-zero l
3e00: 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  ength..    */.  
3e10: 20 20 69 66 28 20 69 50 6f 73 3c 30 20 7c 7c 20    if( iPos<0 || 
3e20: 21 7a 54 6f 6b 65 6e 20 7c 7c 20 6e 54 6f 6b 65  !zToken || nToke
3e30: 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  n<=0 ){.      rc
3e40: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
3e50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3e60: 20 20 7d 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d    }..    pList =
3e70: 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29   (PendingList *)
3e80: 66 74 73 33 48 61 73 68 46 69 6e 64 28 26 70 2d  fts3HashFind(&p-
3e90: 3e 70 65 6e 64 69 6e 67 54 65 72 6d 73 2c 20 7a  >pendingTerms, z
3ea0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
3eb0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
3ec0: 0a 20 20 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  .      p->nPendi
3ed0: 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c 69 73 74  ngData -= (pList
3ee0: 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e  ->nData + nToken
3ef0: 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61   + sizeof(Fts3Ha
3f00: 73 68 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a  shElem));.    }.
3f10: 20 20 20 20 69 66 28 20 66 74 73 33 50 65 6e 64      if( fts3Pend
3f20: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70  ingListAppend(&p
3f30: 4c 69 73 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f  List, p->iPrevDo
3f40: 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  cid, iCol, iPos,
3f50: 20 26 72 63 29 20 29 7b 0a 20 20 20 20 20 20 69   &rc) ){.      i
3f60: 66 28 20 70 4c 69 73 74 3d 3d 66 74 73 33 48 61  f( pList==fts3Ha
3f70: 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 65 6e  shInsert(&p->pen
3f80: 64 69 6e 67 54 65 72 6d 73 2c 20 7a 54 6f 6b 65  dingTerms, zToke
3f90: 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69 73 74  n, nToken, pList
3fa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
3fb0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68  Malloc failed wh
3fc0: 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68  ile inserting th
3fd0: 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69  e new entry. Thi
3fe0: 73 20 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20  s can only .    
3ff0: 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 20 69 66      ** happen if
4000: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 20 70 72   there was no pr
4010: 65 76 69 6f 75 73 20 65 6e 74 72 79 20 66 6f 72  evious entry for
4020: 20 74 68 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20   this token..   
4030: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
4040: 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 33 48  assert( 0==fts3H
4050: 61 73 68 46 69 6e 64 28 26 70 2d 3e 70 65 6e 64  ashFind(&p->pend
4060: 69 6e 67 54 65 72 6d 73 2c 20 7a 54 6f 6b 65 6e  ingTerms, zToken
4070: 2c 20 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  , nToken) );.   
4080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4090: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
40a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
40b0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
40c0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
40d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
40e0: 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
40f0: 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61  a += (pList->nDa
4100: 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69  ta + nToken + si
4110: 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65  zeof(Fts3HashEle
4120: 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  m));.    }.  }..
4130: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
4140: 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
4150: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
4160: 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
4170: 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   rc);.}../* .** 
4180: 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  Calling this fun
4190: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
41a0: 74 68 61 74 20 73 75 62 73 65 71 75 65 6e 74 20  that subsequent 
41b0: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 66 74 73  calls to .** fts
41c0: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64  3PendingTermsAdd
41d0: 28 29 20 61 72 65 20 74 6f 20 61 64 64 20 74 65  () are to add te
41e0: 72 6d 2f 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  rm/position-list
41f0: 20 70 61 69 72 73 20 66 6f 72 20 74 68 65 0a 2a   pairs for the.*
4200: 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
4210: 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
4220: 64 6f 63 69 64 20 69 44 6f 63 69 64 2e 0a 2a 2f  docid iDocid..*/
4230: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
4240: 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69  PendingTermsDoci
4250: 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  d(Fts3Table *p, 
4260: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 44 6f  sqlite_int64 iDo
4270: 63 69 64 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 28  cid){.  /* TODO(
4280: 73 68 65 73 73 29 20 45 78 70 6c 6f 72 65 20 77  shess) Explore w
4290: 68 65 74 68 65 72 20 70 61 72 74 69 61 6c 6c 79  hether partially
42a0: 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20 62 75   flushing the bu
42b0: 66 66 65 72 20 6f 6e 0a 20 20 2a 2a 20 66 6f 72  ffer on.  ** for
42c0: 63 65 64 2d 66 6c 75 73 68 20 77 6f 75 6c 64 20  ced-flush would 
42d0: 70 72 6f 76 69 64 65 20 62 65 74 74 65 72 20 70  provide better p
42e0: 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 49 20 73  erformance.  I s
42f0: 75 73 70 65 63 74 20 74 68 61 74 20 69 66 0a 20  uspect that if. 
4300: 20 2a 2a 20 77 65 20 6f 72 64 65 72 65 64 20 74   ** we ordered t
4310: 68 65 20 64 6f 63 6c 69 73 74 73 20 62 79 20 73  he doclists by s
4320: 69 7a 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ize and flushed 
4330: 74 68 65 20 6c 61 72 67 65 73 74 20 75 6e 74 69  the largest unti
4340: 6c 20 74 68 65 0a 20 20 2a 2a 20 62 75 66 66 65  l the.  ** buffe
4350: 72 20 77 61 73 20 68 61 6c 66 20 65 6d 70 74 79  r was half empty
4360: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6c 65 74  , that would let
4370: 20 74 68 65 20 6c 65 73 73 20 66 72 65 71 75 65   the less freque
4380: 6e 74 20 74 65 72 6d 73 0a 20 20 2a 2a 20 67 65  nt terms.  ** ge
4390: 6e 65 72 61 74 65 20 6c 6f 6e 67 65 72 20 64 6f  nerate longer do
43a0: 63 6c 69 73 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  clists..  */.  i
43b0: 66 28 20 69 44 6f 63 69 64 3c 3d 70 2d 3e 69 50  f( iDocid<=p->iP
43c0: 72 65 76 44 6f 63 69 64 20 7c 7c 20 70 2d 3e 6e  revDocid || p->n
43d0: 50 65 6e 64 69 6e 67 44 61 74 61 3e 70 2d 3e 6e  PendingData>p->n
43e0: 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20 29  MaxPendingData )
43f0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
4400: 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
4410: 67 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a  gTermsFlush(p);.
4420: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
4430: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4440: 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65  c;.  }.  p->iPre
4450: 76 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b  vDocid = iDocid;
4460: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4470: 5f 4f 4b 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  _OK;.}..void sql
4480: 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54  ite3Fts3PendingT
4490: 65 72 6d 73 43 6c 65 61 72 28 46 74 73 33 54 61  ermsClear(Fts3Ta
44a0: 62 6c 65 20 2a 70 29 7b 0a 20 20 46 74 73 33 48  ble *p){.  Fts3H
44b0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
44c0: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 66 74 73 33    for(pElem=fts3
44d0: 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e 70 65  HashFirst(&p->pe
44e0: 6e 64 69 6e 67 54 65 72 6d 73 29 3b 20 70 45 6c  ndingTerms); pEl
44f0: 65 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48 61  em; pElem=fts3Ha
4500: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
4510: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4520: 28 66 74 73 33 48 61 73 68 44 61 74 61 28 70 45  (fts3HashData(pE
4530: 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 66 74 73  lem));.  }.  fts
4540: 33 48 61 73 68 43 6c 65 61 72 28 26 70 2d 3e 70  3HashClear(&p->p
4550: 65 6e 64 69 6e 67 54 65 72 6d 73 29 3b 0a 20 20  endingTerms);.  
4560: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
4570: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
4580: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4590: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55 70  alled by the xUp
45a0: 64 61 74 65 28 29 20 6d 65 74 68 6f 64 20 61 73  date() method as
45b0: 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45   part of an INSE
45c0: 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  RT.** operation.
45d0: 20 49 74 20 61 64 64 73 20 65 6e 74 72 69 65 73   It adds entries
45e0: 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
45f0: 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  n the new record
4600: 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69   to the.** pendi
4610: 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61 62  ngTerms hash tab
4620: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  le..**.** Argume
4630: 6e 74 20 61 70 56 61 6c 20 69 73 20 74 68 65 20  nt apVal is the 
4640: 73 61 6d 65 20 61 73 20 74 68 65 20 73 69 6d 69  same as the simi
4650: 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61 72 67 75  larly named argu
4660: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 0a 2a  ment passed to.*
4670: 2a 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61  * fts3InsertData
4680: 28 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 44  (). Parameter iD
4690: 6f 63 69 64 20 69 73 20 74 68 65 20 64 6f 63 69  ocid is the doci
46a0: 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77  d of the new row
46b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
46c0: 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28  fts3InsertTerms(
46d0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71  Fts3Table *p, sq
46e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
46f0: 56 61 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  Val){.  int i;  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
4720: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
4730: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 70 2d 3e    for(i=2; i<p->
4740: 6e 43 6f 6c 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b  nColumn+2; i++){
4750: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4760: 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
4770: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
4780: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
4790: 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  i]);.    if( zTe
47a0: 78 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  xt ){.      int 
47b0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
47c0: 54 65 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78  TermsAdd(p, zTex
47d0: 74 2c 20 69 2d 32 29 3b 0a 20 20 20 20 20 20 69  t, i-2);.      i
47e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
47f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4800: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
4810: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4820: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4830: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4840: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
4850: 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d   the xUpdate() m
4860: 65 74 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53  ethod for an INS
4870: 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ERT operation..*
4880: 2a 20 54 68 65 20 61 70 56 61 6c 20 70 61 72 61  * The apVal para
4890: 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
48a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70  a copy of the ap
48b0: 56 61 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73  Val argument pas
48c0: 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65  sed by.** SQLite
48d0: 20 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 28   to the xUpdate(
48e0: 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a  ) method. i.e:.*
48f0: 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20  *.**   apVal[0] 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
4910: 6f 74 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45  ot used for INSE
4920: 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31  RT..**   apVal[1
4930: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
4940: 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61   rowid.**   apVa
4950: 6c 5b 32 5d 20 20 20 20 20 20 20 20 20 20 20 20  l[2]            
4960: 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73      Left-most us
4970: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er-defined colum
4980: 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20  n.**   ....**   
4990: 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e  apVal[p->nColumn
49a0: 2b 31 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f  +1]     Right-mo
49b0: 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  st user-defined 
49c0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61  column.**   apVa
49d0: 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20  l[p->nColumn+2] 
49e0: 20 20 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d      Hidden colum
49f0: 6e 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  n with same name
4a00: 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61   as table.**   a
4a10: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
4a20: 33 5d 20 20 20 20 20 48 69 64 64 65 6e 20 22 64  3]     Hidden "d
4a30: 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c  ocid" column (al
4a40: 69 61 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a  ias for rowid).*
4a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
4a60: 33 49 6e 73 65 72 74 44 61 74 61 28 0a 20 20 46  3InsertData(.  F
4a70: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a90: 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61 62 6c  * Full-text tabl
4aa0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
4ab0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20  alue **apVal,   
4ac0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
4ad0: 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73  of values to ins
4ae0: 65 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ert */.  sqlite3
4af0: 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 20  _int64 *piDocid 
4b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4b10: 20 44 6f 63 69 64 20 66 6f 72 20 72 6f 77 20 6a   Docid for row j
4b20: 75 73 74 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ust inserted */.
4b30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
4b60: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
4b70: 5f 73 74 6d 74 20 2a 70 43 6f 6e 74 65 6e 74 49  _stmt *pContentI
4b80: 6e 73 65 72 74 3b 20 20 20 2f 2a 20 49 4e 53 45  nsert;   /* INSE
4b90: 52 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e  RT INTO %_conten
4ba0: 74 20 56 41 4c 55 45 53 28 2e 2e 2e 29 20 2a 2f  t VALUES(...) */
4bb0: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
4bc0: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  e statement hand
4bd0: 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72  le used to inser
4be0: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
4bf0: 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 74  %_content.  ** t
4c00: 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20 66 6f  able. The SQL fo
4c10: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
4c20: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
4c30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63   INSERT INTO %_c
4c40: 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 3f 2c  ontent VALUES(?,
4c50: 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20 2a 2a   ?, ?, ...).  **
4c60: 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65 6d  .  ** The statem
4c70: 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e 20 27  ent features N '
4c80: 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20 77 68  ?' variables, wh
4c90: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
4ca0: 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20 2a 2a  ber of user.  **
4cb0: 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
4cc0: 20 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62   in the FTS3 tab
4cd0: 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66 6f 72  le, plus one for
4ce0: 20 74 68 65 20 64 6f 63 69 64 20 66 69 65 6c 64   the docid field
4cf0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ..  */.  rc = ft
4d00: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
4d10: 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 2c  _CONTENT_INSERT,
4d20: 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74   &pContentInsert
4d30: 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  , &apVal[1]);.  
4d40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4d50: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
4d60: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
4d70: 65 72 65 20 69 73 20 61 20 71 75 69 72 6b 20 68  ere is a quirk h
4d80: 65 72 65 2e 20 54 68 65 20 75 73 65 72 73 20 49  ere. The users I
4d90: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20  NSERT statement 
4da0: 6d 61 79 20 68 61 76 65 20 73 70 65 63 69 66 69  may have specifi
4db0: 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c 75 65 20  ed.  ** a value 
4dc0: 66 6f 72 20 74 68 65 20 22 72 6f 77 69 64 22 20  for the "rowid" 
4dd0: 66 69 65 6c 64 2c 20 66 6f 72 20 74 68 65 20 22  field, for the "
4de0: 64 6f 63 69 64 22 20 66 69 65 6c 64 2c 20 6f 72  docid" field, or
4df0: 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 20   for both..  ** 
4e00: 57 68 69 63 68 20 69 73 20 61 20 70 72 6f 62 6c  Which is a probl
4e10: 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f 77 69 64  em, since "rowid
4e20: 22 20 61 6e 64 20 22 64 6f 63 69 64 22 20 61 72  " and "docid" ar
4e30: 65 20 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68  e aliases for th
4e40: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
4e50: 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  e. For example:.
4e60: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45    **.  **   INSE
4e70: 52 54 20 49 4e 54 4f 20 66 74 73 33 74 62 6c 28  RT INTO fts3tbl(
4e80: 72 6f 77 69 64 2c 20 64 6f 63 69 64 29 20 56 41  rowid, docid) VA
4e90: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 2a 2a  LUES(1, 2);.  **
4ea0: 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33 2c 20 74  .  ** In FTS3, t
4eb0: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
4ec0: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
4ed0: 74 6f 20 73 70 65 63 69 66 79 20 6e 6f 6e 2d 4e  to specify non-N
4ee0: 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  ULL values.  ** 
4ef0: 66 6f 72 20 62 6f 74 68 20 64 6f 63 69 64 20 61  for both docid a
4f00: 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 6f  nd some other ro
4f10: 77 69 64 20 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a  wid alias..  */.
4f20: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
4f30: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
4f40: 5f 74 79 70 65 28 61 70 56 61 6c 5b 33 2b 70 2d  _type(apVal[3+p-
4f50: 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20  >nColumn]) ){.  
4f60: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
4f70: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
4f80: 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 0a  _type(apVal[0]).
4f90: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4e       && SQLITE_N
4fa0: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
4fb0: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d  ue_type(apVal[1]
4fc0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
4fd0: 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63 69 64 20  * A rowid/docid 
4fe0: 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20 20  conflict. */.   
4ff0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5000: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5010: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5020: 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f 6e 74 65  ind_value(pConte
5030: 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20 61 70 56  ntInsert, 1, apV
5040: 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d  al[3+p->nColumn]
5050: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
5060: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5070: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5080: 45 78 65 63 75 74 65 20 74 68 65 20 73 74 61 74  Execute the stat
5090: 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20  ement to insert 
50a0: 74 68 65 20 72 65 63 6f 72 64 2e 20 53 65 74 20  the record. Set 
50b0: 2a 70 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20  *piDocid to the 
50c0: 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63 69 64 20  .  ** new docid 
50d0: 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20 20 73  value. .  */.  s
50e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6f 6e  qlite3_step(pCon
50f0: 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 20 20 72  tentInsert);.  r
5100: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
5110: 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74  t(pContentInsert
5120: 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69 64 20 3d  );..  *piDocid =
5130: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
5140: 73 65 72 74 5f 72 6f 77 69 64 28 70 2d 3e 64 62  sert_rowid(p->db
5150: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5160: 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }..../*.** Remov
5170: 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  e all data from 
5180: 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20  the FTS3 table. 
5190: 43 6c 65 61 72 20 74 68 65 20 68 61 73 68 20 74  Clear the hash t
51a0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  able containing.
51b0: 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  ** pending terms
51c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
51d0: 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 46 74  fts3DeleteAll(Ft
51e0: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
51f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5210: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
5220: 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74  ..  /* Discard t
5230: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
5240: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
5250: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
5260: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
5270: 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
5280: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
5290: 65 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d 20  everything from 
52a0: 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 2c 20 25  the %_content, %
52b0: 5f 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f  _segments and %_
52c0: 73 65 67 64 69 72 20 74 61 62 6c 65 73 2e 20 2a  segdir tables. *
52d0: 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
52e0: 45 78 65 63 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Exec(p, SQL_DELE
52f0: 54 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20  TE_ALL_CONTENT, 
5300: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
5310: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
5320: 63 20 3d 20 66 74 73 33 53 71 6c 45 78 65 63 28  c = fts3SqlExec(
5330: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
5340: 4c 5f 53 45 47 4d 45 4e 54 53 2c 20 30 29 3b 0a  L_SEGMENTS, 0);.
5350: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
5360: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
5370: 63 20 3d 20 66 74 73 33 53 71 6c 45 78 65 63 28  c = fts3SqlExec(
5380: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
5390: 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20  L_SEGDIR, 0);.  
53a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
53b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
53c0: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65  t element in the
53d0: 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69   apVal[] array i
53e0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
53f0: 74 61 69 6e 20 74 68 65 20 64 6f 63 69 64 0a 2a  tain the docid.*
5400: 2a 20 28 61 6e 20 69 6e 74 65 67 65 72 29 20 6f  * (an integer) o
5410: 66 20 61 20 72 6f 77 20 61 62 6f 75 74 20 74 6f  f a row about to
5420: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 52 65 6d   be deleted. Rem
5430: 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73 20 66 72  ove all terms fr
5440: 6f 6d 20 74 68 65 0a 2a 2a 20 66 75 6c 6c 2d 74  om the.** full-t
5450: 65 78 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ext index..*/.st
5460: 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c  atic int fts3Del
5470: 65 74 65 54 65 72 6d 73 28 46 74 73 33 54 61 62  eteTerms(Fts3Tab
5480: 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  le *p, sqlite3_v
5490: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20  alue **apVal){. 
54a0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
54b0: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
54c0: 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  ;..  rc = fts3Sq
54d0: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
54e0: 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52  ECT_CONTENT_BY_R
54f0: 4f 57 49 44 2c 20 26 70 53 65 6c 65 63 74 2c 20  OWID, &pSelect, 
5500: 61 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  apVal);.  if( rc
5510: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5520: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
5530: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
5540: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
5550: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
5560: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 43  or(i=1; i<=p->nC
5570: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
5580: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5590: 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
55a0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
55b0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
55c0: 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ct, i);.        
55d0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
55e0: 54 65 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78  TermsAdd(p, zTex
55f0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  t, -1);.        
5600: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5610: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
5620: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65  qlite3_reset(pSe
5630: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20  lect);.         
5640: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
5650: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5660: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
5670: 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
5680: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
5690: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
56a0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
56b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
56c0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
56d0: 61 72 61 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75  aration to accou
56e0: 6e 74 20 66 6f 72 20 74 68 65 20 63 69 72 63 75  nt for the circu
56f0: 6c 61 72 20 64 65 70 65 6e 64 65 6e 63 79 20 62  lar dependency b
5700: 65 74 77 65 65 6e 0a 2a 2a 20 66 75 6e 63 74 69  etween.** functi
5710: 6f 6e 73 20 66 74 73 33 53 65 67 6d 65 6e 74 4d  ons fts3SegmentM
5720: 65 72 67 65 28 29 20 61 6e 64 20 66 74 73 33 41  erge() and fts3A
5730: 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
5740: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
5750: 74 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  t fts3SegmentMer
5760: 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 2c 20  ge(Fts3Table *, 
5770: 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  int);../* .** Th
5780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
5790: 63 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65  cates a new leve
57a0: 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69  l iLevel index i
57b0: 6e 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62  n the segdir tab
57c0: 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  le..** Usually, 
57d0: 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f  indexes are allo
57e0: 63 61 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c  cated within a l
57f0: 65 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c  evel sequentiall
5800: 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69  y starting.** wi
5810: 74 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c  th 0, so the all
5820: 6f 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20  ocated index is 
5830: 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
5840: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
5850: 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a  ned.** by:.**.**
5860: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64     SELECT max(id
5870: 78 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72  x) FROM %_segdir
5880: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a   WHERE level = :
5890: 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77  iLevel.**.** How
58a0: 65 76 65 72 2c 20 69 66 20 74 68 65 72 65 20 61  ever, if there a
58b0: 72 65 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f  re already FTS3_
58c0: 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65  MERGE_COUNT inde
58d0: 78 65 73 20 61 74 20 74 68 65 20 72 65 71 75 65  xes at the reque
58e0: 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74  sted.** level, t
58f0: 68 65 79 20 61 72 65 20 6d 65 72 67 65 64 20 69  hey are merged i
5900: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76  nto a single lev
5910: 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65  el (iLevel+1) se
5920: 67 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a  gment and the .*
5930: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  * allocated inde
5940: 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  x is 0..**.** If
5950: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69   successful, *pi
5960: 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
5970: 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  e allocated inde
5980: 78 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54  x slot and SQLIT
5990: 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E_OK.** returned
59a0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
59b0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
59c0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
59d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
59e0: 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
59f0: 64 78 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  dx(Fts3Table *p,
5a00: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 69 6e 74   int iLevel, int
5a10: 20 2a 70 69 49 64 78 29 7b 0a 20 20 69 6e 74 20   *piIdx){.  int 
5a20: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
5a40: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
5a50: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e  sqlite3_stmt *pN
5a60: 65 78 74 49 64 78 3b 20 20 20 20 20 20 20 20 20  extIdx;         
5a70: 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 6e 65 78  /* Query for nex
5a80: 74 20 69 64 78 20 61 74 20 6c 65 76 65 6c 20 69  t idx at level i
5a90: 4c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  Level */.  int i
5aa0: 4e 65 78 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Next = 0;       
5ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
5ac0: 73 75 6c 74 20 6f 66 20 71 75 65 72 79 20 70 4e  sult of query pN
5ad0: 65 78 74 49 64 78 20 2a 2f 0a 0a 20 20 2f 2a 20  extIdx */..  /* 
5ae0: 53 65 74 20 76 61 72 69 61 62 6c 65 20 69 4e 65  Set variable iNe
5af0: 78 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 61  xt to the next a
5b00: 76 61 69 6c 61 62 6c 65 20 73 65 67 64 69 72 20  vailable segdir 
5b10: 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69  index at level i
5b20: 4c 65 76 65 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d  Level. */.  rc =
5b30: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
5b40: 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
5b50: 5f 49 4e 44 45 58 2c 20 26 70 4e 65 78 74 49 64  _INDEX, &pNextId
5b60: 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  x, 0);.  if( rc=
5b70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5b80: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
5b90: 6e 74 28 70 4e 65 78 74 49 64 78 2c 20 31 2c 20  nt(pNextIdx, 1, 
5ba0: 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28  iLevel);.    if(
5bb0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
5bc0: 69 74 65 33 5f 73 74 65 70 28 70 4e 65 78 74 49  ite3_step(pNextI
5bd0: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4e 65  dx) ){.      iNe
5be0: 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  xt = sqlite3_col
5bf0: 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74 49 64 78  umn_int(pNextIdx
5c00: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
5c10: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
5c20: 65 74 28 70 4e 65 78 74 49 64 78 29 3b 0a 20 20  et(pNextIdx);.  
5c30: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
5c40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5c50: 20 49 66 20 69 4e 65 78 74 20 69 73 20 46 54 53   If iNext is FTS
5c60: 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20 69  3_MERGE_COUNT, i
5c70: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 6c  ndicating that l
5c80: 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 73 20 61  evel iLevel is a
5c90: 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 66 75  lready.    ** fu
5ca0: 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65  ll, merge all se
5cb0: 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76 65 6c 20  gments in level 
5cc0: 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61 20 73 69  iLevel into a si
5cd0: 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31 0a 20 20  ngle iLevel+1.  
5ce0: 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 61 6e 64    ** segment and
5cf0: 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65 77 6c 79   allocate (newly
5d00: 20 66 72 65 65 64 29 20 69 6e 64 65 78 20 30 20   freed) index 0 
5d10: 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e  at level iLevel.
5d20: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
5d30: 2a 2a 20 69 66 20 69 4e 65 78 74 20 69 73 20 6c  ** if iNext is l
5d40: 65 73 73 20 74 68 61 6e 20 46 54 53 33 5f 4d 45  ess than FTS3_ME
5d50: 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c 6c 6f 63  RGE_COUNT, alloc
5d60: 61 74 65 20 69 6e 64 65 78 20 69 4e 65 78 74 2e  ate index iNext.
5d70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5d80: 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d 45 52 47  iNext>=FTS3_MERG
5d90: 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20 20 20  E_COUNT ){.     
5da0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e   rc = fts3Segmen
5db0: 74 4d 65 72 67 65 28 70 2c 20 69 4c 65 76 65 6c  tMerge(p, iLevel
5dc0: 29 3b 0a 20 20 20 20 20 20 2a 70 69 49 64 78 20  );.      *piIdx 
5dd0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
5de0: 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 69        *piIdx = i
5df0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
5e00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5e10: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
5e20: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
5e30: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
5e40: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ument to the nex
5e50: 74 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  t term in the.**
5e60: 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73 75 63   segment. If suc
5e70: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
5e80: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
5e90: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  If there is no n
5ea0: 65 78 74 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c  ext term,.** SQL
5eb0: 49 54 45 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 77  ITE_DONE. Otherw
5ec0: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
5ed0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
5ee0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
5ef0: 52 65 61 64 65 72 4e 65 78 74 28 46 74 73 33 53  ReaderNext(Fts3S
5f00: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
5f10: 72 29 7b 0a 20 20 63 68 61 72 20 2a 70 4e 65 78  r){.  char *pNex
5f20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5f30: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
5f40: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
5f50: 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  t nPrefix;      
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f70: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
5f80: 20 69 6e 20 74 65 72 6d 20 70 72 65 66 69 78 20   in term prefix 
5f90: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78  */.  int nSuffix
5fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5fb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5fc0: 66 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20  f bytes in term 
5fd0: 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69 66 28  suffix */..  if(
5fe0: 20 21 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c   !pReader->aDocl
5ff0: 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 65 78 74  ist ){.    pNext
6000: 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64   = pReader->aNod
6010: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
6020: 70 4e 65 78 74 20 3d 20 26 70 52 65 61 64 65 72  pNext = &pReader
6030: 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64  ->aDoclist[pRead
6040: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20  er->nDoclist];. 
6050: 20 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65 78 74   }..  if( !pNext
6060: 20 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52 65 61   || pNext>=&pRea
6070: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
6080: 65 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a 20 20  er->nNode] ){.  
6090: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
60a0: 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  ( fts3SegReaderI
60b0: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
60c0: 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 48  ) ){.      Fts3H
60d0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d  ashElem *pElem =
60e0: 20 2a 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65   *(pReader->ppNe
60f0: 78 74 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 69  xtElem);.      i
6100: 66 28 20 70 45 6c 65 6d 3d 3d 30 20 29 7b 0a 20  f( pElem==0 ){. 
6110: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
6120: 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  aNode = 0;.     
6130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6140: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69  PendingList *pLi
6150: 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73  st = (PendingLis
6160: 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61  t *)fts3HashData
6170: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20  (pElem);.       
6180: 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 20   pReader->zTerm 
6190: 3d 20 28 63 68 61 72 20 2a 29 66 74 73 33 48 61  = (char *)fts3Ha
61a0: 73 68 4b 65 79 28 70 45 6c 65 6d 29 3b 0a 20 20  shKey(pElem);.  
61b0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e        pReader->n
61c0: 54 65 72 6d 20 3d 20 66 74 73 33 48 61 73 68 4b  Term = fts3HashK
61d0: 65 79 73 69 7a 65 28 70 45 6c 65 6d 29 3b 0a 20  eysize(pElem);. 
61e0: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
61f0: 6e 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d  nNode = pReader-
6200: 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73  >nDoclist = pLis
6210: 74 2d 3e 6e 44 61 74 61 20 2b 20 31 3b 0a 20 20  t->nData + 1;.  
6220: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61        pReader->a
6230: 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e  Node = pReader->
6240: 61 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73 74  aDoclist = pList
6250: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
6260: 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74   pReader->ppNext
6270: 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Elem++;.        
6280: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
6290: 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  >aNode );.      
62a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
62b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
62c0: 20 20 20 20 69 66 28 20 21 70 52 65 61 64 65 72      if( !pReader
62d0: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
62e0: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20   pReader->aNode 
62f0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
6300: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
6310: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
6320: 74 65 33 5f 73 74 65 70 28 70 52 65 61 64 65 72  te3_step(pReader
6330: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  ->pStmt);.    if
6340: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
6350: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65   ){.      pReade
6360: 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  r->aNode = 0;.  
6370: 20 20 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d      return (rc==
6380: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
6390: 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 20  LITE_OK : rc);. 
63a0: 20 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65 72     }.    pReader
63b0: 2d 3e 6e 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ->nNode = sqlite
63c0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
63d0: 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 2c 20 30  Reader->pStmt, 0
63e0: 29 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e  );.    pReader->
63f0: 61 4e 6f 64 65 20 3d 20 28 63 68 61 72 20 2a 29  aNode = (char *)
6400: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
6410: 6c 6f 62 28 70 52 65 61 64 65 72 2d 3e 70 53 74  lob(pReader->pSt
6420: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 78  mt, 0);.    pNex
6430: 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  t = pReader->aNo
6440: 64 65 3b 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65  de;.  }.  .  pNe
6450: 78 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  xt += sqlite3Fts
6460: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65  3GetVarint32(pNe
6470: 78 74 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a 20  xt, &nPrefix);. 
6480: 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65   pNext += sqlite
6490: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
64a0: 28 70 4e 65 78 74 2c 20 26 6e 53 75 66 66 69 78  (pNext, &nSuffix
64b0: 29 3b 0a 0a 20 20 69 66 28 20 6e 50 72 65 66 69  );..  if( nPrefi
64c0: 78 2b 6e 53 75 66 66 69 78 3e 70 52 65 61 64 65  x+nSuffix>pReade
64d0: 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 29 7b  r->nTermAlloc ){
64e0: 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
64f0: 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78  (nPrefix+nSuffix
6500: 29 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )*2;.    char *z
6510: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
6520: 61 6c 6c 6f 63 28 70 52 65 61 64 65 72 2d 3e 7a  alloc(pReader->z
6530: 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  Term, nNew);.   
6540: 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
6550: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6560: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
6570: 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72     pReader->zTer
6580: 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70 52  m = zNew;.    pR
6590: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f  eader->nTermAllo
65a0: 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 20 20  c = nNew;.  }.  
65b0: 6d 65 6d 63 70 79 28 26 70 52 65 61 64 65 72 2d  memcpy(&pReader-
65c0: 3e 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c  >zTerm[nPrefix],
65d0: 20 70 4e 65 78 74 2c 20 6e 53 75 66 66 69 78 29   pNext, nSuffix)
65e0: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65  ;.  pReader->nTe
65f0: 72 6d 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53 75  rm = nPrefix+nSu
6600: 66 66 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d  ffix;.  pNext +=
6610: 20 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78   nSuffix;.  pNex
6620: 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  t += sqlite3Fts3
6630: 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78  GetVarint32(pNex
6640: 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 44 6f  t, &pReader->nDo
6650: 63 6c 69 73 74 29 3b 0a 20 20 61 73 73 65 72 74  clist);.  assert
6660: 28 20 70 4e 65 78 74 3c 26 70 52 65 61 64 65 72  ( pNext<&pReader
6670: 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d  ->aNode[pReader-
6680: 3e 6e 4e 6f 64 65 5d 20 29 3b 0a 20 20 70 52 65  >nNode] );.  pRe
6690: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d  ader->aDoclist =
66a0: 20 70 4e 65 78 74 3b 0a 20 20 70 52 65 61 64 65   pNext;.  pReade
66b0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
66c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
66d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
66e0: 20 53 65 74 20 74 68 65 20 53 65 67 52 65 61 64   Set the SegRead
66f0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
6700: 68 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 69  he first docid i
6710: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 61 73  n the doclist as
6720: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
6730: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
6740: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
6750: 64 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46  d fts3SegReaderF
6760: 69 72 73 74 44 6f 63 69 64 28 46 74 73 33 53 65  irstDocid(Fts3Se
6770: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
6780: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
6790: 73 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61  sert( pReader->a
67a0: 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 61 73 73  Doclist );.  ass
67b0: 65 72 74 28 20 21 70 52 65 61 64 65 72 2d 3e 70  ert( !pReader->p
67c0: 4f 66 66 73 65 74 4c 69 73 74 20 29 3b 0a 20 20  OffsetList );.  
67d0: 6e 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47  n = sqlite3Fts3G
67e0: 65 74 56 61 72 69 6e 74 28 70 52 65 61 64 65 72  etVarint(pReader
67f0: 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 26 70 52 65  ->aDoclist, &pRe
6800: 61 64 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20  ader->iDocid);. 
6810: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
6820: 74 4c 69 73 74 20 3d 20 26 70 52 65 61 64 65 72  tList = &pReader
6830: 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d 3b 0a 7d  ->aDoclist[n];.}
6840: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
6850: 74 68 65 20 53 65 67 52 65 61 64 65 72 20 74 6f  the SegReader to
6860: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
6870: 78 74 20 64 6f 63 69 64 20 69 6e 20 74 68 65 20  xt docid in the 
6880: 64 6f 63 6c 69 73 74 0a 2a 2a 20 61 73 73 6f 63  doclist.** assoc
6890: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
68a0: 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2a 20  urrent term..** 
68b0: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 73  .** If arguments
68c0: 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20 61 6e   ppOffsetList an
68d0: 64 20 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 61  d pnOffsetList a
68e0: 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  re not NULL, the
68f0: 6e 20 0a 2a 2a 20 2a 70 70 4f 66 66 73 65 74 4c  n .** *ppOffsetL
6900: 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  ist is set to po
6910: 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
6920: 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 20 6c   column-offset l
6930: 69 73 74 0a 2a 2a 20 69 6e 20 74 68 65 20 64 6f  ist.** in the do
6940: 63 6c 69 73 74 20 65 6e 74 72 79 20 28 69 2e 65  clist entry (i.e
6950: 2e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 61  . immediately pa
6960: 73 74 20 74 68 65 20 64 6f 63 69 64 20 76 61 72  st the docid var
6970: 69 6e 74 29 2e 0a 2a 2a 20 2a 70 6e 4f 66 66 73  int)..** *pnOffs
6980: 65 74 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f  etList is set to
6990: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
69a0: 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
69b0: 2d 6f 66 66 73 65 74 0a 2a 2a 20 6c 69 73 74 73  -offset.** lists
69c0: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
69d0: 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
69e0: 6f 72 20 62 79 74 65 2e 20 46 6f 72 20 65 78 61  or byte. For exa
69f0: 6d 70 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  mple:.*/.static 
6a00: 76 6f 69 64 20 66 74 73 33 53 65 67 52 65 61 64  void fts3SegRead
6a10: 65 72 4e 65 78 74 44 6f 63 69 64 28 0a 20 20 46  erNextDocid(.  F
6a20: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
6a30: 65 61 64 65 72 2c 0a 20 20 63 68 61 72 20 2a 2a  eader,.  char **
6a40: 70 70 4f 66 66 73 65 74 4c 69 73 74 2c 0a 20 20  ppOffsetList,.  
6a50: 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73  int *pnOffsetLis
6a60: 74 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 20 3d  t.){.  char *p =
6a70: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
6a80: 74 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20  tList;.  char c 
6a90: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 6f 69 6e 74  = 0;..  /* Point
6aa0: 65 72 20 70 20 63 75 72 72 65 6e 74 6c 79 20 70  er p currently p
6ab0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 66 69 72  oints at the fir
6ac0: 73 74 20 62 79 74 65 20 6f 66 20 61 6e 20 6f 66  st byte of an of
6ad0: 66 73 65 74 20 6c 69 73 74 2e 20 54 68 65 0a 20  fset list. The. 
6ae0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77   ** following tw
6af0: 6f 20 6c 69 6e 65 73 20 61 64 76 61 6e 63 65 20  o lines advance 
6b00: 69 74 20 74 6f 20 70 6f 69 6e 74 20 6f 6e 65 20  it to point one 
6b10: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
6b20: 64 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 61  d of.  ** the sa
6b30: 6d 65 20 6f 66 66 73 65 74 20 6c 69 73 74 2e 0a  me offset list..
6b40: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 2a 70    */.  while( *p
6b50: 20 7c 20 63 20 29 20 63 20 3d 20 2a 70 2b 2b 20   | c ) c = *p++ 
6b60: 26 20 30 78 38 30 3b 0a 20 20 70 2b 2b 3b 0a 0a  & 0x80;.  p++;..
6b70: 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
6b80: 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
6b90: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
6ba0: 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74  with a pointer t
6bb0: 6f 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73  o and the.  ** s
6bc0: 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 76 69  ize of the previ
6bd0: 6f 75 73 20 6f 66 66 73 65 74 2d 6c 69 73 74 2e  ous offset-list.
6be0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 70 4f 66  .  */.  if( ppOf
6bf0: 66 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20  fsetList ){.    
6c00: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  *ppOffsetList = 
6c10: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
6c20: 4c 69 73 74 3b 0a 20 20 20 20 2a 70 6e 4f 66 66  List;.    *pnOff
6c30: 73 65 74 4c 69 73 74 20 3d 20 28 69 6e 74 29 28  setList = (int)(
6c40: 70 20 2d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66  p - pReader->pOf
6c50: 66 73 65 74 4c 69 73 74 20 2d 20 31 29 3b 0a 20  fsetList - 1);. 
6c60: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
6c70: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 65 6e  e are no more en
6c80: 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 6f 63  tries in the doc
6c90: 6c 69 73 74 2c 20 73 65 74 20 70 4f 66 66 73 65  list, set pOffse
6ca0: 74 4c 69 73 74 20 74 6f 0a 20 20 2a 2a 20 4e 55  tList to.  ** NU
6cb0: 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  LL. Otherwise, s
6cc0: 65 74 20 46 74 73 33 53 65 67 52 65 61 64 65 72  et Fts3SegReader
6cd0: 2e 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20 6e  .iDocid to the n
6ce0: 65 78 74 20 64 6f 63 69 64 20 61 6e 64 0a 20 20  ext docid and.  
6cf0: 2a 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72  ** Fts3SegReader
6d00: 2e 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20  .pOffsetList to 
6d10: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  point to the nex
6d20: 74 20 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65  t offset list be
6d30: 66 6f 72 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e  fore.  ** return
6d40: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ing..  */.  if( 
6d50: 70 3e 3d 26 70 52 65 61 64 65 72 2d 3e 61 44 6f  p>=&pReader->aDo
6d60: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
6d70: 44 6f 63 6c 69 73 74 5d 20 29 7b 0a 20 20 20 20  Doclist] ){.    
6d80: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
6d90: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  List = 0;.  }els
6da0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  e{.    sqlite3_i
6db0: 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20  nt64 iDelta;.   
6dc0: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
6dd0: 74 4c 69 73 74 20 3d 20 70 20 2b 20 73 71 6c 69  tList = p + sqli
6de0: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
6df0: 28 70 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20  (p, &iDelta);.  
6e00: 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69    pReader->iDoci
6e10: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d  d += iDelta;.  }
6e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
6e30: 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ll allocations a
6e40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
6e50: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
6e60: 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65  ed as the .** se
6e70: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6e80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
6e90: 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65 28  s3SegReaderFree(
6ea0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 46 74  Fts3Table *p, Ft
6eb0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
6ec0: 61 64 65 72 29 7b 0a 20 20 69 66 28 20 70 52 65  ader){.  if( pRe
6ed0: 61 64 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20  ader ){.    if( 
6ee0: 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 20 29  pReader->pStmt )
6ef0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  {.      /* Move 
6f00: 74 68 65 20 6c 65 61 66 2d 72 61 6e 67 65 20 53  the leaf-range S
6f10: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6f20: 74 6f 20 74 68 65 20 61 4c 65 61 76 65 73 53 74  to the aLeavesSt
6f30: 6d 74 5b 5d 20 61 72 72 61 79 2c 0a 20 20 20 20  mt[] array,.    
6f40: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20    ** so that it 
6f50: 63 61 6e 20 62 65 20 72 65 75 73 65 64 20 77 68  can be reused wh
6f60: 65 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61  en required by a
6f70: 6e 6f 74 68 65 72 20 71 75 65 72 79 2e 0a 20 20  nother query..  
6f80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
6f90: 65 72 74 28 20 70 2d 3e 6e 4c 65 61 76 65 73 53  ert( p->nLeavesS
6fa0: 74 6d 74 3c 70 2d 3e 6e 4c 65 61 76 65 73 54 6f  tmt<p->nLeavesTo
6fb0: 74 61 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  tal );.      sql
6fc0: 69 74 65 33 5f 72 65 73 65 74 28 70 52 65 61 64  ite3_reset(pRead
6fd0: 65 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  er->pStmt);.    
6fe0: 20 20 70 2d 3e 61 4c 65 61 76 65 73 53 74 6d 74    p->aLeavesStmt
6ff0: 5b 70 2d 3e 6e 4c 65 61 76 65 73 53 74 6d 74 2b  [p->nLeavesStmt+
7000: 2b 5d 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 53  +] = pReader->pS
7010: 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  tmt;.    }.    i
7020: 66 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  f( !fts3SegReade
7030: 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64  rIsPending(pRead
7040: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  er) ){.      sql
7050: 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65  ite3_free(pReade
7060: 72 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 7d  r->zTerm);.    }
7070: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7080: 65 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a  e(pReader);.  }.
7090: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
70a0: 65 20 61 20 6e 65 77 20 53 65 67 52 65 61 64 65  e a new SegReade
70b0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  r object..*/.int
70c0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
70d0: 65 61 64 65 72 4e 65 77 28 0a 20 20 46 74 73 33  eaderNew(.  Fts3
70e0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7100: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
7110: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 41 67  dle */.  int iAg
7120: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7130: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
7140: 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a 20 20  ent "age". */.  
7150: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53  sqlite3_int64 iS
7160: 74 61 72 74 4c 65 61 66 2c 20 20 20 20 20 20 20  tartLeaf,       
7170: 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 74 6f  /* First leaf to
7180: 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73   traverse */.  s
7190: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
71a0: 64 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 2f  dLeaf,         /
71b0: 2a 20 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f 20  * Final leaf to 
71c0: 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 71  traverse */.  sq
71d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64  lite3_int64 iEnd
71e0: 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a  Block,        /*
71f0: 20 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66 20   Final block of 
7200: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  segment */.  con
7210: 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c 20  st char *zRoot, 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
7240: 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20  g root node */. 
7250: 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 20   int nRoot,     
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
7280: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f  er containing ro
7290: 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73  ot node */.  Fts
72a0: 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52  3SegReader **ppR
72b0: 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20  eader        /* 
72c0: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20 46  OUT: Allocated F
72d0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2f 0a  ts3SegReader */.
72e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
72f0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
7300: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7310: 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67  ode */.  Fts3Seg
7320: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 3b  Reader *pReader;
7330: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
7340: 79 20 61 6c 6c 6f 63 61 74 65 64 20 53 65 67 52  y allocated SegR
7350: 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  eader object */.
7360: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
7370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7380: 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
7390: 6c 6f 63 61 74 65 20 73 65 67 6d 65 6e 74 20 72  locate segment r
73a0: 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 69  oot node */..  i
73b0: 66 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d 30  f( iStartLeaf==0
73c0: 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d   ){.    nExtra =
73d0: 20 6e 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 70   nRoot;.  }..  p
73e0: 52 65 61 64 65 72 20 3d 20 28 46 74 73 33 53 65  Reader = (Fts3Se
73f0: 67 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74 65  gReader *)sqlite
7400: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
7410: 46 74 73 33 53 65 67 52 65 61 64 65 72 29 20 2b  Fts3SegReader) +
7420: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
7430: 21 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  !pReader ){.    
7440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
7450: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
7460: 74 28 70 52 65 61 64 65 72 2c 20 30 2c 20 73 69  t(pReader, 0, si
7470: 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
7480: 65 72 29 29 3b 0a 20 20 70 52 65 61 64 65 72 2d  er));.  pReader-
7490: 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d 20 69  >iStartBlock = i
74a0: 53 74 61 72 74 4c 65 61 66 3b 0a 20 20 70 52 65  StartLeaf;.  pRe
74b0: 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67  ader->iIdx = iAg
74c0: 65 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 45  e;.  pReader->iE
74d0: 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64 42 6c  ndBlock = iEndBl
74e0: 6f 63 6b 3b 0a 0a 20 20 69 66 28 20 6e 45 78 74  ock;..  if( nExt
74f0: 72 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ra ){.    /* The
7500: 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 20   entire segment 
7510: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
7520: 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20   root node. */. 
7530: 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64     pReader->aNod
7540: 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 65  e = (char *)&pRe
7550: 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20 70 52 65  ader[1];.    pRe
7560: 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 52  ader->nNode = nR
7570: 6f 6f 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  oot;.    memcpy(
7580: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20  pReader->aNode, 
7590: 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20  zRoot, nRoot);. 
75a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
75b0: 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  f the text of th
75c0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
75d0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
75e0: 67 68 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a  gh a contiguous.
75f0: 20 20 20 20 2a 2a 20 73 65 74 20 6f 66 20 65 6e      ** set of en
7600: 74 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f 73  tries in the %_s
7610: 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 68 61  egments table ha
7620: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
7630: 6f 6d 70 6f 73 65 64 2c 0a 20 20 20 20 2a 2a 20  omposed,.    ** 
7640: 63 6f 6d 70 6f 73 65 20 69 74 20 6e 6f 77 2e 0a  compose it now..
7650: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
7660: 70 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76 65 73  p->zSelectLeaves
7670: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 53 65   ){.      p->zSe
7680: 6c 65 63 74 4c 65 61 76 65 73 20 3d 20 73 71 6c  lectLeaves = sql
7690: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
76a0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
76b0: 62 6c 6f 63 6b 20 46 52 4f 4d 20 25 51 2e 27 25  block FROM %Q.'%
76c0: 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52  q_segments' WHER
76d0: 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45 45  E blockid BETWEE
76e0: 4e 20 3f 20 41 4e 44 20 3f 20 22 0a 20 20 20 20  N ? AND ? ".    
76f0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
7700: 62 6c 6f 63 6b 69 64 22 2c 20 70 2d 3e 7a 44 62  blockid", p->zDb
7710: 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  , p->zName.     
7720: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
7730: 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76 65 73 20  ->zSelectLeaves 
7740: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
7750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7760: 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
7770: 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
7780: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
7790: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 20  ere are no free 
77a0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
77b0: 65 20 61 4c 65 61 76 65 73 53 74 6d 74 5b 5d 20  e aLeavesStmt[] 
77c0: 61 72 72 61 79 2c 20 70 72 65 70 61 72 65 0a 20  array, prepare. 
77d0: 20 20 20 2a 2a 20 61 20 6e 65 77 20 73 74 61 74     ** a new stat
77e0: 65 6d 65 6e 74 20 6e 6f 77 2e 20 4f 74 68 65 72  ement now. Other
77f0: 77 69 73 65 2c 20 72 65 75 73 65 20 61 20 70 72  wise, reuse a pr
7800: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
7810: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 61 4c 65   from.    ** aLe
7820: 61 76 65 73 53 74 6d 74 5b 5d 2e 0a 20 20 20 20  avesStmt[]..    
7830: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c  */.    if( p->nL
7840: 65 61 76 65 73 53 74 6d 74 3d 3d 30 20 29 7b 0a  eavesStmt==0 ){.
7850: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 65        if( p->nLe
7860: 61 76 65 73 54 6f 74 61 6c 3d 3d 70 2d 3e 6e 4c  avesTotal==p->nL
7870: 65 61 76 65 73 41 6c 6c 6f 63 20 29 7b 0a 20 20  eavesAlloc ){.  
7880: 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
7890: 20 70 2d 3e 6e 4c 65 61 76 65 73 41 6c 6c 6f 63   p->nLeavesAlloc
78a0: 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 20 20 73   + 16;.        s
78b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 61 4e  qlite3_stmt **aN
78c0: 65 77 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  ew = (sqlite3_st
78d0: 6d 74 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  mt **)sqlite3_re
78e0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
78f0: 20 20 20 70 2d 3e 61 4c 65 61 76 65 73 53 74 6d     p->aLeavesStm
7900: 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 73  t, nNew*sizeof(s
7910: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29 0a 20  qlite3_stmt *). 
7920: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
7930: 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
7940: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
7950: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7960: 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
7970: 68 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  hed;.        }. 
7980: 20 20 20 20 20 20 20 70 2d 3e 6e 4c 65 61 76 65         p->nLeave
7990: 73 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  sAlloc = nNew;. 
79a0: 20 20 20 20 20 20 20 70 2d 3e 61 4c 65 61 76 65         p->aLeave
79b0: 73 53 74 6d 74 20 3d 20 61 4e 65 77 3b 0a 20 20  sStmt = aNew;.  
79c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
79d0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
79e0: 5f 76 32 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 53  _v2(p->db, p->zS
79f0: 65 6c 65 63 74 4c 65 61 76 65 73 2c 20 2d 31 2c  electLeaves, -1,
7a00: 20 26 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74   &pReader->pStmt
7a10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
7a20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7a30: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69  .        goto fi
7a40: 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nished;.      }.
7a50: 20 20 20 20 20 20 70 2d 3e 6e 4c 65 61 76 65 73        p->nLeaves
7a60: 54 6f 74 61 6c 2b 2b 3b 0a 20 20 20 20 7d 65 6c  Total++;.    }el
7a70: 73 65 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65  se{.      pReade
7a80: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 2d 3e 61 4c  r->pStmt = p->aL
7a90: 65 61 76 65 73 53 74 6d 74 5b 2d 2d 70 2d 3e 6e  eavesStmt[--p->n
7aa0: 4c 65 61 76 65 73 53 74 6d 74 5d 3b 0a 20 20 20  LeavesStmt];.   
7ab0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20   }..    /* Bind 
7ac0: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
7ad0: 64 20 6c 65 61 66 20 62 6c 6f 63 6b 69 64 73 20  d leaf blockids 
7ae0: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
7af0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  SQL statement. *
7b00: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
7b10: 6e 64 5f 69 6e 74 36 34 28 70 52 65 61 64 65 72  nd_int64(pReader
7b20: 2d 3e 70 53 74 6d 74 2c 20 31 2c 20 69 53 74 61  ->pStmt, 1, iSta
7b30: 72 74 4c 65 61 66 29 3b 0a 20 20 20 20 73 71 6c  rtLeaf);.    sql
7b40: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
7b50: 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 2c 20  pReader->pStmt, 
7b60: 32 2c 20 69 45 6e 64 4c 65 61 66 29 3b 0a 20 20  2, iEndLeaf);.  
7b70: 7d 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67  }.  rc = fts3Seg
7b80: 52 65 61 64 65 72 4e 65 78 74 28 70 52 65 61 64  ReaderNext(pRead
7b90: 65 72 29 3b 0a 0a 20 66 69 6e 69 73 68 65 64 3a  er);.. finished:
7ba0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7bb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 52  E_OK ){.    *ppR
7bc0: 65 61 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b  eader = pReader;
7bd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7be0: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
7bf0: 65 72 46 72 65 65 28 70 2c 20 70 52 65 61 64 65  erFree(p, pReade
7c00: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
7c10: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
7c20: 69 73 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  is is a comparis
7c30: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64  on function used
7c40: 20 61 73 20 61 20 71 73 6f 72 74 28 29 20 63 61   as a qsort() ca
7c50: 6c 6c 62 61 63 6b 20 77 68 65 6e 20 73 6f 72 74  llback when sort
7c60: 69 6e 67 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20  ing.** an array 
7c70: 6f 66 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  of pending terms
7c80: 20 62 79 20 74 65 72 6d 2e 20 54 68 69 73 20 6f   by term. This o
7c90: 63 63 75 72 73 20 61 73 20 70 61 72 74 20 6f 66  ccurs as part of
7ca0: 20 66 6c 75 73 68 69 6e 67 0a 2a 2a 20 74 68 65   flushing.** the
7cb0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
7cc0: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68   pending-terms h
7cd0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 74 68 65  ash table to the
7ce0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
7cf0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f 6d  atic int fts3Com
7d00: 70 61 72 65 45 6c 65 6d 42 79 54 65 72 6d 28 63  pareElemByTerm(c
7d10: 6f 6e 73 74 20 76 6f 69 64 20 2a 6c 68 73 2c 20  onst void *lhs, 
7d20: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 72 68 73 29  const void *rhs)
7d30: 7b 0a 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 66  {.  char *z1 = f
7d40: 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73  ts3HashKey(*(Fts
7d50: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73  3HashElem **)lhs
7d60: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 32 20 3d 20  );.  char *z2 = 
7d70: 66 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74  fts3HashKey(*(Ft
7d80: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68  s3HashElem **)rh
7d90: 73 29 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66  s);.  int n1 = f
7da0: 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a  ts3HashKeysize(*
7db0: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
7dc0: 29 6c 68 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20  )lhs);.  int n2 
7dd0: 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a  = fts3HashKeysiz
7de0: 65 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d  e(*(Fts3HashElem
7df0: 20 2a 2a 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74   **)rhs);..  int
7e00: 20 6e 20 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31   n = (n1<n2 ? n1
7e10: 20 3a 20 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20   : n2);.  int c 
7e20: 3d 20 6d 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c  = memcmp(z1, z2,
7e30: 20 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20   n);.  if( c==0 
7e40: 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20  ){.    c = n1 - 
7e50: 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n2;.  }.  return
7e60: 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   c;.}../*.** Thi
7e70: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
7e80: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ed to allocate a
7e90: 6e 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  n Fts3SegReader 
7ea0: 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68  that iterates th
7eb0: 72 6f 75 67 68 0a 2a 2a 20 61 20 73 75 62 73 65  rough.** a subse
7ec0: 74 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 73  t of the terms s
7ed0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 46 74 73  tored in the Fts
7ee0: 33 54 61 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65  3Table.pendingTe
7ef0: 72 6d 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 69 6e  rms array..*/.in
7f00: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
7f10: 52 65 61 64 65 72 50 65 6e 64 69 6e 67 28 0a 20  ReaderPending(. 
7f20: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
7f50: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
7f60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f80: 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   Term to search 
7f90: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  for */.  int nTe
7fa0: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
7fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
7fc0: 20 6f 66 20 62 75 66 66 65 72 20 7a 54 65 72 6d   of buffer zTerm
7fd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 50 72 65 66   */.  int isPref
7fe0: 69 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ix,             
7ff0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
8000: 72 20 61 20 74 65 72 6d 2d 70 72 65 66 69 78 20  r a term-prefix 
8010: 71 75 65 72 79 20 2a 2f 0a 20 20 46 74 73 33 53  query */.  Fts3S
8020: 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52 65 61  egReader **ppRea
8030: 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  der        /* OU
8040: 54 3a 20 53 65 67 52 65 61 64 65 72 20 66 6f 72  T: SegReader for
8050: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 2a   pending-terms *
8060: 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65  /.){.  Fts3SegRe
8070: 61 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20  ader *pReader = 
8080: 30 3b 20 20 20 20 20 2f 2a 20 46 74 73 33 53 65  0;     /* Fts3Se
8090: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74  gReader object t
80a0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74  o return */.  Ft
80b0: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c  s3HashElem **aEl
80c0: 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  em = 0;       /*
80d0: 20 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20 68   Array of term h
80e0: 61 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20 73  ash entries to s
80f0: 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c  can */.  int nEl
8100: 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  em = 0;         
8110: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8120: 20 6f 66 20 61 72 72 61 79 20 61 74 20 61 45 6c   of array at aEl
8130: 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  em */.  int rc =
8140: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
8150: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
8160: 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n Code */..  if(
8170: 20 69 73 50 72 65 66 69 78 20 29 7b 0a 20 20 20   isPrefix ){.   
8180: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
81a0: 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61  * Size of alloca
81b0: 74 65 64 20 61 72 72 61 79 20 61 74 20 61 45 6c  ted array at aEl
81c0: 65 6d 20 2a 2f 0a 20 20 20 20 46 74 73 33 48 61  em */.    Fts3Ha
81d0: 73 68 45 6c 65 6d 20 2a 70 45 20 3d 20 30 3b 20  shElem *pE = 0; 
81e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
81f0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
8200: 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33  .    for(pE=fts3
8210: 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e 70 65  HashFirst(&p->pe
8220: 6e 64 69 6e 67 54 65 72 6d 73 29 3b 20 70 45 3b  ndingTerms); pE;
8230: 20 70 45 3d 66 74 73 33 48 61 73 68 4e 65 78 74   pE=fts3HashNext
8240: 28 70 45 29 29 7b 0a 20 20 20 20 20 20 63 68 61  (pE)){.      cha
8250: 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68 61 72 20  r *zKey = (char 
8260: 2a 29 66 74 73 33 48 61 73 68 4b 65 79 28 70 45  *)fts3HashKey(pE
8270: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  );.      int nKe
8280: 79 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73  y = fts3HashKeys
8290: 69 7a 65 28 70 45 29 3b 0a 20 20 20 20 20 20 69  ize(pE);.      i
82a0: 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( nTerm==0 || (
82b0: 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26 26 20 30  nKey>=nTerm && 0
82c0: 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79 2c 20 7a  ==memcmp(zKey, z
82d0: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 20 29 7b  Term, nTerm)) ){
82e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 6c  .        if( nEl
82f0: 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  em==nAlloc ){.  
8300: 20 20 20 20 20 20 20 20 46 74 73 33 48 61 73 68          Fts3Hash
8310: 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32 3b 0a 20  Elem **aElem2;. 
8320: 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20           nAlloc 
8330: 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20  += 16;.         
8340: 20 61 45 6c 65 6d 32 20 3d 20 28 46 74 73 33 48   aElem2 = (Fts3H
8350: 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71 6c 69 74  ashElem **)sqlit
8360: 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
8370: 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 2c            aElem,
8380: 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 46   nAlloc*sizeof(F
8390: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 0a 20  ts3HashElem *). 
83a0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
83b0: 20 20 20 20 20 20 69 66 28 20 21 61 45 6c 65 6d        if( !aElem
83c0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
83d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
83e0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
83f0: 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20 20 20 20  nElem = 0;.     
8400: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8420: 20 20 20 20 61 45 6c 65 6d 20 3d 20 61 45 6c 65      aElem = aEle
8430: 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  m2;.        }.  
8440: 20 20 20 20 20 20 61 45 6c 65 6d 5b 6e 45 6c 65        aElem[nEle
8450: 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20 20 20 20 20  m++] = pE;.     
8460: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
8470: 20 49 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   If more than on
8480: 65 20 74 65 72 6d 20 6d 61 74 63 68 65 73 20 74  e term matches t
8490: 68 65 20 70 72 65 66 69 78 2c 20 73 6f 72 74 20  he prefix, sort 
84a0: 74 68 65 20 46 74 73 33 48 61 73 68 45 6c 65 6d  the Fts3HashElem
84b0: 0a 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  .    ** objects 
84c0: 69 6e 20 74 65 72 6d 20 6f 72 64 65 72 20 75 73  in term order us
84d0: 69 6e 67 20 71 73 6f 72 74 28 29 2e 20 54 68 69  ing qsort(). Thi
84e0: 73 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  s uses the same 
84f0: 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
8500: 2a 20 63 61 6c 6c 62 61 63 6b 20 61 73 20 69 73  * callback as is
8510: 20 75 73 65 64 20 77 68 65 6e 20 66 6c 75 73 68   used when flush
8520: 69 6e 67 20 74 65 72 6d 73 20 74 6f 20 64 69 73  ing terms to dis
8530: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  k..    */.    if
8540: 28 20 6e 45 6c 65 6d 3e 31 20 29 7b 0a 20 20 20  ( nElem>1 ){.   
8550: 20 20 20 71 73 6f 72 74 28 61 45 6c 65 6d 2c 20     qsort(aElem, 
8560: 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f 66 28 46 74  nElem, sizeof(Ft
8570: 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 2c 20 66  s3HashElem *), f
8580: 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42 79  ts3CompareElemBy
8590: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Term);.    }..  
85a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 33 48  }else{.    Fts3H
85b0: 61 73 68 45 6c 65 6d 20 2a 70 45 20 3d 20 66 74  ashElem *pE = ft
85c0: 73 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28 26  s3HashFindElem(&
85d0: 70 2d 3e 70 65 6e 64 69 6e 67 54 65 72 6d 73 2c  p->pendingTerms,
85e0: 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
85f0: 20 20 20 20 69 66 28 20 70 45 20 29 7b 0a 20 20      if( pE ){.  
8600: 20 20 20 20 61 45 6c 65 6d 20 3d 20 26 70 45 3b      aElem = &pE;
8610: 0a 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 31  .      nElem = 1
8620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
8630: 66 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a 20 20  f( nElem>0 ){.  
8640: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
8650: 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
8660: 65 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31 29 2a  er) + (nElem+1)*
8670: 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45  sizeof(Fts3HashE
8680: 6c 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52 65 61  lem *);.    pRea
8690: 64 65 72 20 3d 20 28 46 74 73 33 53 65 67 52 65  der = (Fts3SegRe
86a0: 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  ader *)sqlite3_m
86b0: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
86c0: 20 20 69 66 28 20 21 70 52 65 61 64 65 72 20 29    if( !pReader )
86d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
86e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
86f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
8700: 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c 20 6e  et(pReader, 0, n
8710: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 52 65  Byte);.      pRe
8720: 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 30 78 37  ader->iIdx = 0x7
8730: 46 46 46 46 46 46 46 3b 0a 20 20 20 20 20 20 70  FFFFFFF;.      p
8740: 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c  Reader->ppNextEl
8750: 65 6d 20 3d 20 28 46 74 73 33 48 61 73 68 45 6c  em = (Fts3HashEl
8760: 65 6d 20 2a 2a 29 26 70 52 65 61 64 65 72 5b 31  em **)&pReader[1
8770: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
8780: 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45  pReader->ppNextE
8790: 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45 6c 65  lem, aElem, nEle
87a0: 6d 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73  m*sizeof(Fts3Has
87b0: 68 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20 20 20  hElem *));.     
87c0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
87d0: 78 74 28 70 52 65 61 64 65 72 29 3b 0a 20 20 20  xt(pReader);.   
87e0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73   }.  }..  if( is
87f0: 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 73 71  Prefix ){.    sq
8800: 6c 69 74 65 33 5f 66 72 65 65 28 61 45 6c 65 6d  lite3_free(aElem
8810: 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64  );.  }.  *ppRead
8820: 65 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20  er = pReader;.  
8830: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
8840: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
8850: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8860: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 70   function is exp
8870: 65 63 74 65 64 20 74 6f 20 62 65 20 61 20 73 74  ected to be a st
8880: 61 74 65 6d 65 6e 74 20 6f 66 0a 2a 2a 20 74 68  atement of.** th
8890: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
88a0: 53 45 4c 45 43 54 20 0a 2a 2a 20 20 20 20 20 69  SELECT .**     i
88b0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
88c0: 20 20 20 20 20 2d 2d 20 63 6f 6c 20 30 0a 2a 2a       -- col 0.**
88d0: 20 20 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b       start_block
88e0: 2c 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f  ,          -- co
88f0: 6c 20 31 0a 2a 2a 20 20 20 20 20 6c 65 61 76 65  l 1.**     leave
8900: 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 20 20 20  s_end_block,    
8910: 20 2d 2d 20 63 6f 6c 20 32 0a 2a 2a 20 20 20 20   -- col 2.**    
8920: 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 20 20 20 20   end_block,     
8930: 20 20 20 20 20 20 20 2d 2d 20 63 6f 6c 20 33 0a         -- col 3.
8940: 2a 2a 20 20 20 20 20 72 6f 6f 74 20 20 20 20 20  **     root     
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
8960: 63 6f 6c 20 34 0a 2a 2a 20 20 20 46 52 4f 4d 20  col 4.**   FROM 
8970: 25 5f 73 65 67 64 69 72 20 2e 2e 2e 0a 2a 2a 0a  %_segdir ....**.
8980: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8990: 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 69   allocates and i
89a0: 6e 69 74 69 61 6c 69 7a 65 73 20 61 20 46 74 73  nitializes a Fts
89b0: 33 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63  3SegReader struc
89c0: 74 75 72 65 20 74 6f 0a 2a 2a 20 69 74 65 72 61  ture to.** itera
89d0: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  te through the t
89e0: 65 72 6d 73 20 73 74 6f 72 65 64 20 69 6e 20 74  erms stored in t
89f0: 68 65 20 73 65 67 6d 65 6e 74 20 69 64 65 6e 74  he segment ident
8a00: 69 66 69 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  ified by the.** 
8a10: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 68 61 74  current row that
8a20: 20 70 53 74 6d 74 20 69 73 20 70 6f 69 6e 74 69   pStmt is pointi
8a30: 6e 67 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ng to. .**.** If
8a40: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
8a50: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 69   Fts3SegReader i
8a60: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
8a70: 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  to the first ter
8a80: 6d 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 67 6d  m.** in the segm
8a90: 65 6e 74 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ent and SQLITE_O
8aa0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
8ab0: 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
8ac0: 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
8ad0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
8ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
8af0: 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 0a 20  3SegReaderNew(. 
8b00: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b20: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
8b30: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
8b40: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
8b50: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
8b60: 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20   See above */.  
8b70: 69 6e 74 20 69 41 67 65 2c 20 20 20 20 20 20 20  int iAge,       
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b90: 2f 2a 20 53 65 67 6d 65 6e 74 20 22 61 67 65 22  /* Segment "age"
8ba0: 2e 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65  . */.  Fts3SegRe
8bb0: 61 64 65 72 20 2a 2a 70 70 52 65 61 64 65 72 20  ader **ppReader 
8bc0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
8bd0: 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 53 65 67  llocated Fts3Seg
8be0: 52 65 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 72  Reader */.){.  r
8bf0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73  eturn sqlite3Fts
8c00: 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 70 2c  3SegReaderNew(p,
8c10: 20 69 41 67 65 2c 20 0a 20 20 20 20 20 20 73 71   iAge, .      sq
8c20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
8c30: 36 34 28 70 53 74 6d 74 2c 20 31 29 2c 0a 20 20  64(pStmt, 1),.  
8c40: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
8c50: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
8c60: 32 29 2c 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2),.      sqlite
8c70: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
8c80: 53 74 6d 74 2c 20 33 29 2c 0a 20 20 20 20 20 20  Stmt, 3),.      
8c90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
8ca0: 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c 0a 20  lob(pStmt, 4),. 
8cb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
8cc0: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
8cd0: 20 34 29 2c 0a 20 20 20 20 20 20 70 70 52 65 61   4),.      ppRea
8ce0: 64 65 72 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  der.  );.}../*.*
8cf0: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 65 6e  * Compare the en
8d00: 74 72 69 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tries pointed to
8d10: 20 62 79 20 74 77 6f 20 46 74 73 33 53 65 67 52   by two Fts3SegR
8d20: 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65 73  eader structures
8d30: 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  . .** Comparison
8d40: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
8d50: 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 69  **.**   1) EOF i
8d60: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
8d70: 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20  ot EOF..**.**   
8d80: 32 29 20 54 68 65 20 63 75 72 72 65 6e 74 20 74  2) The current t
8d90: 65 72 6d 73 20 28 69 66 20 61 6e 79 29 20 61 72  erms (if any) ar
8da0: 65 20 63 6f 6d 70 61 72 65 64 20 75 73 69 6e 67  e compared using
8db0: 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e   memcmp(). If on
8dc0: 65 0a 2a 2a 20 20 20 20 20 20 74 65 72 6d 20 69  e.**      term i
8dd0: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e  s a prefix of an
8de0: 6f 74 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67 65  other, the longe
8df0: 72 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 64  r term is consid
8e00: 65 72 65 64 20 74 68 65 0a 2a 2a 20 20 20 20 20  ered the.**     
8e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20   larger..**.**  
8e20: 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61   3) By segment a
8e30: 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67  ge. An older seg
8e40: 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72  ment is consider
8e50: 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74  ed larger..*/.st
8e60: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
8e70: 52 65 61 64 65 72 43 6d 70 28 46 74 73 33 53 65  ReaderCmp(Fts3Se
8e80: 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46  gReader *pLhs, F
8e90: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
8ea0: 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  hs){.  int rc;. 
8eb0: 20 69 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65   if( pLhs->aNode
8ec0: 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20   && pRhs->aNode 
8ed0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
8ee0: 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20 70   pLhs->nTerm - p
8ef0: 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  Rhs->nTerm;.    
8f00: 69 66 28 20 72 63 32 3c 30 20 29 7b 0a 20 20 20  if( rc2<0 ){.   
8f10: 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70     rc = memcmp(p
8f20: 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73  Lhs->zTerm, pRhs
8f30: 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e 6e  ->zTerm, pLhs->n
8f40: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Term);.    }else
8f50: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d  {.      rc = mem
8f60: 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c  cmp(pLhs->zTerm,
8f70: 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52   pRhs->zTerm, pR
8f80: 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  hs->nTerm);.    
8f90: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20  }.    if( rc==0 
8fa0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
8fb0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
8fc0: 7b 0a 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73  {.    rc = (pLhs
8fd0: 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28 70  ->aNode==0) - (p
8fe0: 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b 0a  Rhs->aNode==0);.
8ff0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
9000: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 68 73  ){.    rc = pRhs
9010: 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69  ->iIdx - pLhs->i
9020: 49 64 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Idx;.  }.  asser
9030: 74 28 20 72 63 21 3d 30 20 29 3b 0a 20 20 72 65  t( rc!=0 );.  re
9040: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9050: 2a 20 41 20 64 69 66 66 65 72 65 6e 74 20 63 6f  * A different co
9060: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
9070: 6e 20 66 6f 72 20 53 65 67 52 65 61 64 65 72 20  n for SegReader 
9080: 73 74 72 75 63 74 75 72 65 73 2e 20 49 6e 20 74  structures. In t
9090: 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20  his.** version, 
90a0: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
90b0: 61 74 20 65 61 63 68 20 53 65 67 52 65 61 64 65  at each SegReade
90c0: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  r points to an e
90d0: 6e 74 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f 63  ntry in.** a doc
90e0: 6c 69 73 74 20 66 6f 72 20 69 64 65 6e 74 69 63  list for identic
90f0: 61 6c 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61 72  al terms. Compar
9100: 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 73 20  ison is made as 
9110: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
9120: 20 31 29 20 45 4f 46 20 28 65 6e 64 20 6f 66 20   1) EOF (end of 
9130: 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 69 73 20  doclist in this 
9140: 63 61 73 65 29 20 69 73 20 67 72 65 61 74 65 72  case) is greater
9150: 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a   than not EOF..*
9160: 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20 63 75 72  *.**   2) By cur
9170: 72 65 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a 2a  rent docid..**.*
9180: 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e  *   3) By segmen
9190: 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20  t age. An older 
91a0: 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69  segment is consi
91b0: 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f  dered larger..*/
91c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
91d0: 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
91e0: 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64 65  Cmp(Fts3SegReade
91f0: 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67  r *pLhs, Fts3Seg
9200: 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20  Reader *pRhs){. 
9210: 20 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 2d   int rc = (pLhs-
9220: 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29  >pOffsetList==0)
9230: 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c  -(pRhs->pOffsetL
9240: 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72  ist==0);.  if( r
9250: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
9260: 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52  pLhs->iDocid==pR
9270: 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20  hs->iDocid ){.  
9280: 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69      rc = pRhs->i
9290: 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78  Idx - pLhs->iIdx
92a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
92b0: 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69     rc = (pLhs->i
92c0: 44 6f 63 69 64 20 3e 20 70 52 68 73 2d 3e 69 44  Docid > pRhs->iD
92d0: 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a  ocid) ? 1 : -1;.
92e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
92f0: 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20  rt( pLhs->aNode 
9300: 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29  && pRhs->aNode )
9310: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9320: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
9330: 74 68 65 20 74 65 72 6d 20 74 68 61 74 20 74 68  the term that th
9340: 65 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  e Fts3SegReader 
9350: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
9360: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9370: 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ent.** points to
9380: 20 77 69 74 68 20 74 68 65 20 74 65 72 6d 20 73   with the term s
9390: 70 65 63 69 66 69 65 64 20 62 79 20 61 72 67 75  pecified by argu
93a0: 6d 65 6e 74 73 20 7a 54 65 72 6d 20 61 6e 64 20  ments zTerm and 
93b0: 6e 54 65 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  nTerm. .**.** If
93c0: 20 74 68 65 20 70 53 65 67 20 69 74 65 72 61 74   the pSeg iterat
93d0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
93e0: 20 45 4f 46 2c 20 72 65 74 75 72 6e 20 30 2e 20   EOF, return 0. 
93f0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
9400: 6e 0a 2a 2a 20 2d 76 65 20 69 66 20 74 68 65 20  n.** -ve if the 
9410: 70 53 65 67 20 74 65 72 6d 20 69 73 20 6c 65 73  pSeg term is les
9420: 73 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65  s than zTerm/nTe
9430: 72 6d 2c 20 30 20 69 66 20 74 68 65 20 74 77 6f  rm, 0 if the two
9440: 20 74 65 72 6d 73 20 61 72 65 0a 2a 2a 20 65 71   terms are.** eq
9450: 75 61 6c 2c 20 6f 72 20 2b 76 65 20 69 66 20 74  ual, or +ve if t
9460: 68 65 20 70 53 65 67 20 74 65 72 6d 20 69 73 20  he pSeg term is 
9470: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 54 65  greater than zTe
9480: 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61  rm/nTerm..*/.sta
9490: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
94a0: 65 61 64 65 72 54 65 72 6d 43 6d 70 28 0a 20 20  eaderTermCmp(.  
94b0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
94c0: 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
94d0: 2f 2a 20 53 65 67 6d 65 6e 74 20 72 65 61 64 65  /* Segment reade
94e0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
94f0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9510: 20 54 65 72 6d 20 74 6f 20 63 6f 6d 70 61 72 65   Term to compare
9520: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65   to */.  int nTe
9530: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
9540: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9550: 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d 20 69   of term zTerm i
9560: 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
9570: 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69  int res = 0;.  i
9580: 66 28 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20 29  f( pSeg->aNode )
9590: 7b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  {.    if( pSeg->
95a0: 6e 54 65 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a 20  nTerm>nTerm ){. 
95b0: 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d       res = memcm
95c0: 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a  p(pSeg->zTerm, z
95d0: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
95e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
95f0: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67  es = memcmp(pSeg
9600: 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->zTerm, zTerm, 
9610: 70 53 65 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20  pSeg->nTerm);.  
9620: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3d    }.    if( res=
9630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
9640: 3d 20 70 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e 54  = pSeg->nTerm-nT
9650: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  erm;.    }.  }. 
9660: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
9670: 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61  /*.** Argument a
9680: 70 53 65 67 6d 65 6e 74 20 69 73 20 61 6e 20 61  pSegment is an a
9690: 72 72 61 79 20 6f 66 20 6e 53 65 67 6d 65 6e 74  rray of nSegment
96a0: 20 65 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69 73   elements. It is
96b0: 20 6b 6e 6f 77 6e 20 74 68 61 74 0a 2a 2a 20 74   known that.** t
96c0: 68 65 20 66 69 6e 61 6c 20 28 6e 53 65 67 6d 65  he final (nSegme
96d0: 6e 74 2d 6e 53 75 73 70 65 63 74 29 20 6d 65 6d  nt-nSuspect) mem
96e0: 62 65 72 73 20 61 72 65 20 61 6c 72 65 61 64 79  bers are already
96f0: 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
9700: 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74  .** (according t
9710: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
9720: 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64   function provid
9730: 65 64 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ed). This functi
9740: 6f 6e 20 73 68 75 66 66 6c 65 73 0a 2a 2a 20 74  on shuffles.** t
9750: 68 65 20 61 72 72 61 79 20 61 72 6f 75 6e 64 20  he array around 
9760: 75 6e 74 69 6c 20 61 6c 6c 20 65 6e 74 72 69 65  until all entrie
9770: 73 20 61 72 65 20 69 6e 20 73 6f 72 74 65 64 20  s are in sorted 
9780: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
9790: 20 76 6f 69 64 20 66 74 73 33 53 65 67 52 65 61   void fts3SegRea
97a0: 64 65 72 53 6f 72 74 28 0a 20 20 46 74 73 33 53  derSort(.  Fts3S
97b0: 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67  egReader **apSeg
97c0: 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ment,           
97d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
97e0: 61 79 20 74 6f 20 73 6f 72 74 20 65 6e 74 72 69  ay to sort entri
97f0: 65 73 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 6e  es of */.  int n
9800: 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20  Segment,        
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9830: 65 20 6f 66 20 61 70 53 65 67 6d 65 6e 74 20 61  e of apSegment a
9840: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rray */.  int nS
9850: 75 73 70 65 63 74 2c 20 20 20 20 20 20 20 20 20  uspect,         
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f           /* Unso
9880: 72 74 65 64 20 65 6e 74 72 79 20 63 6f 75 6e 74  rted entry count
9890: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70   */.  int (*xCmp
98a0: 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  )(Fts3SegReader 
98b0: 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  *, Fts3SegReader
98c0: 20 2a 29 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73   *)  /* Comparis
98d0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  on function */.)
98e0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
9910: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61  variable */..  a
9920: 73 73 65 72 74 28 20 6e 53 75 73 70 65 63 74 3c  ssert( nSuspect<
9930: 3d 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 0a 20 20  =nSegment );..  
9940: 69 66 28 20 6e 53 75 73 70 65 63 74 3d 3d 6e 53  if( nSuspect==nS
9950: 65 67 6d 65 6e 74 20 29 20 6e 53 75 73 70 65 63  egment ) nSuspec
9960: 74 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 75  t--;.  for(i=nSu
9970: 73 70 65 63 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  spect-1; i>=0; i
9980: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  --){.    int j;.
9990: 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 28      for(j=i; j<(
99a0: 6e 53 65 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b 2b  nSegment-1); j++
99b0: 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67  ){.      Fts3Seg
99c0: 52 65 61 64 65 72 20 2a 70 54 6d 70 3b 0a 20 20  Reader *pTmp;.  
99d0: 20 20 20 20 69 66 28 20 78 43 6d 70 28 61 70 53      if( xCmp(apS
99e0: 65 67 6d 65 6e 74 5b 6a 5d 2c 20 61 70 53 65 67  egment[j], apSeg
99f0: 6d 65 6e 74 5b 6a 2b 31 5d 29 3c 30 20 29 20 62  ment[j+1])<0 ) b
9a00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6d 70  reak;.      pTmp
9a10: 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31   = apSegment[j+1
9a20: 5d 3b 0a 20 20 20 20 20 20 61 70 53 65 67 6d 65  ];.      apSegme
9a30: 6e 74 5b 6a 2b 31 5d 20 3d 20 61 70 53 65 67 6d  nt[j+1] = apSegm
9a40: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 70  ent[j];.      ap
9a50: 53 65 67 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54 6d  Segment[j] = pTm
9a60: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  p;.    }.  }..#i
9a70: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
9a80: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
9a90: 20 6c 69 73 74 20 72 65 61 6c 6c 79 20 69 73 20   list really is 
9aa0: 73 6f 72 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a 20  sorted now. */. 
9ab0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 53 75   for(i=0; i<(nSu
9ac0: 73 70 65 63 74 2d 31 29 3b 20 69 2b 2b 29 7b 0a  spect-1); i++){.
9ad0: 20 20 20 20 61 73 73 65 72 74 28 20 78 43 6d 70      assert( xCmp
9ae0: 28 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2c 20 61  (apSegment[i], a
9af0: 70 53 65 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c 30  pSegment[i+1])<0
9b00: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   );.  }.#endif.}
9b10: 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20  ../* .** Insert 
9b20: 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  a record into th
9b30: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
9b40: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
9b50: 74 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  t fts3WriteSegme
9b60: 6e 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  nt(.  Fts3Table 
9b70: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
9b80: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
9b90: 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
9ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
9bb0: 20 69 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20   iBlock,        
9bc0: 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 66     /* Block id f
9bd0: 6f 72 20 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f 0a  or new block */.
9be0: 20 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20    char *z,      
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9c10: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
9c20: 67 20 62 6c 6f 63 6b 20 64 61 74 61 20 2a 2f 0a  g block data */.
9c30: 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20    int n         
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
9c60: 66 65 72 20 7a 20 69 6e 20 62 79 74 65 73 20 2a  fer z in bytes *
9c70: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
9c80: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
9c90: 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74  t rc = fts3SqlSt
9ca0: 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54  mt(p, SQL_INSERT
9cb0: 5f 53 45 47 4d 45 4e 54 53 2c 20 26 70 53 74 6d  _SEGMENTS, &pStm
9cc0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
9cd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9ce0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
9cf0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69  nt64(pStmt, 1, i
9d00: 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69  Block);.    sqli
9d10: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
9d20: 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53 51  tmt, 2, z, n, SQ
9d30: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
9d40: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
9d50: 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  Stmt);.    rc = 
9d60: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
9d70: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tmt);.  }.  retu
9d80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
9d90: 20 49 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64   Insert a record
9da0: 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 64   into the %_segd
9db0: 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ir table..*/.sta
9dc0: 74 69 63 20 69 6e 74 20 66 74 73 33 57 72 69 74  tic int fts3Writ
9dd0: 65 53 65 67 64 69 72 28 0a 20 20 46 74 73 33 54  eSegdir(.  Fts3T
9de0: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
9df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
9e00: 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
9e10: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  le */.  int iLev
9e20: 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
9e30: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
9e40: 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 66 69 65   for "level" fie
9e50: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ld */.  int iIdx
9e60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9e70: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
9e80: 20 66 6f 72 20 22 69 64 78 22 20 66 69 65 6c 64   for "idx" field
9e90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
9ea0: 74 36 34 20 69 53 74 61 72 74 42 6c 6f 63 6b 2c  t64 iStartBlock,
9eb0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
9ec0: 6f 72 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22  or "start_block"
9ed0: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69   field */.  sqli
9ee0: 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45  te3_int64 iLeafE
9ef0: 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 2f 2a 20 56  ndBlock,    /* V
9f00: 61 6c 75 65 20 66 6f 72 20 22 6c 65 61 76 65 73  alue for "leaves
9f10: 5f 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c  _end_block" fiel
9f20: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
9f30: 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20  nt64 iEndBlock, 
9f40: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
9f50: 66 6f 72 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20  for "end_block" 
9f60: 66 69 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20  field */.  char 
9f70: 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  *zRoot,         
9f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
9f90: 6f 62 20 76 61 6c 75 65 20 66 6f 72 20 22 72 6f  ob value for "ro
9fa0: 6f 74 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  ot" field */.  i
9fb0: 6e 74 20 6e 52 6f 6f 74 20 20 20 20 20 20 20 20  nt nRoot        
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9fd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9fe0: 73 20 69 6e 20 62 75 66 66 65 72 20 7a 52 6f 6f  s in buffer zRoo
9ff0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
a000: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
a010: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71   int rc = fts3Sq
a020: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53  lStmt(p, SQL_INS
a030: 45 52 54 5f 53 45 47 44 49 52 2c 20 26 70 53 74  ERT_SEGDIR, &pSt
a040: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
a050: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a060: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a070: 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c  int(pStmt, 1, iL
a080: 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  evel);.    sqlit
a090: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
a0a0: 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20  t, 2, iIdx);.   
a0b0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
a0c0: 74 36 34 28 70 53 74 6d 74 2c 20 33 2c 20 69 53  t64(pStmt, 3, iS
a0d0: 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  tartBlock);.    
a0e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
a0f0: 36 34 28 70 53 74 6d 74 2c 20 34 2c 20 69 4c 65  64(pStmt, 4, iLe
a100: 61 66 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20  afEndBlock);.   
a110: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
a120: 74 36 34 28 70 53 74 6d 74 2c 20 35 2c 20 69 45  t64(pStmt, 5, iE
a130: 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71  ndBlock);.    sq
a140: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
a150: 70 53 74 6d 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c  pStmt, 6, zRoot,
a160: 20 6e 52 6f 6f 74 2c 20 53 51 4c 49 54 45 5f 53   nRoot, SQLITE_S
a170: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
a180: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
a190: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a1a0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
a1b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a1c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a1d0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a1e0: 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28   common prefix (
a1f0: 69 66 20 61 6e 79 29 20 73 68 61 72 65 64 20 62  if any) shared b
a200: 79 20 7a 50 72 65 76 20 61 6e 64 0a 2a 2a 20 7a  y zPrev and.** z
a210: 4e 65 78 74 2c 20 69 6e 20 62 79 74 65 73 2e 20  Next, in bytes. 
a220: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a  For example, .**
a230: 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 78  .**   fts3Prefix
a240: 43 6f 6d 70 72 65 73 73 28 22 61 62 63 22 2c 20  Compress("abc", 
a250: 33 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29 20  3, "abcdef", 6) 
a260: 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 33 0a 2a    // returns 3.*
a270: 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f  *   fts3PrefixCo
a280: 6d 70 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c  mpress("abX", 3,
a290: 20 22 61 62 63 64 65 66 22 2c 20 36 29 20 20 20   "abcdef", 6)   
a2a0: 2f 2f 20 72 65 74 75 72 6e 73 20 32 0a 2a 2a 20  // returns 2.** 
a2b0: 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70    fts3PrefixComp
a2c0: 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22  ress("abX", 3, "
a2d0: 58 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f  Xbcdef", 6)   //
a2e0: 20 72 65 74 75 72 6e 73 20 30 0a 2a 2f 0a 73 74   returns 0.*/.st
a2f0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 72 65  atic int fts3Pre
a300: 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 63  fixCompress(.  c
a310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76  onst char *zPrev
a320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a330: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
a340: 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72  ing previous ter
a350: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 76  m */.  int nPrev
a360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a370: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
a380: 66 20 62 75 66 66 65 72 20 7a 50 72 65 76 20 69  f buffer zPrev i
a390: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e  n bytes */.  con
a3a0: 73 74 20 63 68 61 72 20 2a 7a 4e 65 78 74 2c 20  st char *zNext, 
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3c0: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
a3d0: 67 20 6e 65 78 74 20 74 65 72 6d 20 2a 2f 0a 20  g next term */. 
a3e0: 20 69 6e 74 20 6e 4e 65 78 74 20 20 20 20 20 20   int nNext      
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
a410: 65 72 20 7a 4e 65 78 74 20 69 6e 20 62 79 74 65  er zNext in byte
a420: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  s */.){.  int n;
a430: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a440: 54 45 52 28 6e 4e 65 78 74 29 3b 0a 20 20 66 6f  TER(nNext);.  fo
a450: 72 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26  r(n=0; n<nPrev &
a460: 26 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78  & zPrev[n]==zNex
a470: 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65  t[n]; n++);.  re
a480: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
a490: 20 41 64 64 20 74 65 72 6d 20 7a 54 65 72 6d 20   Add term zTerm 
a4a0: 74 6f 20 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f  to the SegmentNo
a4b0: 64 65 2e 20 49 74 20 69 73 20 67 75 61 72 61 6e  de. It is guaran
a4c0: 74 65 65 64 20 74 68 61 74 20 7a 54 65 72 6d 20  teed that zTerm 
a4d0: 69 73 20 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63  is larger.** (ac
a4e0: 63 6f 72 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d  cording to memcm
a4f0: 70 29 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  p) than the prev
a500: 69 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  ious term..*/.st
a510: 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64  atic int fts3Nod
a520: 65 41 64 64 54 65 72 6d 28 0a 20 20 46 74 73 33  eAddTerm(.  Fts3
a530: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
a540: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
a550: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
a560: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  */.  SegmentNode
a570: 20 2a 2a 70 70 54 72 65 65 2c 20 20 20 20 20 20   **ppTree,      
a580: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
a590: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64  SegmentNode hand
a5a0: 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43  le */ .  int isC
a5b0: 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20  opyTerm,        
a5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
a5d0: 20 69 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20   if zTerm/nTerm 
a5e0: 69 73 20 74 72 61 6e 73 69 65 6e 74 20 2a 2f 0a  is transient */.
a5f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
a600: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
a610: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a620: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
a630: 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  g term */.  int 
a640: 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
a650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a660: 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
a670: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 67  ytes */.){.  Seg
a680: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 20  mentNode *pTree 
a690: 3d 20 2a 70 70 54 72 65 65 3b 0a 20 20 69 6e 74  = *ppTree;.  int
a6a0: 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f   rc;.  SegmentNo
a6b0: 64 65 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  de *pNew;..  /* 
a6c0: 46 69 72 73 74 20 74 72 79 20 74 6f 20 61 70 70  First try to app
a6d0: 65 6e 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20  end the term to 
a6e0: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
a6f0: 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69  . Return early i
a700: 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20  f .  ** this is 
a710: 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
a720: 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20   if( pTree ){.  
a730: 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70 54    int nData = pT
a740: 72 65 65 2d 3e 6e 44 61 74 61 3b 20 20 20 20 20  ree->nData;     
a750: 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
a760: 6f 66 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73  of node in bytes
a770: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 71   */.    int nReq
a780: 20 3d 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20   = nData;       
a790: 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
a7a0: 64 20 73 70 61 63 65 20 61 66 74 65 72 20 61 64  d space after ad
a7b0: 64 69 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  ding zTerm */.  
a7c0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20    int nPrefix;  
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a7f0: 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
a800: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
a810: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a830: 20 53 75 66 66 69 78 20 6c 65 6e 67 74 68 20 2a   Suffix length *
a840: 2f 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  /..    nPrefix =
a850: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
a860: 65 73 73 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d  ess(pTree->zTerm
a870: 2c 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 2c 20  , pTree->nTerm, 
a880: 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
a890: 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
a8a0: 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 20  rm-nPrefix;..   
a8b0: 20 6e 52 65 71 20 2b 3d 20 73 71 6c 69 74 65 33   nReq += sqlite3
a8c0: 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50  Fts3VarintLen(nP
a8d0: 72 65 66 69 78 29 2b 73 71 6c 69 74 65 33 46 74  refix)+sqlite3Ft
a8e0: 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66  s3VarintLen(nSuf
a8f0: 66 69 78 29 2b 6e 53 75 66 66 69 78 3b 0a 20 20  fix)+nSuffix;.  
a900: 20 20 69 66 28 20 6e 52 65 71 3c 3d 70 2d 3e 6e    if( nReq<=p->n
a910: 4e 6f 64 65 53 69 7a 65 20 7c 7c 20 21 70 54 72  NodeSize || !pTr
a920: 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20 20  ee->zTerm ){..  
a930: 20 20 20 20 69 66 28 20 6e 52 65 71 3e 70 2d 3e      if( nReq>p->
a940: 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  nNodeSize ){.   
a950: 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 75       /* An unusu
a960: 61 6c 20 63 61 73 65 3a 20 74 68 69 73 20 69 73  al case: this is
a970: 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
a980: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
a990: 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20  he node.        
a9a0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74 69  ** and the stati
a9b0: 63 20 6e 6f 64 65 20 62 75 66 66 65 72 20 28 70  c node buffer (p
a9c0: 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74 65  ->nNodeSize byte
a9d0: 73 29 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 0a  s) is not large.
a9e0: 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 6f 75 67          ** enoug
a9f0: 68 2e 20 55 73 65 20 61 20 73 65 70 61 72 61 74  h. Use a separat
aa00: 65 6c 79 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  ely malloced buf
aa10: 66 65 72 20 69 6e 73 74 65 61 64 20 54 68 69 73  fer instead This
aa20: 20 77 61 73 74 65 73 0a 20 20 20 20 20 20 20 20   wastes.        
aa30: 2a 2a 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20  ** p->nNodeSize 
aa40: 62 79 74 65 73 2c 20 62 75 74 20 73 69 6e 63 65  bytes, but since
aa50: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 6f   this scenario o
aa60: 6e 6c 79 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  nly comes about 
aa70: 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
aa80: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
aa90: 74 61 69 6e 20 74 77 6f 20 74 65 72 6d 73 20 74  tain two terms t
aaa0: 68 61 74 20 73 68 61 72 65 20 61 20 70 72 65 66  hat share a pref
aab0: 69 78 20 6f 66 20 61 6c 6d 6f 73 74 20 32 4b 42  ix of almost 2KB
aac0: 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
aad0: 69 73 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74  is is not expect
aae0: 65 64 20 74 6f 20 62 65 20 61 20 73 65 72 69 6f  ed to be a serio
aaf0: 75 73 20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20 20  us problem. .   
ab00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ab10: 61 73 73 65 72 74 28 20 70 54 72 65 65 2d 3e 61  assert( pTree->a
ab20: 44 61 74 61 3d 3d 28 63 68 61 72 20 2a 29 26 70  Data==(char *)&p
ab30: 54 72 65 65 5b 31 5d 20 29 3b 0a 20 20 20 20 20  Tree[1] );.     
ab40: 20 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61 20     pTree->aData 
ab50: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
ab60: 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a  3_malloc(nReq);.
ab70: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 54 72          if( !pTr
ab80: 65 65 2d 3e 61 44 61 74 61 20 29 7b 0a 20 20 20  ee->aData ){.   
ab90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
aba0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
abb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
abc0: 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e       if( pTree->
abd0: 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  zTerm ){.       
abe0: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
abf0: 70 72 65 66 69 78 2d 6c 65 6e 67 74 68 20 66 69  prefix-length fi
ac00: 65 6c 64 20 66 6f 72 20 66 69 72 73 74 20 74 65  eld for first te
ac10: 72 6d 20 69 6e 20 61 20 6e 6f 64 65 20 2a 2f 0a  rm in a node */.
ac20: 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d          nData +=
ac30: 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
ac40: 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44  arint(&pTree->aD
ac50: 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65  ata[nData], nPre
ac60: 66 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  fix);.      }.. 
ac70: 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71       nData += sq
ac80: 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
ac90: 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61  nt(&pTree->aData
aca0: 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78  [nData], nSuffix
acb0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
acc0: 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44  &pTree->aData[nD
acd0: 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ata], &zTerm[nPr
ace0: 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
acf0: 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 44  .      pTree->nD
ad00: 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 53  ata = nData + nS
ad10: 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70 54 72  uffix;.      pTr
ad20: 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a 20  ee->nEntry++;.. 
ad30: 20 20 20 20 20 69 66 28 20 69 73 43 6f 70 79 54       if( isCopyT
ad40: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  erm ){.        i
ad50: 66 28 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f  f( pTree->nMallo
ad60: 63 3c 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  c<nTerm ){.     
ad70: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20       char *zNew 
ad80: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
ad90: 63 28 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63  c(pTree->zMalloc
ada0: 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20  , nTerm*2);.    
adb0: 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20        if( !zNew 
adc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
add0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ade0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
adf0: 20 20 20 20 20 20 20 20 20 20 70 54 72 65 65 2d            pTree-
ae00: 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d  >nMalloc = nTerm
ae10: 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  *2;.          pT
ae20: 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a  ree->zMalloc = z
ae30: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
ae40: 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54         pTree->zT
ae50: 65 72 6d 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61  erm = pTree->zMa
ae60: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 6d 65  lloc;.        me
ae70: 6d 63 70 79 28 70 54 72 65 65 2d 3e 7a 54 65 72  mcpy(pTree->zTer
ae80: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
ae90: 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d  ;.        pTree-
aea0: 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a  >nTerm = nTerm;.
aeb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aec0: 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65 72       pTree->zTer
aed0: 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72  m = (char *)zTer
aee0: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65  m;.        pTree
aef0: 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b  ->nTerm = nTerm;
af00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
af10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
af20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
af30: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
af40: 73 20 74 6f 20 68 65 72 65 2c 20 69 74 20 77 61  s to here, it wa
af50: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
af60: 6f 20 61 70 70 65 6e 64 20 7a 54 65 72 6d 20 74  o append zTerm t
af70: 6f 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  o the.  ** curre
af80: 6e 74 20 6e 6f 64 65 2e 20 43 72 65 61 74 65 20  nt node. Create 
af90: 61 20 6e 65 77 20 6e 6f 64 65 20 28 61 20 72 69  a new node (a ri
afa0: 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 74  ght-sibling of t
afb0: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 29  he current node)
afc0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  ..  ** If this i
afd0: 73 20 74 68 65 20 66 69 72 73 74 20 6e 6f 64 65  s the first node
afe0: 20 69 6e 20 74 68 65 20 74 72 65 65 2c 20 74 68   in the tree, th
aff0: 65 20 74 65 72 6d 20 69 73 20 61 64 64 65 64 20  e term is added 
b000: 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  to it..  **.  **
b010: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
b020: 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 64 64 65  term is not adde
b030: 64 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 6f 64  d to the new nod
b040: 65 2c 20 69 74 20 69 73 20 6c 65 66 74 20 65 6d  e, it is left em
b050: 70 74 79 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 77  pty for.  ** now
b060: 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 74  . Instead, the t
b070: 65 72 6d 20 69 73 20 69 6e 73 65 72 74 65 64 20  erm is inserted 
b080: 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
b090: 6f 66 20 70 54 72 65 65 2e 20 49 66 20 70 54 72  of pTree. If pTr
b0a0: 65 65 20 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 20  ee .  ** has no 
b0b0: 70 61 72 65 6e 74 2c 20 6f 6e 65 20 69 73 20 63  parent, one is c
b0c0: 72 65 61 74 65 64 20 68 65 72 65 2e 0a 20 20 2a  reated here..  *
b0d0: 2f 0a 20 20 70 4e 65 77 20 3d 20 28 53 65 67 6d  /.  pNew = (Segm
b0e0: 65 6e 74 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65  entNode *)sqlite
b0f0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
b100: 53 65 67 6d 65 6e 74 4e 6f 64 65 29 20 2b 20 70  SegmentNode) + p
b110: 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20  ->nNodeSize);.  
b120: 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
b130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b140: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
b150: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
b160: 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 29  of(SegmentNode))
b170: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44 61 74 61 20  ;.  pNew->nData 
b180: 3d 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49 4e  = 1 + FTS3_VARIN
b190: 54 5f 4d 41 58 3b 0a 20 20 70 4e 65 77 2d 3e 61  T_MAX;.  pNew->a
b1a0: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26  Data = (char *)&
b1b0: 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69 66 28 20  pNew[1];..  if( 
b1c0: 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65 67  pTree ){.    Seg
b1d0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e  mentNode *pParen
b1e0: 74 20 3d 20 70 54 72 65 65 2d 3e 70 50 61 72 65  t = pTree->pPare
b1f0: 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  nt;.    rc = fts
b200: 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20  3NodeAddTerm(p, 
b210: 26 70 50 61 72 65 6e 74 2c 20 69 73 43 6f 70 79  &pParent, isCopy
b220: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
b230: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72  rm);.    if( pTr
b240: 65 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ee->pParent==0 )
b250: 7b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 70  {.      pTree->p
b260: 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
b270: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 65  ;.    }.    pTre
b280: 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65 77  e->pRight = pNew
b290: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66  ;.    pNew->pLef
b2a0: 74 6d 6f 73 74 20 3d 20 70 54 72 65 65 2d 3e 70  tmost = pTree->p
b2b0: 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 70 4e  Leftmost;.    pN
b2c0: 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
b2d0: 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  arent;.    pNew-
b2e0: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65  >zMalloc = pTree
b2f0: 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70  ->zMalloc;.    p
b300: 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 70  New->nMalloc = p
b310: 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20  Tree->nMalloc;. 
b320: 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f     pTree->zMallo
b330: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
b340: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d      pNew->pLeftm
b350: 6f 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ost = pNew;.    
b360: 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64  rc = fts3NodeAdd
b370: 54 65 72 6d 28 70 2c 20 26 70 4e 65 77 2c 20 69  Term(p, &pNew, i
b380: 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d  sCopyTerm, zTerm
b390: 2c 20 6e 54 65 72 6d 29 3b 20 0a 20 20 7d 0a 0a  , nTerm); .  }..
b3a0: 20 20 2a 70 70 54 72 65 65 20 3d 20 70 4e 65 77    *ppTree = pNew
b3b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b3c0: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
b3d0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 74 73 33  unction for fts3
b3e0: 4e 6f 64 65 57 72 69 74 65 28 29 2e 0a 2a 2f 0a  NodeWrite()..*/.
b3f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54  static int fts3T
b400: 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 0a 20  reeFinishNode(. 
b410: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54   SegmentNode *pT
b420: 72 65 65 2c 20 0a 20 20 69 6e 74 20 69 48 65 69  ree, .  int iHei
b430: 67 68 74 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  ght, .  sqlite3_
b440: 69 6e 74 36 34 20 69 4c 65 66 74 43 68 69 6c 64  int64 iLeftChild
b450: 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 61 72 74  .){.  int nStart
b460: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 48 65 69  ;.  assert( iHei
b470: 67 68 74 3e 3d 31 20 26 26 20 69 48 65 69 67 68  ght>=1 && iHeigh
b480: 74 3c 31 32 38 20 29 3b 0a 20 20 6e 53 74 61 72  t<128 );.  nStar
b490: 74 20 3d 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  t = FTS3_VARINT_
b4a0: 4d 41 58 20 2d 20 73 71 6c 69 74 65 33 46 74 73  MAX - sqlite3Fts
b4b0: 33 56 61 72 69 6e 74 4c 65 6e 28 69 4c 65 66 74  3VarintLen(iLeft
b4c0: 43 68 69 6c 64 29 3b 0a 20 20 70 54 72 65 65 2d  Child);.  pTree-
b4d0: 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 20 3d  >aData[nStart] =
b4e0: 20 28 63 68 61 72 29 69 48 65 69 67 68 74 3b 0a   (char)iHeight;.
b4f0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74    sqlite3Fts3Put
b500: 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61  Varint(&pTree->a
b510: 44 61 74 61 5b 6e 53 74 61 72 74 2b 31 5d 2c 20  Data[nStart+1], 
b520: 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 72  iLeftChild);.  r
b530: 65 74 75 72 6e 20 6e 53 74 61 72 74 3b 0a 7d 0a  eturn nStart;.}.
b540: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
b550: 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 65 20   buffer for the 
b560: 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 70 54 72  segment node pTr
b570: 65 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  ee and all of it
b580: 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 0a 2a  s peers to the.*
b590: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 6e  * database. Then
b5a0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
b5b0: 69 6f 6e 20 72 65 63 75 72 73 69 76 65 6c 79 20  ion recursively 
b5c0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61 72  to write the par
b5d0: 65 6e 74 20 6f 66 20 0a 2a 2a 20 70 54 72 65 65  ent of .** pTree
b5e0: 20 61 6e 64 20 69 74 73 20 70 65 65 72 73 20 74   and its peers t
b5f0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
b600: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
b610: 66 20 70 54 72 65 65 20 69 73 20 61 20 72 6f 6f  f pTree is a roo
b620: 74 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 77  t node, do not w
b630: 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 64  rite it to the d
b640: 61 74 61 62 61 73 65 2e 20 49 6e 73 74 65 61 64  atabase. Instead
b650: 2c 0a 2a 2a 20 73 65 74 20 6f 75 74 70 75 74 20  ,.** set output 
b660: 76 61 72 69 61 62 6c 65 73 20 2a 70 61 52 6f 6f  variables *paRoo
b670: 74 20 61 6e 64 20 2a 70 6e 52 6f 6f 74 20 74 6f  t and *pnRoot to
b680: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 6f   contain the roo
b690: 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  t node..**.** If
b6a0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
b6b0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
b6c0: 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76 61  ed and output va
b6d0: 72 69 61 62 6c 65 20 2a 70 69 4c 61 73 74 20 69  riable *piLast i
b6e0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20  s.** set to the 
b6f0: 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64 20  largest blockid 
b700: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
b710: 61 74 61 62 61 73 65 20 28 6f 72 20 7a 65 72 6f  atabase (or zero
b720: 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b 73   if no.** blocks
b730: 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 74 6f   were written to
b740: 20 74 68 65 20 64 62 29 2e 20 4f 74 68 65 72 77   the db). Otherw
b750: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
b760: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
b770: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b780: 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64  atic int fts3Nod
b790: 65 57 72 69 74 65 28 0a 20 20 46 74 73 33 54 61  eWrite(.  Fts3Ta
b7a0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
b7b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
b7c0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
b7d0: 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  e */.  SegmentNo
b7e0: 64 65 20 2a 70 54 72 65 65 2c 20 20 20 20 20 20  de *pTree,      
b7f0: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
b800: 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  tNode handle */.
b810: 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 20    int iHeight,  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 74    /* Height of t
b840: 68 69 73 20 6e 6f 64 65 20 69 6e 20 74 72 65 65  his node in tree
b850: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
b860: 74 36 34 20 69 4c 65 61 66 2c 20 20 20 20 20 20  t64 iLeaf,      
b870: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69        /* Block i
b880: 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66 20  d of first leaf 
b890: 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
b8a0: 33 5f 69 6e 74 36 34 20 69 46 72 65 65 2c 20 20  3_int64 iFree,  
b8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
b8c0: 63 6b 20 69 64 20 6f 66 20 6e 65 78 74 20 66 72  ck id of next fr
b8d0: 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67  ee slot in %_seg
b8e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ments */.  sqlit
b8f0: 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73 74  e3_int64 *piLast
b900: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ,          /* OU
b910: 54 3a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6c  T: Block id of l
b920: 61 73 74 20 65 6e 74 72 79 20 77 72 69 74 74 65  ast entry writte
b930: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61  n */.  char **pa
b940: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
b950: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
b960: 61 74 61 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64  ata for root nod
b970: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 6f  e */.  int *pnRo
b980: 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
b990: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
b9a0: 69 7a 65 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65  ize of root node
b9b0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
b9c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b9d0: 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 54  E_OK;..  if( !pT
b9e0: 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a  ree->pParent ){.
b9f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65      /* Root node
ba00: 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a 2f   of the tree. */
ba10: 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20  .    int nStart 
ba20: 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68  = fts3TreeFinish
ba30: 4e 6f 64 65 28 70 54 72 65 65 2c 20 69 48 65 69  Node(pTree, iHei
ba40: 67 68 74 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20  ght, iLeaf);.   
ba50: 20 2a 70 69 4c 61 73 74 20 3d 20 69 46 72 65 65   *piLast = iFree
ba60: 2d 31 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f 74 20  -1;.    *pnRoot 
ba70: 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 2d  = pTree->nData -
ba80: 20 6e 53 74 61 72 74 3b 0a 20 20 20 20 2a 70 61   nStart;.    *pa
ba90: 52 6f 6f 74 20 3d 20 26 70 54 72 65 65 2d 3e 61  Root = &pTree->a
baa0: 44 61 74 61 5b 6e 53 74 61 72 74 5d 3b 0a 20 20  Data[nStart];.  
bab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 53 65 67 6d 65  }else{.    Segme
bac0: 6e 74 4e 6f 64 65 20 2a 70 49 74 65 72 3b 0a 20  ntNode *pIter;. 
bad0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
bae0: 20 69 4e 65 78 74 46 72 65 65 20 3d 20 69 46 72   iNextFree = iFr
baf0: 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ee;.    sqlite3_
bb00: 69 6e 74 36 34 20 69 4e 65 78 74 4c 65 61 66 20  int64 iNextLeaf 
bb10: 3d 20 69 4c 65 61 66 3b 0a 20 20 20 20 66 6f 72  = iLeaf;.    for
bb20: 28 70 49 74 65 72 3d 70 54 72 65 65 2d 3e 70 4c  (pIter=pTree->pL
bb30: 65 66 74 6d 6f 73 74 3b 20 70 49 74 65 72 20 26  eftmost; pIter &
bb40: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
bb50: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 52   pIter=pIter->pR
bb60: 69 67 68 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  ight){.      int
bb70: 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54 72   nStart = fts3Tr
bb80: 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 49 74  eeFinishNode(pIt
bb90: 65 72 2c 20 69 48 65 69 67 68 74 2c 20 69 4e 65  er, iHeight, iNe
bba0: 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  xtLeaf);.      i
bbb0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 70 49 74 65  nt nWrite = pIte
bbc0: 72 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72  r->nData - nStar
bbd0: 74 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d  t;.  .      rc =
bbe0: 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
bbf0: 74 28 70 2c 20 69 4e 65 78 74 46 72 65 65 2c 20  t(p, iNextFree, 
bc00: 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 6e 53  &pIter->aData[nS
bc10: 74 61 72 74 5d 2c 20 6e 57 72 69 74 65 29 3b 0a  tart], nWrite);.
bc20: 20 20 20 20 20 20 69 4e 65 78 74 46 72 65 65 2b        iNextFree+
bc30: 2b 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 4c 65  +;.      iNextLe
bc40: 61 66 20 2b 3d 20 28 70 49 74 65 72 2d 3e 6e 45  af += (pIter->nE
bc50: 6e 74 72 79 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ntry+1);.    }. 
bc60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bc70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
bc80: 73 65 72 74 28 20 69 4e 65 78 74 4c 65 61 66 3d  sert( iNextLeaf=
bc90: 3d 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20  =iFree );.      
bca0: 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69  rc = fts3NodeWri
bcb0: 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  te(.          p,
bcc0: 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 2c   pTree->pParent,
bcd0: 20 69 48 65 69 67 68 74 2b 31 2c 20 69 46 72 65   iHeight+1, iFre
bce0: 65 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 70 69  e, iNextFree, pi
bcf0: 4c 61 73 74 2c 20 70 61 52 6f 6f 74 2c 20 70 6e  Last, paRoot, pn
bd00: 52 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  Root.      );.  
bd10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
bd20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
bd30: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
bd40: 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
bd50: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
bd60: 72 65 65 20 70 54 72 65 65 2e 0a 2a 2f 0a 73 74  ree pTree..*/.st
bd70: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4e 6f  atic void fts3No
bd80: 64 65 46 72 65 65 28 53 65 67 6d 65 6e 74 4e 6f  deFree(SegmentNo
bd90: 64 65 20 2a 70 54 72 65 65 29 7b 0a 20 20 69 66  de *pTree){.  if
bda0: 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53  ( pTree ){.    S
bdb0: 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 20 3d 20  egmentNode *p = 
bdc0: 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74  pTree->pLeftmost
bdd0: 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65 46 72  ;.    fts3NodeFr
bde0: 65 65 28 70 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  ee(p->pParent);.
bdf0: 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a      while( p ){.
be00: 20 20 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64        SegmentNod
be10: 65 20 2a 70 52 69 67 68 74 20 3d 20 70 2d 3e 70  e *pRight = p->p
be20: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
be30: 20 70 2d 3e 61 44 61 74 61 21 3d 28 63 68 61 72   p->aData!=(char
be40: 20 2a 29 26 70 5b 31 5d 20 29 7b 0a 20 20 20 20   *)&p[1] ){.    
be50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
be60: 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  (p->aData);.    
be70: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
be80: 28 20 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ( pRight==0 || p
be90: 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  ->zMalloc==0 );.
bea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
beb0: 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  ee(p->zMalloc);.
bec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
bed0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 70 20 3d  ee(p);.      p =
bee0: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20   pRight;.    }. 
bef0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
bf00: 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 73 65  a term to the se
bf10: 67 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 6e 73  gment being cons
bf20: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 53  tructed by the S
bf30: 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a  egmentWriter obj
bf40: 65 63 74 0a 2a 2a 20 2a 70 70 57 72 69 74 65 72  ect.** *ppWriter
bf50: 2e 20 57 68 65 6e 20 61 64 64 69 6e 67 20 74 68  . When adding th
bf60: 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20  e first term to 
bf70: 61 20 73 65 67 6d 65 6e 74 2c 20 2a 70 70 57 72  a segment, *ppWr
bf80: 69 74 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  iter should.** b
bf90: 65 20 70 61 73 73 65 64 20 4e 55 4c 4c 2e 20 54  e passed NULL. T
bfa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
bfb0: 6c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  l allocate a new
bfc0: 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f   SegmentWriter o
bfd0: 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 72 65 74  bject.** and ret
bfe0: 75 72 6e 20 69 74 20 76 69 61 20 74 68 65 20 69  urn it via the i
bff0: 6e 70 75 74 2f 6f 75 74 70 75 74 20 76 61 72 69  nput/output vari
c000: 61 62 6c 65 20 2a 70 70 57 72 69 74 65 72 20 69  able *ppWriter i
c010: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
c020: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
c030: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
c040: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
c050: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
c060: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
c070: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 57  tic int fts3SegW
c080: 72 69 74 65 72 41 64 64 28 0a 20 20 46 74 73 33  riterAdd(.  Fts3
c090: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
c0b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
c0c0: 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  dle */.  Segment
c0d0: 57 72 69 74 65 72 20 2a 2a 70 70 57 72 69 74 65  Writer **ppWrite
c0e0: 72 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  r,       /* IN/O
c0f0: 55 54 3a 20 53 65 67 6d 65 6e 74 57 72 69 74 65  UT: SegmentWrite
c100: 72 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69  r handle */ .  i
c110: 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20  nt isCopyTerm,  
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c130: 2a 20 54 72 75 65 20 69 66 20 62 75 66 66 65 72  * True if buffer
c140: 20 7a 54 65 72 6d 20 6d 75 73 74 20 62 65 20 63   zTerm must be c
c150: 6f 70 69 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  opied */.  const
c160: 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
c170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
c180: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
c190: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
c1a0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
c1d0: 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
c1e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
c1f0: 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20  Doclist,        
c200: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
c210: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
c220: 6e 67 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  ng doclist */.  
c230: 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20 20  int nDoclist    
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
c260: 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  st in bytes */.)
c270: 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  {.  int nPrefix;
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
c2a0: 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79  erm prefix in by
c2b0: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  tes */.  int nSu
c2c0: 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
c2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c2e0: 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20   of term suffix 
c2f0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
c300: 74 20 6e 52 65 71 3b 20 20 20 20 20 20 20 20 20  t nReq;         
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c320: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c330: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61   required on lea
c340: 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  f page */.  int 
c350: 6e 44 61 74 61 3b 0a 20 20 53 65 67 6d 65 6e 74  nData;.  Segment
c360: 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
c370: 3d 20 2a 70 70 57 72 69 74 65 72 3b 0a 0a 20 20  = *ppWriter;..  
c380: 69 66 28 20 21 70 57 72 69 74 65 72 20 29 7b 0a  if( !pWriter ){.
c390: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
c3a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
c3b0: 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  tmt;..    /* All
c3c0: 6f 63 61 74 65 20 74 68 65 20 53 65 67 6d 65 6e  ocate the Segmen
c3d0: 74 57 72 69 74 65 72 20 73 74 72 75 63 74 75 72  tWriter structur
c3e0: 65 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72  e */.    pWriter
c3f0: 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74 65   = (SegmentWrite
c400: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
c410: 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  oc(sizeof(Segmen
c420: 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 69  tWriter));.    i
c430: 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72 65  f( !pWriter ) re
c440: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c450: 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57  M;.    memset(pW
c460: 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
c470: 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29  (SegmentWriter))
c480: 3b 0a 20 20 20 20 2a 70 70 57 72 69 74 65 72 20  ;.    *ppWriter 
c490: 3d 20 70 57 72 69 74 65 72 3b 0a 0a 20 20 20 20  = pWriter;..    
c4a0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* Allocate a bu
c4b0: 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
c4c0: 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74 61   accumulate data
c4d0: 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72 2d   */.    pWriter-
c4e0: 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a  >aData = (char *
c4f0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
c500: 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20  p->nNodeSize);. 
c510: 20 20 20 69 66 28 20 21 70 57 72 69 74 65 72 2d     if( !pWriter-
c520: 3e 61 44 61 74 61 20 29 20 72 65 74 75 72 6e 20  >aData ) return 
c530: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c540: 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65    pWriter->nSize
c550: 20 3d 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 3b   = p->nNodeSize;
c560: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
c570: 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c 6f 63  e next free bloc
c580: 6b 69 64 20 69 6e 20 74 68 65 20 25 5f 73 65 67  kid in the %_seg
c590: 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a 20  ments table */. 
c5a0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
c5b0: 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f  tmt(p, SQL_NEXT_
c5c0: 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70 53  SEGMENTS_ID, &pS
c5d0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
c5e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c5f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c600: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
c610: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
c620: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70 57 72  mt) ){.      pWr
c630: 69 74 65 72 2d 3e 69 46 72 65 65 20 3d 20 73 71  iter->iFree = sq
c640: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
c650: 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  64(pStmt, 0);.  
c660: 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69      pWriter->iFi
c670: 72 73 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 69  rst = pWriter->i
c680: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
c690: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
c6a0: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  et(pStmt);.    i
c6b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c6c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c6d0: 7d 0a 20 20 6e 44 61 74 61 20 3d 20 70 57 72 69  }.  nData = pWri
c6e0: 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 0a 20 20 6e  ter->nData;..  n
c6f0: 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 65  Prefix = fts3Pre
c700: 66 69 78 43 6f 6d 70 72 65 73 73 28 70 57 72 69  fixCompress(pWri
c710: 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 57 72 69  ter->zTerm, pWri
c720: 74 65 72 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72  ter->nTerm, zTer
c730: 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53 75  m, nTerm);.  nSu
c740: 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72  ffix = nTerm-nPr
c750: 65 66 69 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  efix;..  /* Figu
c760: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
c770: 62 79 74 65 73 20 61 72 65 20 72 65 71 75 69 72  bytes are requir
c780: 65 64 20 62 79 20 74 68 69 73 20 6e 65 77 20 65  ed by this new e
c790: 6e 74 72 79 20 2a 2f 0a 20 20 6e 52 65 71 20 3d  ntry */.  nReq =
c7a0: 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
c7b0: 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 20 2b  ntLen(nPrefix) +
c7c0: 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f      /* varint co
c7d0: 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
c7e0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
c7f0: 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
c800: 28 6e 53 75 66 66 69 78 29 20 2b 20 20 20 20 20  (nSuffix) +     
c810: 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f      /* varint co
c820: 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69 78 20  ntaining suffix 
c830: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6e 53 75 66  size */.    nSuf
c840: 66 69 78 20 2b 20 20 20 20 20 20 20 20 20 20 20  fix +           
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75 66 66      /* Term suff
c870: 69 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ix */.    sqlite
c880: 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
c890: 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20  Doclist) +      
c8a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
c8b0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6e 44 6f 63  list */.    nDoc
c8c0: 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64      /* Doclist d
c8f0: 61 74 61 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 44  ata */..  if( nD
c900: 61 74 61 3e 30 20 26 26 20 6e 44 61 74 61 2b 6e  ata>0 && nData+n
c910: 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  Req>p->nNodeSize
c920: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
c930: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72  .    /* The curr
c940: 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65 20 69 73  ent leaf node is
c950: 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20   full. Write it 
c960: 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
c970: 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ase. */.    rc =
c980: 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
c990: 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 46  t(p, pWriter->iF
c9a0: 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e  ree++, pWriter->
c9b0: 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  aData, nData);. 
c9c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c9d0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
c9e0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
c9f0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74  e current term t
ca00: 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  o the interior n
ca10: 6f 64 65 20 74 72 65 65 2e 20 54 68 65 20 74 65  ode tree. The te
ca20: 72 6d 20 61 64 64 65 64 20 74 6f 0a 20 20 20 20  rm added to.    
ca30: 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  ** the interior 
ca40: 74 72 65 65 20 6d 75 73 74 3a 0a 20 20 20 20 2a  tree must:.    *
ca50: 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65  *.    **   a) be
ca60: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
ca70: 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f  e largest term o
ca80: 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
ca90: 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20  just written.   
caa0: 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20   **      to the 
cab0: 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20  database (still 
cac0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 57 72  available in pWr
cad0: 69 74 65 72 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e  iter->zTerm), an
cae0: 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  d.    **.    ** 
caf0: 20 20 62 29 20 62 65 20 6c 65 73 73 20 74 68 61    b) be less tha
cb00: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
cb10: 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74 6f 20  e term about to 
cb20: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
cb30: 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  new.    **      
cb40: 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d  leaf node (zTerm
cb50: 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a  /nTerm)..    **.
cb60: 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
cb70: 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74 20 62  words, it must b
cb80: 65 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  e the prefix of 
cb90: 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e  zTerm 1 byte lon
cba0: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ger than.    ** 
cbb0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
cbc0: 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20 7a 54  x (if any) of zT
cbd0: 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65 72 2d  erm and pWriter-
cbe0: 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20  >zTerm..    */. 
cbf0: 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66     assert( nPref
cc00: 69 78 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20  ix<nTerm );.    
cc10: 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64  rc = fts3NodeAdd
cc20: 54 65 72 6d 28 70 2c 20 26 70 57 72 69 74 65 72  Term(p, &pWriter
cc30: 2d 3e 70 54 72 65 65 2c 20 69 73 43 6f 70 79 54  ->pTree, isCopyT
cc40: 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 50 72 65  erm, zTerm, nPre
cc50: 66 69 78 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  fix+1);.    if( 
cc60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cc70: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
cc80: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  nData = 0;.    p
cc90: 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Writer->nTerm = 
cca0: 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20  0;..    nPrefix 
ccb0: 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66 66 69 78  = 0;.    nSuffix
ccc0: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e 52   = nTerm;.    nR
ccd0: 65 71 20 3d 20 31 20 2b 20 20 20 20 20 20 20 20  eq = 1 +        
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
cd00: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
cd10: 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  x size */.      
cd20: 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
cd30: 74 4c 65 6e 28 6e 54 65 72 6d 29 20 2b 20 20 20  tLen(nTerm) +   
cd40: 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
cd50: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69  containing suffi
cd60: 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  x size */.      
cd70: 6e 54 65 72 6d 20 2b 20 20 20 20 20 20 20 20 20  nTerm +         
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75        /* Term su
cda0: 66 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 73 71  ffix */.      sq
cdb0: 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
cdc0: 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20  en(nDoclist) +  
cdd0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
cde0: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  oclist */.      
cdf0: 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
ce20: 20 64 61 74 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20   data */.  }..  
ce30: 2f 2a 20 49 66 20 74 68 65 20 62 75 66 66 65 72  /* If the buffer
ce40: 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63   currently alloc
ce50: 61 74 65 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c  ated is too smal
ce60: 6c 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  l for this entry
ce70: 2c 20 72 65 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74  , realloc.  ** t
ce80: 68 65 20 62 75 66 66 65 72 20 74 6f 20 6d 61 6b  he buffer to mak
ce90: 65 20 69 74 20 6c 61 72 67 65 20 65 6e 6f 75 67  e it large enoug
cea0: 68 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 52  h..  */.  if( nR
ceb0: 65 71 3e 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a  eq>pWriter->nSiz
cec0: 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61  e ){.    char *a
ced0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
cee0: 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61  alloc(pWriter->a
cef0: 44 61 74 61 2c 20 6e 52 65 71 29 3b 0a 20 20 20  Data, nReq);.   
cf00: 20 69 66 28 20 21 61 4e 65 77 20 29 20 72 65 74   if( !aNew ) ret
cf10: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
cf20: 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61  ;.    pWriter->a
cf30: 44 61 74 61 20 3d 20 61 4e 65 77 3b 0a 20 20 20  Data = aNew;.   
cf40: 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20   pWriter->nSize 
cf50: 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a 20 20 61 73  = nReq;.  }.  as
cf60: 73 65 72 74 28 20 6e 44 61 74 61 2b 6e 52 65 71  sert( nData+nReq
cf70: 3c 3d 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65  <=pWriter->nSize
cf80: 20 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64   );..  /* Append
cf90: 20 74 68 65 20 70 72 65 66 69 78 2d 63 6f 6d 70   the prefix-comp
cfa0: 72 65 73 73 65 64 20 74 65 72 6d 20 61 6e 64 20  ressed term and 
cfb0: 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 62  doclist to the b
cfc0: 75 66 66 65 72 2e 20 2a 2f 0a 20 20 6e 44 61 74  uffer. */.  nDat
cfd0: 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
cfe0: 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74  PutVarint(&pWrit
cff0: 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
d000: 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 44  , nPrefix);.  nD
d010: 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
d020: 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57 72  s3PutVarint(&pWr
d030: 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74  iter->aData[nDat
d040: 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  a], nSuffix);.  
d050: 6d 65 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d  memcpy(&pWriter-
d060: 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26  >aData[nData], &
d070: 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
d080: 6e 53 75 66 66 69 78 29 3b 0a 20 20 6e 44 61 74  nSuffix);.  nDat
d090: 61 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20  a += nSuffix;.  
d0a0: 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
d0b0: 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
d0c0: 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
d0d0: 61 74 61 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  ata], nDoclist);
d0e0: 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74  .  memcpy(&pWrit
d0f0: 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
d100: 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63  , aDoclist, nDoc
d110: 6c 69 73 74 29 3b 0a 20 20 70 57 72 69 74 65 72  list);.  pWriter
d120: 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61 20  ->nData = nData 
d130: 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f  + nDoclist;..  /
d140: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
d150: 6e 74 20 74 65 72 6d 20 73 6f 20 74 68 61 74 20  nt term so that 
d160: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  it can be used t
d170: 6f 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73  o prefix-compres
d180: 73 20 74 68 65 20 6e 65 78 74 2e 0a 20 20 2a 2a  s the next..  **
d190: 20 49 66 20 74 68 65 20 69 73 43 6f 70 79 54 65   If the isCopyTe
d1a0: 72 6d 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  rm parameter is 
d1b0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 62  true, then the b
d1c0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
d1d0: 20 62 79 0a 20 20 2a 2a 20 7a 54 65 72 6d 20 69   by.  ** zTerm i
d1e0: 73 20 74 72 61 6e 73 69 65 6e 74 2c 20 73 6f 20  s transient, so 
d1f0: 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  take a copy of t
d200: 68 65 20 74 65 72 6d 20 64 61 74 61 2e 20 4f 74  he term data. Ot
d210: 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a 20 20  herwise, just.  
d220: 2a 2a 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20  ** store a copy 
d230: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  of the pointer..
d240: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 70    */.  if( isCop
d250: 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  yTerm ){.    if(
d260: 20 6e 54 65 72 6d 3e 70 57 72 69 74 65 72 2d 3e   nTerm>pWriter->
d270: 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  nMalloc ){.     
d280: 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71   char *zNew = sq
d290: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57  lite3_realloc(pW
d2a0: 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20  riter->zMalloc, 
d2b0: 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20  nTerm*2);.      
d2c0: 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20  if( !zNew ){.   
d2d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d2e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
d2f0: 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  }.      pWriter-
d300: 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d  >nMalloc = nTerm
d310: 2a 32 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  *2;.      pWrite
d320: 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65  r->zMalloc = zNe
d330: 77 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  w;.      pWriter
d340: 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a  ->zTerm = zNew;.
d350: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
d360: 28 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d  ( pWriter->zTerm
d370: 3d 3d 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  ==pWriter->zMall
d380: 6f 63 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  oc );.    memcpy
d390: 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c  (pWriter->zTerm,
d3a0: 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
d3b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 72    }else{.    pWr
d3c0: 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63  iter->zTerm = (c
d3d0: 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d  har *)zTerm;.  }
d3e0: 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72  .  pWriter->nTer
d3f0: 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 72 65  m = nTerm;..  re
d400: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d410: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
d420: 6c 6c 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ll data associat
d430: 65 64 20 77 69 74 68 20 74 68 65 20 53 65 67 6d  ed with the Segm
d440: 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
d450: 20 70 57 72 69 74 65 72 20 74 6f 20 74 68 65 0a   pWriter to the.
d460: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
d470: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
d480: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
d490: 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20 62  all terms have b
d4a0: 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  een added.** to 
d4b0: 74 68 65 20 73 65 67 6d 65 6e 74 20 75 73 69 6e  the segment usin
d4c0: 67 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  g fts3SegWriterA
d4d0: 64 64 28 29 2e 20 49 66 20 73 75 63 63 65 73 73  dd(). If success
d4e0: 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
d4f0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
d500: 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
d510: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
d520: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
d530: 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68  s3SegWriterFlush
d540: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
d550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d560: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
d570: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
d580: 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a   SegmentWriter *
d590: 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
d5a0: 20 2f 2a 20 53 65 67 6d 65 6e 74 57 72 69 74 65   /* SegmentWrite
d5b0: 72 20 74 6f 20 66 6c 75 73 68 20 74 6f 20 74 68  r to flush to th
d5c0: 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  e db */.  int iL
d5d0: 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
d5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
d5f0: 75 65 20 66 6f 72 20 27 6c 65 76 65 6c 27 20 63  ue for 'level' c
d600: 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69  olumn of %_segdi
d610: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  r */.  int iIdx 
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
d640: 66 6f 72 20 27 69 64 78 27 20 63 6f 6c 75 6d 6e  for 'idx' column
d650: 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a   of %_segdir */.
d660: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
d690: 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 57 72  ode */.  if( pWr
d6a0: 69 74 65 72 2d 3e 70 54 72 65 65 20 29 7b 0a 20  iter->pTree ){. 
d6b0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
d6c0: 20 69 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20   iLast = 0;     
d6d0: 20 2f 2a 20 4c 61 72 67 65 73 74 20 62 6c 6f 63   /* Largest bloc
d6e0: 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  k id written to 
d6f0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
d700: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
d710: 61 73 74 4c 65 61 66 3b 20 20 20 20 20 20 2f 2a  astLeaf;      /*
d720: 20 4c 61 72 67 65 73 74 20 6c 65 61 66 20 62 6c   Largest leaf bl
d730: 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74  ock id written t
d740: 6f 20 64 62 20 2a 2f 0a 20 20 20 20 63 68 61 72  o db */.    char
d750: 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20   *zRoot = NULL; 
d760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
d770: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
d780: 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e  ontaining root n
d790: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ode */.    int n
d7a0: 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Root = 0;       
d7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
d7c0: 20 6f 66 20 62 75 66 66 65 72 20 7a 52 6f 6f 74   of buffer zRoot
d7d0: 20 2a 2f 0a 0a 20 20 20 20 69 4c 61 73 74 4c 65   */..    iLastLe
d7e0: 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 46  af = pWriter->iF
d7f0: 72 65 65 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  ree;.    rc = ft
d800: 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
d810: 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65  , pWriter->iFree
d820: 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61  ++, pWriter->aDa
d830: 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ta, pWriter->nDa
d840: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ta);.    if( rc=
d850: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d860: 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
d870: 65 57 72 69 74 65 28 70 2c 20 70 57 72 69 74 65  eWrite(p, pWrite
d880: 72 2d 3e 70 54 72 65 65 2c 20 31 2c 0a 20 20 20  r->pTree, 1,.   
d890: 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
d8a0: 69 46 69 72 73 74 2c 20 70 57 72 69 74 65 72 2d  iFirst, pWriter-
d8b0: 3e 69 46 72 65 65 2c 20 26 69 4c 61 73 74 2c 20  >iFree, &iLast, 
d8c0: 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b  &zRoot, &nRoot);
d8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d8e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d8f0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57        rc = fts3W
d900: 72 69 74 65 53 65 67 64 69 72 28 0a 20 20 20 20  riteSegdir(.    
d910: 20 20 20 20 20 20 70 2c 20 69 4c 65 76 65 6c 2c        p, iLevel,
d920: 20 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e   iIdx, pWriter->
d930: 69 46 69 72 73 74 2c 20 69 4c 61 73 74 4c 65 61  iFirst, iLastLea
d940: 66 2c 20 69 4c 61 73 74 2c 20 7a 52 6f 6f 74 2c  f, iLast, zRoot,
d950: 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20   nRoot);.    }. 
d960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
d970: 68 65 20 65 6e 74 69 72 65 20 74 72 65 65 20 66  he entire tree f
d980: 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  its on the root 
d990: 6e 6f 64 65 2e 20 57 72 69 74 65 20 69 74 20 74  node. Write it t
d9a0: 6f 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62  o the segdir tab
d9b0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  le. */.    rc = 
d9c0: 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28  fts3WriteSegdir(
d9d0: 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 65 76  .        p, iLev
d9e0: 65 6c 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c 20  el, iIdx, 0, 0, 
d9f0: 30 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74  0, pWriter->aDat
da00: 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74  a, pWriter->nDat
da10: 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  a);.  }.  return
da20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
da30: 6c 65 61 73 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  lease all memory
da40: 20 68 65 6c 64 20 62 79 20 74 68 65 20 53 65 67   held by the Seg
da50: 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63  mentWriter objec
da60: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
da70: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
da80: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
da90: 69 64 20 66 74 73 33 53 65 67 57 72 69 74 65 72  id fts3SegWriter
daa0: 46 72 65 65 28 53 65 67 6d 65 6e 74 57 72 69 74  Free(SegmentWrit
dab0: 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
dac0: 69 66 28 20 70 57 72 69 74 65 72 20 29 7b 0a 20  if( pWriter ){. 
dad0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
dae0: 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 29 3b  pWriter->aData);
daf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
db00: 65 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  e(pWriter->zMall
db10: 6f 63 29 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64  oc);.    fts3Nod
db20: 65 46 72 65 65 28 70 57 72 69 74 65 72 2d 3e 70  eFree(pWriter->p
db30: 54 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Tree);.    sqlit
db40: 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 29  e3_free(pWriter)
db50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
db60: 68 65 20 66 69 72 73 74 20 76 61 6c 75 65 20 69  he first value i
db70: 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72  n the apVal[] ar
db80: 72 61 79 20 69 73 20 61 73 73 75 6d 65 64 20 74  ray is assumed t
db90: 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  o contain an int
dba0: 65 67 65 72 2e 0a 2a 2a 20 54 68 69 73 20 66 75  eger..** This fu
dbb0: 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
dbc0: 74 68 65 72 65 20 65 78 69 73 74 20 61 6e 79 20  there exist any 
dbd0: 64 6f 63 75 6d 65 6e 74 73 20 77 69 74 68 20 64  documents with d
dbe0: 6f 63 69 64 20 76 61 6c 75 65 73 20 74 68 61 74  ocid values that
dbf0: 0a 2a 2a 20 61 72 65 20 64 69 66 66 65 72 65 6e  .** are differen
dc00: 74 20 66 72 6f 6d 20 74 68 61 74 20 69 6e 74 65  t from that inte
dc10: 67 65 72 2e 20 69 2e 65 2e 20 69 66 20 64 65 6c  ger. i.e. if del
dc20: 65 74 69 6e 67 20 74 68 65 20 64 6f 63 75 6d 65  eting the docume
dc30: 6e 74 20 77 69 74 68 20 64 6f 63 69 64 0a 2a 2a  nt with docid.**
dc40: 20 61 70 56 61 6c 5b 30 5d 20 77 6f 75 6c 64 20   apVal[0] would 
dc50: 6d 65 61 6e 20 74 68 65 20 46 54 53 33 20 74 61  mean the FTS3 ta
dc60: 62 6c 65 20 77 65 72 65 20 65 6d 70 74 79 2e 0a  ble were empty..
dc70: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
dc80: 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74 79 20 69  ful, *pisEmpty i
dc90: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
dca0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
dcb0: 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 0a 2a  pty except for.*
dcc0: 2a 20 64 6f 63 75 6d 65 6e 74 20 61 70 56 61 6c  * document apVal
dcd0: 5b 30 5d 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  [0], or false ot
dce0: 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53 51 4c  herwise, and SQL
dcf0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
dd00: 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  ed. If an.** err
dd10: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
dd20: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
dd30: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
dd40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
dd50: 73 45 6d 70 74 79 28 46 74 73 33 54 61 62 6c 65  sEmpty(Fts3Table
dd60: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c   *p, sqlite3_val
dd70: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 69 6e 74 20  ue **apVal, int 
dd80: 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20 20 73 71  *pisEmpty){.  sq
dd90: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
dda0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  t;.  int rc;.  r
ddb0: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
ddc0: 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59 2c  p, SQL_IS_EMPTY,
ddd0: 20 26 70 53 74 6d 74 2c 20 61 70 56 61 6c 29 3b   &pStmt, apVal);
dde0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ddf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
de00: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
de10: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
de20: 29 7b 0a 20 20 20 20 20 20 2a 70 69 73 45 6d 70  ){.      *pisEmp
de30: 74 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ty = sqlite3_col
de40: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
de50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
de60: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
de70: 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65  pStmt);.  }.  re
de80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
de90: 2a 20 53 65 74 20 2a 70 6e 53 65 67 6d 65 6e 74  * Set *pnSegment
dea0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
deb0: 66 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6c 65  f segments of le
dec0: 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 20 74 68  vel iLevel in th
ded0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
dee0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
def0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
df00: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
df10: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6e 6f 74  rror code if not
df20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
df30: 66 74 73 33 53 65 67 6d 65 6e 74 43 6f 75 6e 74  fts3SegmentCount
df40: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69  (Fts3Table *p, i
df50: 6e 74 20 69 4c 65 76 65 6c 2c 20 69 6e 74 20 2a  nt iLevel, int *
df60: 70 6e 53 65 67 6d 65 6e 74 29 7b 0a 20 20 73 71  pnSegment){.  sq
df70: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
df80: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
df90: 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3e 3d  assert( iLevel>=
dfa0: 30 20 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  0 );.  rc = fts3
dfb0: 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
dfc0: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e  ELECT_LEVEL_COUN
dfd0: 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
dfe0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
dff0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e000: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
e010: 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65  nt(pStmt, 1, iLe
e020: 76 65 6c 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  vel);.  if( SQLI
e030: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
e040: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
e050: 20 20 20 2a 70 6e 53 65 67 6d 65 6e 74 20 3d 20     *pnSegment = 
e060: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
e070: 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
e080: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
e090: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
e0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
e0b0: 6e 53 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20  nSegment to the 
e0c0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
e0d0: 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  segments in the 
e0e0: 64 61 74 61 62 61 73 65 2e 20 53 65 74 0a 2a 2a  database. Set.**
e0f0: 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c   *pnMax to the l
e100: 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20 6c  argest segment l
e110: 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61 74 61  evel in the data
e120: 62 61 73 65 20 28 73 65 67 6d 65 6e 74 20 6c 65  base (segment le
e130: 76 65 6c 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  vels.** are stor
e140: 65 64 20 69 6e 20 74 68 65 20 27 6c 65 76 65 6c  ed in the 'level
e150: 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  ' column of the 
e160: 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 29 2e  %_segdir table).
e170: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
e180: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
e190: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
e1a0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
e1b0: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
e1c0: 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74   int fts3Segment
e1d0: 43 6f 75 6e 74 4d 61 78 28 46 74 73 33 54 61 62  CountMax(Fts3Tab
e1e0: 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 65  le *p, int *pnSe
e1f0: 67 6d 65 6e 74 2c 20 69 6e 74 20 2a 70 6e 4d 61  gment, int *pnMa
e200: 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  x){.  sqlite3_st
e210: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
e220: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73   rc;..  rc = fts
e230: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
e240: 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 43 4f  SELECT_SEGDIR_CO
e250: 55 4e 54 5f 4d 41 58 2c 20 26 70 53 74 6d 74 2c  UNT_MAX, &pStmt,
e260: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
e270: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e280: 6e 20 72 63 3b 0a 20 20 69 66 28 20 53 51 4c 49  n rc;.  if( SQLI
e290: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
e2a0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
e2b0: 20 20 20 2a 70 6e 53 65 67 6d 65 6e 74 20 3d 20     *pnSegment = 
e2c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
e2d0: 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
e2e0: 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71 6c 69 74    *pnMax = sqlit
e2f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
e300: 74 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  tmt, 1);.  }.  r
e310: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65  eturn sqlite3_re
e320: 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  set(pStmt);.}../
e330: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e340: 6f 6e 20 69 73 20 75 73 65 64 20 61 66 74 65 72  on is used after
e350: 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69 70 6c   merging multipl
e360: 65 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f 20  e segments into 
e370: 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a 2a  a single large.*
e380: 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c  * segment to del
e390: 65 74 65 20 74 68 65 20 6f 6c 64 2c 20 6e 6f 77  ete the old, now
e3a0: 20 72 65 64 75 6e 64 61 6e 74 2c 20 73 65 67 6d   redundant, segm
e3b0: 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 53 70 65  ent b-trees. Spe
e3c0: 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20 69 74  cifically,.** it
e3d0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29 20 44 65  :.** .**   1) De
e3e0: 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 6d  letes all %_segm
e3f0: 65 6e 74 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ents entries for
e400: 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 73   the segments as
e410: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
e420: 2a 20 20 20 20 20 20 65 61 63 68 20 6f 66 20 74  *      each of t
e430: 68 65 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  he SegReader obj
e440: 65 63 74 73 20 69 6e 20 74 68 65 20 61 72 72 61  ects in the arra
e450: 79 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  y passed as the 
e460: 74 68 69 72 64 20 0a 2a 2a 20 20 20 20 20 20 61  third .**      a
e470: 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a 2a 0a  rgument, and.**.
e480: 2a 2a 20 20 20 32 29 20 64 65 6c 65 74 65 73 20  **   2) deletes 
e490: 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65 6e 74  all %_segdir ent
e4a0: 72 69 65 73 20 77 69 74 68 20 6c 65 76 65 6c 20  ries with level 
e4b0: 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c 6c 20 25  iLevel, or all %
e4c0: 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20 20 20 20  _segdir.**      
e4d0: 65 6e 74 72 69 65 73 20 72 65 67 61 72 64 6c 65  entries regardle
e4e0: 73 73 20 6f 66 20 6c 65 76 65 6c 20 69 66 20 28  ss of level if (
e4f0: 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a 2a  iLevel<0)..**.**
e500: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
e510: 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
e520: 73 66 75 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  sful, otherwise 
e530: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
e540: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
e550: 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 53 65  int fts3DeleteSe
e560: 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c  gdir(.  Fts3Tabl
e570: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
e580: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
e590: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
e5a0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66       /* Level of
e5d0: 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65   %_segdir entrie
e5e0: 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
e5f0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
e600: 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  *apSegment,     
e610: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53 65 67   /* Array of Seg
e620: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 2a  Reader objects *
e630: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 20  /.  int nReader 
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
e660: 72 72 61 79 20 61 70 53 65 67 6d 65 6e 74 20 2a  rray apSegment *
e670: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e6a0: 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   Code */.  int i
e6b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
e6d0: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
e6e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
e6f0: 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20 20 20  t *pDelete;     
e700: 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
e710: 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20  ement to delete 
e720: 72 6f 77 73 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  rows */..  rc = 
e730: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
e740: 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e  QL_DELETE_SEGMEN
e750: 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65  TS_RANGE, &pDele
e760: 74 65 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d  te, 0);.  for(i=
e770: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e780: 20 26 26 20 69 3c 6e 52 65 61 64 65 72 3b 20 69   && i<nReader; i
e790: 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67  ++){.    Fts3Seg
e7a0: 52 65 61 64 65 72 20 2a 70 53 65 67 6d 65 6e 74  Reader *pSegment
e7b0: 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b   = apSegment[i];
e7c0: 0a 20 20 20 20 69 66 28 20 70 53 65 67 6d 65 6e  .    if( pSegmen
e7d0: 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 29  t->iStartBlock )
e7e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
e7f0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65  bind_int64(pDele
e800: 74 65 2c 20 31 2c 20 70 53 65 67 6d 65 6e 74 2d  te, 1, pSegment-
e810: 3e 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20  >iStartBlock);. 
e820: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
e830: 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c  d_int64(pDelete,
e840: 20 32 2c 20 70 53 65 67 6d 65 6e 74 2d 3e 69 45   2, pSegment->iE
e850: 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ndBlock);.      
e860: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65  sqlite3_step(pDe
e870: 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  lete);.      rc 
e880: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
e890: 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 7d 0a  pDelete);.    }.
e8a0: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
e8b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
e8c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
e8d0: 20 69 66 28 20 69 4c 65 76 65 6c 3e 3d 30 20 29   if( iLevel>=0 )
e8e0: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
e8f0: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45  qlStmt(p, SQL_DE
e900: 4c 45 54 45 5f 53 45 47 44 49 52 5f 42 59 5f 4c  LETE_SEGDIR_BY_L
e910: 45 56 45 4c 2c 20 26 70 44 65 6c 65 74 65 2c 20  EVEL, &pDelete, 
e920: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
e930: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e940: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
e950: 69 6e 74 28 70 44 65 6c 65 74 65 2c 20 31 2c 20  int(pDelete, 1, 
e960: 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73  iLevel);.      s
e970: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c  qlite3_step(pDel
e980: 65 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ete);.      rc =
e990: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
e9a0: 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 7d 0a 20  Delete);.    }. 
e9b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
e9c0: 20 66 74 73 33 53 71 6c 45 78 65 63 28 70 2c 20   fts3SqlExec(p, 
e9d0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
e9e0: 45 47 44 49 52 2c 20 30 29 3b 0a 20 20 7d 0a 0a  EGDIR, 0);.  }..
e9f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ea00: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
ea10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ea20: 65 64 2c 20 62 75 66 66 65 72 20 2a 70 70 4c 69  ed, buffer *ppLi
ea30: 73 74 20 28 73 69 7a 65 20 2a 70 6e 4c 69 73 74  st (size *pnList
ea40: 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69 6e 73   bytes) contains
ea50: 20 0a 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e 20   .** a position 
ea60: 6c 69 73 74 20 74 68 61 74 20 6d 61 79 20 28 6f  list that may (o
ea70: 72 20 6d 61 79 20 6e 6f 74 29 20 66 65 61 74 75  r may not) featu
ea80: 72 65 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75  re multiple colu
ea90: 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  mns. This.** fun
eaa0: 63 74 69 6f 6e 20 61 64 6a 75 73 74 73 20 74 68  ction adjusts th
eab0: 65 20 70 6f 69 6e 74 65 72 20 2a 70 70 4c 69 73  e pointer *ppLis
eac0: 74 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  t and the length
ead0: 20 2a 70 6e 4c 69 73 74 20 73 6f 20 74 68 61 74   *pnList so that
eae0: 20 74 68 65 79 0a 2a 2a 20 69 64 65 6e 74 69 66   they.** identif
eaf0: 79 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  y the subset of 
eb00: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
eb10: 74 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  t that correspon
eb20: 64 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 69 43 6f  ds to column iCo
eb30: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  l..**.** If ther
eb40: 65 20 61 72 65 20 6e 6f 20 65 6e 74 72 69 65 73  e are no entries
eb50: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 70 6f   in the input po
eb60: 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
eb70: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65  column iCol, the
eb80: 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74 20 69 73 20  n.** *pnList is 
eb90: 73 65 74 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f  set to zero befo
eba0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
ebb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ebc0: 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20  3ColumnFilter(. 
ebd0: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69   /* Column to fi
ec00: 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 68 61  lter on */.  cha
ec10: 72 20 2a 2a 70 70 4c 69 73 74 2c 20 20 20 20 20  r **ppList,     
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec30: 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  IN/OUT: Pointer 
ec40: 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  to position list
ec50: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73   */.  int *pnLis
ec60: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
ec70: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
ec80: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
ec90: 2a 70 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73  *ppList in bytes
eca0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
ecb0: 4c 69 73 74 20 3d 20 2a 70 70 4c 69 73 74 3b 0a  List = *ppList;.
ecc0: 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70    int nList = *p
ecd0: 6e 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70  nList;.  char *p
ece0: 45 6e 64 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69  End = &pList[nLi
ecf0: 73 74 5d 3b 0a 20 20 69 6e 74 20 69 43 75 72 72  st];.  int iCurr
ed00: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ent = 0;.  char 
ed10: 2a 70 20 3d 20 70 4c 69 73 74 3b 0a 0a 20 20 61  *p = pList;..  a
ed20: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
ed30: 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
ed40: 20 20 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a      char c = 0;.
ed50: 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e      while( p<pEn
ed60: 64 20 26 26 20 28 63 20 7c 20 2a 70 29 26 30 78  d && (c | *p)&0x
ed70: 46 45 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20  FE ) c = *p++ & 
ed80: 30 78 38 30 3b 0a 20 20 0a 20 20 20 20 69 66 28  0x80;.  .    if(
ed90: 20 69 43 6f 6c 3d 3d 69 43 75 72 72 65 6e 74 20   iCol==iCurrent 
eda0: 29 7b 0a 20 20 20 20 20 20 6e 4c 69 73 74 20 3d  ){.      nList =
edb0: 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74   (int)(p - pList
edc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
edd0: 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74      }..    nList
ede0: 20 2d 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c   -= (int)(p - pL
edf0: 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
ee00: 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 6e 4c 69  = p;.    if( nLi
ee10: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  st==0 ){.      b
ee20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ee30: 70 20 3d 20 26 70 4c 69 73 74 5b 31 5d 3b 0a 20  p = &pList[1];. 
ee40: 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46     p += sqlite3F
ee50: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
ee60: 2c 20 26 69 43 75 72 72 65 6e 74 29 3b 0a 20 20  , &iCurrent);.  
ee70: 7d 0a 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20 70  }..  *ppList = p
ee80: 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 20  List;.  *pnList 
ee90: 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nList;.}../*.*
eea0: 2a 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  * sqlite3Fts3Seg
eeb0: 52 65 61 64 65 72 49 74 65 72 61 74 65 28 29 20  ReaderIterate() 
eec0: 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68  callback used wh
eed0: 65 6e 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69  en merging multi
eee0: 70 6c 65 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  ple .** segments
eef0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 69 6e   to create a sin
ef00: 67 6c 65 2c 20 6c 61 72 67 65 72 20 73 65 67 6d  gle, larger segm
ef10: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
ef20: 6e 74 20 66 74 73 33 4d 65 72 67 65 43 61 6c 6c  nt fts3MergeCall
ef30: 62 61 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c  back(.  Fts3Tabl
ef40: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
ef50: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
ef60: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
ef70: 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ndle */.  void *
ef80: 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 20  pContext,       
ef90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
efa0: 6e 74 65 72 20 74 6f 20 53 65 67 6d 65 6e 74 57  nter to SegmentW
efb0: 72 69 74 65 72 2a 20 74 6f 20 77 72 69 74 65 20  riter* to write 
efc0: 77 69 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  with */.  char *
efd0: 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
efe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
eff0: 6d 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  m to write to th
f000: 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  e db */.  int nT
f010: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
f020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f030: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
f040: 7a 54 65 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20  zTerm */.  char 
f050: 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20  *aDoclist,      
f060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
f070: 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64  clist associated
f080: 20 77 69 74 68 20 7a 54 65 72 6d 20 2a 2f 0a 20   with zTerm */. 
f090: 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20   int nDoclist   
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
f0c0: 74 65 73 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a  tes in doclist *
f0d0: 2f 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74 57 72  /.){.  SegmentWr
f0e0: 69 74 65 72 20 2a 2a 70 70 57 20 3d 20 28 53 65  iter **ppW = (Se
f0f0: 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 29 70  gmentWriter **)p
f100: 43 6f 6e 74 65 78 74 3b 0a 20 20 72 65 74 75 72  Context;.  retur
f110: 6e 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  n fts3SegWriterA
f120: 64 64 28 70 2c 20 70 70 57 2c 20 31 2c 20 7a 54  dd(p, ppW, 1, zT
f130: 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 61 44 6f 63  erm, nTerm, aDoc
f140: 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  list, nDoclist);
f150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  .}../*.** sqlite
f160: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74  3Fts3SegReaderIt
f170: 65 72 61 74 65 28 29 20 63 61 6c 6c 62 61 63 6b  erate() callback
f180: 20 75 73 65 64 20 77 68 65 6e 20 66 6c 75 73 68   used when flush
f190: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
f1a0: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 65 6e 64 69  .** of the pendi
f1b0: 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61  ng-terms hash ta
f1c0: 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ble to the datab
f1d0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
f1e0: 6e 74 20 66 74 73 33 46 6c 75 73 68 43 61 6c 6c  nt fts3FlushCall
f1f0: 62 61 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c  back(.  Fts3Tabl
f200: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
f210: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
f220: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
f230: 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ndle */.  void *
f240: 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 20  pContext,       
f250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
f260: 6e 74 65 72 20 74 6f 20 53 65 67 6d 65 6e 74 57  nter to SegmentW
f270: 72 69 74 65 72 2a 20 74 6f 20 77 72 69 74 65 20  riter* to write 
f280: 77 69 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  with */.  char *
f290: 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
f2a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
f2b0: 6d 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  m to write to th
f2c0: 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  e db */.  int nT
f2d0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
f2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f2f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
f300: 7a 54 65 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20  zTerm */.  char 
f310: 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20  *aDoclist,      
f320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
f330: 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64  clist associated
f340: 20 77 69 74 68 20 7a 54 65 72 6d 20 2a 2f 0a 20   with zTerm */. 
f350: 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20   int nDoclist   
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
f380: 74 65 73 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a  tes in doclist *
f390: 2f 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74 57 72  /.){.  SegmentWr
f3a0: 69 74 65 72 20 2a 2a 70 70 57 20 3d 20 28 53 65  iter **ppW = (Se
f3b0: 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 29 70  gmentWriter **)p
f3c0: 43 6f 6e 74 65 78 74 3b 0a 20 20 72 65 74 75 72  Context;.  retur
f3d0: 6e 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  n fts3SegWriterA
f3e0: 64 64 28 70 2c 20 70 70 57 2c 20 30 2c 20 7a 54  dd(p, ppW, 0, zT
f3f0: 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 61 44 6f 63  erm, nTerm, aDoc
f400: 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  list, nDoclist);
f410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
f420: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
f430: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
f440: 67 68 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20  gh a contiguous 
f450: 73 65 74 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a  set of terms .**
f460: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66   stored in the f
f470: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20  ull-text index. 
f480: 49 74 20 6d 65 72 67 65 73 20 64 61 74 61 20 63  It merges data c
f490: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 6f 6e 65 20  ontained in one 
f4a0: 6f 72 20 0a 2a 2a 20 6d 6f 72 65 20 73 65 67 6d  or .** more segm
f4b0: 65 6e 74 73 20 74 6f 20 73 75 70 70 6f 72 74 20  ents to support 
f4c0: 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  this..**.** The 
f4d0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
f4e0: 69 73 20 70 61 73 73 65 64 20 61 6e 20 61 72 72  is passed an arr
f4f0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
f500: 6f 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65  o SegReader obje
f510: 63 74 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  cts.** allocated
f520: 20 77 69 74 68 20 73 71 6c 69 74 65 33 46 74 73   with sqlite3Fts
f530: 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 29 2e  3SegReaderNew().
f540: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
f550: 65 72 67 65 73 20 74 68 65 20 72 61 6e 67 65 20  erges the range 
f560: 0a 2a 2a 20 6f 66 20 74 65 72 6d 73 20 73 65 6c  .** of terms sel
f570: 65 63 74 65 64 20 62 79 20 65 61 63 68 20 53 65  ected by each Se
f580: 67 52 65 61 64 65 72 2e 20 49 66 20 61 20 73 69  gReader. If a si
f590: 6e 67 6c 65 20 74 65 72 6d 20 69 73 20 70 72 65  ngle term is pre
f5a0: 73 65 6e 74 20 69 6e 0a 2a 2a 20 6d 6f 72 65 20  sent in.** more 
f5b0: 74 68 61 6e 20 6f 6e 65 20 73 65 67 6d 65 6e 74  than one segment
f5c0: 2c 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  , the associated
f5d0: 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20 6d 65   doclists are me
f5e0: 72 67 65 64 2e 20 46 6f 72 20 65 61 63 68 0a 2a  rged. For each.*
f5f0: 2a 20 74 65 72 6d 20 61 6e 64 20 28 70 6f 73 73  * term and (poss
f600: 69 62 6c 79 20 6d 65 72 67 65 64 29 20 64 6f 63  ibly merged) doc
f610: 6c 69 73 74 20 69 6e 20 74 68 65 20 6d 65 72 67  list in the merg
f620: 65 64 20 72 61 6e 67 65 2c 20 74 68 65 20 63 61  ed range, the ca
f630: 6c 6c 62 61 63 6b 0a 2a 2a 20 66 75 6e 63 74 69  llback.** functi
f640: 6f 6e 20 78 46 75 6e 63 20 69 73 20 69 6e 76 6f  on xFunc is invo
f650: 6b 65 64 20 77 69 74 68 20 69 74 73 20 61 72 67  ked with its arg
f660: 75 6d 65 6e 74 73 20 73 65 74 20 61 73 20 66 6f  uments set as fo
f670: 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 61  llows..**.**   a
f680: 72 67 20 30 3a 20 43 6f 70 79 20 6f 66 20 27 70  rg 0: Copy of 'p
f690: 27 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  ' parameter pass
f6a0: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
f6b0: 69 6f 6e 0a 2a 2a 20 20 20 61 72 67 20 31 3a 20  ion.**   arg 1: 
f6c0: 43 6f 70 79 20 6f 66 20 27 70 43 6f 6e 74 65 78  Copy of 'pContex
f6d0: 74 27 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  t' parameter pas
f6e0: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
f6f0: 74 69 6f 6e 0a 2a 2a 20 20 20 61 72 67 20 32 3a  tion.**   arg 2:
f700: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
f710: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65  er containing te
f720: 72 6d 0a 2a 2a 20 20 20 61 72 67 20 33 3a 20 53  rm.**   arg 3: S
f730: 69 7a 65 20 6f 66 20 61 72 67 20 32 20 62 75 66  ize of arg 2 buf
f740: 66 65 72 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20  fer in bytes.** 
f750: 20 20 61 72 67 20 34 3a 20 50 6f 69 6e 74 65 72    arg 4: Pointer
f760: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
f770: 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74 0a 2a 2a  ining doclist.**
f780: 20 20 20 61 72 67 20 35 3a 20 53 69 7a 65 20 6f     arg 5: Size o
f790: 66 20 61 72 67 20 32 20 62 75 66 66 65 72 20 69  f arg 2 buffer i
f7a0: 6e 20 62 79 74 65 73 0a 2a 2a 0a 2a 2a 20 54 68  n bytes.**.** Th
f7b0: 65 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74  e 4th argument t
f7c0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
f7d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f7e0: 61 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 74  a structure of t
f7f0: 79 70 65 0a 2a 2a 20 46 74 73 33 53 65 67 46 69  ype.** Fts3SegFi
f800: 6c 74 65 72 2c 20 64 65 66 69 6e 65 64 20 69 6e  lter, defined in
f810: 20 66 74 73 33 49 6e 74 2e 68 2e 20 54 68 65 20   fts3Int.h. The 
f820: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
f830: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 66 75   structure.** fu
f840: 72 74 68 65 72 20 72 65 73 74 72 69 63 74 20 74  rther restrict t
f850: 68 65 20 72 61 6e 67 65 20 6f 66 20 74 65 72 6d  he range of term
f860: 73 20 74 68 61 74 20 63 61 6c 6c 62 61 63 6b 73  s that callbacks
f870: 20 61 72 65 20 6d 61 64 65 20 66 6f 72 20 61 6e   are made for an
f880: 64 0a 2a 2a 20 6d 6f 64 69 66 79 20 74 68 65 20  d.** modify the 
f890: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 74 68 69  behaviour of thi
f8a0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 53 65 65 20  s function. See 
f8b0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 73  comments above s
f8c0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 64 65 66 69  tructure.** defi
f8d0: 6e 69 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  nition for detai
f8e0: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
f8f0: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49  e3Fts3SegReaderI
f900: 74 65 72 61 74 65 28 0a 20 20 46 74 73 33 54 61  terate(.  Fts3Ta
f910: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
f920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
f930: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
f940: 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65  e */.  Fts3SegRe
f950: 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74  ader **apSegment
f960: 2c 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ,      /* Array 
f970: 6f 66 20 46 74 73 33 53 65 67 52 65 61 64 65 72  of Fts3SegReader
f980: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 6e   objects */.  in
f990: 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  t nSegment,     
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f9b0: 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67 6d 65   Size of apSegme
f9c0: 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  nt array */.  Ft
f9d0: 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69  s3SegFilter *pFi
f9e0: 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  lter,         /*
f9f0: 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e   Restrictions on
fa00: 20 72 61 6e 67 65 20 6f 66 20 69 74 65 72 61 74   range of iterat
fa10: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ion */.  int (*x
fa20: 46 75 6e 63 29 28 46 74 73 33 54 61 62 6c 65 20  Func)(Fts3Table 
fa30: 2a 2c 20 76 6f 69 64 20 2a 2c 20 63 68 61 72 20  *, void *, char 
fa40: 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2c 20  *, int, char *, 
fa50: 69 6e 74 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61  int),  /* Callba
fa60: 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ck */.  void *pC
fa70: 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
fa80: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62          /* Callb
fa90: 61 63 6b 20 63 6f 6e 74 65 78 74 20 28 32 6e 64  ack context (2nd
faa0: 20 61 72 67 75 6d 65 6e 74 29 20 2a 2f 0a 29 7b   argument) */.){
fab0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
fae0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61  ariable */.  cha
faf0: 72 20 2a 61 42 75 66 66 65 72 20 3d 20 30 3b 20  r *aBuffer = 0; 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb10: 42 75 66 66 65 72 20 74 6f 20 6d 65 72 67 65 20  Buffer to merge 
fb20: 64 6f 63 6c 69 73 74 73 20 69 6e 20 2a 2f 0a 20  doclists in */. 
fb30: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
fb60: 7a 65 20 6f 66 20 61 42 75 66 66 65 72 20 62 75  ze of aBuffer bu
fb70: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ffer */.  int rc
fb80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
fb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
fba0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
fbb0: 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79  nt isIgnoreEmpty
fbc0: 20 3d 20 20 28 70 46 69 6c 74 65 72 2d 3e 66 6c   =  (pFilter->fl
fbd0: 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
fbe0: 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 29  NT_IGNORE_EMPTY)
fbf0: 3b 0a 20 20 69 6e 74 20 69 73 52 65 71 75 69 72  ;.  int isRequir
fc00: 65 50 6f 73 20 3d 20 20 20 28 70 46 69 6c 74 65  ePos =   (pFilte
fc10: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f  r->flags & FTS3_
fc20: 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f  SEGMENT_REQUIRE_
fc30: 50 4f 53 29 3b 0a 20 20 69 6e 74 20 69 73 43 6f  POS);.  int isCo
fc40: 6c 46 69 6c 74 65 72 20 3d 20 20 20 20 28 70 46  lFilter =    (pF
fc50: 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  ilter->flags & F
fc60: 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55  TS3_SEGMENT_COLU
fc70: 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20 20 69 6e  MN_FILTER);.  in
fc80: 74 20 69 73 50 72 65 66 69 78 20 3d 20 20 20 20  t isPrefix =    
fc90: 20 20 20 28 70 46 69 6c 74 65 72 2d 3e 66 6c 61     (pFilter->fla
fca0: 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
fcb0: 54 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 2f 2a  T_PREFIX);..  /*
fcc0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 7a 65   If there are ze
fcd0: 72 6f 20 73 65 67 6d 65 6e 74 73 2c 20 74 68 69  ro segments, thi
fce0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
fcf0: 6e 6f 2d 6f 70 2e 20 54 68 69 73 20 73 63 65 6e  no-op. This scen
fd00: 61 72 69 6f 0a 20 20 2a 2a 20 63 6f 6d 65 73 20  ario.  ** comes 
fd10: 61 62 6f 75 74 20 6f 6e 6c 79 20 77 68 65 6e 20  about only when 
fd20: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 61 6e 20  reading from an 
fd30: 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2e 0a  empty database..
fd40: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67 6d    */.  if( nSegm
fd50: 65 6e 74 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69  ent==0 ) goto fi
fd60: 6e 69 73 68 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  nished;..  /* If
fd70: 20 74 68 65 20 46 74 73 33 53 65 67 46 69 6c 74   the Fts3SegFilt
fd80: 65 72 20 64 65 66 69 6e 65 73 20 61 20 73 70 65  er defines a spe
fd90: 63 69 66 69 63 20 74 65 72 6d 20 28 6f 72 20 74  cific term (or t
fda0: 65 72 6d 20 70 72 65 66 69 78 29 20 74 6f 20 73  erm prefix) to s
fdb0: 65 61 72 63 68 20 0a 20 20 2a 2a 20 66 6f 72 2c  earch .  ** for,
fdc0: 20 74 68 65 6e 20 61 64 76 61 6e 63 65 20 65 61   then advance ea
fdd0: 63 68 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  ch segment itera
fde0: 74 6f 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  tor until it poi
fdf0: 6e 74 73 20 74 6f 20 61 20 74 65 72 6d 20 6f 66  nts to a term of
fe00: 0a 20 20 2a 2a 20 65 71 75 61 6c 20 6f 72 20 67  .  ** equal or g
fe10: 72 65 61 74 65 72 20 76 61 6c 75 65 20 74 68 61  reater value tha
fe20: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
fe30: 74 65 72 6d 2e 20 54 68 69 73 20 70 72 65 76 65  term. This preve
fe40: 6e 74 73 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 6e  nts many.  ** un
fe50: 6e 65 63 65 73 73 61 72 79 20 6d 65 72 67 65 2f  necessary merge/
fe60: 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20  sort operations 
fe70: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
fe80: 72 65 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e  re single segmen
fe90: 74 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 6c 65  t.  ** b-tree le
fea0: 61 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e  af nodes contain
feb0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
fec0: 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  erm..  */.  if( 
fed0: 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 20 29  pFilter->zTerm )
fee0: 7b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20  {.    int nTerm 
fef0: 3d 20 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d  = pFilter->nTerm
ff00: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
ff10: 20 2a 7a 54 65 72 6d 20 3d 20 70 46 69 6c 74 65   *zTerm = pFilte
ff20: 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 66 6f  r->zTerm;.    fo
ff30: 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 6e  r(i=0; i<nSegmen
ff40: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  t; i++){.      F
ff50: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53  ts3SegReader *pS
ff60: 65 67 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69  eg = apSegment[i
ff70: 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ];.      while( 
ff80: 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72  fts3SegReaderTer
ff90: 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d  mCmp(pSeg, zTerm
ffa0: 2c 20 6e 54 65 72 6d 29 3c 30 20 29 7b 0a 20 20  , nTerm)<0 ){.  
ffb0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53        rc = fts3S
ffc0: 65 67 52 65 61 64 65 72 4e 65 78 74 28 70 53 65  egReaderNext(pSe
ffd0: 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
ffe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
fff0: 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 20 7d  goto finished; }
10000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
10010 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
10020 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d  apSegment, nSegm
10030 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 66  ent, nSegment, f
10040 74 73 33 53 65 67 52 65 61 64 65 72 43 6d 70 29  ts3SegReaderCmp)
10050 3b 0a 20 20 77 68 69 6c 65 28 20 61 70 53 65 67  ;.  while( apSeg
10060 6d 65 6e 74 5b 30 5d 2d 3e 61 4e 6f 64 65 20 29  ment[0]->aNode )
10070 7b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20  {.    int nTerm 
10080 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  = apSegment[0]->
10090 6e 54 65 72 6d 3b 0a 20 20 20 20 63 68 61 72 20  nTerm;.    char 
100a0 2a 7a 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65  *zTerm = apSegme
100b0 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a 20 20  nt[0]->zTerm;.  
100c0 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 31    int nMerge = 1
100d0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
100e0 73 20 69 73 20 61 20 70 72 65 66 69 78 2d 73 65  s is a prefix-se
100f0 61 72 63 68 2c 20 61 6e 64 20 69 66 20 74 68 65  arch, and if the
10100 20 74 65 72 6d 20 74 68 61 74 20 61 70 53 65 67   term that apSeg
10110 6d 65 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20  ment[0] points. 
10120 20 20 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f     ** to does no
10130 74 20 73 68 61 72 65 20 61 20 73 75 66 66 69 78  t share a suffix
10140 20 77 69 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a   with pFilter->z
10150 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e  Term/nTerm, then
10160 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71   all .    ** req
10170 75 69 72 65 64 20 63 61 6c 6c 62 61 63 6b 73 20  uired callbacks 
10180 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20  have been made. 
10190 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 78 69  In this case exi
101a0 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a  t early..    **.
101b0 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79      ** Similarly
101c0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  , if this is a s
101d0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 61  earch for an exa
101e0 63 74 20 6d 61 74 63 68 2c 20 61 6e 64 20 74 68  ct match, and th
101f0 65 20 66 69 72 73 74 20 74 65 72 6d 0a 20 20 20  e first term.   
10200 20 2a 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20 61   ** of segment a
10210 70 53 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e  pSegment[0] is n
10220 6f 74 20 61 20 6d 61 74 63 68 2c 20 65 78 69 74  ot a match, exit
10230 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20   early..    */. 
10240 20 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e     if( pFilter->
10250 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69  zTerm ){.      i
10260 66 28 20 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72  f( nTerm<pFilter
10270 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20  ->nTerm .       
10280 7c 7c 20 28 21 69 73 50 72 65 66 69 78 20 26 26  || (!isPrefix &&
10290 20 6e 54 65 72 6d 3e 70 46 69 6c 74 65 72 2d 3e   nTerm>pFilter->
102a0 6e 54 65 72 6d 29 0a 20 20 20 20 20 20 20 7c 7c  nTerm).       ||
102b0 20 6d 65 6d 63 6d 70 28 7a 54 65 72 6d 2c 20 70   memcmp(zTerm, p
102c0 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70  Filter->zTerm, p
102d0 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 20 0a  Filter->nTerm) .
102e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 67      ){.        g
102f0 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20  oto finished;.  
10300 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10310 20 77 68 69 6c 65 28 20 6e 4d 65 72 67 65 3c 6e   while( nMerge<n
10320 53 65 67 6d 65 6e 74 20 0a 20 20 20 20 20 20 20  Segment .       
10330 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d   && apSegment[nM
10340 65 72 67 65 5d 2d 3e 61 4e 6f 64 65 0a 20 20 20  erge]->aNode.   
10350 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e       && apSegmen
10360 74 5b 6e 4d 65 72 67 65 5d 2d 3e 6e 54 65 72 6d  t[nMerge]->nTerm
10370 3d 3d 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20  ==nTerm .       
10380 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54   && 0==memcmp(zT
10390 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6e  erm, apSegment[n
103a0 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20 6e  Merge]->zTerm, n
103b0 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20  Term).    ){.   
103c0 20 20 20 6e 4d 65 72 67 65 2b 2b 3b 0a 20 20 20     nMerge++;.   
103d0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
103e0 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 3d 3d 30  isIgnoreEmpty==0
103f0 20 7c 7c 20 28 69 73 52 65 71 75 69 72 65 50 6f   || (isRequirePo
10400 73 20 26 26 20 69 73 43 6f 6c 46 69 6c 74 65 72  s && isColFilter
10410 3d 3d 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ==0) );.    if( 
10420 6e 4d 65 72 67 65 3d 3d 31 20 26 26 20 21 69 73  nMerge==1 && !is
10430 49 67 6e 6f 72 65 45 6d 70 74 79 20 29 7b 0a 20  IgnoreEmpty ){. 
10440 20 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64       Fts3SegRead
10450 65 72 20 2a 70 30 20 3d 20 61 70 53 65 67 6d 65  er *p0 = apSegme
10460 6e 74 5b 30 5d 3b 0a 20 20 20 20 20 20 72 63 20  nt[0];.      rc 
10470 3d 20 78 46 75 6e 63 28 70 2c 20 70 43 6f 6e 74  = xFunc(p, pCont
10480 65 78 74 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  ext, zTerm, nTer
10490 6d 2c 20 70 30 2d 3e 61 44 6f 63 6c 69 73 74 2c  m, p0->aDoclist,
104a0 20 70 30 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a   p0->nDoclist);.
104b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
104c0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
104d0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 65 6c  inished;.    }el
104e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44  se{.      int nD
104f0 6f 63 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  oclist = 0;     
10500 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10510 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20   doclist */.    
10520 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10530 69 50 72 65 76 20 3d 20 30 3b 20 20 20 20 2f 2a  iPrev = 0;    /*
10540 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20   Previous docid 
10550 73 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c 69 73  stored in doclis
10560 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  t */..      /* T
10570 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
10580 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 4d 65  of the first nMe
10590 72 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  rge entries in t
105a0 68 65 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a  he array.      *
105b0 2a 20 6f 66 20 46 74 73 33 53 65 67 52 65 61 64  * of Fts3SegRead
105c0 65 72 20 6f 62 6a 65 63 74 73 20 69 73 20 74 68  er objects is th
105d0 65 20 73 61 6d 65 2e 20 54 68 65 20 64 6f 63 6c  e same. The docl
105e0 69 73 74 73 20 6d 75 73 74 20 62 65 20 6d 65 72  ists must be mer
105f0 67 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ged.      ** and
10600 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 61   a single term a
10610 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 20  dded to the new 
10620 73 65 67 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  segment..      *
10630 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
10640 20 69 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b   i<nMerge; i++){
10650 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67  .        fts3Seg
10660 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64  ReaderFirstDocid
10670 28 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a  (apSegment[i]);.
10680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
10690 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
106a0 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67  apSegment, nMerg
106b0 65 2c 20 6e 4d 65 72 67 65 2c 20 66 74 73 33 53  e, nMerge, fts3S
106c0 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43  egReaderDoclistC
106d0 6d 70 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  mp);.      while
106e0 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  ( apSegment[0]->
106f0 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20  pOffsetList ){. 
10700 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 20 20 20         int j;   
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
10730 67 6d 65 6e 74 73 20 74 68 61 74 20 73 68 61 72  gments that shar
10740 65 20 61 20 64 6f 63 69 64 20 2a 2f 0a 20 20 20  e a docid */.   
10750 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74       char *pList
10760 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c  ;.        int nL
10770 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ist;.        int
10780 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
10790 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
107a0 6f 63 69 64 20 3d 20 61 70 53 65 67 6d 65 6e 74  ocid = apSegment
107b0 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20  [0]->iDocid;.   
107c0 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
107d0 65 72 4e 65 78 74 44 6f 63 69 64 28 61 70 53 65  erNextDocid(apSe
107e0 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74  gment[0], &pList
107f0 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &nList);.     
10800 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20     j = 1;.      
10810 20 20 77 68 69 6c 65 28 20 6a 3c 6e 4d 65 72 67    while( j<nMerg
10820 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  e.            &&
10830 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70   apSegment[j]->p
10840 4f 66 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20  OffsetList.     
10850 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
10860 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d  ent[j]->iDocid==
10870 69 44 6f 63 69 64 0a 20 20 20 20 20 20 20 20 29  iDocid.        )
10880 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
10890 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63  SegReaderNextDoc
108a0 69 64 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c  id(apSegment[j],
108b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
108c0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    j++;.        }
108d0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ..        if( is
108e0 43 6f 6c 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  ColFilter ){.   
108f0 20 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d         fts3Colum
10900 6e 46 69 6c 74 65 72 28 70 46 69 6c 74 65 72 2d  nFilter(pFilter-
10910 3e 69 43 6f 6c 2c 20 26 70 4c 69 73 74 2c 20 26  >iCol, &pList, &
10920 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nList);.        
10930 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  }..        if( !
10940 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c  isIgnoreEmpty ||
10950 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20   nList>0 ){.    
10960 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 71        nByte = sq
10970 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
10980 65 6e 28 69 44 6f 63 69 64 2d 69 50 72 65 76 29  en(iDocid-iPrev)
10990 20 2b 20 28 69 73 52 65 71 75 69 72 65 50 6f 73   + (isRequirePos
109a0 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20  ?nList+1:0);.   
109b0 20 20 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c         if( nDocl
109c0 69 73 74 2b 6e 42 79 74 65 3e 6e 41 6c 6c 6f 63  ist+nByte>nAlloc
109d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
109e0 63 68 61 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20  char *aNew;.    
109f0 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d          nAlloc =
10a00 20 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74 65 2a   nDoclist+nByte*
10a10 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  2;.            a
10a20 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
10a30 61 6c 6c 6f 63 28 61 42 75 66 66 65 72 2c 20 6e  alloc(aBuffer, n
10a40 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
10a50 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
10a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
10a70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
10a90 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
10aa0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10ab0 20 20 20 20 20 20 20 20 20 61 42 75 66 66 65 72           aBuffer
10ac0 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
10ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e     }.          n
10ae0 44 6f 63 6c 69 73 74 20 2b 3d 20 73 71 6c 69 74  Doclist += sqlit
10af0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
10b00 26 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73  &aBuffer[nDoclis
10b10 74 5d 2c 20 69 44 6f 63 69 64 2d 69 50 72 65 76  t], iDocid-iPrev
10b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 50 72  );.          iPr
10b30 65 76 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20  ev = iDocid;.   
10b40 20 20 20 20 20 20 20 69 66 28 20 69 73 52 65 71         if( isReq
10b50 75 69 72 65 50 6f 73 20 29 7b 0a 20 20 20 20 20  uirePos ){.     
10b60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
10b70 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d  Buffer[nDoclist]
10b80 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29 3b  , pList, nList);
10b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f  .            nDo
10ba0 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73 74 3b 0a  clist += nList;.
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 61 42 75 66              aBuf
10bc0 66 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b 5d 20  fer[nDoclist++] 
10bd0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
10be0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
10bf0 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
10c00 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65  aderSort(apSegme
10c10 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 66  nt, nMerge, j, f
10c20 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
10c30 69 73 74 43 6d 70 29 3b 0a 20 20 20 20 20 20 7d  istCmp);.      }
10c40 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 44 6f 63  ..      if( nDoc
10c50 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  list>0 ){.      
10c60 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 2c 20    rc = xFunc(p, 
10c70 70 43 6f 6e 74 65 78 74 2c 20 7a 54 65 72 6d 2c  pContext, zTerm,
10c80 20 6e 54 65 72 6d 2c 20 61 42 75 66 66 65 72 2c   nTerm, aBuffer,
10c90 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   nDoclist);.    
10ca0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10cb0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e  TE_OK ) goto fin
10cc0 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ished;.      }. 
10cd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10ce0 74 68 65 72 65 20 69 73 20 61 20 74 65 72 6d 20  there is a term 
10cf0 73 70 65 63 69 66 69 65 64 20 74 6f 20 66 69 6c  specified to fil
10d00 74 65 72 20 6f 6e 2c 20 61 6e 64 20 74 68 69 73  ter on, and this
10d10 20 69 73 20 6e 6f 74 20 61 20 70 72 65 66 69 78   is not a prefix
10d20 0a 20 20 20 20 2a 2a 20 73 65 61 72 63 68 2c 20  .    ** search, 
10d30 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
10d40 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 63 6f  callback that co
10d50 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
10d60 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a   required.    **
10d70 20 74 65 72 6d 20 28 69 66 20 73 75 63 68 20 61   term (if such a
10d80 20 74 65 72 6d 20 65 78 69 73 74 73 20 69 6e 20   term exists in 
10d90 74 68 65 20 69 6e 64 65 78 29 20 68 61 73 20 61  the index) has a
10da0 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65  lready been made
10db0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10dc0 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 20   pFilter->zTerm 
10dd0 26 26 20 21 69 73 50 72 65 66 69 78 20 29 7b 0a  && !isPrefix ){.
10de0 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
10df0 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
10e00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67  for(i=0; i<nMerg
10e10 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
10e20 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
10e30 72 4e 65 78 74 28 61 70 53 65 67 6d 65 6e 74 5b  rNext(apSegment[
10e40 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  i]);.      if( r
10e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
10e60 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20  oto finished;.  
10e70 20 20 7d 0a 20 20 20 20 66 74 73 33 53 65 67 52    }.    fts3SegR
10e80 65 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d  eaderSort(apSegm
10e90 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 6e  ent, nSegment, n
10ea0 4d 65 72 67 65 2c 20 66 74 73 33 53 65 67 52 65  Merge, fts3SegRe
10eb0 61 64 65 72 43 6d 70 29 3b 0a 20 20 7d 0a 0a 20  aderCmp);.  }.. 
10ec0 66 69 6e 69 73 68 65 64 3a 0a 20 20 73 71 6c 69  finished:.  sqli
10ed0 74 65 33 5f 66 72 65 65 28 61 42 75 66 66 65 72  te3_free(aBuffer
10ee0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 61  }../*.** Merge a
10f00 6c 6c 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  ll level iLevel 
10f10 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  segments in the 
10f20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 61 20  database into a 
10f30 73 69 6e 67 6c 65 20 0a 2a 2a 20 69 4c 65 76 65  single .** iLeve
10f40 6c 2b 31 20 73 65 67 6d 65 6e 74 2e 20 4f 72 2c  l+1 segment. Or,
10f50 20 69 66 20 69 4c 65 76 65 6c 3c 30 2c 20 6d 65   if iLevel<0, me
10f60 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rge all segments
10f70 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c   into a.** singl
10f80 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20 61  e segment with a
10f90 20 6c 65 76 65 6c 20 65 71 75 61 6c 20 74 6f 20   level equal to 
10fa0 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
10fb0 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 20 0a 2a  largest level .*
10fc0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 72 65 73  * currently pres
10fd0 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
10fe0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
10ff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11000 61 6c 6c 65 64 20 77 69 74 68 20 69 4c 65 76 65  alled with iLeve
11010 6c 3c 30 2c 20 62 75 74 20 74 68 65 72 65 20 69  l<0, but there i
11020 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20 73 65  s only one.** se
11030 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  gment in the dat
11040 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 44 4f  abase, SQLITE_DO
11050 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  NE is returned i
11060 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 2a 2a 20  mmediately. .** 
11070 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 73 75  Otherwise, if su
11080 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
11090 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
110a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
110b0 75 72 73 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  urs, .** an SQLi
110c0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
110d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
110e0 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
110f0 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61  mentMerge(Fts3Ta
11100 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 4c 65 76  ble *p, int iLev
11110 65 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  el){.  int i;   
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
11140 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
11150 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11180 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  */.  int iIdx;  
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
111b0 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 2a 2f 0a   new segment */.
111c0 20 20 69 6e 74 20 69 4e 65 77 4c 65 76 65 6c 3b    int iNewLevel;
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 63 72    /* Level to cr
111f0 65 61 74 65 20 6e 65 77 20 73 65 67 6d 65 6e 74  eate new segment
11200 20 61 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   at */.  sqlite3
11210 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
11220 3b 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65  ;.  SegmentWrite
11230 72 20 2a 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  r *pWriter = 0;.
11240 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
11250 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11260 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
11270 65 67 6d 65 6e 74 73 20 62 65 69 6e 67 20 6d 65  egments being me
11280 72 67 65 64 20 2a 2f 0a 20 20 46 74 73 33 53 65  rged */.  Fts3Se
11290 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d  gReader **apSegm
112a0 65 6e 74 20 3d 20 30 3b 20 20 2f 2a 20 41 72 72  ent = 0;  /* Arr
112b0 61 79 20 6f 66 20 53 65 67 6d 65 6e 74 20 69 74  ay of Segment it
112c0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 46 74 73  erators */.  Fts
112d0 33 53 65 67 52 65 61 64 65 72 20 2a 70 50 65 6e  3SegReader *pPen
112e0 64 69 6e 67 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ding = 0;    /* 
112f0 49 74 65 72 61 74 6f 72 20 66 6f 72 20 70 65 6e  Iterator for pen
11300 64 69 6e 67 2d 74 65 72 6d 73 20 2a 2f 0a 20 20  ding-terms */.  
11310 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 66 69  Fts3SegFilter fi
11320 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  lter;           
11330 2f 2a 20 53 65 67 6d 65 6e 74 20 74 65 72 6d 20  /* Segment term 
11340 66 69 6c 74 65 72 20 63 6f 6e 64 69 74 69 6f 6e  filter condition
11350 20 2a 2f 0a 0a 20 20 69 66 28 20 69 4c 65 76 65   */..  if( iLeve
11360 6c 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  l<0 ){.    /* Th
11370 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65  is call is to me
11380 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rge all segments
11390 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
113a0 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 20 20 20   to a single.   
113b0 20 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 65   ** segment. The
113c0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6e 65   level of the ne
113d0 77 20 73 65 67 6d 65 6e 74 20 69 73 20 65 71 75  w segment is equ
113e0 61 6c 20 74 6f 20 74 68 65 20 74 68 65 20 6e 75  al to the the nu
113f0 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 20 20 2a  merically .    *
11400 2a 20 67 72 65 61 74 65 73 74 20 73 65 67 6d 65  * greatest segme
11410 6e 74 20 6c 65 76 65 6c 20 63 75 72 72 65 6e 74  nt level current
11420 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ly present in th
11430 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  e database. The 
11440 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20  index.    ** of 
11450 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  the new segment 
11460 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 20 20 20  is always 0..   
11470 20 2a 2f 0a 20 20 20 20 69 49 64 78 20 3d 20 30   */.    iIdx = 0
11480 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
11490 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 50  e3Fts3SegReaderP
114a0 65 6e 64 69 6e 67 28 70 2c 20 30 2c 20 30 2c 20  ending(p, 0, 0, 
114b0 31 2c 20 26 70 50 65 6e 64 69 6e 67 29 3b 0a 20  1, &pPending);. 
114c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
114d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
114e0 73 68 65 64 3b 0a 20 20 20 20 72 63 20 3d 20 66  shed;.    rc = f
114f0 74 73 33 53 65 67 6d 65 6e 74 43 6f 75 6e 74 4d  ts3SegmentCountM
11500 61 78 28 70 2c 20 26 6e 53 65 67 6d 65 6e 74 2c  ax(p, &nSegment,
11510 20 26 69 4e 65 77 4c 65 76 65 6c 29 3b 0a 20 20   &iNewLevel);.  
11520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11530 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  _OK ) goto finis
11540 68 65 64 3b 0a 20 20 20 20 6e 53 65 67 6d 65 6e  hed;.    nSegmen
11550 74 20 2b 3d 20 28 70 50 65 6e 64 69 6e 67 21 3d  t += (pPending!=
11560 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 67  0);.    if( nSeg
11570 6d 65 6e 74 3c 3d 31 20 29 7b 0a 20 20 20 20 20  ment<=1 ){.     
11580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
11590 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
115a0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
115b0 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67 65  call is to merge
115c0 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61 74   all segments at
115d0 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 46   level iLevel. F
115e0 69 6e 64 20 74 68 65 20 6e 65 78 74 0a 20 20 20  ind the next.   
115f0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 65   ** available se
11600 67 6d 65 6e 74 20 69 6e 64 65 78 20 61 74 20 6c  gment index at l
11610 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 2e 20 54  evel iLevel+1. T
11620 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  he call to.    *
11630 2a 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  * fts3AllocateSe
11640 67 64 69 72 49 64 78 28 29 20 77 69 6c 6c 20 6d  gdirIdx() will m
11650 65 72 67 65 20 74 68 65 20 73 65 67 6d 65 6e 74  erge the segment
11660 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  s at level iLeve
11670 6c 2b 31 20 74 6f 20 0a 20 20 20 20 2a 2a 20 61  l+1 to .    ** a
11680 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 32   single iLevel+2
11690 20 73 65 67 6d 65 6e 74 20 69 66 20 6e 65 63 65   segment if nece
116a0 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
116b0 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 69 4c    iNewLevel = iL
116c0 65 76 65 6c 2b 31 3b 0a 20 20 20 20 72 63 20 3d  evel+1;.    rc =
116d0 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67   fts3AllocateSeg
116e0 64 69 72 49 64 78 28 70 2c 20 69 4e 65 77 4c 65  dirIdx(p, iNewLe
116f0 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20 20 20  vel, &iIdx);.   
11700 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11710 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
11720 65 64 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  ed;.    rc = fts
11730 33 53 65 67 6d 65 6e 74 43 6f 75 6e 74 28 70 2c  3SegmentCount(p,
11740 20 69 4c 65 76 65 6c 2c 20 26 6e 53 65 67 6d 65   iLevel, &nSegme
11750 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  nt);.    if( rc!
11760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11770 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a  o finished;.  }.
11780 20 20 61 73 73 65 72 74 28 20 6e 53 65 67 6d 65    assert( nSegme
11790 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
117a0 28 20 69 4e 65 77 4c 65 76 65 6c 3e 3d 30 20 29  ( iNewLevel>=0 )
117b0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
117c0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 61 72   space for an ar
117d0 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
117e0 74 6f 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  to segment itera
117f0 74 6f 72 73 2e 20 2a 2f 0a 20 20 61 70 53 65 67  tors. */.  apSeg
11800 6d 65 6e 74 20 3d 20 28 46 74 73 33 53 65 67 52  ment = (Fts3SegR
11810 65 61 64 65 72 2a 2a 29 73 71 6c 69 74 65 33 5f  eader**)sqlite3_
11820 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74  malloc(sizeof(Ft
11830 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 2a 6e  s3SegReader *)*n
11840 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  Segment);.  if( 
11850 21 61 70 53 65 67 6d 65 6e 74 20 29 7b 0a 20 20  !apSegment ){.  
11860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11870 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 69  MEM;.    goto fi
11880 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 20 20 6d 65  nished;.  }.  me
11890 6d 73 65 74 28 61 70 53 65 67 6d 65 6e 74 2c 20  mset(apSegment, 
118a0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65  0, sizeof(Fts3Se
118b0 67 52 65 61 64 65 72 20 2a 29 2a 6e 53 65 67 6d  gReader *)*nSegm
118c0 65 6e 74 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ent);..  /* Allo
118d0 63 61 74 65 20 61 20 46 74 73 33 53 65 67 52 65  cate a Fts3SegRe
118e0 61 64 65 72 20 73 74 72 75 63 74 75 72 65 20 66  ader structure f
118f0 6f 72 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20  or each segment 
11900 62 65 69 6e 67 20 6d 65 72 67 65 64 2e 20 41 20  being merged. A 
11910 0a 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61  .  ** Fts3SegRea
11920 64 65 72 20 73 74 6f 72 65 73 20 74 68 65 20 73  der stores the s
11930 74 61 74 65 20 64 61 74 61 20 72 65 71 75 69 72  tate data requir
11940 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
11950 72 6f 75 67 68 20 61 6c 6c 20 0a 20 20 2a 2a 20  rough all .  ** 
11960 65 6e 74 72 69 65 73 20 6f 6e 20 61 6c 6c 20 6c  entries on all l
11970 65 61 76 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  eaves of a singl
11980 65 20 73 65 67 6d 65 6e 74 2e 20 0a 20 20 2a 2f  e segment. .  */
11990 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 5f 53  .  assert( SQL_S
119a0 45 4c 45 43 54 5f 4c 45 56 45 4c 2b 31 3d 3d 53  ELECT_LEVEL+1==S
119b0 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 45  QL_SELECT_ALL_LE
119c0 56 45 4c 29 3b 0a 20 20 72 63 20 3d 20 66 74 73  VEL);.  rc = fts
119d0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
119e0 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2b 28 69 4c  SELECT_LEVEL+(iL
119f0 65 76 65 6c 3c 30 29 2c 20 26 70 53 74 6d 74 2c  evel<0), &pStmt,
11a00 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
11a10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
11a20 66 69 6e 69 73 68 65 64 3b 0a 20 20 73 71 6c 69  finished;.  sqli
11a30 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
11a40 6d 74 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a  mt, 1, iLevel);.
11a50 20 20 66 6f 72 28 69 3d 30 3b 20 53 51 4c 49 54    for(i=0; SQLIT
11a60 45 5f 52 4f 57 3d 3d 28 73 71 6c 69 74 65 33 5f  E_ROW==(sqlite3_
11a70 73 74 65 70 28 70 53 74 6d 74 29 29 3b 20 69 2b  step(pStmt)); i+
11a80 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  +){.    rc = fts
11a90 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 70 2c  3SegReaderNew(p,
11aa0 20 70 53 74 6d 74 2c 20 69 2c 20 26 61 70 53 65   pStmt, i, &apSe
11ab0 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69  gment[i]);.    i
11ac0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11ad0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
11ae0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
11af0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
11b00 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
11b10 20 20 69 66 28 20 70 50 65 6e 64 69 6e 67 20 29    if( pPending )
11b20 7b 0a 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b  {.    apSegment[
11b30 69 5d 20 3d 20 70 50 65 6e 64 69 6e 67 3b 0a 20  i] = pPending;. 
11b40 20 20 20 70 50 65 6e 64 69 6e 67 20 3d 20 30 3b     pPending = 0;
11b50 0a 20 20 7d 0a 20 20 70 53 74 6d 74 20 3d 20 30  .  }.  pStmt = 0
11b60 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11b70 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e  TE_OK ) goto fin
11b80 69 73 68 65 64 3b 0a 0a 20 20 6d 65 6d 73 65 74  ished;..  memset
11b90 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69 7a  (&filter, 0, siz
11ba0 65 6f 66 28 46 74 73 33 53 65 67 46 69 6c 74 65  eof(Fts3SegFilte
11bb0 72 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c  r));.  filter.fl
11bc0 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d 45  ags = FTS3_SEGME
11bd0 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b 0a  NT_REQUIRE_POS;.
11be0 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c    filter.flags |
11bf0 3d 20 28 69 4c 65 76 65 6c 3c 30 20 3f 20 46 54  = (iLevel<0 ? FT
11c00 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52  S3_SEGMENT_IGNOR
11c10 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a 20 20  E_EMPTY : 0);.  
11c20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
11c30 53 65 67 52 65 61 64 65 72 49 74 65 72 61 74 65  SegReaderIterate
11c40 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 2c 20 6e  (p, apSegment, n
11c50 53 65 67 6d 65 6e 74 2c 0a 20 20 20 20 20 20 26  Segment,.      &
11c60 66 69 6c 74 65 72 2c 20 66 74 73 33 4d 65 72 67  filter, fts3Merg
11c70 65 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  eCallback, (void
11c80 20 2a 29 26 70 57 72 69 74 65 72 0a 20 20 29 3b   *)&pWriter.  );
11c90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11ca0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
11cb0 73 68 65 64 3b 0a 0a 20 20 72 63 20 3d 20 66 74  shed;..  rc = ft
11cc0 73 33 44 65 6c 65 74 65 53 65 67 64 69 72 28 70  s3DeleteSegdir(p
11cd0 2c 20 69 4c 65 76 65 6c 2c 20 61 70 53 65 67 6d  , iLevel, apSegm
11ce0 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a  ent, nSegment);.
11cf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11d00 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
11d10 66 74 73 33 53 65 67 57 72 69 74 65 72 46 6c 75  fts3SegWriterFlu
11d20 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69  sh(p, pWriter, i
11d30 4e 65 77 4c 65 76 65 6c 2c 20 69 49 64 78 29 3b  NewLevel, iIdx);
11d40 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a  .  }.. finished:
11d50 0a 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72  .  fts3SegWriter
11d60 46 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20  Free(pWriter);. 
11d70 20 69 66 28 20 61 70 53 65 67 6d 65 6e 74 20 29   if( apSegment )
11d80 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
11d90 3c 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b  <nSegment; i++){
11da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
11db0 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65 28  s3SegReaderFree(
11dc0 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29  p, apSegment[i])
11dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11de0 74 65 33 5f 66 72 65 65 28 61 70 53 65 67 6d 65  te3_free(apSegme
11df0 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
11e00 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46  e3Fts3SegReaderF
11e10 72 65 65 28 70 2c 20 70 50 65 6e 64 69 6e 67 29  ree(p, pPending)
11e20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  ;.  sqlite3_rese
11e30 74 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75  t(pStmt);.  retu
11e40 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a  rn rc;.}.../* .*
11e50 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74  * Flush the cont
11e60 65 6e 74 73 20 6f 66 20 70 65 6e 64 69 6e 67 54  ents of pendingT
11e70 65 72 6d 73 20 74 6f 20 61 20 6c 65 76 65 6c 20  erms to a level 
11e80 30 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  0 segment..*/.in
11e90 74 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e  t sqlite3Fts3Pen
11ea0 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 46  dingTermsFlush(F
11eb0 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
11ec0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
11ef0 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
11f20 6e 65 77 20 73 65 67 6d 65 6e 74 20 63 72 65 61  new segment crea
11f30 74 65 64 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  ted */.  Segment
11f40 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
11f50 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73 65 64  = 0;     /* Used
11f60 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 73 65   to write the se
11f70 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33 53  gment */.  Fts3S
11f80 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
11f90 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73  r = 0;     /* Us
11fa0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
11fb0 72 6f 75 67 68 20 74 68 65 20 68 61 73 68 20 74  rough the hash t
11fc0 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  able */..  /* Al
11fd0 6c 6f 63 61 74 65 20 61 20 53 65 67 52 65 61 64  locate a SegRead
11fe0 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 69 74 65  er object to ite
11ff0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
12000 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12010 0a 20 20 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65  .  ** pending-te
12020 72 6d 73 20 74 61 62 6c 65 2e 20 49 66 20 61 6e  rms table. If an
12030 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f   error occurs, o
12040 72 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  r if there are n
12050 6f 20 74 65 72 6d 73 0a 20 20 2a 2a 20 69 6e 20  o terms.  ** in 
12060 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
12070 73 20 74 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  s table, return 
12080 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a  immediately..  *
12090 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
120a0 46 74 73 33 53 65 67 52 65 61 64 65 72 50 65 6e  Fts3SegReaderPen
120b0 64 69 6e 67 28 70 2c 20 30 2c 20 30 2c 20 31 2c  ding(p, 0, 0, 1,
120c0 20 26 70 52 65 61 64 65 72 29 3b 0a 20 20 69 66   &pReader);.  if
120d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
120e0 7c 7c 20 70 52 65 61 64 65 72 3d 3d 30 20 29 7b  || pReader==0 ){
120f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
12100 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
12110 69 6e 65 20 74 68 65 20 6e 65 78 74 20 69 6e 64  ine the next ind
12120 65 78 20 61 74 20 6c 65 76 65 6c 20 30 2e 20 49  ex at level 0. I
12130 66 20 6c 65 76 65 6c 20 30 20 69 73 20 61 6c 72  f level 0 is alr
12140 65 61 64 79 20 66 75 6c 6c 2c 20 74 68 69 73 0a  eady full, this.
12150 20 20 2a 2a 20 63 61 6c 6c 20 6d 61 79 20 6d 65    ** call may me
12160 72 67 65 20 61 6c 6c 20 65 78 69 73 74 69 6e 67  rge all existing
12170 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65 6e 74   level 0 segment
12180 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
12190 6c 65 76 65 6c 20 31 0a 20 20 2a 2a 20 73 65 67  level 1.  ** seg
121a0 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ment..  */.  rc 
121b0 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  = fts3AllocateSe
121c0 67 64 69 72 49 64 78 28 70 2c 20 30 2c 20 26 69  gdirIdx(p, 0, &i
121d0 64 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  dx);..  /* If no
121e0 20 65 72 72 6f 72 73 20 68 61 76 65 20 6f 63 63   errors have occ
121f0 75 72 65 64 2c 20 69 74 65 72 61 74 65 20 74 68  ured, iterate th
12200 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e  rough the conten
12210 74 73 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ts of the .  ** 
12220 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61  pending-terms ha
12230 73 68 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74  sh table using t
12240 68 65 20 46 74 73 33 53 65 67 52 65 61 64 65 72  he Fts3SegReader
12250 20 69 74 65 72 61 74 6f 72 2e 20 54 68 65 20 63   iterator. The c
12260 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 72 69  allback.  ** wri
12270 74 65 73 20 65 61 63 68 20 74 65 72 6d 20 28 61  tes each term (a
12280 6c 6f 6e 67 20 77 69 74 68 20 69 74 73 20 64 6f  long with its do
12290 63 6c 69 73 74 29 20 74 6f 20 74 68 65 20 64 61  clist) to the da
122a0 74 61 62 61 73 65 20 76 69 61 20 74 68 65 0a 20  tabase via the. 
122b0 20 2a 2a 20 53 65 67 6d 65 6e 74 57 72 69 74 65   ** SegmentWrite
122c0 72 20 68 61 6e 64 6c 65 20 70 57 72 69 74 65 72  r handle pWriter
122d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
122e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
122f0 20 20 76 6f 69 64 20 2a 63 20 3d 20 28 76 6f 69    void *c = (voi
12300 64 20 2a 29 26 70 57 72 69 74 65 72 3b 20 20 20  d *)&pWriter;   
12310 2f 2a 20 53 65 67 52 65 61 64 65 72 49 74 65 72  /* SegReaderIter
12320 61 74 65 28 29 20 63 61 6c 6c 62 61 63 6b 20 63  ate() callback c
12330 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 46 74  ontext */.    Ft
12340 73 33 53 65 67 46 69 6c 74 65 72 20 66 3b 20 20  s3SegFilter f;  
12350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12360 65 67 52 65 61 64 65 72 49 74 65 72 61 74 65 28  egReaderIterate(
12370 29 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  ) parameters */.
12380 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
12390 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65  0, sizeof(Fts3Se
123a0 67 46 69 6c 74 65 72 29 29 3b 0a 20 20 20 20 66  gFilter));.    f
123b0 2e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45  .flags = FTS3_SE
123c0 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f  GMENT_REQUIRE_PO
123d0 53 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  S;.    rc = sqli
123e0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
123f0 49 74 65 72 61 74 65 28 70 2c 20 26 70 52 65 61  Iterate(p, &pRea
12400 64 65 72 2c 20 31 2c 20 26 66 2c 20 66 74 73 33  der, 1, &f, fts3
12410 46 6c 75 73 68 43 61 6c 6c 62 61 63 6b 2c 20 63  FlushCallback, c
12420 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
12430 20 70 57 72 69 74 65 72 20 7c 7c 20 72 63 21 3d   pWriter || rc!=
12440 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
12450 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20  /* If no errors 
12460 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20 66 6c  have occured, fl
12470 75 73 68 20 74 68 65 20 53 65 67 6d 65 6e 74 57  ush the SegmentW
12480 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  riter object to 
12490 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
124a0 65 2e 20 54 68 65 6e 20 64 65 6c 65 74 65 20 74  e. Then delete t
124b0 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  he SegmentWriter
124c0 20 61 6e 64 20 46 74 73 33 53 65 67 52 65 61 64   and Fts3SegRead
124d0 65 72 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20  er objects.  ** 
124e0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
124f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  s function..  */
12500 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
12510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
12520 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46 6c   fts3SegWriterFl
12530 75 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c 20  ush(p, pWriter, 
12540 30 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20 66  0, idx);.  }.  f
12550 74 73 33 53 65 67 57 72 69 74 65 72 46 72 65 65  ts3SegWriterFree
12560 28 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c  (pWriter);.  sql
12570 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
12580 72 46 72 65 65 28 70 2c 20 70 52 65 61 64 65 72  rFree(p, pReader
12590 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
125a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
125b0 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
125c0 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a  gTermsClear(p);.
125d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
125e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  .}../*.** Handle
125f0 20 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e 53   a 'special' INS
12600 45 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ERT of the form:
12610 0a 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52 54  .**.**   "INSERT
12620 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20 56   INTO tbl(tbl) V
12630 41 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a 2a  ALUES(<expr>)".*
12640 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56  *.** Argument pV
12650 61 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  al contains the 
12660 72 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72 3e  result of <expr>
12670 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20  . Currently the 
12680 6f 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67  only .** meaning
12690 66 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e 73  ful value to ins
126a0 65 72 74 20 69 73 20 74 68 65 20 74 65 78 74 20  ert is the text 
126b0 27 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a 73  'optimize'..*/.s
126c0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 70  tatic int fts3Sp
126d0 65 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73 33  ecialInsert(Fts3
126e0 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
126f0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
12700 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
12730 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
12740 20 2a 7a 56 61 6c 20 3d 20 73 71 6c 69 74 65 33   *zVal = sqlite3
12750 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
12760 29 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  );.  int nVal = 
12770 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
12780 74 65 73 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66  tes(pVal);..  if
12790 28 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72  ( !zVal ){.    r
127a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
127b0 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EM;.  }else if( 
127c0 6e 56 61 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71  nVal==8 && 0==sq
127d0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
127e0 56 61 6c 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c  Val, "optimize",
127f0 20 38 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   8) ){.    rc = 
12800 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65  fts3SegmentMerge
12810 28 70 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28  (p, -1);.    if(
12820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
12830 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
12840 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
12850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
12860 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
12870 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29  ingTermsClear(p)
12880 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
12890 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c  QLITE_TEST.  }el
128a0 73 65 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26  se if( nVal>9 &&
128b0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e   0==sqlite3_strn
128c0 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65  icmp(zVal, "node
128d0 73 69 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20  size=", 9) ){.  
128e0 20 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d    p->nNodeSize =
128f0 20 61 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b   atoi(&zVal[9]);
12900 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12910 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
12920 20 6e 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73   nVal>11 && 0==s
12930 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
12940 7a 56 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e  zVal, "maxpendin
12950 67 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70  g=", 9) ){.    p
12960 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  ->nMaxPendingDat
12970 61 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31  a = atoi(&zVal[1
12980 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  1]);.    rc = SQ
12990 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
129a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
129b0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
129c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
129d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
129e0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
129f0 65 20 77 6f 72 6b 20 66 6f 72 20 74 68 65 20 78  e work for the x
12a00 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20 6f 66  Update method of
12a10 20 46 54 53 33 20 76 69 72 74 75 61 6c 0a 2a 2a   FTS3 virtual.**
12a20 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20   tables..*/.int 
12a30 73 71 6c 69 74 65 33 46 74 73 33 55 70 64 61 74  sqlite3Fts3Updat
12a40 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  eMethod(.  sqlit
12a50 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
12a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12a70 53 33 20 76 74 61 62 20 6f 62 6a 65 63 74 20 2a  S3 vtab object *
12a80 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
12ab0 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f  rgument array */
12ac0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
12ad0 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20   **apVal,       
12ae0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
12af0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71  rguments */.  sq
12b00 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
12b10 69 64 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id            /*
12b20 20 4f 55 54 3a 20 54 68 65 20 61 66 66 65 63 74   OUT: The affect
12b30 65 64 20 28 6f 72 20 65 66 66 65 63 74 65 64 29  ed (or effected)
12b40 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46   rowid */.){.  F
12b50 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
12b60 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62  ts3Table *)pVtab
12b70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12b80 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
12b90 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
12ba0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65  de */.  int isRe
12bb0 6d 6f 76 65 20 3d 20 30 3b 20 20 20 20 20 20 20  move = 0;       
12bc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12bd0 66 6f 72 20 61 6e 20 55 50 44 41 54 45 20 6f 72  for an UPDATE or
12be0 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 73 71 6c   DELETE */.  sql
12bf0 69 74 65 33 5f 69 6e 74 36 34 20 69 52 65 6d 6f  ite3_int64 iRemo
12c00 76 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ve = 0;      /* 
12c10 52 6f 77 69 64 20 72 65 6d 6f 76 65 64 20 62 79  Rowid removed by
12c20 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
12c30 45 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 66 20 74  E */...  /* If t
12c40 68 69 73 20 69 73 20 61 20 44 45 4c 45 54 45 20  his is a DELETE 
12c50 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  or UPDATE operat
12c60 69 6f 6e 2c 20 72 65 6d 6f 76 65 20 74 68 65 20  ion, remove the 
12c70 6f 6c 64 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20  old record. */. 
12c80 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
12c90 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d  ue_type(apVal[0]
12ca0 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )!=SQLITE_NULL )
12cb0 7b 0a 20 20 20 20 69 6e 74 20 69 73 45 6d 70 74  {.    int isEmpt
12cc0 79 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  y;.    rc = fts3
12cd0 49 73 45 6d 70 74 79 28 70 2c 20 61 70 56 61 6c  IsEmpty(p, apVal
12ce0 2c 20 26 69 73 45 6d 70 74 79 29 3b 0a 20 20 20  , &isEmpty);.   
12cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
12d10 69 73 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20  isEmpty ){.     
12d20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 74     /* Deleting t
12d30 68 69 73 20 72 6f 77 20 6d 65 61 6e 73 20 74 68  his row means th
12d40 65 20 77 68 6f 6c 65 20 74 61 62 6c 65 20 69 73  e whole table is
12d50 20 65 6d 70 74 79 2e 20 49 6e 20 74 68 69 73 20   empty. In this 
12d60 63 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  case.        ** 
12d70 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65  delete the conte
12d80 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72 65 65  nts of all three
12d90 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 72 6f   tables and thro
12da0 77 20 61 77 61 79 20 61 6e 79 0a 20 20 20 20 20  w away any.     
12db0 20 20 20 2a 2a 20 64 61 74 61 20 69 6e 20 74 68     ** data in th
12dc0 65 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 68  e pendingTerms h
12dd0 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  ash table..     
12de0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
12df0 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c   = fts3DeleteAll
12e00 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
12e10 7b 0a 20 20 20 20 20 20 20 20 69 73 52 65 6d 6f  {.        isRemo
12e20 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
12e30 69 52 65 6d 6f 76 65 20 3d 20 73 71 6c 69 74 65  iRemove = sqlite
12e40 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
12e50 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Val[0]);.       
12e60 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
12e70 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 69  gTermsDocid(p, i
12e80 52 65 6d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  Remove);.       
12e90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12ea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12eb0 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 54  rc = fts3DeleteT
12ec0 65 72 6d 73 28 70 2c 20 61 70 56 61 6c 29 3b 0a  erms(p, apVal);.
12ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
12ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12ef0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
12f00 66 74 73 33 53 71 6c 45 78 65 63 28 70 2c 20 53  fts3SqlExec(p, S
12f10 51 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e 54 45 4e  QL_DELETE_CONTEN
12f20 54 2c 20 61 70 56 61 6c 29 3b 0a 20 20 20 20 20  T, apVal);.     
12f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12f50 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
12f60 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
12f70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  Val[p->nColumn+2
12f80 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])!=SQLITE_NULL 
12f90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66 74  ){.    return ft
12fa0 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28  s3SpecialInsert(
12fb0 70 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c  p, apVal[p->nCol
12fc0 75 6d 6e 2b 32 5d 29 3b 0a 20 20 7d 0a 20 20 0a  umn+2]);.  }.  .
12fd0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
12fe0 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44  an INSERT or UPD
12ff0 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ATE operation, i
13000 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 65  nsert the new re
13010 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  cord. */.  if( n
13020 41 72 67 3e 31 20 26 26 20 72 63 3d 3d 53 51 4c  Arg>1 && rc==SQL
13030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
13040 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61 74   = fts3InsertDat
13050 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f 77  a(p, apVal, pRow
13060 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  id);.    if( rc=
13070 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 21  =SQLITE_OK && (!
13080 69 73 52 65 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f  isRemove || *pRo
13090 77 69 64 21 3d 69 52 65 6d 6f 76 65 29 20 29 7b  wid!=iRemove) ){
130a0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
130b0 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69  PendingTermsDoci
130c0 64 28 70 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20  d(p, *pRowid);. 
130d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
130e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
130f0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73      rc = fts3Ins
13100 65 72 74 54 65 72 6d 73 28 70 2c 20 61 70 56 61  ertTerms(p, apVa
13110 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  l);.    }.  }.. 
13120 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13130 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  * .** Flush any 
13140 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64  data in the pend
13150 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
13160 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20 49 66  able to disk. If
13170 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
13180 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
13190 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
131a0 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68  se (including th
131b0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20 69  e new segment, i
131c0 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61 73 20  f .** there was 
131d0 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c 75 73  any data to flus
131e0 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  h) into a single
131f0 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69 6e   segment. .*/.in
13200 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 74  t sqlite3Fts3Opt
13210 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20  imize(Fts3Table 
13220 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
13230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
13240 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50  ec(p->db, "SAVEP
13250 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c 20 30  OINT fts3", 0, 0
13260 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
13270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13280 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e   rc = fts3Segmen
13290 74 4d 65 72 67 65 28 70 2c 20 2d 31 29 3b 0a 20  tMerge(p, -1);. 
132a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
132b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
132c0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
132d0 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20  p->db, "RELEASE 
132e0 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b  fts3", 0, 0, 0);
132f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
13300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13310 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 50      sqlite3Fts3P
13320 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72  endingTermsClear
13330 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
13340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
13350 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
13360 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66  , "ROLLBACK TO f
13370 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ts3", 0, 0, 0);.
13380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
13390 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41  ec(p->db, "RELEA
133a0 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20  SE fts3", 0, 0, 
133b0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
133c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
133d0 6e 64 69 66 0a                                   ndif.