/ Hex Artifact Content
Login

Artifact 6c59b1d6eed759815151298c132d79301c205fce:


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 23 64 65 66 69 6e  tdlib.h>..#defin
0340: 65 20 49 4e 54 45 52 49 4f 52 5f 4d 41 58 20 32  e INTERIOR_MAX 2
0350: 30 34 38 20 20 20 20 20 20 20 20 20 2f 2a 20 53  048         /* S
0360: 6f 66 74 20 6c 69 6d 69 74 20 66 6f 72 20 73 65  oft limit for se
0370: 67 6d 65 6e 74 20 6e 6f 64 65 20 73 69 7a 65 20  gment node size 
0380: 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 45 41 46 5f  */.#define LEAF_
0390: 4d 41 58 20 32 30 34 38 20 20 20 20 20 20 20 20  MAX 2048        
03a0: 20 20 20 20 20 2f 2a 20 53 6f 66 74 20 6c 69 6d       /* Soft lim
03b0: 69 74 20 66 6f 72 20 73 65 67 6d 65 6e 74 20 6c  it for segment l
03c0: 65 61 66 20 73 69 7a 65 20 2a 2f 0a 0a 74 79 70  eaf size */..typ
03d0: 65 64 65 66 20 73 74 72 75 63 74 20 50 65 6e 64  edef struct Pend
03e0: 69 6e 67 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c  ingList PendingL
03f0: 69 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ist;.typedef str
0400: 75 63 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  uct SegmentNode 
0410: 53 65 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70  SegmentNode;.typ
0420: 65 64 65 66 20 73 74 72 75 63 74 20 53 65 67 6d  edef struct Segm
0430: 65 6e 74 57 72 69 74 65 72 20 53 65 67 6d 65 6e  entWriter Segmen
0440: 74 57 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20  tWriter;../*.** 
0450: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 75  Data structure u
0460: 73 65 64 20 77 68 69 6c 65 20 61 63 63 75 6d 75  sed while accumu
0470: 6c 61 74 69 6e 67 20 74 65 72 6d 73 20 69 6e 20  lating terms in 
0480: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
0490: 73 20 68 61 73 68 0a 2a 2a 20 74 61 62 6c 65 2e  s hash.** table.
04a0: 20 54 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   The hash table 
04b0: 65 6e 74 72 79 20 6d 61 70 73 20 66 72 6f 6d 20  entry maps from 
04c0: 74 65 72 6d 20 28 61 20 73 74 72 69 6e 67 29 20  term (a string) 
04d0: 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 0a 2a 2a  to a malloced.**
04e0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
04f0: 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  s structure..*/.
0500: 73 74 72 75 63 74 20 50 65 6e 64 69 6e 67 4c 69  struct PendingLi
0510: 73 74 20 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61  st {.  int nData
0520: 3b 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  ;.  char *aData;
0530: 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 20  .  int nSpace;. 
0540: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
0550: 4c 61 73 74 44 6f 63 69 64 3b 0a 20 20 73 71 6c  LastDocid;.  sql
0560: 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74  ite3_int64 iLast
0570: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  Col;.  sqlite3_i
0580: 6e 74 36 34 20 69 4c 61 73 74 50 6f 73 3b 0a 7d  nt64 iLastPos;.}
0590: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
05a0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
05b0: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
05c0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
05d0: 68 20 74 68 65 20 74 65 72 6d 73 20 6f 6e 0a 2a  h the terms on.*
05e0: 2a 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 73  * a contiguous s
05f0: 65 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d  et of segment b-
0600: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 2e  tree leaf nodes.
0610: 20 41 6c 74 68 6f 75 67 68 20 74 68 65 20 64 65   Although the de
0620: 74 61 69 6c 73 20 6f 66 0a 2a 2a 20 74 68 69 73  tails of.** this
0630: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 6f   structure are o
0640: 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  nly manipulated 
0650: 62 79 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  by code in this 
0660: 66 69 6c 65 2c 20 6f 70 61 71 75 65 20 68 61 6e  file, opaque han
0670: 64 6c 65 73 0a 2a 2a 20 6f 66 20 74 79 70 65 20  dles.** of type 
0680: 46 74 73 33 53 65 67 52 65 61 64 65 72 2a 20 61  Fts3SegReader* a
0690: 72 65 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  re also used by 
06a0: 63 6f 64 65 20 69 6e 20 66 74 73 33 2e 63 20 74  code in fts3.c t
06b0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
06c0: 68 0a 2a 2a 20 74 65 72 6d 73 20 77 68 65 6e 20  h.** terms when 
06d0: 71 75 65 72 79 69 6e 67 20 74 68 65 20 66 75 6c  querying the ful
06e0: 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 53 65  l-text index. Se
06f0: 65 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  e functions:.**.
0700: 2a 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  **   sqlite3Fts3
0710: 53 65 67 52 65 61 64 65 72 4e 65 77 28 29 0a 2a  SegReaderNew().*
0720: 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  *   sqlite3Fts3S
0730: 65 67 52 65 61 64 65 72 46 72 65 65 28 29 0a 2a  egReaderFree().*
0740: 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  *   sqlite3Fts3S
0750: 65 67 52 65 61 64 65 72 49 74 65 72 61 74 65 28  egReaderIterate(
0760: 29 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 33  ).*/.struct Fts3
0770: 53 65 67 52 65 61 64 65 72 20 7b 0a 20 20 69 6e  SegReader {.  in
0780: 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
07a0: 20 49 6e 64 65 78 20 77 69 74 68 69 6e 20 6c 65   Index within le
07b0: 76 65 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  vel */.  sqlite3
07c0: 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f  _int64 iStartBlo
07d0: 63 6b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ck;.  sqlite3_in
07e0: 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 20  t64 iEndBlock;. 
07f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0800: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
0810: 20 2f 2a 20 53 51 4c 20 53 74 61 74 65 6d 65 6e   /* SQL Statemen
0820: 74 20 74 6f 20 61 63 63 65 73 73 20 6c 65 61 66  t to access leaf
0830: 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72   nodes */.  char
0840: 20 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20   *aNode;        
0850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
0860: 6f 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64  ointer to node d
0870: 61 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ata (or NULL) */
0880: 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20  .  int nNode;   
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
08b0: 66 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f  ffer at aNode (o
08c0: 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  r 0) */.  int nT
08d0: 65 72 6d 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  ermAlloc;       
08e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
08f0: 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 7a  ocated size of z
0900: 54 65 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a 0a  Term buffer */..
0910: 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 73    /* Variables s
0920: 65 74 20 62 79 20 66 74 73 33 53 65 67 52 65 61  et by fts3SegRea
0930: 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65 73 65  derNext(). These
0940: 20 6d 61 79 20 62 65 20 72 65 61 64 20 64 69 72   may be read dir
0950: 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
0960: 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79 20 61  e caller. They a
0970: 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20 74 68  re valid from th
0980: 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74 52 65  e time SegmentRe
0990: 61 64 65 72 4e 65 77 28 29 20 72 65 74 75 72 6e  aderNew() return
09a0: 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53 65 67  s.  ** until Seg
09b0: 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74 28 29  mentReaderNext()
09c0: 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
09d0: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
09e0: 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28 69 2e  LITE_OK.  ** (i.
09f0: 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 2e  e. SQLITE_DONE).
0a00: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  .  */.  int nTer
0a10: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
0a20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0a30: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75  r of bytes in cu
0a40: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
0a50: 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
0a80: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
0a90: 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 3b 20  char *aDoclist; 
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f  /* Pointer to do
0ac0: 63 6c 69 73 74 20 6f 66 20 63 75 72 72 65 6e 74  clist of current
0ad0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
0ae0: 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
0b00: 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  ize of doclist i
0b10: 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  n current entry 
0b20: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
0b30: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
0b40: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
0b50: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
0b60: 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
0b70: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f 66 66   */.  char *pOff
0b80: 73 65 74 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  setList;.  sqlit
0b90: 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b  e3_int64 iDocid;
0ba0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
0bb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
0bc0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
0bd0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 67   to create a seg
0be0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 20 74  ment b-tree in t
0bf0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
0c00: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 74  The internal det
0c10: 61 69 6c 73 20 6f 66 20 74 68 69 73 20 74 79 70  ails of this typ
0c20: 65 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73  e are only acces
0c30: 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f  sed by the.** fo
0c40: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
0c50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
0c60: 65 67 57 72 69 74 65 72 41 64 64 28 29 0a 2a 2a  egWriterAdd().**
0c70: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72     fts3SegWriter
0c80: 46 6c 75 73 68 28 29 0a 2a 2a 20 20 20 66 74 73  Flush().**   fts
0c90: 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 29  3SegWriterFree()
0ca0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
0cb0: 6e 74 57 72 69 74 65 72 20 7b 0a 20 20 53 65 67  ntWriter {.  Seg
0cc0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 3b  mentNode *pTree;
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0ce0: 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74 65 72  Pointer to inter
0cf0: 69 6f 72 20 74 72 65 65 20 73 74 72 75 63 74 75  ior tree structu
0d00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
0d10: 69 6e 74 36 34 20 69 46 69 72 73 74 3b 20 20 20  int64 iFirst;   
0d20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
0d30: 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65   slot in %_segme
0d40: 6e 74 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  nts written */. 
0d50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
0d60: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
0d70: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
0d80: 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
0d90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72   */.  char *zTer
0da0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
0db0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
0dc0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72   to previous ter
0dd0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
0de0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0e00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
0e10: 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69   in zTerm */.  i
0e20: 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20  nt nMalloc;     
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e40: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63  * Size of malloc
0e50: 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61  'd buffer at zMa
0e60: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
0e70: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  zMalloc;        
0e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c            /* Mal
0e90: 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73  loc'd space (pos
0ea0: 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20  sibly) used for 
0eb0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
0ec0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
0ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
0ee0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  ze of allocation
0ef0: 20 61 74 20 61 44 61 74 61 20 2a 2f 0a 20 20 69   at aData */.  i
0f00: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0f20: 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
0f30: 69 6e 20 61 44 61 74 61 20 2a 2f 0a 20 20 63 68  in aData */.  ch
0f40: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 6c 6f 63   Pointer to bloc
0f70: 6b 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  k from malloc() 
0f80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70  */.};../*.** Typ
0f90: 65 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 69 73  e SegmentNode is
0fa0: 20 75 73 65 64 20 62 79 20 74 68 65 20 66 6f 6c   used by the fol
0fb0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
0fc0: 63 74 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ctions to create
0fd0: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72  .** the interior
0fe0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 65 67   part of the seg
0ff0: 6d 65 6e 74 20 62 2b 2d 74 72 65 65 20 73 74 72  ment b+-tree str
1000: 75 63 74 75 72 65 73 20 28 65 76 65 72 79 74 68  uctures (everyth
1010: 69 6e 67 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  ing except.** th
1020: 65 20 6c 65 61 66 20 6e 6f 64 65 73 29 2e 20 54  e leaf nodes). T
1030: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
1040: 6e 64 20 74 79 70 65 20 61 72 65 20 6f 6e 6c 79  nd type are only
1050: 20 65 76 65 72 20 75 73 65 64 20 62 79 20 63 6f   ever used by co
1060: 64 65 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  de.** within the
1070: 20 66 74 73 33 53 65 67 57 72 69 74 65 72 58 58   fts3SegWriterXX
1080: 58 28 29 20 66 61 6d 69 6c 79 20 6f 66 20 66 75  X() family of fu
1090: 6e 63 74 69 6f 6e 73 20 64 65 73 63 72 69 62 65  nctions describe
10a0: 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20  d above..**.**  
10b0: 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d   fts3NodeAddTerm
10c0: 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65  ().**   fts3Node
10d0: 57 72 69 74 65 28 29 0a 2a 2a 20 20 20 66 74 73  Write().**   fts
10e0: 33 4e 6f 64 65 46 72 65 65 28 29 0a 2a 2f 0a 73  3NodeFree().*/.s
10f0: 74 72 75 63 74 20 53 65 67 6d 65 6e 74 4e 6f 64  truct SegmentNod
1100: 65 20 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64  e {.  SegmentNod
1110: 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  e *pParent;     
1120: 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
1130: 6e 6f 64 65 20 28 6f 72 20 4e 55 4c 4c 20 66 6f  node (or NULL fo
1140: 72 20 72 6f 6f 74 20 6e 6f 64 65 29 20 2a 2f 0a  r root node) */.
1150: 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
1160: 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
1170: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1180: 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 2a 2f  right-sibling */
1190: 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a  .  SegmentNode *
11a0: 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20  pLeftmost;      
11b0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
11c0: 20 6c 65 66 74 2d 6d 6f 73 74 20 6e 6f 64 65 20   left-most node 
11d0: 6f 66 20 74 68 69 73 20 64 65 70 74 68 20 2a 2f  of this depth */
11e0: 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1210: 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f  terms written to
1220: 20 6e 6f 64 65 20 73 6f 20 66 61 72 20 2a 2f 0a   node so far */.
1230: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1260: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 62 75  previous term bu
1270: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ffer */.  int nT
1280: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
1290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
12b0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
12c0: 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  Malloc;         
12d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
12e0: 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63 27 64 20 62  ze of malloc'd b
12f0: 75 66 66 65 72 20 61 74 20 7a 4d 61 6c 6c 6f 63  uffer at zMalloc
1300: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c   */.  char *zMal
1310: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
1320: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27        /* Malloc'
1330: 64 20 73 70 61 63 65 20 28 70 6f 73 73 69 62 6c  d space (possibl
1340: 79 29 20 75 73 65 64 20 66 6f 72 20 7a 54 65 72  y) used for zTer
1350: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  m */.  int nData
1360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1370: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1380: 6f 66 20 76 61 6c 69 64 20 64 61 74 61 20 73 6f  of valid data so
1390: 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a   far */.  char *
13a0: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
13b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64            /* Nod
13c0: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e data */.};../*
13d0: 0a 2a 2a 20 56 61 6c 69 64 20 76 61 6c 75 65 73  .** Valid values
13e0: 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
13f0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 66 74 73 33  argument to fts3
1400: 53 71 6c 53 74 6d 74 28 29 2e 0a 2a 2f 0a 23 64  SqlStmt()..*/.#d
1410: 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45  efine SQL_DELETE
1420: 5f 43 4f 4e 54 45 4e 54 20 20 20 20 20 20 20 20  _CONTENT        
1430: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53       0.#define S
1440: 51 4c 5f 49 53 5f 45 4d 50 54 59 20 20 20 20 20  QL_IS_EMPTY     
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
1460: 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45  #define SQL_DELE
1470: 54 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 20 20  TE_ALL_CONTENT  
1480: 20 20 20 20 20 20 20 32 20 0a 23 64 65 66 69 6e         2 .#defin
1490: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  e SQL_DELETE_ALL
14a0: 5f 53 45 47 4d 45 4e 54 53 20 20 20 20 20 20 20  _SEGMENTS       
14b0: 20 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44   3.#define SQL_D
14c0: 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52  ELETE_ALL_SEGDIR
14d0: 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65 66            4.#def
14e0: 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43  ine SQL_SELECT_C
14f0: 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 20  ONTENT_BY_ROWID 
1500: 20 20 20 35 0a 23 64 65 66 69 6e 65 20 53 51 4c     5.#define SQL
1510: 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e  _NEXT_SEGMENT_IN
1520: 44 45 58 20 20 20 20 20 20 20 20 20 36 0a 23 64  DEX         6.#d
1530: 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53 45 52 54  efine SQL_INSERT
1540: 5f 53 45 47 4d 45 4e 54 53 20 20 20 20 20 20 20  _SEGMENTS       
1550: 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53       7.#define S
1560: 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53  QL_NEXT_SEGMENTS
1570: 5f 49 44 20 20 20 20 20 20 20 20 20 20 20 38 0a  _ID           8.
1580: 23 64 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53 45  #define SQL_INSE
1590: 52 54 5f 53 45 47 44 49 52 20 20 20 20 20 20 20  RT_SEGDIR       
15a0: 20 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65         9.#define
15b0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
15c0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  L              1
15d0: 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  0.#define SQL_SE
15e0: 4c 45 43 54 5f 41 4c 4c 5f 4c 45 56 45 4c 20 20  LECT_ALL_LEVEL  
15f0: 20 20 20 20 20 20 20 20 31 31 0a 23 64 65 66 69          11.#defi
1600: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45  ne SQL_SELECT_LE
1610: 56 45 4c 5f 43 4f 55 4e 54 20 20 20 20 20 20 20  VEL_COUNT       
1620: 20 31 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   12.#define SQL_
1630: 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 43 4f  SELECT_SEGDIR_CO
1640: 55 4e 54 5f 4d 41 58 20 20 20 31 33 0a 23 64 65  UNT_MAX   13.#de
1650: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
1660: 53 45 47 44 49 52 5f 42 59 5f 4c 45 56 45 4c 20  SEGDIR_BY_LEVEL 
1670: 20 20 20 31 34 0a 23 64 65 66 69 6e 65 20 53 51     14.#define SQ
1680: 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54  L_DELETE_SEGMENT
1690: 53 5f 52 41 4e 47 45 20 20 20 20 20 31 35 0a 23  S_RANGE     15.#
16a0: 64 65 66 69 6e 65 20 53 51 4c 5f 43 4f 4e 54 45  define SQL_CONTE
16b0: 4e 54 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20  NT_INSERT       
16c0: 20 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20       16.#define 
16d0: 53 51 4c 5f 47 45 54 5f 42 4c 4f 43 4b 20 20 20  SQL_GET_BLOCK   
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 37                17
16f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1700: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1710: 20 6f 62 74 61 69 6e 20 61 6e 20 53 51 4c 69 74   obtain an SQLit
1720: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1730: 6d 65 6e 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66  ment handle.** f
1740: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
1750: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
1760: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1770: 6e 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  nt. If successfu
1780: 6c 2c 0a 2a 2a 20 2a 70 70 20 69 73 20 73 65 74  l,.** *pp is set
1790: 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74 65   to the requeste
17a0: 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  d statement hand
17b0: 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  le and SQLITE_OK
17c0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
17d0: 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
17e0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
17f0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1800: 70 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  p is set to 0..*
1810: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1820: 20 61 70 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55   apVal is not NU
1830: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  LL, then it must
1840: 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
1850: 61 79 20 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65  ay with.** at le
1860: 61 73 74 20 61 73 20 6d 61 6e 79 20 65 6e 74 72  ast as many entr
1870: 69 65 73 20 61 73 20 74 68 65 20 72 65 71 75 65  ies as the reque
1880: 73 74 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68  sted statement h
1890: 61 73 20 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72  as bound .** par
18a0: 61 6d 65 74 65 72 73 2e 20 54 68 65 20 76 61 6c  ameters. The val
18b0: 75 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f  ues are bound to
18c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20   the statements 
18d0: 70 61 72 61 6d 65 74 65 72 73 20 62 65 66 6f 72  parameters befor
18e0: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
18f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1900: 73 33 53 71 6c 53 74 6d 74 28 0a 20 20 46 74 73  s3SqlStmt(.  Fts
1910: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1930: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
1940: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53  ndle */.  int eS
1950: 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  tmt,            
1960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
1970: 20 6f 66 20 74 68 65 20 53 51 4c 5f 58 58 58 20   of the SQL_XXX 
1980: 63 6f 6e 73 74 61 6e 74 73 20 61 62 6f 76 65 20  constants above 
1990: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
19a0: 74 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20  t **pp,         
19b0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61       /* OUT: Sta
19c0: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f  tement handle */
19d0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
19e0: 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
19f0: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20     /* Values to 
1a00: 62 69 6e 64 20 74 6f 20 73 74 61 74 65 6d 65 6e  bind to statemen
1a10: 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  t */.){.  const 
1a20: 63 68 61 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20  char *azSql[] = 
1a30: 7b 0a 2f 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c  {./* 0  */  "DEL
1a40: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
1a50: 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72  content' WHERE r
1a60: 6f 77 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20  owid = ?",./* 1 
1a70: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 4e 4f 54   */  "SELECT NOT
1a80: 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 64   EXISTS(SELECT d
1a90: 6f 63 69 64 20 46 52 4f 4d 20 25 51 2e 27 25 71  ocid FROM %Q.'%q
1aa0: 5f 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20  _content' WHERE 
1ab0: 72 6f 77 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32  rowid!=?)",./* 2
1ac0: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52    */  "DELETE FR
1ad0: 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e  OM %Q.'%q_conten
1ae0: 74 27 22 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22  t'",./* 3  */  "
1af0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
1b00: 25 71 5f 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f  %q_segments'",./
1b10: 2a 20 34 20 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 4  */  "DELETE
1b20: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
1b30: 64 69 72 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20  dir'",./* 5  */ 
1b40: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
1b50: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20  %Q.'%q_content' 
1b60: 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 2c 0a  WHERE rowid=?",.
1b70: 2f 2a 20 36 20 20 2a 2f 20 20 22 53 45 4c 45 43  /* 6  */  "SELEC
1b80: 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69  T coalesce(max(i
1b90: 64 78 29 2b 31 2c 20 30 29 20 46 52 4f 4d 20 25  dx)+1, 0) FROM %
1ba0: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
1bb0: 45 52 45 20 6c 65 76 65 6c 3d 3f 22 2c 0a 2f 2a  ERE level=?",./*
1bc0: 20 37 20 20 2a 2f 20 20 22 49 4e 53 45 52 54 20   7  */  "INSERT 
1bd0: 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65 67 6d  INTO %Q.'%q_segm
1be0: 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 2c 20 62  ents'(blockid, b
1bf0: 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c 20  lock) VALUES(?, 
1c00: 3f 29 22 2c 0a 2f 2a 20 38 20 20 2a 2f 20 20 22  ?)",./* 8  */  "
1c10: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
1c20: 6d 61 78 28 62 6c 6f 63 6b 69 64 29 2b 31 2c 20  max(blockid)+1, 
1c30: 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  1) FROM %Q.'%q_s
1c40: 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 39 20  egments'",./* 9 
1c50: 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49 4e 54   */  "INSERT INT
1c60: 4f 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  O %Q.'%q_segdir'
1c70: 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c   VALUES(?,?,?,?,
1c80: 3f 2c 3f 29 22 2c 0a 0a 20 20 20 20 20 20 20 20  ?,?)",..        
1c90: 20 20 2f 2a 20 52 65 74 75 72 6e 20 73 65 67 6d    /* Return segm
1ca0: 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 66 72  ents in order fr
1cb0: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
1cc0: 65 73 74 2e 2a 2f 20 0a 2f 2a 20 31 30 20 2a 2f  est.*/ ./* 10 */
1cd0: 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20 73    "SELECT idx, s
1ce0: 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76  tart_block, leav
1cf0: 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e  es_end_block, en
1d00: 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22 0a  d_block, root ".
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f              "FRO
1d20: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
1d30: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
1d40: 20 4f 52 44 45 52 20 42 59 20 69 64 78 20 41 53   ORDER BY idx AS
1d50: 43 22 2c 0a 2f 2a 20 31 31 20 2a 2f 20 20 22 53  C",./* 11 */  "S
1d60: 45 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74  ELECT idx, start
1d70: 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65  _block, leaves_e
1d80: 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c  nd_block, end_bl
1d90: 6f 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20  ock, root ".    
1da0: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
1db0: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 4f 52 44  .'%q_segdir' ORD
1dc0: 45 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43  ER BY level DESC
1dd0: 2c 20 69 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20  , idx ASC",../* 
1de0: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63  12 */  "SELECT c
1df0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e  ount(*) FROM %Q.
1e00: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
1e10: 45 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a  E level = ?",./*
1e20: 20 31 33 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   13 */  "SELECT 
1e30: 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 6c 65  count(*), max(le
1e40: 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  vel) FROM %Q.'%q
1e50: 5f 73 65 67 64 69 72 27 22 2c 0a 0a 2f 2a 20 31  _segdir'",../* 1
1e60: 34 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52  4 */  "DELETE FR
1e70: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
1e80: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  ' WHERE level = 
1e90: 3f 22 2c 0a 2f 2a 20 31 35 20 2a 2f 20 20 22 44  ?",./* 15 */  "D
1ea0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
1eb0: 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52  q_segments' WHER
1ec0: 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45 45  E blockid BETWEE
1ed0: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20 31  N ? AND ?",./* 1
1ee0: 36 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49 4e  6 */  "INSERT IN
1ef0: 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e  TO %Q.'%q_conten
1f00: 74 27 20 56 41 4c 55 45 53 28 25 7a 29 22 2c 0a  t' VALUES(%z)",.
1f10: 2f 2a 20 31 37 20 2a 2f 20 20 22 53 45 4c 45 43  /* 17 */  "SELEC
1f20: 54 20 62 6c 6f 63 6b 20 46 52 4f 4d 20 25 51 2e  T block FROM %Q.
1f30: 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48  '%q_segments' WH
1f40: 45 52 45 20 62 6c 6f 63 6b 69 64 20 3d 20 3f 22  ERE blockid = ?"
1f50: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63 20  ,.  };.  int rc 
1f60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
1f70: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1f80: 6d 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53  mt;..  assert( S
1f90: 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53 71 6c  izeofArray(azSql
1fa0: 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28 70  )==SizeofArray(p
1fb0: 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20 61 73  ->aStmt) );.  as
1fc0: 73 65 72 74 28 20 65 53 74 6d 74 3c 53 69 7a 65  sert( eStmt<Size
1fd0: 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 20 26  ofArray(azSql) &
1fe0: 26 20 65 53 74 6d 74 3e 3d 30 20 29 3b 0a 20 20  & eStmt>=0 );.  
1ff0: 0a 20 20 70 53 74 6d 74 20 3d 20 70 2d 3e 61 53  .  pStmt = p->aS
2000: 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 69 66  tmt[eStmt];.  if
2010: 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  ( !pStmt ){.    
2020: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
2030: 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 43  if( eStmt==SQL_C
2040: 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29 7b  ONTENT_INSERT ){
2050: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2080: 61 72 69 61 62 6c 65 20 2a 2f 20 20 0a 20 20 20  ariable */  .   
2090: 20 20 20 63 68 61 72 20 2a 7a 56 61 72 6c 69 73     char *zVarlis
20a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
20b0: 2a 20 54 68 65 20 22 3f 2c 20 3f 2c 20 2e 2e 2e  * The "?, ?, ...
20c0: 22 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  " string */.    
20d0: 20 20 7a 56 61 72 6c 69 73 74 20 3d 20 28 63 68    zVarlist = (ch
20e0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
20f0: 6c 6f 63 28 32 2a 70 2d 3e 6e 43 6f 6c 75 6d 6e  loc(2*p->nColumn
2100: 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  +2);.      if( !
2110: 7a 56 61 72 6c 69 73 74 20 29 7b 0a 20 20 20 20  zVarlist ){.    
2120: 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20      *pp = 0;.   
2130: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2140: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2150: 7d 0a 20 20 20 20 20 20 7a 56 61 72 6c 69 73 74  }.      zVarlist
2160: 5b 30 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20  [0] = '?';.     
2170: 20 7a 56 61 72 6c 69 73 74 5b 70 2d 3e 6e 43 6f   zVarlist[p->nCo
2180: 6c 75 6d 6e 2a 32 2b 31 5d 20 3d 20 27 5c 30 27  lumn*2+1] = '\0'
2190: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
21a0: 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20   i<=p->nColumn; 
21b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 56  i++){.        zV
21c0: 61 72 6c 69 73 74 5b 69 2a 32 2d 31 5d 20 3d 20  arlist[i*2-1] = 
21d0: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 7a 56 61  ',';.        zVa
21e0: 72 6c 69 73 74 5b 69 2a 32 5d 20 3d 20 27 3f 27  rlist[i*2] = '?'
21f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2200: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2210: 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74  printf(azSql[eSt
2220: 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e  mt], p->zDb, p->
2230: 7a 4e 61 6d 65 2c 20 7a 56 61 72 6c 69 73 74 29  zName, zVarlist)
2240: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2250: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2260: 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b  3_mprintf(azSql[
2270: 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20  eStmt], p->zDb, 
2280: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
2290: 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
22a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
22c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
22d0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
22e0: 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
22f0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 4e 55 4c   -1, &pStmt, NUL
2300: 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
2310: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2320: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2330: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
2340: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  mt==0 );.      p
2350: 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74 5d 20 3d  ->aStmt[eStmt] =
2360: 20 70 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20   pStmt;.    }.  
2370: 7d 0a 20 20 69 66 28 20 61 70 56 61 6c 20 29 7b  }.  if( apVal ){
2380: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2390: 69 6e 74 20 6e 50 61 72 61 6d 20 3d 20 73 71 6c  int nParam = sql
23a0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
23b0: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
23c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ;.    for(i=0; r
23d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23e0: 69 3c 6e 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a  i<nParam; i++){.
23f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2400: 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 53  e3_bind_value(pS
2410: 74 6d 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b  tmt, i+1, apVal[
2420: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i]);.    }.  }. 
2430: 20 2a 70 70 20 3d 20 70 53 74 6d 74 3b 0a 20 20   *pp = pStmt;.  
2440: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2450: 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74 6f 20 66  .** Similar to f
2460: 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 20 45 78  ts3SqlStmt(). Ex
2470: 63 65 70 74 2c 20 61 66 74 65 72 20 62 69 6e 64  cept, after bind
2480: 69 6e 67 20 74 68 65 20 70 61 72 61 6d 65 74 65  ing the paramete
2490: 72 73 20 69 6e 0a 2a 2a 20 61 72 72 61 79 20 61  rs in.** array a
24a0: 70 56 61 6c 5b 5d 20 74 6f 20 74 68 65 20 53 51  pVal[] to the SQ
24b0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 64 65 6e  L statement iden
24c0: 74 69 66 69 65 64 20 62 79 20 65 53 74 6d 74 2c  tified by eStmt,
24d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
24e0: 2a 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a  * is executed..*
24f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c  *.** Returns SQL
2500: 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 73 74  ITE_OK if the st
2510: 61 74 65 6d 65 6e 74 20 69 73 20 73 75 63 63 65  atement is succe
2520: 73 73 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64  ssfully executed
2530: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74  , or an.** SQLit
2540: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
2550: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
2560: 63 20 69 6e 74 20 66 74 73 33 53 71 6c 45 78 65  c int fts3SqlExe
2570: 63 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  c(Fts3Table *p, 
2580: 69 6e 74 20 65 53 74 6d 74 2c 20 73 71 6c 69 74  int eStmt, sqlit
2590: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
25a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
25b0: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
25c0: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
25d0: 28 70 2c 20 65 53 74 6d 74 2c 20 26 70 53 74 6d  (p, eStmt, &pStm
25e0: 74 2c 20 61 70 56 61 6c 29 3b 20 0a 20 20 69 66  t, apVal); .  if
25f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2600: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2610: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
2620: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
2630: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  et(pStmt);.  }. 
2640: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2650: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
2660: 67 6c 65 20 62 6c 6f 63 6b 20 66 72 6f 6d 20 74  gle block from t
2670: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
2680: 62 6c 65 2e 20 49 66 20 74 68 65 20 73 70 65 63  ble. If the spec
2690: 69 66 69 65 64 20 62 6c 6f 63 6b 0a 2a 2a 20 64  ified block.** d
26a0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 72  oes not exist, r
26b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26c0: 52 55 50 54 2e 20 49 66 20 73 6f 6d 65 20 6f 74  RUPT. If some ot
26d0: 68 65 72 20 65 72 72 6f 72 20 28 6d 61 6c 6c 6f  her error (mallo
26e0: 63 2c 20 49 4f 20 0a 2a 2a 20 65 74 63 2e 29 20  c, IO .** etc.) 
26f0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
2700: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 53  he appropriate S
2710: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2720: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2730: 65 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  e, if successful
2740: 2c 20 73 65 74 20 2a 70 7a 42 6c 6f 63 6b 20 74  , set *pzBlock t
2750: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
2760: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  fer containing.*
2770: 2a 20 74 68 65 20 62 6c 6f 63 6b 20 72 65 61 64  * the block read
2780: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2790: 73 65 2c 20 61 6e 64 20 2a 70 6e 42 6c 6f 63 6b  se, and *pnBlock
27a0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
27b0: 74 68 65 20 72 65 61 64 0a 2a 2a 20 62 6c 6f 63  the read.** bloc
27c0: 6b 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  k in bytes..**.*
27d0: 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65 20 72  * WARNING: The r
27e0: 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 20 69  eturned buffer i
27f0: 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74  s only valid unt
2800: 69 6c 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  il the next call
2810: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 46   to .** sqlite3F
2820: 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 29 2e 0a  ts3ReadBlock()..
2830: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2840: 73 33 52 65 61 64 42 6c 6f 63 6b 28 0a 20 20 46  s3ReadBlock(.  F
2850: 74 73 33 54 61 62 6c 65 20 2a 70 2c 0a 20 20 73  ts3Table *p,.  s
2860: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c  qlite3_int64 iBl
2870: 6f 63 6b 2c 0a 20 20 63 68 61 72 20 63 6f 6e 73  ock,.  char cons
2880: 74 20 2a 2a 70 7a 42 6c 6f 63 6b 2c 0a 20 20 69  t **pzBlock,.  i
2890: 6e 74 20 2a 70 6e 42 6c 6f 63 6b 0a 29 7b 0a 20  nt *pnBlock.){. 
28a0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
28b0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Stmt;.  int rc =
28c0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
28d0: 53 51 4c 5f 47 45 54 5f 42 4c 4f 43 4b 2c 20 26  SQL_GET_BLOCK, &
28e0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
28f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2900: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 73 71   return rc;.  sq
2910: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
2920: 74 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62  t);..  sqlite3_b
2930: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
2940: 20 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20 72   1, iBlock);.  r
2950: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
2960: 28 70 53 74 6d 74 29 3b 20 0a 20 20 69 66 28 20  (pStmt); .  if( 
2970: 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
2980: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2990: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
29a0: 0a 0a 20 20 2a 70 6e 42 6c 6f 63 6b 20 3d 20 73  ..  *pnBlock = s
29b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
29c0: 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  tes(pStmt, 0);. 
29d0: 20 2a 70 7a 42 6c 6f 63 6b 20 3d 20 28 63 68 61   *pzBlock = (cha
29e0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
29f0: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30  mn_blob(pStmt, 0
2a00: 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 42 6c 6f  );.  if( !*pzBlo
2a10: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
2a20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2a40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2a50: 53 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 61  Set *ppStmt to a
2a60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
2a70: 65 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  e that may be us
2a80: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
2a90: 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77  rough.** all row
2aa0: 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69  s in the %_segdi
2ab0: 72 20 74 61 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c  r table, from ol
2ac0: 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 20  dest to newest. 
2ad0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
2ae0: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
2af0: 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  OK. If an error 
2b00: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 72 65  occurs while pre
2b10: 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
2b20: 6d 65 6e 74 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ment, .** return
2b30: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2b40: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
2b50: 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  re is only ever 
2b60: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
2b70: 74 68 69 73 20 53 51 4c 20 73 74 61 74 65 6d 65  this SQL stateme
2b80: 6e 74 20 63 6f 6d 70 69 6c 65 64 20 66 6f 72 0a  nt compiled for.
2b90: 2a 2a 20 65 61 63 68 20 46 54 53 33 20 74 61 62  ** each FTS3 tab
2ba0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  le..**.** The st
2bb0: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
2bc0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
2bd0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 25  lumns from the %
2be0: 5f 73 65 67 64 69 72 20 74 61 62 6c 65 3a 0a 2a  _segdir table:.*
2bf0: 2a 0a 2a 2a 20 20 20 30 3a 20 69 64 78 0a 2a 2a  *.**   0: idx.**
2c00: 20 20 20 31 3a 20 73 74 61 72 74 5f 62 6c 6f 63     1: start_bloc
2c10: 6b 0a 2a 2a 20 20 20 32 3a 20 6c 65 61 76 65 73  k.**   2: leaves
2c20: 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20  _end_block.**   
2c30: 33 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20  3: end_block.** 
2c40: 20 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74    4: root.*/.int
2c50: 20 73 71 6c 69 74 65 33 46 74 73 33 41 6c 6c 53   sqlite3Fts3AllS
2c60: 65 67 64 69 72 73 28 46 74 73 33 54 61 62 6c 65  egdirs(Fts3Table
2c70: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d   *p, sqlite3_stm
2c80: 74 20 2a 2a 70 70 53 74 6d 74 29 7b 0a 20 20 72  t **ppStmt){.  r
2c90: 65 74 75 72 6e 20 66 74 73 33 53 71 6c 53 74 6d  eturn fts3SqlStm
2ca0: 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
2cb0: 41 4c 4c 5f 4c 45 56 45 4c 2c 20 70 70 53 74 6d  ALL_LEVEL, ppStm
2cc0: 74 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t, 0);.}.../*.**
2cd0: 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65   Append a single
2ce0: 20 76 61 72 69 6e 74 20 74 6f 20 61 20 50 65 6e   varint to a Pen
2cf0: 64 69 6e 67 4c 69 73 74 20 62 75 66 66 65 72 2e  dingList buffer.
2d00: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2d10: 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20 73 75 63  turned.** if suc
2d20: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
2d30: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2d40: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
2d50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2d60: 61 6c 73 6f 20 73 65 72 76 65 73 20 74 6f 20 61  also serves to a
2d70: 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 65 6e 64  llocate the Pend
2d80: 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72  ingList structur
2d90: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 46 6f 72  e itself..** For
2da0: 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 63 72 65   example, to cre
2db0: 61 74 65 20 61 20 6e 65 77 20 50 65 6e 64 69 6e  ate a new Pendin
2dc0: 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20  gList structure 
2dd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 77 6f 0a 2a  containing two.*
2de0: 2a 20 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a  * varints:.**.**
2df0: 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a     PendingList *
2e00: 70 20 3d 20 30 3b 0a 2a 2a 20 20 20 66 74 73 33  p = 0;.**   fts3
2e10: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
2e20: 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29 3b 0a  dVarint(&p, 1);.
2e30: 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67  **   fts3Pending
2e40: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
2e50: 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73 74 61 74  (&p, 2);.*/.stat
2e60: 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69  ic int fts3Pendi
2e70: 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
2e80: 6e 74 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73  nt(.  PendingLis
2e90: 74 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20  t **pp,         
2ea0: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2eb0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 50 65 6e 64   Pointer to Pend
2ec0: 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 20 2a  ingList struct *
2ed0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
2ee0: 34 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20  4 i             
2ef0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
2f00: 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a  append to data *
2f10: 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69  /.){.  PendingLi
2f20: 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 0a 20 20  st *p = *pp;..  
2f30: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 67  /* Allocate or g
2f40: 72 6f 77 20 74 68 65 20 50 65 6e 64 69 6e 67 4c  row the PendingL
2f50: 69 73 74 20 61 73 20 72 65 71 75 69 72 65 64 2e  ist as required.
2f60: 20 2a 2f 0a 20 20 69 66 28 20 21 70 20 29 7b 0a   */.  if( !p ){.
2f70: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f      p = sqlite3_
2f80: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
2f90: 29 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66  ) + 100);.    if
2fa0: 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 72 65  ( !p ){.      re
2fb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2fc0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  M;.    }.    p->
2fd0: 6e 53 70 61 63 65 20 3d 20 31 30 30 3b 0a 20 20  nSpace = 100;.  
2fe0: 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68    p->aData = (ch
2ff0: 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  ar *)&p[1];.    
3000: 70 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20  p->nData = 0;.  
3010: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e  }.  else if( p->
3020: 6e 44 61 74 61 2b 46 54 53 33 5f 56 41 52 49 4e  nData+FTS3_VARIN
3030: 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53 70 61 63  T_MAX+1>p->nSpac
3040: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  e ){.    int nNe
3050: 77 20 3d 20 70 2d 3e 6e 53 70 61 63 65 20 2a 20  w = p->nSpace * 
3060: 32 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  2;.    p = sqlit
3070: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 73 69  e3_realloc(p, si
3080: 7a 65 6f 66 28 2a 70 29 20 2b 20 6e 4e 65 77 29  zeof(*p) + nNew)
3090: 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a  ;.    if( !p ){.
30a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
30b0: 65 65 28 2a 70 70 29 3b 0a 20 20 20 20 20 20 2a  ee(*pp);.      *
30c0: 70 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  pp = 0;.      re
30d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30e0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  M;.    }.    p->
30f0: 6e 53 70 61 63 65 20 3d 20 6e 4e 65 77 3b 0a 20  nSpace = nNew;. 
3100: 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63     p->aData = (c
3110: 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 7d  har *)&p[1];.  }
3120: 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
3130: 65 20 6e 65 77 20 73 65 72 69 61 6c 69 7a 65 64  e new serialized
3140: 20 76 61 72 69 6e 74 20 74 6f 20 74 68 65 20 65   varint to the e
3150: 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 20  nd of the list. 
3160: 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74 61 20 2b 3d  */.  p->nData +=
3170: 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
3180: 61 72 69 6e 74 28 26 70 2d 3e 61 44 61 74 61 5b  arint(&p->aData[
3190: 70 2d 3e 6e 44 61 74 61 5d 2c 20 69 29 3b 0a 20  p->nData], i);. 
31a0: 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61   p->aData[p->nDa
31b0: 74 61 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 2a 70  ta] = '\0';.  *p
31c0: 70 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  p = p;.  return 
31d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
31e0: 0a 2a 2a 20 41 64 64 20 61 20 64 6f 63 69 64 2f  .** Add a docid/
31f0: 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69 6f 6e 20  column/position 
3200: 65 6e 74 72 79 20 74 6f 20 61 20 50 65 6e 64 69  entry to a Pendi
3210: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65  ngList structure
3220: 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73  . Non-zero.** is
3230: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
3240: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73 71   structure is sq
3250: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 65 64 20  lite3_realloced 
3260: 61 73 20 70 61 72 74 20 6f 66 20 61 64 64 69 6e  as part of addin
3270: 67 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 2e 20  g.** the entry. 
3280: 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e  Otherwise, zero.
3290: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
32a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
32b0: 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51  pRc is set to SQ
32c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72  LITE_NOMEM befor
32d0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
32e0: 5a 65 72 6f 20 69 73 20 61 6c 77 61 79 73 20 72  Zero is always r
32f0: 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
3300: 63 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  case. Otherwise,
3310: 20 69 66 20 6e 6f 20 4f 4f 4d 20 65 72 72 6f 72   if no OOM error
3320: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
3330: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
3340: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
3350: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73  t fts3PendingLis
3360: 74 41 70 70 65 6e 64 28 0a 20 20 50 65 6e 64 69  tAppend(.  Pendi
3370: 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20  ngList **pp,    
3380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
3390: 2f 4f 55 54 3a 20 50 65 6e 64 69 6e 67 4c 69 73  /OUT: PendingLis
33a0: 74 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  t structure */. 
33b0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
33c0: 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20  Docid,          
33d0: 20 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20 65 6e   /* Docid for en
33e0: 74 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  try to add */.  
33f0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43  sqlite3_int64 iC
3400: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
3410: 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 65 6e  /* Column for en
3420: 74 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  try to add */.  
3430: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50  sqlite3_int64 iP
3440: 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
3450: 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
3460: 65 72 6d 20 66 6f 72 20 65 6e 74 72 79 20 74 6f  erm for entry to
3470: 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   add */.  int *p
3480: 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
3490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
34a0: 3a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  : Return code */
34b0: 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73  .){.  PendingLis
34c0: 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 6e  t *p = *pp;.  in
34d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 20  ;..  assert( !p 
34f0: 7c 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64  || p->iLastDocid
3500: 3c 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20 69  <=iDocid );..  i
3510: 66 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73  f( !p || p->iLas
3520: 74 44 6f 63 69 64 21 3d 69 44 6f 63 69 64 20 29  tDocid!=iDocid )
3530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
3540: 74 36 34 20 69 44 65 6c 74 61 20 3d 20 69 44 6f  t64 iDelta = iDo
3550: 63 69 64 20 2d 20 28 70 20 3f 20 70 2d 3e 69 4c  cid - (p ? p->iL
3560: 61 73 74 44 6f 63 69 64 20 3a 20 30 29 3b 0a 20  astDocid : 0);. 
3570: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
3580: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 44 61    assert( p->nDa
3590: 74 61 3c 70 2d 3e 6e 53 70 61 63 65 20 29 3b 0a  ta<p->nSpace );.
35a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
35b0: 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d  >aData[p->nData]
35c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
35d0: 6e 44 61 74 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nData++;.    }. 
35e0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
35f0: 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64  !=(rc = fts3Pend
3600: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
3610: 69 6e 74 28 26 70 2c 20 69 44 65 6c 74 61 29 29  int(&p, iDelta))
3620: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
3630: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
3640: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
3650: 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 2d 31  p->iLastCol = -1
3660: 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f  ;.    p->iLastPo
3670: 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 69 4c  s = 0;.    p->iL
3680: 61 73 74 44 6f 63 69 64 20 3d 20 69 44 6f 63 69  astDocid = iDoci
3690: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  d;.  }.  if( iCo
36a0: 6c 3e 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 43  l>0 && p->iLastC
36b0: 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  ol!=iCol ){.    
36c0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
36d0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
36e0: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
36f0: 28 26 70 2c 20 31 29 29 0a 20 20 20 20 20 7c 7c  (&p, 1)).     ||
3700: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
3710: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73  = fts3PendingLis
3720: 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  tAppendVarint(&p
3730: 2c 20 69 43 6f 6c 29 29 0a 20 20 20 20 29 7b 0a  , iCol)).    ){.
3740: 20 20 20 20 20 20 67 6f 74 6f 20 70 65 6e 64 69        goto pendi
3750: 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74  nglistappend_out
3760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
3770: 4c 61 73 74 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a  LastCol = iCol;.
3780: 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73 20      p->iLastPos 
3790: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 0;.  }.  if( i
37a0: 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  Col>=0 ){.    as
37b0: 73 65 72 74 28 20 69 50 6f 73 3e 70 2d 3e 69 4c  sert( iPos>p->iL
37c0: 61 73 74 50 6f 73 20 7c 7c 20 28 69 50 6f 73 3d  astPos || (iPos=
37d0: 3d 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 50 6f  =0 && p->iLastPo
37e0: 73 3d 3d 30 29 20 29 3b 0a 20 20 20 20 72 63 20  s==0) );.    rc 
37f0: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73  = fts3PendingLis
3800: 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  tAppendVarint(&p
3810: 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e 69 4c 61 73  , 2+iPos-p->iLas
3820: 74 50 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 72  tPos);.    if( r
3830: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3840: 20 20 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f        p->iLastPo
3850: 73 20 3d 20 69 50 6f 73 3b 0a 20 20 20 20 7d 0a  s = iPos;.    }.
3860: 20 20 7d 0a 0a 20 70 65 6e 64 69 6e 67 6c 69 73    }.. pendinglis
3870: 74 61 70 70 65 6e 64 5f 6f 75 74 3a 0a 20 20 2a  tappend_out:.  *
3880: 70 52 63 20 3d 20 72 63 3b 0a 20 20 69 66 28 20  pRc = rc;.  if( 
3890: 70 21 3d 2a 70 70 20 29 7b 0a 20 20 20 20 2a 70  p!=*pp ){.    *p
38a0: 70 20 3d 20 70 3b 0a 20 20 20 20 72 65 74 75 72  p = p;.    retur
38b0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
38c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f  n 0;.}../*.** To
38d0: 6b 65 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d 74  kenize the nul-t
38e0: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
38f0: 20 7a 54 65 78 74 20 61 6e 64 20 61 64 64 20 61   zText and add a
3900: 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68 65  ll tokens to the
3910: 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  .** pending-term
3920: 73 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 54 68  s hash-table. Th
3930: 65 20 64 6f 63 69 64 20 75 73 65 64 20 69 73 20  e docid used is 
3940: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 73  that currently s
3950: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e 69  tored in.** p->i
3960: 50 72 65 76 44 6f 63 69 64 2c 20 61 6e 64 20 74  PrevDocid, and t
3970: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65  he column is spe
3980: 63 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65  cified by argume
3990: 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49  nt iCol..**.** I
39a0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
39b0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
39c0: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
39d0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
39e0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
39f0: 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54  int fts3PendingT
3a00: 65 72 6d 73 41 64 64 28 46 74 73 33 54 61 62 6c  ermsAdd(Fts3Tabl
3a10: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
3a20: 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69 43 6f   *zText, int iCo
3a30: 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  l){.  int rc;.  
3a40: 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 69 6e  int iStart;.  in
3a50: 74 20 69 45 6e 64 3b 0a 20 20 69 6e 74 20 69 50  t iEnd;.  int iP
3a60: 6f 73 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73  os;..  char cons
3a70: 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74  t *zToken;.  int
3a80: 20 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69   nToken;..  sqli
3a90: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  te3_tokenizer *p
3aa0: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70  Tokenizer = p->p
3ab0: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c  Tokenizer;.  sql
3ac0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
3ad0: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
3ae0: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  dule = pTokenize
3af0: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71  r->pModule;.  sq
3b00: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
3b10: 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  cursor *pCsr;.  
3b20: 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71 6c  int (*xNext)(sql
3b30: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
3b40: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a  ursor *pCursor,.
3b50: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
3b60: 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74  **,int*,int*,int
3b70: 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65  *,int*);..  asse
3b80: 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26  rt( pTokenizer &
3b90: 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20  & pModule );..  
3ba0: 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f  rc = pModule->xO
3bb0: 70 65 6e 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20  pen(pTokenizer, 
3bc0: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72  zText, -1, &pCsr
3bd0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3be0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
3bf0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
3c00: 43 73 72 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 20  Csr->pTokenizer 
3c10: 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 0a 20  = pTokenizer;.. 
3c20: 20 78 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65   xNext = pModule
3c30: 2d 3e 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65  ->xNext;.  while
3c40: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a  ( SQLITE_OK==rc.
3c50: 20 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f        && SQLITE_
3c60: 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28  OK==(rc = xNext(
3c70: 70 43 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26  pCsr, &zToken, &
3c80: 6e 54 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c  nToken, &iStart,
3c90: 20 26 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a   &iEnd, &iPos)).
3ca0: 20 20 29 7b 0a 20 20 20 20 50 65 6e 64 69 6e 67    ){.    Pending
3cb0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
3cc0: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 73 20 63    /* Positions c
3cd0: 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69 76  annot be negativ
3ce0: 65 3b 20 77 65 20 75 73 65 20 2d 31 20 61 73 20  e; we use -1 as 
3cf0: 61 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 6e 74  a terminator int
3d00: 65 72 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20  ernally..    ** 
3d10: 54 6f 6b 65 6e 73 20 6d 75 73 74 20 68 61 76 65  Tokens must have
3d20: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67   a non-zero leng
3d30: 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  th..    */.    i
3d40: 66 28 20 69 50 6f 73 3c 30 20 7c 7c 20 21 7a 54  f( iPos<0 || !zT
3d50: 6f 6b 65 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d  oken || nToken<=
3d60: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
3d70: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
3d80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3d90: 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 28 50  ..    pList = (P
3da0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73  endingList *)fts
3db0: 33 48 61 73 68 46 69 6e 64 28 26 70 2d 3e 70 65  3HashFind(&p->pe
3dc0: 6e 64 69 6e 67 54 65 72 6d 73 2c 20 7a 54 6f 6b  ndingTerms, zTok
3dd0: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
3de0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
3df0: 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
3e00: 61 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e 6e  ata -= (pList->n
3e10: 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20  Data + nToken + 
3e20: 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45  sizeof(Fts3HashE
3e30: 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lem));.    }.   
3e40: 20 69 66 28 20 66 74 73 33 50 65 6e 64 69 6e 67   if( fts3Pending
3e50: 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c 69 73  ListAppend(&pLis
3e60: 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  t, p->iPrevDocid
3e70: 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 72  , iCol, iPos, &r
3e80: 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  c) ){.      if( 
3e90: 70 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49  pList==fts3HashI
3ea0: 6e 73 65 72 74 28 26 70 2d 3e 70 65 6e 64 69 6e  nsert(&p->pendin
3eb0: 67 54 65 72 6d 73 2c 20 7a 54 6f 6b 65 6e 2c 20  gTerms, zToken, 
3ec0: 6e 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20 29  nToken, pList) )
3ed0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c  {.        /* Mal
3ee0: 6c 6f 63 20 66 61 69 6c 65 64 20 77 68 69 6c 65  loc failed while
3ef0: 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e   inserting the n
3f00: 65 77 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63  ew entry. This c
3f10: 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  an only .       
3f20: 20 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74 68   ** happen if th
3f30: 65 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76 69  ere was no previ
3f40: 6f 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ous entry for th
3f50: 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20 20  is token..      
3f60: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
3f70: 65 72 74 28 20 30 3d 3d 66 74 73 33 48 61 73 68  ert( 0==fts3Hash
3f80: 46 69 6e 64 28 26 70 2d 3e 70 65 6e 64 69 6e 67  Find(&p->pending
3f90: 54 65 72 6d 73 2c 20 7a 54 6f 6b 65 6e 2c 20 6e  Terms, zToken, n
3fa0: 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 20 20  Token) );.      
3fb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3fc0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 72  List);.        r
3fd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
3fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3ff0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4000: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
4010: 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 2b  ->nPendingData +
4020: 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20  = (pList->nData 
4030: 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f  + nToken + sizeo
4040: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29 29  f(Fts3HashElem))
4050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
4060: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
4070: 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Csr);.  return (
4080: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
4090: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
40a0: 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c  );.}../* .** Cal
40b0: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
40c0: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  on indicates tha
40d0: 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  t subsequent cal
40e0: 6c 73 20 74 6f 20 0a 2a 2a 20 66 74 73 33 50 65  ls to .** fts3Pe
40f0: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 29 20  ndingTermsAdd() 
4100: 61 72 65 20 74 6f 20 61 64 64 20 74 65 72 6d 2f  are to add term/
4110: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 70 61  position-list pa
4120: 69 72 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63  irs for the.** c
4130: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
4140: 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63  ocument with doc
4150: 69 64 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a 73 74  id iDocid..*/.st
4160: 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e  atic int fts3Pen
4170: 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 46  dingTermsDocid(F
4180: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c  ts3Table *p, sql
4190: 69 74 65 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  ite_int64 iDocid
41a0: 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65  ){.  /* TODO(she
41b0: 73 73 29 20 45 78 70 6c 6f 72 65 20 77 68 65 74  ss) Explore whet
41c0: 68 65 72 20 70 61 72 74 69 61 6c 6c 79 20 66 6c  her partially fl
41d0: 75 73 68 69 6e 67 20 74 68 65 20 62 75 66 66 65  ushing the buffe
41e0: 72 20 6f 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64  r on.  ** forced
41f0: 2d 66 6c 75 73 68 20 77 6f 75 6c 64 20 70 72 6f  -flush would pro
4200: 76 69 64 65 20 62 65 74 74 65 72 20 70 65 72 66  vide better perf
4210: 6f 72 6d 61 6e 63 65 2e 20 20 49 20 73 75 73 70  ormance.  I susp
4220: 65 63 74 20 74 68 61 74 20 69 66 0a 20 20 2a 2a  ect that if.  **
4230: 20 77 65 20 6f 72 64 65 72 65 64 20 74 68 65 20   we ordered the 
4240: 64 6f 63 6c 69 73 74 73 20 62 79 20 73 69 7a 65  doclists by size
4250: 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 68 65   and flushed the
4260: 20 6c 61 72 67 65 73 74 20 75 6e 74 69 6c 20 74   largest until t
4270: 68 65 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 77  he.  ** buffer w
4280: 61 73 20 68 61 6c 66 20 65 6d 70 74 79 2c 20 74  as half empty, t
4290: 68 61 74 20 77 6f 75 6c 64 20 6c 65 74 20 74 68  hat would let th
42a0: 65 20 6c 65 73 73 20 66 72 65 71 75 65 6e 74 20  e less frequent 
42b0: 74 65 72 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72  terms.  ** gener
42c0: 61 74 65 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69  ate longer docli
42d0: 73 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sts..  */.  if( 
42e0: 69 44 6f 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76  iDocid<=p->iPrev
42f0: 44 6f 63 69 64 20 7c 7c 20 70 2d 3e 6e 50 65 6e  Docid || p->nPen
4300: 64 69 6e 67 44 61 74 61 3e 46 54 53 33 5f 4d 41  dingData>FTS3_MA
4310: 58 5f 50 45 4e 44 49 4e 47 5f 44 41 54 41 20 29  X_PENDING_DATA )
4320: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
4330: 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
4340: 67 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a  gTermsFlush(p);.
4350: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
4360: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4370: 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65  c;.  }.  p->iPre
4380: 76 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b  vDocid = iDocid;
4390: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
43a0: 5f 4f 4b 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  _OK;.}..void sql
43b0: 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54  ite3Fts3PendingT
43c0: 65 72 6d 73 43 6c 65 61 72 28 46 74 73 33 54 61  ermsClear(Fts3Ta
43d0: 62 6c 65 20 2a 70 29 7b 0a 20 20 46 74 73 33 48  ble *p){.  Fts3H
43e0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
43f0: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 66 74 73 33    for(pElem=fts3
4400: 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e 70 65  HashFirst(&p->pe
4410: 6e 64 69 6e 67 54 65 72 6d 73 29 3b 20 70 45 6c  ndingTerms); pEl
4420: 65 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48 61  em; pElem=fts3Ha
4430: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
4440: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4450: 28 66 74 73 33 48 61 73 68 44 61 74 61 28 70 45  (fts3HashData(pE
4460: 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 66 74 73  lem));.  }.  fts
4470: 33 48 61 73 68 43 6c 65 61 72 28 26 70 2d 3e 70  3HashClear(&p->p
4480: 65 6e 64 69 6e 67 54 65 72 6d 73 29 3b 0a 20 20  endingTerms);.  
4490: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
44a0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
44b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44c0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55 70  alled by the xUp
44d0: 64 61 74 65 28 29 20 6d 65 74 68 6f 64 20 61 73  date() method as
44e0: 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45   part of an INSE
44f0: 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  RT.** operation.
4500: 20 49 74 20 61 64 64 73 20 65 6e 74 72 69 65 73   It adds entries
4510: 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
4520: 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  n the new record
4530: 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69   to the.** pendi
4540: 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61 62  ngTerms hash tab
4550: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  le..**.** Argume
4560: 6e 74 20 61 70 56 61 6c 20 69 73 20 74 68 65 20  nt apVal is the 
4570: 73 61 6d 65 20 61 73 20 74 68 65 20 73 69 6d 69  same as the simi
4580: 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61 72 67 75  larly named argu
4590: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 0a 2a  ment passed to.*
45a0: 2a 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61  * fts3InsertData
45b0: 28 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 44  (). Parameter iD
45c0: 6f 63 69 64 20 69 73 20 74 68 65 20 64 6f 63 69  ocid is the doci
45d0: 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77  d of the new row
45e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
45f0: 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28  fts3InsertTerms(
4600: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71  Fts3Table *p, sq
4610: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
4620: 56 61 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  Val){.  int i;  
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
4650: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
4660: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 70 2d 3e    for(i=2; i<p->
4670: 6e 43 6f 6c 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b  nColumn+2; i++){
4680: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4690: 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
46a0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
46b0: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
46c0: 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  i]);.    if( zTe
46d0: 78 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  xt ){.      int 
46e0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
46f0: 54 65 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78  TermsAdd(p, zTex
4700: 74 2c 20 69 2d 32 29 3b 0a 20 20 20 20 20 20 69  t, i-2);.      i
4710: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4720: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4730: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
4740: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4750: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4760: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4770: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
4780: 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d   the xUpdate() m
4790: 65 74 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53  ethod for an INS
47a0: 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ERT operation..*
47b0: 2a 20 54 68 65 20 61 70 56 61 6c 20 70 61 72 61  * The apVal para
47c0: 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
47d0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70  a copy of the ap
47e0: 56 61 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73  Val argument pas
47f0: 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65  sed by.** SQLite
4800: 20 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 28   to the xUpdate(
4810: 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a  ) method. i.e:.*
4820: 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20  *.**   apVal[0] 
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
4840: 6f 74 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45  ot used for INSE
4850: 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31  RT..**   apVal[1
4860: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
4870: 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61   rowid.**   apVa
4880: 6c 5b 32 5d 20 20 20 20 20 20 20 20 20 20 20 20  l[2]            
4890: 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73      Left-most us
48a0: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er-defined colum
48b0: 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20  n.**   ....**   
48c0: 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e  apVal[p->nColumn
48d0: 2b 31 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f  +1]     Right-mo
48e0: 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  st user-defined 
48f0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61  column.**   apVa
4900: 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20  l[p->nColumn+2] 
4910: 20 20 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d      Hidden colum
4920: 6e 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  n with same name
4930: 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61   as table.**   a
4940: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
4950: 33 5d 20 20 20 20 20 48 69 64 64 65 6e 20 22 64  3]     Hidden "d
4960: 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c  ocid" column (al
4970: 69 61 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a  ias for rowid).*
4980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
4990: 33 49 6e 73 65 72 74 44 61 74 61 28 0a 20 20 46  3InsertData(.  F
49a0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
49c0: 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61 62 6c  * Full-text tabl
49d0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
49e0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20  alue **apVal,   
49f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
4a00: 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73  of values to ins
4a10: 65 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ert */.  sqlite3
4a20: 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 20  _int64 *piDocid 
4a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4a40: 20 44 6f 63 69 64 20 66 6f 72 20 72 6f 77 20 6a   Docid for row j
4a50: 75 73 74 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ust inserted */.
4a60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
4a90: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
4aa0: 5f 73 74 6d 74 20 2a 70 43 6f 6e 74 65 6e 74 49  _stmt *pContentI
4ab0: 6e 73 65 72 74 3b 20 20 20 2f 2a 20 49 4e 53 45  nsert;   /* INSE
4ac0: 52 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e  RT INTO %_conten
4ad0: 74 20 56 41 4c 55 45 53 28 2e 2e 2e 29 20 2a 2f  t VALUES(...) */
4ae0: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
4af0: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  e statement hand
4b00: 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72  le used to inser
4b10: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
4b20: 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 74  %_content.  ** t
4b30: 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20 66 6f  able. The SQL fo
4b40: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
4b50: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
4b60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63   INSERT INTO %_c
4b70: 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 3f 2c  ontent VALUES(?,
4b80: 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20 2a 2a   ?, ?, ...).  **
4b90: 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65 6d  .  ** The statem
4ba0: 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e 20 27  ent features N '
4bb0: 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20 77 68  ?' variables, wh
4bc0: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
4bd0: 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20 2a 2a  ber of user.  **
4be0: 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
4bf0: 20 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62   in the FTS3 tab
4c00: 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66 6f 72  le, plus one for
4c10: 20 74 68 65 20 64 6f 63 69 64 20 66 69 65 6c 64   the docid field
4c20: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ..  */.  rc = ft
4c30: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
4c40: 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 2c  _CONTENT_INSERT,
4c50: 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74   &pContentInsert
4c60: 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  , &apVal[1]);.  
4c70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4c80: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
4c90: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
4ca0: 65 72 65 20 69 73 20 61 20 71 75 69 72 6b 20 68  ere is a quirk h
4cb0: 65 72 65 2e 20 54 68 65 20 75 73 65 72 73 20 49  ere. The users I
4cc0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20  NSERT statement 
4cd0: 6d 61 79 20 68 61 76 65 20 73 70 65 63 69 66 69  may have specifi
4ce0: 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c 75 65 20  ed.  ** a value 
4cf0: 66 6f 72 20 74 68 65 20 22 72 6f 77 69 64 22 20  for the "rowid" 
4d00: 66 69 65 6c 64 2c 20 66 6f 72 20 74 68 65 20 22  field, for the "
4d10: 64 6f 63 69 64 22 20 66 69 65 6c 64 2c 20 6f 72  docid" field, or
4d20: 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 20   for both..  ** 
4d30: 57 68 69 63 68 20 69 73 20 61 20 70 72 6f 62 6c  Which is a probl
4d40: 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f 77 69 64  em, since "rowid
4d50: 22 20 61 6e 64 20 22 64 6f 63 69 64 22 20 61 72  " and "docid" ar
4d60: 65 20 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68  e aliases for th
4d70: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
4d80: 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  e. For example:.
4d90: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45    **.  **   INSE
4da0: 52 54 20 49 4e 54 4f 20 66 74 73 33 74 62 6c 28  RT INTO fts3tbl(
4db0: 72 6f 77 69 64 2c 20 64 6f 63 69 64 29 20 56 41  rowid, docid) VA
4dc0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 2a 2a  LUES(1, 2);.  **
4dd0: 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33 2c 20 74  .  ** In FTS3, t
4de0: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
4df0: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
4e00: 74 6f 20 73 70 65 63 69 66 79 20 6e 6f 6e 2d 4e  to specify non-N
4e10: 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  ULL values.  ** 
4e20: 66 6f 72 20 62 6f 74 68 20 64 6f 63 69 64 20 61  for both docid a
4e30: 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 6f  nd some other ro
4e40: 77 69 64 20 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a  wid alias..  */.
4e50: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
4e60: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
4e70: 5f 74 79 70 65 28 61 70 56 61 6c 5b 33 2b 70 2d  _type(apVal[3+p-
4e80: 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20  >nColumn]) ){.  
4e90: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
4ea0: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
4eb0: 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 0a  _type(apVal[0]).
4ec0: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4e       && SQLITE_N
4ed0: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
4ee0: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d  ue_type(apVal[1]
4ef0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
4f00: 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63 69 64 20  * A rowid/docid 
4f10: 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20 20  conflict. */.   
4f20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4f30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
4f40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
4f50: 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f 6e 74 65  ind_value(pConte
4f60: 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20 61 70 56  ntInsert, 1, apV
4f70: 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d  al[3+p->nColumn]
4f80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
4f90: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4fa0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
4fb0: 45 78 65 63 75 74 65 20 74 68 65 20 73 74 61 74  Execute the stat
4fc0: 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20  ement to insert 
4fd0: 74 68 65 20 72 65 63 6f 72 64 2e 20 53 65 74 20  the record. Set 
4fe0: 2a 70 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20  *piDocid to the 
4ff0: 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63 69 64 20  .  ** new docid 
5000: 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20 20 73  value. .  */.  s
5010: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6f 6e  qlite3_step(pCon
5020: 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 20 20 72  tentInsert);.  r
5030: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
5040: 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74  t(pContentInsert
5050: 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69 64 20 3d  );..  *piDocid =
5060: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
5070: 73 65 72 74 5f 72 6f 77 69 64 28 70 2d 3e 64 62  sert_rowid(p->db
5080: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5090: 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }..../*.** Remov
50a0: 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  e all data from 
50b0: 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20  the FTS3 table. 
50c0: 43 6c 65 61 72 20 74 68 65 20 68 61 73 68 20 74  Clear the hash t
50d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  able containing.
50e0: 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  ** pending terms
50f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5100: 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 46 74  fts3DeleteAll(Ft
5110: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
5120: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5140: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
5150: 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74  ..  /* Discard t
5160: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
5170: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
5180: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
5190: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
51a0: 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
51b0: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
51c0: 65 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d 20  everything from 
51d0: 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 2c 20 25  the %_content, %
51e0: 5f 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f  _segments and %_
51f0: 73 65 67 64 69 72 20 74 61 62 6c 65 73 2e 20 2a  segdir tables. *
5200: 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
5210: 45 78 65 63 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Exec(p, SQL_DELE
5220: 54 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20  TE_ALL_CONTENT, 
5230: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
5240: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
5250: 63 20 3d 20 66 74 73 33 53 71 6c 45 78 65 63 28  c = fts3SqlExec(
5260: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
5270: 4c 5f 53 45 47 4d 45 4e 54 53 2c 20 30 29 3b 0a  L_SEGMENTS, 0);.
5280: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
5290: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
52a0: 63 20 3d 20 66 74 73 33 53 71 6c 45 78 65 63 28  c = fts3SqlExec(
52b0: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
52c0: 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20  L_SEGDIR, 0);.  
52d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
52e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
52f0: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65  t element in the
5300: 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69   apVal[] array i
5310: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
5320: 74 61 69 6e 20 74 68 65 20 64 6f 63 69 64 0a 2a  tain the docid.*
5330: 2a 20 28 61 6e 20 69 6e 74 65 67 65 72 29 20 6f  * (an integer) o
5340: 66 20 61 20 72 6f 77 20 61 62 6f 75 74 20 74 6f  f a row about to
5350: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 52 65 6d   be deleted. Rem
5360: 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73 20 66 72  ove all terms fr
5370: 6f 6d 20 74 68 65 0a 2a 2a 20 66 75 6c 6c 2d 74  om the.** full-t
5380: 65 78 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ext index..*/.st
5390: 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c  atic int fts3Del
53a0: 65 74 65 54 65 72 6d 73 28 46 74 73 33 54 61 62  eteTerms(Fts3Tab
53b0: 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  le *p, sqlite3_v
53c0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20  alue **apVal){. 
53d0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
53e0: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
53f0: 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  ;..  rc = fts3Sq
5400: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
5410: 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52  ECT_CONTENT_BY_R
5420: 4f 57 49 44 2c 20 26 70 53 65 6c 65 63 74 2c 20  OWID, &pSelect, 
5430: 61 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  apVal);.  if( rc
5440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5450: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
5460: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
5470: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
5480: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
5490: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 43  or(i=1; i<=p->nC
54a0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
54b0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
54c0: 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
54d0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
54e0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
54f0: 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ct, i);.        
5500: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
5510: 54 65 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78  TermsAdd(p, zTex
5520: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  t, -1);.        
5530: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5540: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
5550: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65  qlite3_reset(pSe
5560: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20  lect);.         
5570: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
5580: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5590: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
55a0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
55b0: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
55c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
55d0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
55e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
55f0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
5600: 61 72 61 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75  aration to accou
5610: 6e 74 20 66 6f 72 20 74 68 65 20 63 69 72 63 75  nt for the circu
5620: 6c 61 72 20 64 65 70 65 6e 64 65 6e 63 79 20 62  lar dependency b
5630: 65 74 77 65 65 6e 0a 2a 2a 20 66 75 6e 63 74 69  etween.** functi
5640: 6f 6e 73 20 66 74 73 33 53 65 67 6d 65 6e 74 4d  ons fts3SegmentM
5650: 65 72 67 65 28 29 20 61 6e 64 20 66 74 73 33 41  erge() and fts3A
5660: 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
5670: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
5680: 74 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  t fts3SegmentMer
5690: 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 2c 20  ge(Fts3Table *, 
56a0: 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  int);../* .** Th
56b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
56c0: 63 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65  cates a new leve
56d0: 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69  l iLevel index i
56e0: 6e 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62  n the segdir tab
56f0: 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  le..** Usually, 
5700: 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f  indexes are allo
5710: 63 61 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c  cated within a l
5720: 65 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c  evel sequentiall
5730: 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69  y starting.** wi
5740: 74 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c  th 0, so the all
5750: 6f 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20  ocated index is 
5760: 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
5770: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
5780: 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a  ned.** by:.**.**
5790: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64     SELECT max(id
57a0: 78 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72  x) FROM %_segdir
57b0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a   WHERE level = :
57c0: 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77  iLevel.**.** How
57d0: 65 76 65 72 2c 20 69 66 20 74 68 65 72 65 20 61  ever, if there a
57e0: 72 65 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f  re already FTS3_
57f0: 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65  MERGE_COUNT inde
5800: 78 65 73 20 61 74 20 74 68 65 20 72 65 71 75 65  xes at the reque
5810: 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74  sted.** level, t
5820: 68 65 79 20 61 72 65 20 6d 65 72 67 65 64 20 69  hey are merged i
5830: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76  nto a single lev
5840: 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65  el (iLevel+1) se
5850: 67 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a  gment and the .*
5860: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  * allocated inde
5870: 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  x is 0..**.** If
5880: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69   successful, *pi
5890: 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
58a0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  e allocated inde
58b0: 78 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54  x slot and SQLIT
58c0: 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E_OK.** returned
58d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
58e0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
58f0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
5900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
5910: 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
5920: 64 78 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  dx(Fts3Table *p,
5930: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 69 6e 74   int iLevel, int
5940: 20 2a 70 69 49 64 78 29 7b 0a 20 20 69 6e 74 20   *piIdx){.  int 
5950: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
5960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
5970: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
5980: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e  sqlite3_stmt *pN
5990: 65 78 74 49 64 78 3b 20 20 20 20 20 20 20 20 20  extIdx;         
59a0: 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 6e 65 78  /* Query for nex
59b0: 74 20 69 64 78 20 61 74 20 6c 65 76 65 6c 20 69  t idx at level i
59c0: 4c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  Level */.  int i
59d0: 4e 65 78 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Next = 0;       
59e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
59f0: 73 75 6c 74 20 6f 66 20 71 75 65 72 79 20 70 4e  sult of query pN
5a00: 65 78 74 49 64 78 20 2a 2f 0a 0a 20 20 2f 2a 20  extIdx */..  /* 
5a10: 53 65 74 20 76 61 72 69 61 62 6c 65 20 69 4e 65  Set variable iNe
5a20: 78 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 61  xt to the next a
5a30: 76 61 69 6c 61 62 6c 65 20 73 65 67 64 69 72 20  vailable segdir 
5a40: 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69  index at level i
5a50: 4c 65 76 65 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d  Level. */.  rc =
5a60: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
5a70: 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
5a80: 5f 49 4e 44 45 58 2c 20 26 70 4e 65 78 74 49 64  _INDEX, &pNextId
5a90: 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  x, 0);.  if( rc=
5aa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5ab0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
5ac0: 6e 74 28 70 4e 65 78 74 49 64 78 2c 20 31 2c 20  nt(pNextIdx, 1, 
5ad0: 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28  iLevel);.    if(
5ae0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
5af0: 69 74 65 33 5f 73 74 65 70 28 70 4e 65 78 74 49  ite3_step(pNextI
5b00: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4e 65  dx) ){.      iNe
5b10: 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  xt = sqlite3_col
5b20: 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74 49 64 78  umn_int(pNextIdx
5b30: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
5b40: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
5b50: 65 74 28 70 4e 65 78 74 49 64 78 29 3b 0a 20 20  et(pNextIdx);.  
5b60: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
5b70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5b80: 20 49 66 20 69 4e 65 78 74 20 69 73 20 46 54 53   If iNext is FTS
5b90: 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20 69  3_MERGE_COUNT, i
5ba0: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 6c  ndicating that l
5bb0: 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 73 20 61  evel iLevel is a
5bc0: 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 66 75  lready.    ** fu
5bd0: 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65  ll, merge all se
5be0: 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76 65 6c 20  gments in level 
5bf0: 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61 20 73 69  iLevel into a si
5c00: 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31 0a 20 20  ngle iLevel+1.  
5c10: 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 61 6e 64    ** segment and
5c20: 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65 77 6c 79   allocate (newly
5c30: 20 66 72 65 65 64 29 20 69 6e 64 65 78 20 30 20   freed) index 0 
5c40: 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e  at level iLevel.
5c50: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
5c60: 2a 2a 20 69 66 20 69 4e 65 78 74 20 69 73 20 6c  ** if iNext is l
5c70: 65 73 73 20 74 68 61 6e 20 46 54 53 33 5f 4d 45  ess than FTS3_ME
5c80: 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c 6c 6f 63  RGE_COUNT, alloc
5c90: 61 74 65 20 69 6e 64 65 78 20 69 4e 65 78 74 2e  ate index iNext.
5ca0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5cb0: 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d 45 52 47  iNext>=FTS3_MERG
5cc0: 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20 20 20  E_COUNT ){.     
5cd0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e   rc = fts3Segmen
5ce0: 74 4d 65 72 67 65 28 70 2c 20 69 4c 65 76 65 6c  tMerge(p, iLevel
5cf0: 29 3b 0a 20 20 20 20 20 20 2a 70 69 49 64 78 20  );.      *piIdx 
5d00: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
5d10: 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 69        *piIdx = i
5d20: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
5d30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5d40: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
5d50: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
5d60: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
5d70: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ument to the nex
5d80: 74 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  t term in the.**
5d90: 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73 75 63   segment. If suc
5da0: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
5db0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
5dc0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  If there is no n
5dd0: 65 78 74 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c  ext term,.** SQL
5de0: 49 54 45 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 77  ITE_DONE. Otherw
5df0: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
5e00: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
5e10: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
5e20: 52 65 61 64 65 72 4e 65 78 74 28 46 74 73 33 53  ReaderNext(Fts3S
5e30: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
5e40: 72 29 7b 0a 20 20 63 68 61 72 20 2a 70 4e 65 78  r){.  char *pNex
5e50: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5e60: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
5e70: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
5e80: 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  t nPrefix;      
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ea0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
5eb0: 20 69 6e 20 74 65 72 6d 20 70 72 65 66 69 78 20   in term prefix 
5ec0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78  */.  int nSuffix
5ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5ef0: 66 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20  f bytes in term 
5f00: 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69 66 28  suffix */..  if(
5f10: 20 21 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c   !pReader->aDocl
5f20: 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 65 78 74  ist ){.    pNext
5f30: 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64   = pReader->aNod
5f40: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
5f50: 70 4e 65 78 74 20 3d 20 26 70 52 65 61 64 65 72  pNext = &pReader
5f60: 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64  ->aDoclist[pRead
5f70: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20  er->nDoclist];. 
5f80: 20 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65 78 74   }..  if( !pNext
5f90: 20 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52 65 61   || pNext>=&pRea
5fa0: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
5fb0: 65 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a 20 20  er->nNode] ){.  
5fc0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
5fd0: 28 20 21 70 52 65 61 64 65 72 2d 3e 70 53 74 6d  ( !pReader->pStm
5fe0: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64  t ){.      pRead
5ff0: 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20  er->aNode = 0;. 
6000: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6010: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
6020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
6030: 65 70 28 70 52 65 61 64 65 72 2d 3e 70 53 74 6d  ep(pReader->pStm
6040: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
6050: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
6060: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f      pReader->aNo
6070: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  de = 0;.      re
6080: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
6090: 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
60a0: 4b 20 3a 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  K : rc);.    }. 
60b0: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64     pReader->nNod
60c0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
60d0: 6d 6e 5f 62 79 74 65 73 28 70 52 65 61 64 65 72  mn_bytes(pReader
60e0: 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  ->pStmt, 0);.   
60f0: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20   pReader->aNode 
6100: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
6110: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 52  3_column_blob(pR
6120: 65 61 64 65 72 2d 3e 70 53 74 6d 74 2c 20 30 29  eader->pStmt, 0)
6130: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52  ;.    pNext = pR
6140: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20  eader->aNode;.  
6150: 7d 0a 20 20 0a 20 20 70 4e 65 78 74 20 2b 3d 20  }.  .  pNext += 
6160: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
6170: 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e  rint32(pNext, &n
6180: 50 72 65 66 69 78 29 3b 0a 20 20 70 4e 65 78 74  Prefix);.  pNext
6190: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
61a0: 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78 74  etVarint32(pNext
61b0: 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a 0a 20 20  , &nSuffix);..  
61c0: 69 66 28 20 6e 50 72 65 66 69 78 2b 6e 53 75 66  if( nPrefix+nSuf
61d0: 66 69 78 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65  fix>pReader->nTe
61e0: 72 6d 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  rmAlloc ){.    i
61f0: 6e 74 20 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66  nt nNew = (nPref
6200: 69 78 2b 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20  ix+nSuffix)*2;. 
6210: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20     char *zNew = 
6220: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
6230: 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20  pReader->zTerm, 
6240: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21  nNew);.    if( !
6250: 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65  zNew ){.      re
6260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6270: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  M;.    }.    pRe
6280: 61 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e  ader->zTerm = zN
6290: 65 77 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d  ew;.    pReader-
62a0: 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e  >nTermAlloc = nN
62b0: 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  ew;.  }.  memcpy
62c0: 28 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d  (&pReader->zTerm
62d0: 5b 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78 74  [nPrefix], pNext
62e0: 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 52  , nSuffix);.  pR
62f0: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e  eader->nTerm = n
6300: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a  Prefix+nSuffix;.
6310: 20 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66    pNext += nSuff
6320: 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73  ix;.  pNext += s
6330: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
6340: 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70 52  int32(pNext, &pR
6350: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29  eader->nDoclist)
6360: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 78  ;.  assert( pNex
6370: 74 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  t<&pReader->aNod
6380: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  e[pReader->nNode
6390: 5d 20 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e  ] );.  pReader->
63a0: 61 44 6f 63 6c 69 73 74 20 3d 20 70 4e 65 78 74  aDoclist = pNext
63b0: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66  ;.  pReader->pOf
63c0: 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20  fsetList = 0;.  
63d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
63f0: 68 65 20 53 65 67 52 65 61 64 65 72 20 74 6f 20  he SegReader to 
6400: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
6410: 73 74 20 64 6f 63 69 64 20 69 6e 20 74 68 65 20  st docid in the 
6420: 64 6f 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74  doclist associat
6430: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 63  ed.** with the c
6440: 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a  urrent term..*/.
6450: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
6460: 53 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f  SegReaderFirstDo
6470: 63 69 64 28 46 74 73 33 53 65 67 52 65 61 64 65  cid(Fts3SegReade
6480: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69  r *pReader){.  i
6490: 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
64a0: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
64b0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  t );.  assert( !
64c0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
64d0: 4c 69 73 74 20 29 3b 0a 20 20 6e 20 3d 20 73 71  List );.  n = sq
64e0: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
64f0: 6e 74 28 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  nt(pReader->aDoc
6500: 6c 69 73 74 2c 20 26 70 52 65 61 64 65 72 2d 3e  list, &pReader->
6510: 69 44 6f 63 69 64 29 3b 0a 20 20 70 52 65 61 64  iDocid);.  pRead
6520: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
6530: 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  = &pReader->aDoc
6540: 6c 69 73 74 5b 6e 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  list[n];.}../*.*
6550: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 53 65  * Advance the Se
6560: 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74  gReader to point
6570: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63   to the next doc
6580: 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  id in the doclis
6590: 74 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  t.** associated 
65a0: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
65b0: 20 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   term..** .** If
65c0: 20 61 72 67 75 6d 65 6e 74 73 20 70 70 4f 66 66   arguments ppOff
65d0: 73 65 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66  setList and pnOf
65e0: 66 73 65 74 4c 69 73 74 20 61 72 65 20 6e 6f 74  fsetList are not
65f0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20   NULL, then .** 
6600: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69 73  *ppOffsetList is
6610: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
6620: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
6630: 6e 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a  n-offset list.**
6640: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
6650: 65 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65  entry (i.e. imme
6660: 64 69 61 74 65 6c 79 20 70 61 73 74 20 74 68 65  diately past the
6670: 20 64 6f 63 69 64 20 76 61 72 69 6e 74 29 2e 0a   docid varint)..
6680: 2a 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74  ** *pnOffsetList
6690: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
66a0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 74  ength of the set
66b0: 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65   of column-offse
66c0: 74 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20  t.** lists, not 
66d0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75  including the nu
66e0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
66f0: 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  e. For example:.
6700: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6710: 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
6720: 44 6f 63 69 64 28 0a 20 20 46 74 73 33 53 65 67  Docid(.  Fts3Seg
6730: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 2c  Reader *pReader,
6740: 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 66 66 73  .  char **ppOffs
6750: 65 74 4c 69 73 74 2c 0a 20 20 69 6e 74 20 2a 70  etList,.  int *p
6760: 6e 4f 66 66 73 65 74 4c 69 73 74 0a 29 7b 0a 20  nOffsetList.){. 
6770: 20 63 68 61 72 20 2a 70 20 3d 20 70 52 65 61 64   char *p = pRead
6780: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b  er->pOffsetList;
6790: 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a  .  char c = 0;..
67a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 70 20 63    /* Pointer p c
67b0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
67c0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
67d0: 65 20 6f 66 20 61 6e 20 6f 66 66 73 65 74 20 6c  e of an offset l
67e0: 69 73 74 2e 20 54 68 65 0a 20 20 2a 2a 20 66 6f  ist. The.  ** fo
67f0: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6c 69 6e 65  llowing two line
6800: 73 20 61 64 76 61 6e 63 65 20 69 74 20 74 6f 20  s advance it to 
6810: 70 6f 69 6e 74 20 6f 6e 65 20 62 79 74 65 20 70  point one byte p
6820: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20  ast the end of. 
6830: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 6f 66 66   ** the same off
6840: 73 65 74 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  set list..  */. 
6850: 20 77 68 69 6c 65 28 20 2a 70 20 7c 20 63 20 29   while( *p | c )
6860: 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30   c = *p++ & 0x80
6870: 3b 0a 20 20 70 2b 2b 3b 0a 0a 20 20 2f 2a 20 49  ;.  p++;..  /* I
6880: 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
6890: 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75 74 20  late the output 
68a0: 76 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 61  variables with a
68b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64 20   pointer to and 
68c0: 74 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  the.  ** size of
68d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 66   the previous of
68e0: 66 73 65 74 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  fset-list..  */.
68f0: 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c 69    if( ppOffsetLi
6900: 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 4f 66 66  st ){.    *ppOff
6910: 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65  setList = pReade
6920: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a  r->pOffsetList;.
6930: 20 20 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73      *pnOffsetLis
6940: 74 20 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 52  t = (int)(p - pR
6950: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
6960: 73 74 20 2d 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  st - 1);.  }..  
6970: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
6980: 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 20  no more entries 
6990: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20  in the doclist, 
69a0: 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73 74 20  set pOffsetList 
69b0: 74 6f 0a 20 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74  to.  ** NULL. Ot
69c0: 68 65 72 77 69 73 65 2c 20 73 65 74 20 46 74 73  herwise, set Fts
69d0: 33 53 65 67 52 65 61 64 65 72 2e 69 44 6f 63 69  3SegReader.iDoci
69e0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f  d to the next do
69f0: 63 69 64 20 61 6e 64 0a 20 20 2a 2a 20 46 74 73  cid and.  ** Fts
6a00: 33 53 65 67 52 65 61 64 65 72 2e 70 4f 66 66 73  3SegReader.pOffs
6a10: 65 74 4c 69 73 74 20 74 6f 20 70 6f 69 6e 74 20  etList to point 
6a20: 74 6f 20 74 68 65 20 6e 65 78 74 20 6f 66 66 73  to the next offs
6a30: 65 74 20 6c 69 73 74 20 62 65 66 6f 72 65 0a 20  et list before. 
6a40: 20 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20   ** returning.. 
6a50: 20 2a 2f 0a 20 20 69 66 28 20 70 3e 3d 26 70 52   */.  if( p>=&pR
6a60: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
6a70: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
6a80: 74 5d 20 29 7b 0a 20 20 20 20 70 52 65 61 64 65  t] ){.    pReade
6a90: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
6aa0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6ab0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
6ac0: 44 65 6c 74 61 3b 0a 20 20 20 20 70 52 65 61 64  Delta;.    pRead
6ad0: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
6ae0: 3d 20 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73  = p + sqlite3Fts
6af0: 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69  3GetVarint(p, &i
6b00: 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 52 65 61  Delta);.    pRea
6b10: 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b 3d 20 69  der->iDocid += i
6b20: 44 65 6c 74 61 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Delta;.  }.}../*
6b30: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c  .** Free all all
6b40: 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
6b50: 74 65 64 20 77 69 74 68 20 74 68 65 20 69 74 65  ted with the ite
6b60: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
6b70: 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61  the .** second a
6b80: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
6b90: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
6ba0: 65 61 64 65 72 46 72 65 65 28 46 74 73 33 54 61  eaderFree(Fts3Ta
6bb0: 62 6c 65 20 2a 70 2c 20 46 74 73 33 53 65 67 52  ble *p, Fts3SegR
6bc0: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b  eader *pReader){
6bd0: 0a 20 20 69 66 28 20 70 52 65 61 64 65 72 20 29  .  if( pReader )
6be0: 7b 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65  {.    if( pReade
6bf0: 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  r->pStmt ){.    
6c00: 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 6c 65    /* Move the le
6c10: 61 66 2d 72 61 6e 67 65 20 53 45 4c 45 43 54 20  af-range SELECT 
6c20: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
6c30: 20 61 4c 65 61 76 65 73 53 74 6d 74 5b 5d 20 61   aLeavesStmt[] a
6c40: 72 72 61 79 2c 0a 20 20 20 20 20 20 2a 2a 20 73  rray,.      ** s
6c50: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
6c60: 20 72 65 75 73 65 64 20 77 68 65 6e 20 72 65 71   reused when req
6c70: 75 69 72 65 64 20 62 79 20 61 6e 6f 74 68 65 72  uired by another
6c80: 20 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f   query..      */
6c90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6ca0: 2d 3e 6e 4c 65 61 76 65 73 53 74 6d 74 3c 70 2d  ->nLeavesStmt<p-
6cb0: 3e 6e 4c 65 61 76 65 73 54 6f 74 61 6c 20 29 3b  >nLeavesTotal );
6cc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6cd0: 65 73 65 74 28 70 52 65 61 64 65 72 2d 3e 70 53  eset(pReader->pS
6ce0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  tmt);.      p->a
6cf0: 4c 65 61 76 65 73 53 74 6d 74 5b 70 2d 3e 6e 4c  LeavesStmt[p->nL
6d00: 65 61 76 65 73 53 74 6d 74 2b 2b 5d 20 3d 20 70  eavesStmt++] = p
6d10: 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  Reader->pStmt;. 
6d20: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6d30: 5f 66 72 65 65 28 70 52 65 61 64 65 72 2d 3e 7a  _free(pReader->z
6d40: 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Term);.    sqlit
6d50: 65 33 5f 66 72 65 65 28 70 52 65 61 64 65 72 29  e3_free(pReader)
6d60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
6d70: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
6d80: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 2e 0a  gReader object..
6d90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
6da0: 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 0a  s3SegReaderNew(.
6db0: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
6de0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
6df0: 6e 74 20 69 41 67 65 2c 20 20 20 20 20 20 20 20  nt iAge,        
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6e10: 2a 20 53 65 67 6d 65 6e 74 20 22 61 67 65 22 2e  * Segment "age".
6e20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
6e30: 74 36 34 20 69 53 74 61 72 74 4c 65 61 66 2c 20  t64 iStartLeaf, 
6e40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
6e50: 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65 20  eaf to traverse 
6e60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
6e70: 36 34 20 69 45 6e 64 4c 65 61 66 2c 20 20 20 20  64 iEndLeaf,    
6e80: 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6c 65       /* Final le
6e90: 61 66 20 74 6f 20 74 72 61 76 65 72 73 65 20 2a  af to traverse *
6ea0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
6eb0: 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20  4 iEndBlock,    
6ec0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 62 6c 6f      /* Final blo
6ed0: 63 6b 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  ck of segment */
6ee0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6ef0: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
6f00: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
6f10: 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64  taining root nod
6f20: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  e */.  int nRoot
6f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6f40: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
6f50: 66 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  f buffer contain
6f60: 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  ing root node */
6f70: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
6f80: 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20   **ppReader     
6f90: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63     /* OUT: Alloc
6fa0: 61 74 65 64 20 46 74 73 33 53 65 67 52 65 61 64  ated Fts3SegRead
6fb0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  er */.){.  int r
6fc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
6fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6fe0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
6ff0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
7000: 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20 2f  eader;         /
7010: 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
7020: 64 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65  d SegReader obje
7030: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ct */.  int nExt
7040: 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
7050: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
7060: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65 67   to allocate seg
7070: 6d 65 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20 2a  ment root node *
7080: 2f 0a 0a 20 20 69 66 28 20 69 53 74 61 72 74 4c  /..  if( iStartL
7090: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 45  eaf==0 ){.    nE
70a0: 78 74 72 61 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20  xtra = nRoot;.  
70b0: 7d 0a 0a 20 20 70 52 65 61 64 65 72 20 3d 20 28  }..  pReader = (
70c0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
70d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
70e0: 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61  izeof(Fts3SegRea
70f0: 64 65 72 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a  der) + nExtra);.
7100: 20 20 69 66 28 20 21 70 52 65 61 64 65 72 20 29    if( !pReader )
7110: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7120: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
7130: 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c   memset(pReader,
7140: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53   0, sizeof(Fts3S
7150: 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 70 52  egReader));.  pR
7160: 65 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f  eader->iStartBlo
7170: 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 3b  ck = iStartLeaf;
7180: 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78  .  pReader->iIdx
7190: 20 3d 20 69 41 67 65 3b 0a 20 20 70 52 65 61 64   = iAge;.  pRead
71a0: 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d 20  er->iEndBlock = 
71b0: 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69 66  iEndBlock;..  if
71c0: 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 20 20 20  ( nExtra ){.    
71d0: 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 73 65  /* The entire se
71e0: 67 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  gment is stored 
71f0: 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  in the root node
7200: 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61 64 65 72  . */.    pReader
7210: 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68 61 72 20  ->aNode = (char 
7220: 2a 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20  *)&pReader[1];. 
7230: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64     pReader->nNod
7240: 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d  e = nRoot;.    m
7250: 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61  emcpy(pReader->a
7260: 4e 6f 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f  Node, zRoot, nRo
7270: 6f 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ot);.  }else{.  
7280: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 65 78 74    /* If the text
7290: 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
72a0: 65 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65  ement to iterate
72b0: 20 74 68 72 6f 75 67 68 20 61 20 63 6f 6e 74 69   through a conti
72c0: 67 75 6f 75 73 0a 20 20 20 20 2a 2a 20 73 65 74  guous.    ** set
72d0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
72e0: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
72f0: 62 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ble has not yet 
7300: 62 65 65 6e 20 63 6f 6d 70 6f 73 65 64 2c 0a 20  been composed,. 
7310: 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 65 20 69 74     ** compose it
7320: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
7330: 20 69 66 28 20 21 70 2d 3e 7a 53 65 6c 65 63 74   if( !p->zSelect
7340: 4c 65 61 76 65 73 20 29 7b 0a 20 20 20 20 20 20  Leaves ){.      
7350: 70 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76 65 73  p->zSelectLeaves
7360: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7370: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53  tf(.          "S
7380: 45 4c 45 43 54 20 62 6c 6f 63 6b 20 46 52 4f 4d  ELECT block FROM
7390: 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73   %Q.'%q_segments
73a0: 27 20 57 48 45 52 45 20 62 6c 6f 63 6b 69 64 20  ' WHERE blockid 
73b0: 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20  BETWEEN ? AND ? 
73c0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44  ".          "ORD
73d0: 45 52 20 42 59 20 62 6c 6f 63 6b 69 64 22 2c 20  ER BY blockid", 
73e0: 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
73f0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
7400: 69 66 28 20 21 70 2d 3e 7a 53 65 6c 65 63 74 4c  if( !p->zSelectL
7410: 65 61 76 65 73 20 29 7b 0a 20 20 20 20 20 20 20  eaves ){.       
7420: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
7430: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
7440: 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20   finished;.     
7450: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
7460: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
7470: 20 66 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73   free statements
7480: 20 69 6e 20 74 68 65 20 61 4c 65 61 76 65 73 53   in the aLeavesS
7490: 74 6d 74 5b 5d 20 61 72 72 61 79 2c 20 70 72 65  tmt[] array, pre
74a0: 70 61 72 65 0a 20 20 20 20 2a 2a 20 61 20 6e 65  pare.    ** a ne
74b0: 77 20 73 74 61 74 65 6d 65 6e 74 20 6e 6f 77 2e  w statement now.
74c0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75 73   Otherwise, reus
74d0: 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  e a prepared sta
74e0: 74 65 6d 65 6e 74 20 66 72 6f 6d 0a 20 20 20 20  tement from.    
74f0: 2a 2a 20 61 4c 65 61 76 65 73 53 74 6d 74 5b 5d  ** aLeavesStmt[]
7500: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
7510: 20 70 2d 3e 6e 4c 65 61 76 65 73 53 74 6d 74 3d   p->nLeavesStmt=
7520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
7530: 70 2d 3e 6e 4c 65 61 76 65 73 54 6f 74 61 6c 3d  p->nLeavesTotal=
7540: 3d 70 2d 3e 6e 4c 65 61 76 65 73 41 6c 6c 6f 63  =p->nLeavesAlloc
7550: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
7560: 6e 4e 65 77 20 3d 20 70 2d 3e 6e 4c 65 61 76 65  nNew = p->nLeave
7570: 73 41 6c 6c 6f 63 20 2b 20 31 36 3b 0a 20 20 20  sAlloc + 16;.   
7580: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
7590: 74 20 2a 2a 61 4e 65 77 20 3d 20 28 73 71 6c 69  t **aNew = (sqli
75a0: 74 65 33 5f 73 74 6d 74 20 2a 2a 29 73 71 6c 69  te3_stmt **)sqli
75b0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
75c0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4c 65 61           p->aLea
75d0: 76 65 73 53 74 6d 74 2c 20 6e 4e 65 77 2a 73 69  vesStmt, nNew*si
75e0: 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 73 74 6d  zeof(sqlite3_stm
75f0: 74 20 2a 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  t *).        );.
7600: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 4e 65          if( !aNe
7610: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  w ){.          r
7620: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7630: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
7640: 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20   finished;.     
7650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
7660: 6e 4c 65 61 76 65 73 41 6c 6c 6f 63 20 3d 20 6e  nLeavesAlloc = n
7670: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  New;.        p->
7680: 61 4c 65 61 76 65 73 53 74 6d 74 20 3d 20 61 4e  aLeavesStmt = aN
7690: 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
76a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
76b0: 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
76c0: 20 70 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76 65   p->zSelectLeave
76d0: 73 2c 20 2d 31 2c 20 26 70 52 65 61 64 65 72 2d  s, -1, &pReader-
76e0: 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  >pStmt, 0);.    
76f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7700: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
7710: 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20  oto finished;.  
7720: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
7730: 4c 65 61 76 65 73 54 6f 74 61 6c 2b 2b 3b 0a 20  LeavesTotal++;. 
7740: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7750: 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 20 3d  pReader->pStmt =
7760: 20 70 2d 3e 61 4c 65 61 76 65 73 53 74 6d 74 5b   p->aLeavesStmt[
7770: 2d 2d 70 2d 3e 6e 4c 65 61 76 65 73 53 74 6d 74  --p->nLeavesStmt
7780: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  ];.    }..    /*
7790: 20 42 69 6e 64 20 74 68 65 20 73 74 61 72 74 20   Bind the start 
77a0: 61 6e 64 20 65 6e 64 20 6c 65 61 66 20 62 6c 6f  and end leaf blo
77b0: 63 6b 69 64 73 20 74 6f 20 74 68 65 20 70 72 65  ckids to the pre
77c0: 70 61 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d  pared SQL statem
77d0: 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ent. */.    sqli
77e0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
77f0: 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 2c 20 31  Reader->pStmt, 1
7800: 2c 20 69 53 74 61 72 74 4c 65 61 66 29 3b 0a 20  , iStartLeaf);. 
7810: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
7820: 69 6e 74 36 34 28 70 52 65 61 64 65 72 2d 3e 70  int64(pReader->p
7830: 53 74 6d 74 2c 20 32 2c 20 69 45 6e 64 4c 65 61  Stmt, 2, iEndLea
7840: 66 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  f);.  }.  rc = f
7850: 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
7860: 28 70 52 65 61 64 65 72 29 3b 0a 0a 20 66 69 6e  (pReader);.. fin
7870: 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 3d  ished:.  if( rc=
7880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7890: 20 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52    *ppReader = pR
78a0: 65 61 64 65 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eader;.  }else{.
78b0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53      sqlite3Fts3S
78c0: 65 67 52 65 61 64 65 72 46 72 65 65 28 70 2c 20  egReaderFree(p, 
78d0: 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20  pReader);.  }.  
78e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
78f0: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
7900: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
7910: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 70   function is exp
7920: 65 63 74 65 64 20 74 6f 20 62 65 20 61 20 73 74  ected to be a st
7930: 61 74 65 6d 65 6e 74 20 6f 66 0a 2a 2a 20 74 68  atement of.** th
7940: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
7950: 53 45 4c 45 43 54 20 0a 2a 2a 20 20 20 20 20 69  SELECT .**     i
7960: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
7970: 20 20 20 20 20 2d 2d 20 63 6f 6c 20 30 0a 2a 2a       -- col 0.**
7980: 20 20 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b       start_block
7990: 2c 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f  ,          -- co
79a0: 6c 20 31 0a 2a 2a 20 20 20 20 20 6c 65 61 76 65  l 1.**     leave
79b0: 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 20 20 20  s_end_block,    
79c0: 20 2d 2d 20 63 6f 6c 20 32 0a 2a 2a 20 20 20 20   -- col 2.**    
79d0: 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 20 20 20 20   end_block,     
79e0: 20 20 20 20 20 20 20 2d 2d 20 63 6f 6c 20 33 0a         -- col 3.
79f0: 2a 2a 20 20 20 20 20 72 6f 6f 74 20 20 20 20 20  **     root     
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
7a10: 63 6f 6c 20 34 0a 2a 2a 20 20 20 46 52 4f 4d 20  col 4.**   FROM 
7a20: 25 5f 73 65 67 64 69 72 20 2e 2e 2e 0a 2a 2a 0a  %_segdir ....**.
7a30: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7a40: 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 69   allocates and i
7a50: 6e 69 74 69 61 6c 69 7a 65 73 20 61 20 46 74 73  nitializes a Fts
7a60: 33 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63  3SegReader struc
7a70: 74 75 72 65 20 74 6f 0a 2a 2a 20 69 74 65 72 61  ture to.** itera
7a80: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  te through the t
7a90: 65 72 6d 73 20 73 74 6f 72 65 64 20 69 6e 20 74  erms stored in t
7aa0: 68 65 20 73 65 67 6d 65 6e 74 20 69 64 65 6e 74  he segment ident
7ab0: 69 66 69 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  ified by the.** 
7ac0: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 68 61 74  current row that
7ad0: 20 70 53 74 6d 74 20 69 73 20 70 6f 69 6e 74 69   pStmt is pointi
7ae0: 6e 67 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ng to. .**.** If
7af0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
7b00: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 69   Fts3SegReader i
7b10: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
7b20: 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  to the first ter
7b30: 6d 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 67 6d  m.** in the segm
7b40: 65 6e 74 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ent and SQLITE_O
7b50: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
7b60: 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
7b70: 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
7b80: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
7b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
7ba0: 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 0a 20  3SegReaderNew(. 
7bb0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
7be0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
7bf0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
7c00: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
7c10: 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20   See above */.  
7c20: 69 6e 74 20 69 41 67 65 2c 20 20 20 20 20 20 20  int iAge,       
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 2f 2a 20 53 65 67 6d 65 6e 74 20 22 61 67 65 22  /* Segment "age"
7c50: 2e 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65  . */.  Fts3SegRe
7c60: 61 64 65 72 20 2a 2a 70 70 52 65 61 64 65 72 20  ader **ppReader 
7c70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
7c80: 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 53 65 67  llocated Fts3Seg
7c90: 52 65 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 72  Reader */.){.  r
7ca0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73  eturn sqlite3Fts
7cb0: 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 70 2c  3SegReaderNew(p,
7cc0: 20 69 41 67 65 2c 20 0a 20 20 20 20 20 20 73 71   iAge, .      sq
7cd0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
7ce0: 36 34 28 70 53 74 6d 74 2c 20 31 29 2c 0a 20 20  64(pStmt, 1),.  
7cf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
7d00: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
7d10: 32 29 2c 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2),.      sqlite
7d20: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
7d30: 53 74 6d 74 2c 20 33 29 2c 0a 20 20 20 20 20 20  Stmt, 3),.      
7d40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
7d50: 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c 0a 20  lob(pStmt, 4),. 
7d60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
7d70: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
7d80: 20 34 29 2c 0a 20 20 20 20 20 20 70 70 52 65 61   4),.      ppRea
7d90: 64 65 72 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  der.  );.}../*.*
7da0: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 65 6e  * Compare the en
7db0: 74 72 69 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tries pointed to
7dc0: 20 62 79 20 74 77 6f 20 46 74 73 33 53 65 67 52   by two Fts3SegR
7dd0: 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65 73  eader structures
7de0: 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  . .** Comparison
7df0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
7e00: 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 69  **.**   1) EOF i
7e10: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
7e20: 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20  ot EOF..**.**   
7e30: 32 29 20 54 68 65 20 63 75 72 72 65 6e 74 20 74  2) The current t
7e40: 65 72 6d 73 20 28 69 66 20 61 6e 79 29 20 61 72  erms (if any) ar
7e50: 65 20 63 6f 6d 70 61 72 65 64 20 77 69 74 68 20  e compared with 
7e60: 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65  memcmp(). If one
7e70: 0a 2a 2a 20 20 20 20 20 20 74 65 72 6d 20 69 73  .**      term is
7e80: 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 6f   a prefix of ano
7e90: 74 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67 65 72  ther, the longer
7ea0: 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 64 65   term is conside
7eb0: 72 65 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  red the.**      
7ec0: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  larger..**.**   
7ed0: 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67  3) By segment ag
7ee0: 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d  e. An older segm
7ef0: 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ent is considere
7f00: 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61  d larger..*/.sta
7f10: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
7f20: 65 61 64 65 72 43 6d 70 28 46 74 73 33 53 65 67  eaderCmp(Fts3Seg
7f30: 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74  Reader *pLhs, Ft
7f40: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68  s3SegReader *pRh
7f50: 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
7f60: 69 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20  if( pLhs->aNode 
7f70: 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29  && pRhs->aNode )
7f80: 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
7f90: 70 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20 70 52  pLhs->nTerm - pR
7fa0: 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 69  hs->nTerm;.    i
7fb0: 66 28 20 72 63 32 3c 30 20 29 7b 0a 20 20 20 20  f( rc2<0 ){.    
7fc0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c    rc = memcmp(pL
7fd0: 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d  hs->zTerm, pRhs-
7fe0: 3e 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e 6e 54  >zTerm, pLhs->nT
7ff0: 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  erm);.    }else{
8000: 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63  .      rc = memc
8010: 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20  mp(pLhs->zTerm, 
8020: 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68  pRhs->zTerm, pRh
8030: 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d  s->nTerm);.    }
8040: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29  .    if( rc==0 )
8050: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
8060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
8070: 0a 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d  .    rc = (pLhs-
8080: 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28 70 52  >aNode==0) - (pR
8090: 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b 0a 20  hs->aNode==0);. 
80a0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29   }.  if( rc==0 )
80b0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d  {.    rc = pRhs-
80c0: 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49  >iIdx - pLhs->iI
80d0: 64 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  dx;.  }.  assert
80e0: 28 20 72 63 21 3d 30 20 29 3b 0a 20 20 72 65 74  ( rc!=0 );.  ret
80f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8100: 20 41 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d   A different com
8110: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
8120: 20 66 6f 72 20 53 65 67 52 65 61 64 65 72 20 73   for SegReader s
8130: 74 72 75 63 74 75 72 65 73 2e 20 49 6e 20 74 68  tructures. In th
8140: 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 69  is.** version, i
8150: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
8160: 74 20 65 61 63 68 20 53 65 67 52 65 61 64 65 72  t each SegReader
8170: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
8180: 74 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f 63 6c  try in.** a docl
8190: 69 73 74 20 66 6f 72 20 69 64 65 6e 74 69 63 61  ist for identica
81a0: 6c 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61 72 69  l terms. Compari
81b0: 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 73 20 66  son is made as f
81c0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
81d0: 31 29 20 45 4f 46 20 28 65 6e 64 20 6f 66 20 64  1) EOF (end of d
81e0: 6f 63 6c 69 73 74 20 69 6e 20 74 68 69 73 20 63  oclist in this c
81f0: 61 73 65 29 20 69 73 20 67 72 65 61 74 65 72 20  ase) is greater 
8200: 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a  than not EOF..**
8210: 0a 2a 2a 20 20 20 32 29 20 42 79 20 63 75 72 72  .**   2) By curr
8220: 65 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a  ent docid..**.**
8230: 20 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74     3) By segment
8240: 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73   age. An older s
8250: 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64  egment is consid
8260: 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a  ered larger..*/.
8270: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
8280: 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43  egReaderDoclistC
8290: 6d 70 28 46 74 73 33 53 65 67 52 65 61 64 65 72  mp(Fts3SegReader
82a0: 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52   *pLhs, Fts3SegR
82b0: 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20  eader *pRhs){.  
82c0: 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e  int rc = (pLhs->
82d0: 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d  pOffsetList==0)-
82e0: 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69  (pRhs->pOffsetLi
82f0: 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72 63  st==0);.  if( rc
8300: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
8310: 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68  Lhs->iDocid==pRh
8320: 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20 20  s->iDocid ){.   
8330: 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49     rc = pRhs->iI
8340: 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b  dx - pLhs->iIdx;
8350: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8360: 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44    rc = (pLhs->iD
8370: 6f 63 69 64 20 3e 20 70 52 68 73 2d 3e 69 44 6f  ocid > pRhs->iDo
8380: 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20  cid) ? 1 : -1;. 
8390: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
83a0: 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26  t( pLhs->aNode &
83b0: 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b  & pRhs->aNode );
83c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
83d0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
83e0: 68 65 20 74 65 72 6d 20 74 68 61 74 20 74 68 65  he term that the
83f0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
8400: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
8410: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
8420: 6e 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  nt.** points to 
8430: 77 69 74 68 20 74 68 65 20 74 65 72 6d 20 73 70  with the term sp
8440: 65 63 69 66 69 65 64 20 62 79 20 61 72 67 75 6d  ecified by argum
8450: 65 6e 74 73 20 7a 54 65 72 6d 20 61 6e 64 20 6e  ents zTerm and n
8460: 54 65 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  Term. .**.** If 
8470: 74 68 65 20 70 53 65 67 20 69 74 65 72 61 74 6f  the pSeg iterato
8480: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
8490: 45 4f 46 2c 20 72 65 74 75 72 6e 20 30 2e 20 4f  EOF, return 0. O
84a0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
84b0: 0a 2a 2a 20 2d 76 65 20 69 66 20 74 68 65 20 70  .** -ve if the p
84c0: 53 65 67 20 74 65 72 6d 20 69 73 20 6c 65 73 73  Seg term is less
84d0: 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72   than zTerm/nTer
84e0: 6d 2c 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  m, 0 if the two 
84f0: 74 65 72 6d 73 20 61 72 65 0a 2a 2a 20 65 71 75  terms are.** equ
8500: 61 6c 2c 20 6f 72 20 2b 76 65 20 69 66 20 74 68  al, or +ve if th
8510: 65 20 70 53 65 67 20 74 65 72 6d 20 69 73 20 67  e pSeg term is g
8520: 72 65 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72  reater than zTer
8530: 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  m/nTerm..*/.stat
8540: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
8550: 61 64 65 72 54 65 72 6d 43 6d 70 28 0a 20 20 46  aderTermCmp(.  F
8560: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53  ts3SegReader *pS
8570: 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  eg,            /
8580: 2a 20 53 65 67 6d 65 6e 74 20 72 65 61 64 65 72  * Segment reader
8590: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
85a0: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85c0: 54 65 72 6d 20 74 6f 20 63 6f 6d 70 61 72 65 20  Term to compare 
85d0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  to */.  int nTer
85e0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
85f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8600: 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e  of term zTerm in
8610: 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
8620: 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66  nt res = 0;.  if
8630: 28 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20 29 7b  ( pSeg->aNode ){
8640: 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e  .    if( pSeg->n
8650: 54 65 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20  Term>nTerm ){.  
8660: 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
8670: 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54  (pSeg->zTerm, zT
8680: 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
8690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
86a0: 73 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d  s = memcmp(pSeg-
86b0: 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 70  >zTerm, zTerm, p
86c0: 53 65 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  Seg->nTerm);.   
86d0: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d   }.    if( res==
86e0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
86f0: 20 70 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e 54 65   pSeg->nTerm-nTe
8700: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rm;.    }.  }.  
8710: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
8720: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70  *.** Argument ap
8730: 53 65 67 6d 65 6e 74 20 69 73 20 61 6e 20 61 72  Segment is an ar
8740: 72 61 79 20 6f 66 20 6e 53 65 67 6d 65 6e 74 20  ray of nSegment 
8750: 65 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  elements. It is 
8760: 6b 6e 6f 77 6e 20 74 68 61 74 0a 2a 2a 20 74 68  known that.** th
8770: 65 20 66 69 6e 61 6c 20 28 6e 53 65 67 6d 65 6e  e final (nSegmen
8780: 74 2d 6e 53 75 73 70 65 63 74 29 20 6d 65 6d 62  t-nSuspect) memb
8790: 65 72 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ers are already 
87a0: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
87b0: 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f  ** (according to
87c0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
87d0: 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  function provide
87e0: 64 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  d). This functio
87f0: 6e 20 73 68 75 66 66 6c 65 73 0a 2a 2a 20 74 68  n shuffles.** th
8800: 65 20 61 72 72 61 79 20 61 72 6f 75 6e 64 20 75  e array around u
8810: 6e 74 69 6c 20 61 6c 6c 20 65 6e 74 72 69 65 73  ntil all entries
8820: 20 61 72 65 20 69 6e 20 73 6f 72 74 65 64 20 6f   are in sorted o
8830: 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
8840: 76 6f 69 64 20 66 74 73 33 53 65 67 52 65 61 64  void fts3SegRead
8850: 65 72 53 6f 72 74 28 0a 20 20 46 74 73 33 53 65  erSort(.  Fts3Se
8860: 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d  gReader **apSegm
8870: 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
8880: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
8890: 79 20 74 6f 20 73 6f 72 74 20 65 6e 74 72 69 65  y to sort entrie
88a0: 73 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  s of */.  int nS
88b0: 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20  egment,         
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
88e0: 20 6f 66 20 61 70 53 65 67 6d 65 6e 74 20 61 72   of apSegment ar
88f0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  ray */.  int nSu
8900: 73 70 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  spect,          
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
8930: 74 65 64 20 65 6e 74 72 79 20 63 6f 75 6e 74 20  ted entry count 
8940: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29  */.  int (*xCmp)
8950: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
8960: 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  , Fts3SegReader 
8970: 2a 29 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  *)  /* Compariso
8980: 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  n function */.){
8990: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
89c0: 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73  ariable */..  as
89d0: 73 65 72 74 28 20 6e 53 75 73 70 65 63 74 3c 3d  sert( nSuspect<=
89e0: 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 0a 20 20 69  nSegment );..  i
89f0: 66 28 20 6e 53 75 73 70 65 63 74 3d 3d 6e 53 65  f( nSuspect==nSe
8a00: 67 6d 65 6e 74 20 29 20 6e 53 75 73 70 65 63 74  gment ) nSuspect
8a10: 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 75 73  --;.  for(i=nSus
8a20: 70 65 63 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  pect-1; i>=0; i-
8a30: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20  -){.    int j;. 
8a40: 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 28 6e     for(j=i; j<(n
8a50: 53 65 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b 2b 29  Segment-1); j++)
8a60: 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67 52  {.      Fts3SegR
8a70: 65 61 64 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20  eader *pTmp;.   
8a80: 20 20 20 69 66 28 20 78 43 6d 70 28 61 70 53 65     if( xCmp(apSe
8a90: 67 6d 65 6e 74 5b 6a 5d 2c 20 61 70 53 65 67 6d  gment[j], apSegm
8aa0: 65 6e 74 5b 6a 2b 31 5d 29 3c 30 20 29 20 62 72  ent[j+1])<0 ) br
8ab0: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6d 70 20  eak;.      pTmp 
8ac0: 3d 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d  = apSegment[j+1]
8ad0: 3b 0a 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e  ;.      apSegmen
8ae0: 74 5b 6a 2b 31 5d 20 3d 20 61 70 53 65 67 6d 65  t[j+1] = apSegme
8af0: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 70 53  nt[j];.      apS
8b00: 65 67 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54 6d 70  egment[j] = pTmp
8b10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
8b20: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
8b30: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
8b40: 6c 69 73 74 20 72 65 61 6c 6c 79 20 69 73 20 73  list really is s
8b50: 6f 72 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a 20 20  orted now. */.  
8b60: 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 53 75 73  for(i=0; i<(nSus
8b70: 70 65 63 74 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20  pect-1); i++){. 
8b80: 20 20 20 61 73 73 65 72 74 28 20 78 43 6d 70 28     assert( xCmp(
8b90: 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2c 20 61 70  apSegment[i], ap
8ba0: 53 65 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c 30 20  Segment[i+1])<0 
8bb0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
8bc0: 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ./* .** Insert a
8bd0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
8be0: 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
8bf0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8c00: 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
8c10: 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  t(.  Fts3Table *
8c20: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8c30: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
8c40: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
8c50: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
8c60: 69 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  iBlock,         
8c70: 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 66 6f    /* Block id fo
8c80: 72 20 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f 0a 20  r new block */. 
8c90: 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
8cc0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
8cd0: 20 62 6c 6f 63 6b 20 64 61 74 61 20 2a 2f 0a 20   block data */. 
8ce0: 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20   int n          
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
8d10: 65 72 20 7a 20 69 6e 20 62 79 74 65 73 20 2a 2f  er z in bytes */
8d20: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
8d30: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
8d40: 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
8d50: 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f  t(p, SQL_INSERT_
8d60: 53 45 47 4d 45 4e 54 53 2c 20 26 70 53 74 6d 74  SEGMENTS, &pStmt
8d70: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
8d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8d90: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
8da0: 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 42  t64(pStmt, 1, iB
8db0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  lock);.    rc = 
8dc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
8dd0: 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e  b(pStmt, 2, z, n
8de0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8df0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
8e00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8e10: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
8e20: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
8e30: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
8e40: 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Stmt);.    }.  }
8e50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8e60: 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ./* .** Insert a
8e70: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
8e80: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
8e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
8ea0: 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 0a  ts3WriteSegdir(.
8eb0: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
8ee0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
8ef0: 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f10: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
8f20: 65 6c 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  el" field */.  i
8f30: 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f50: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 69 64 78  * Value for "idx
8f60: 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  " field */.  sql
8f70: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
8f80: 74 42 6c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20  tBlock,      /* 
8f90: 56 61 6c 75 65 20 66 6f 72 20 22 73 74 61 72 74  Value for "start
8fa0: 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f  _block" field */
8fb0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
8fc0: 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20   iLeafEndBlock, 
8fd0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
8fe0: 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63  "leaves_end_bloc
8ff0: 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71  k" field */.  sq
9000: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64  lite3_int64 iEnd
9010: 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a  Block,        /*
9020: 20 56 61 6c 75 65 20 66 6f 72 20 22 65 6e 64 5f   Value for "end_
9030: 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a  block" field */.
9040: 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c 20 20    char *zRoot,  
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 2f 2a 20 42 6c 6f 62 20 76 61 6c 75 65 20    /* Blob value 
9070: 66 6f 72 20 22 72 6f 6f 74 22 20 66 69 65 6c 64  for "root" field
9080: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 20   */.  int nRoot 
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
90b0: 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75 66 66  of bytes in buff
90c0: 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20  er zRoot */.){. 
90d0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
90e0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Stmt;.  int rc =
90f0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
9100: 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49  SQL_INSERT_SEGDI
9110: 52 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  R, &pStmt, 0);. 
9120: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9130: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
9140: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
9150: 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20  , 1, iLevel);.  
9160: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
9170: 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20 69 49 64  nt(pStmt, 2, iId
9180: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
9190: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
91a0: 2c 20 33 2c 20 69 53 74 61 72 74 42 6c 6f 63 6b  , 3, iStartBlock
91b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
91c0: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
91d0: 20 34 2c 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63   4, iLeafEndBloc
91e0: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  k);.    sqlite3_
91f0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
9200: 2c 20 35 2c 20 69 45 6e 64 42 6c 6f 63 6b 29 3b  , 5, iEndBlock);
9210: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9220: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
9230: 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f  t, 6, zRoot, nRo
9240: 6f 74 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  ot, SQLITE_STATI
9250: 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  C);.    if( rc==
9260: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9270: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
9280: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
9290: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
92a0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
92b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
92c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
92d0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
92e0: 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69  common prefix (i
92f0: 66 20 61 6e 79 29 20 73 68 61 72 65 64 20 62 79  f any) shared by
9300: 20 7a 50 72 65 76 20 61 6e 64 0a 2a 2a 20 7a 4e   zPrev and.** zN
9310: 65 78 74 2c 20 69 6e 20 62 79 74 65 73 2e 20 46  ext, in bytes. F
9320: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a 0a  or example, .**.
9330: 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43  **   fts3PrefixC
9340: 6f 6d 70 72 65 73 73 28 22 61 62 63 22 2c 20 33  ompress("abc", 3
9350: 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29 20 20  , "abcdef", 6)  
9360: 20 2f 2f 20 72 65 74 75 72 6e 73 20 33 0a 2a 2a   // returns 3.**
9370: 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d     fts3PrefixCom
9380: 70 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20  press("abX", 3, 
9390: 22 61 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f  "abcdef", 6)   /
93a0: 2f 20 72 65 74 75 72 6e 73 20 32 0a 2a 2a 20 20  / returns 2.**  
93b0: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
93c0: 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22 58  ess("abX", 3, "X
93d0: 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20  bcdef", 6)   // 
93e0: 72 65 74 75 72 6e 73 20 30 0a 2a 2f 0a 73 74 61  returns 0.*/.sta
93f0: 74 69 63 20 69 6e 74 20 66 74 73 33 50 72 65 66  tic int fts3Pref
9400: 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 63 6f  ixCompress(.  co
9410: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76 2c  nst char *zPrev,
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9430: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
9440: 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ng previous term
9450: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 76 2c   */.  int nPrev,
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9480: 20 62 75 66 66 65 72 20 7a 50 72 65 76 20 69 6e   buffer zPrev in
9490: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73   bytes */.  cons
94a0: 74 20 63 68 61 72 20 2a 7a 4e 65 78 74 2c 20 20  t char *zNext,  
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
94c0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
94d0: 20 6e 65 78 74 20 74 65 72 6d 20 2a 2f 0a 20 20   next term */.  
94e0: 69 6e 74 20 6e 4e 65 78 74 20 20 20 20 20 20 20  int nNext       
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
9510: 72 20 7a 4e 65 78 74 20 69 6e 20 62 79 74 65 73  r zNext in bytes
9520: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
9530: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9540: 45 52 28 6e 4e 65 78 74 29 3b 0a 20 20 66 6f 72  ER(nNext);.  for
9550: 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26 26  (n=0; n<nPrev &&
9560: 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78 74   zPrev[n]==zNext
9570: 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65 74  [n]; n++);.  ret
9580: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
9590: 41 64 64 20 74 65 72 6d 20 7a 54 65 72 6d 20 74  Add term zTerm t
95a0: 6f 20 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f 64  o the SegmentNod
95b0: 65 2e 20 49 74 20 69 73 20 67 75 61 72 61 6e 74  e. It is guarant
95c0: 65 65 64 20 74 68 61 74 20 7a 54 65 72 6d 20 69  eed that zTerm i
95d0: 73 20 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63 63  s larger.** (acc
95e0: 6f 72 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d 70  ording to memcmp
95f0: 29 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69  ) than the previ
9600: 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  ous term..*/.sta
9610: 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65  tic int fts3Node
9620: 41 64 64 54 65 72 6d 28 0a 20 20 46 74 73 33 54  AddTerm(.  Fts3T
9630: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
9640: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
9650: 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
9660: 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  /.  SegmentNode 
9670: 2a 2a 70 70 54 72 65 65 2c 20 20 20 20 20 20 20  **ppTree,       
9680: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
9690: 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64 6c  egmentNode handl
96a0: 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f  e */ .  int isCo
96b0: 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  pyTerm,         
96c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
96d0: 69 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 69  if zTerm/nTerm i
96e0: 73 20 74 72 61 6e 73 69 65 6e 74 20 2a 2f 0a 20  s transient */. 
96f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
9700: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
9710: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
9720: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
9730: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   term */.  int n
9740: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
9750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9760: 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79  ze of term in by
9770: 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 67 6d  tes */.){.  Segm
9780: 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 20 3d  entNode *pTree =
9790: 20 2a 70 70 54 72 65 65 3b 0a 20 20 69 6e 74 20   *ppTree;.  int 
97a0: 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64  rc;.  SegmentNod
97b0: 65 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 46  e *pNew;..  /* F
97c0: 69 72 73 74 20 74 72 79 20 74 6f 20 61 70 70 65  irst try to appe
97d0: 6e 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74  nd the term to t
97e0: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e  he current node.
97f0: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
9800: 20 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70   .  ** this is p
9810: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
9820: 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20  if( pTree ){.   
9830: 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70 54 72   int nData = pTr
9840: 65 65 2d 3e 6e 44 61 74 61 3b 20 20 20 20 20 2f  ee->nData;     /
9850: 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
9860: 66 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20  f node in bytes 
9870: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20  */.    int nReq 
9880: 3d 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  = nData;        
9890: 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
98a0: 20 73 70 61 63 65 20 61 66 74 65 72 20 61 64 64   space after add
98b0: 69 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 20  ing zTerm */.   
98c0: 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
98f0: 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70  s of prefix comp
9900: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ression */.    i
9910: 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20  nt nSuffix;     
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9930: 53 75 66 66 69 78 20 6c 65 6e 67 74 68 20 2a 2f  Suffix length */
9940: 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  ..    nPrefix = 
9950: 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
9960: 73 73 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c  ss(pTree->zTerm,
9970: 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 2c 20 7a   pTree->nTerm, z
9980: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
9990: 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72    nSuffix = nTer
99a0: 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 20 20  m-nPrefix;..    
99b0: 6e 52 65 71 20 2b 3d 20 73 71 6c 69 74 65 33 46  nReq += sqlite3F
99c0: 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72  ts3VarintLen(nPr
99d0: 65 66 69 78 29 2b 73 71 6c 69 74 65 33 46 74 73  efix)+sqlite3Fts
99e0: 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66  3VarintLen(nSuff
99f0: 69 78 29 2b 6e 53 75 66 66 69 78 3b 0a 20 20 20  ix)+nSuffix;.   
9a00: 20 69 66 28 20 6e 52 65 71 3c 3d 49 4e 54 45 52   if( nReq<=INTER
9a10: 49 4f 52 5f 4d 41 58 20 7c 7c 20 21 70 54 72 65  IOR_MAX || !pTre
9a20: 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20 20 20  e->zTerm ){..   
9a30: 20 20 20 69 66 28 20 6e 52 65 71 3e 49 4e 54 45     if( nReq>INTE
9a40: 52 49 4f 52 5f 4d 41 58 20 29 7b 0a 20 20 20 20  RIOR_MAX ){.    
9a50: 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 75 61      /* An unusua
9a60: 6c 20 63 61 73 65 3a 20 74 68 69 73 20 69 73 20  l case: this is 
9a70: 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 74  the first term t
9a80: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
9a90: 65 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 2a  e node.        *
9aa0: 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74 69 63  * and the static
9ab0: 20 6e 6f 64 65 20 62 75 66 66 65 72 20 28 49 4e   node buffer (IN
9ac0: 54 45 52 49 4f 52 5f 4d 41 58 20 62 79 74 65 73  TERIOR_MAX bytes
9ad0: 29 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 0a 20  ) is not large. 
9ae0: 20 20 20 20 20 20 20 2a 2a 20 65 6e 6f 75 67 68         ** enough
9af0: 2e 20 55 73 65 20 61 20 73 65 70 61 72 61 74 65  . Use a separate
9b00: 6c 79 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66  ly malloced buff
9b10: 65 72 20 69 6e 73 74 65 61 64 20 54 68 69 73 20  er instead This 
9b20: 77 61 73 74 65 73 0a 20 20 20 20 20 20 20 20 2a  wastes.        *
9b30: 2a 20 49 4e 54 45 52 49 4f 52 5f 4d 41 58 20 62  * INTERIOR_MAX b
9b40: 79 74 65 73 2c 20 62 75 74 20 73 69 6e 63 65 20  ytes, but since 
9b50: 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 6f 6e  this scenario on
9b60: 6c 79 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  ly comes about w
9b70: 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
9b80: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
9b90: 61 69 6e 20 74 77 6f 20 74 65 72 6d 73 20 74 68  ain two terms th
9ba0: 61 74 20 73 68 61 72 65 20 61 20 70 72 65 66 69  at share a prefi
9bb0: 78 20 6f 66 20 61 6c 6d 6f 73 74 20 32 4b 42 2c  x of almost 2KB,
9bc0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
9bd0: 73 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65  s is not expecte
9be0: 64 20 74 6f 20 62 65 20 61 20 73 65 72 69 6f 75  d to be a seriou
9bf0: 73 20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20 20 20  s problem. .    
9c00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
9c10: 73 73 65 72 74 28 20 70 54 72 65 65 2d 3e 61 44  ssert( pTree->aD
9c20: 61 74 61 3d 3d 28 63 68 61 72 20 2a 29 26 70 54  ata==(char *)&pT
9c30: 72 65 65 5b 31 5d 20 29 3b 0a 20 20 20 20 20 20  ree[1] );.      
9c40: 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61 20 3d    pTree->aData =
9c50: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
9c60: 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a 20  _malloc(nReq);. 
9c70: 20 20 20 20 20 20 20 69 66 28 20 21 70 54 72 65         if( !pTre
9c80: 65 2d 3e 61 44 61 74 61 20 29 7b 0a 20 20 20 20  e->aData ){.    
9c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9ca0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9cb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
9cc0: 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e 7a      if( pTree->z
9cd0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
9ce0: 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  /* There is no p
9cf0: 72 65 66 69 78 2d 6c 65 6e 67 74 68 20 66 69 65  refix-length fie
9d00: 6c 64 20 66 6f 72 20 66 69 72 73 74 20 74 65 72  ld for first ter
9d10: 6d 20 69 6e 20 61 20 6e 6f 64 65 20 2a 2f 0a 20  m in a node */. 
9d20: 20 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20         nData += 
9d30: 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
9d40: 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61  rint(&pTree->aDa
9d50: 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66  ta[nData], nPref
9d60: 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ix);.      }..  
9d70: 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c      nData += sql
9d80: 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
9d90: 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  t(&pTree->aData[
9da0: 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29  nData], nSuffix)
9db0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
9dc0: 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61  pTree->aData[nDa
9dd0: 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65  ta], &zTerm[nPre
9de0: 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  fix], nSuffix);.
9df0: 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 44 61        pTree->nDa
9e00: 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 53 75  ta = nData + nSu
9e10: 66 66 69 78 3b 0a 20 20 20 20 20 20 70 54 72 65  ffix;.      pTre
9e20: 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a 20 20  e->nEntry++;..  
9e30: 20 20 20 20 69 66 28 20 69 73 43 6f 70 79 54 65      if( isCopyTe
9e40: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rm ){.        if
9e50: 28 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63  ( pTree->nMalloc
9e60: 3c 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  <nTerm ){.      
9e70: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d      char *zNew =
9e80: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
9e90: 28 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 2c  (pTree->zMalloc,
9ea0: 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20   nTerm*2);.     
9eb0: 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29       if( !zNew )
9ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
9ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9ee0: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
9ef0: 20 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e           pTree->
9f00: 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a  nMalloc = nTerm*
9f10: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 72  2;.          pTr
9f20: 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e  ee->zMalloc = zN
9f30: 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
9f40: 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65        pTree->zTe
9f50: 72 6d 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c  rm = pTree->zMal
9f60: 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  loc;.        mem
9f70: 63 70 79 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d  cpy(pTree->zTerm
9f80: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
9f90: 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e  .        pTree->
9fa0: 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20  nTerm = nTerm;. 
9fb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9fc0: 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d      pTree->zTerm
9fd0: 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72 6d   = (char *)zTerm
9fe0: 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d  ;.        pTree-
9ff0: 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a  >nTerm = nTerm;.
a000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
a010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a020: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a030: 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
a040: 20 74 6f 20 68 65 72 65 2c 20 69 74 20 77 61 73   to here, it was
a050: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
a060: 20 61 70 70 65 6e 64 20 7a 54 65 72 6d 20 74 6f   append zTerm to
a070: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
a080: 74 20 6e 6f 64 65 2e 20 43 72 65 61 74 65 20 61  t node. Create a
a090: 20 6e 65 77 20 6e 6f 64 65 20 28 61 20 72 69 67   new node (a rig
a0a0: 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 74 68  ht-sibling of th
a0b0: 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 29 2e  e current node).
a0c0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
a0d0: 20 74 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20   the first node 
a0e0: 69 6e 20 74 68 65 20 74 72 65 65 2c 20 74 68 65  in the tree, the
a0f0: 20 74 65 72 6d 20 69 73 20 61 64 64 65 64 20 74   term is added t
a100: 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o it..  **.  ** 
a110: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 74  Otherwise, the t
a120: 65 72 6d 20 69 73 20 6e 6f 74 20 61 64 64 65 64  erm is not added
a130: 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 6f 64 65   to the new node
a140: 2c 20 69 74 20 69 73 20 6c 65 66 74 20 65 6d 70  , it is left emp
a150: 74 79 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 77 2e  ty for.  ** now.
a160: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 74 65   Instead, the te
a170: 72 6d 20 69 73 20 69 6e 73 65 72 74 65 64 20 69  rm is inserted i
a180: 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6f  nto the parent o
a190: 66 20 70 54 72 65 65 2e 20 49 66 20 70 54 72 65  f pTree. If pTre
a1a0: 65 20 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 20 70  e .  ** has no p
a1b0: 61 72 65 6e 74 2c 20 6f 6e 65 20 69 73 20 63 72  arent, one is cr
a1c0: 65 61 74 65 64 20 68 65 72 65 2e 0a 20 20 2a 2f  eated here..  */
a1d0: 0a 20 20 70 4e 65 77 20 3d 20 28 53 65 67 6d 65  .  pNew = (Segme
a1e0: 6e 74 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65 33  ntNode *)sqlite3
a1f0: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53  _malloc(sizeof(S
a200: 65 67 6d 65 6e 74 4e 6f 64 65 29 20 2b 20 49 4e  egmentNode) + IN
a210: 54 45 52 49 4f 52 5f 4d 41 58 29 3b 0a 20 20 69  TERIOR_MAX);.  i
a220: 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20  f( !pNew ){.    
a230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a240: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
a250: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
a260: 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 29 3b  f(SegmentNode));
a270: 0a 20 20 70 4e 65 77 2d 3e 6e 44 61 74 61 20 3d  .  pNew->nData =
a280: 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49 4e 54   1 + FTS3_VARINT
a290: 5f 4d 41 58 3b 0a 20 20 70 4e 65 77 2d 3e 61 44  _MAX;.  pNew->aD
a2a0: 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ata = (char *)&p
a2b0: 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69 66 28 20 70  New[1];..  if( p
a2c0: 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65 67 6d  Tree ){.    Segm
a2d0: 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  entNode *pParent
a2e0: 20 3d 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e   = pTree->pParen
a2f0: 74 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  t;.    rc = fts3
a300: 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26  NodeAddTerm(p, &
a310: 70 50 61 72 65 6e 74 2c 20 69 73 43 6f 70 79 54  pParent, isCopyT
a320: 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
a330: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 65  m);.    if( pTre
a340: 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b  e->pParent==0 ){
a350: 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 70 50  .      pTree->pP
a360: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
a370: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 65 65  .    }.    pTree
a380: 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65 77 3b  ->pRight = pNew;
a390: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  .    pNew->pLeft
a3a0: 6d 6f 73 74 20 3d 20 70 54 72 65 65 2d 3e 70 4c  most = pTree->pL
a3b0: 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 70 4e 65  eftmost;.    pNe
a3c0: 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  w->pParent = pPa
a3d0: 72 65 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  rent;.    pNew->
a3e0: 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d  zMalloc = pTree-
a3f0: 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4e  >zMalloc;.    pN
a400: 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 70 54  ew->nMalloc = pT
a410: 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20 20  ree->nMalloc;.  
a420: 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63    pTree->zMalloc
a430: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
a440: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f     pNew->pLeftmo
a450: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  st = pNew;.    r
a460: 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54  c = fts3NodeAddT
a470: 65 72 6d 28 70 2c 20 26 70 4e 65 77 2c 20 69 73  erm(p, &pNew, is
a480: 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  CopyTerm, zTerm,
a490: 20 6e 54 65 72 6d 29 3b 20 0a 20 20 7d 0a 0a 20   nTerm); .  }.. 
a4a0: 20 2a 70 70 54 72 65 65 20 3d 20 70 4e 65 77 3b   *ppTree = pNew;
a4b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a4c0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
a4d0: 6e 63 74 69 6f 6e 20 66 6f 72 20 66 74 73 33 4e  nction for fts3N
a4e0: 6f 64 65 57 72 69 74 65 28 29 2e 0a 2a 2f 0a 73  odeWrite()..*/.s
a4f0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 72  tatic int fts3Tr
a500: 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 0a 20 20  eeFinishNode(.  
a510: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72  SegmentNode *pTr
a520: 65 65 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67  ee, .  int iHeig
a530: 68 74 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69  ht, .  sqlite3_i
a540: 6e 74 36 34 20 69 4c 65 66 74 43 68 69 6c 64 0a  nt64 iLeftChild.
a550: 29 7b 0a 20 20 69 6e 74 20 6e 53 74 61 72 74 3b  ){.  int nStart;
a560: 0a 20 20 61 73 73 65 72 74 28 20 69 48 65 69 67  .  assert( iHeig
a570: 68 74 3e 3d 31 20 26 26 20 69 48 65 69 67 68 74  ht>=1 && iHeight
a580: 3c 31 32 38 20 29 3b 0a 20 20 6e 53 74 61 72 74  <128 );.  nStart
a590: 20 3d 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d   = FTS3_VARINT_M
a5a0: 41 58 20 2d 20 73 71 6c 69 74 65 33 46 74 73 33  AX - sqlite3Fts3
a5b0: 56 61 72 69 6e 74 4c 65 6e 28 69 4c 65 66 74 43  VarintLen(iLeftC
a5c0: 68 69 6c 64 29 3b 0a 20 20 70 54 72 65 65 2d 3e  hild);.  pTree->
a5d0: 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 20 3d 20  aData[nStart] = 
a5e0: 28 63 68 61 72 29 69 48 65 69 67 68 74 3b 0a 20  (char)iHeight;. 
a5f0: 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
a600: 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44  arint(&pTree->aD
a610: 61 74 61 5b 6e 53 74 61 72 74 2b 31 5d 2c 20 69  ata[nStart+1], i
a620: 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 72 65  LeftChild);.  re
a630: 74 75 72 6e 20 6e 53 74 61 72 74 3b 0a 7d 0a 0a  turn nStart;.}..
a640: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
a650: 62 75 66 66 65 72 20 66 6f 72 20 74 68 65 20 73  buffer for the s
a660: 65 67 6d 65 6e 74 20 6e 6f 64 65 20 70 54 72 65  egment node pTre
a670: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
a680: 20 70 65 65 72 73 20 74 6f 20 74 68 65 0a 2a 2a   peers to the.**
a690: 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 6e 20   database. Then 
a6a0: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
a6b0: 6f 6e 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  on recursively t
a6c0: 6f 20 77 72 69 74 65 20 74 68 65 20 70 61 72 65  o write the pare
a6d0: 6e 74 20 6f 66 20 0a 2a 2a 20 70 54 72 65 65 20  nt of .** pTree 
a6e0: 61 6e 64 20 69 74 73 20 70 65 65 72 73 20 74 6f  and its peers to
a6f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a   the database. .
a700: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
a710: 20 70 54 72 65 65 20 69 73 20 61 20 72 6f 6f 74   pTree is a root
a720: 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 77 72   node, do not wr
a730: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 64 61  ite it to the da
a740: 74 61 62 61 73 65 2e 20 49 6e 73 74 65 61 64 2c  tabase. Instead,
a750: 0a 2a 2a 20 73 65 74 20 6f 75 74 70 75 74 20 76  .** set output v
a760: 61 72 69 61 62 6c 65 73 20 2a 70 61 52 6f 6f 74  ariables *paRoot
a770: 20 61 6e 64 20 2a 70 6e 52 6f 6f 74 20 74 6f 20   and *pnRoot to 
a780: 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 6f 74  contain the root
a790: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   node..**.** If 
a7a0: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
a7b0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
a7c0: 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76 61 72  d and output var
a7d0: 69 61 62 6c 65 20 2a 70 69 4c 61 73 74 20 69 73  iable *piLast is
a7e0: 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 6c  .** set to the l
a7f0: 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64 20 77  argest blockid w
a800: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
a810: 74 61 62 61 73 65 20 28 6f 72 20 7a 65 72 6f 20  tabase (or zero 
a820: 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b 73 20  if no.** blocks 
a830: 77 65 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20  were written to 
a840: 74 68 65 20 64 62 29 2e 20 4f 74 68 65 72 77 69  the db). Otherwi
a850: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
a860: 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
a870: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
a880: 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65  tic int fts3Node
a890: 57 72 69 74 65 28 0a 20 20 46 74 73 33 54 61 62  Write(.  Fts3Tab
a8a0: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
a8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
a8c0: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
a8d0: 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64   */.  SegmentNod
a8e0: 65 20 2a 70 54 72 65 65 2c 20 20 20 20 20 20 20  e *pTree,       
a8f0: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
a900: 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  Node handle */. 
a910: 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 20 20   int iHeight,   
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 74 68   /* Height of th
a940: 69 73 20 6e 6f 64 65 20 69 6e 20 74 72 65 65 20  is node in tree 
a950: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
a960: 36 34 20 69 4c 65 61 66 2c 20 20 20 20 20 20 20  64 iLeaf,       
a970: 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64       /* Block id
a980: 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66 20 6e   of first leaf n
a990: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
a9a0: 5f 69 6e 74 36 34 20 69 46 72 65 65 2c 20 20 20  _int64 iFree,   
a9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
a9c0: 6b 20 69 64 20 6f 66 20 6e 65 78 74 20 66 72 65  k id of next fre
a9d0: 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d  e slot in %_segm
a9e0: 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ents */.  sqlite
a9f0: 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73 74 2c  3_int64 *piLast,
aa00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
aa10: 3a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6c 61  : Block id of la
aa20: 73 74 20 65 6e 74 72 79 20 77 72 69 74 74 65 6e  st entry written
aa30: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 52   */.  char **paR
aa40: 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  oot,            
aa50: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 61        /* OUT: Da
aa60: 74 61 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65  ta for root node
aa70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 6f 6f   */.  int *pnRoo
aa80: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
aa90: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
aaa0: 7a 65 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65 20  ze of root node 
aab0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
aac0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
aad0: 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 54 72  _OK;..  if( !pTr
aae0: 65 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20  ee->pParent ){. 
aaf0: 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65 20     /* Root node 
ab00: 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a  of the tree. */.
ab10: 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d      int nStart =
ab20: 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e   fts3TreeFinishN
ab30: 6f 64 65 28 70 54 72 65 65 2c 20 69 48 65 69 67  ode(pTree, iHeig
ab40: 68 74 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20  ht, iLeaf);.    
ab50: 2a 70 69 4c 61 73 74 20 3d 20 69 46 72 65 65 2d  *piLast = iFree-
ab60: 31 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f 74 20 3d  1;.    *pnRoot =
ab70: 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 2d 20   pTree->nData - 
ab80: 6e 53 74 61 72 74 3b 0a 20 20 20 20 2a 70 61 52  nStart;.    *paR
ab90: 6f 6f 74 20 3d 20 26 70 54 72 65 65 2d 3e 61 44  oot = &pTree->aD
aba0: 61 74 61 5b 6e 53 74 61 72 74 5d 3b 0a 20 20 7d  ata[nStart];.  }
abb0: 65 6c 73 65 7b 0a 20 20 20 20 53 65 67 6d 65 6e  else{.    Segmen
abc0: 74 4e 6f 64 65 20 2a 70 49 74 65 72 3b 0a 20 20  tNode *pIter;.  
abd0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
abe0: 69 4e 65 78 74 46 72 65 65 20 3d 20 69 46 72 65  iNextFree = iFre
abf0: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  e;.    sqlite3_i
ac00: 6e 74 36 34 20 69 4e 65 78 74 4c 65 61 66 20 3d  nt64 iNextLeaf =
ac10: 20 69 4c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28   iLeaf;.    for(
ac20: 70 49 74 65 72 3d 70 54 72 65 65 2d 3e 70 4c 65  pIter=pTree->pLe
ac30: 66 74 6d 6f 73 74 3b 20 70 49 74 65 72 20 26 26  ftmost; pIter &&
ac40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
ac50: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 52 69  pIter=pIter->pRi
ac60: 67 68 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ght){.      int 
ac70: 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54 72 65  nStart = fts3Tre
ac80: 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 49 74 65  eFinishNode(pIte
ac90: 72 2c 20 69 48 65 69 67 68 74 2c 20 69 4e 65 78  r, iHeight, iNex
aca0: 74 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 6e  tLeaf);.      in
acb0: 74 20 6e 57 72 69 74 65 20 3d 20 70 49 74 65 72  t nWrite = pIter
acc0: 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74  ->nData - nStart
acd0: 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20  ;.  .      rc = 
ace0: 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74  fts3WriteSegment
acf0: 28 70 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 26  (p, iNextFree, &
ad00: 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 6e 53 74  pIter->aData[nSt
ad10: 61 72 74 5d 2c 20 6e 57 72 69 74 65 29 3b 0a 20  art], nWrite);. 
ad20: 20 20 20 20 20 69 4e 65 78 74 46 72 65 65 2b 2b       iNextFree++
ad30: 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 4c 65 61  ;.      iNextLea
ad40: 66 20 2b 3d 20 28 70 49 74 65 72 2d 3e 6e 45 6e  f += (pIter->nEn
ad50: 74 72 79 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  try+1);.    }.  
ad60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ad70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
ad80: 65 72 74 28 20 69 4e 65 78 74 4c 65 61 66 3d 3d  ert( iNextLeaf==
ad90: 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 72  iFree );.      r
ada0: 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 74  c = fts3NodeWrit
adb0: 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20  e(.          p, 
adc0: 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 2c 20  pTree->pParent, 
add0: 69 48 65 69 67 68 74 2b 31 2c 20 69 46 72 65 65  iHeight+1, iFree
ade0: 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 70 69 4c  , iNextFree, piL
adf0: 61 73 74 2c 20 70 61 52 6f 6f 74 2c 20 70 6e 52  ast, paRoot, pnR
ae00: 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  oot.      );.   
ae10: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
ae20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
ae30: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c  ee all memory al
ae40: 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
ae50: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 72  ated with the tr
ae60: 65 65 20 70 54 72 65 65 2e 0a 2a 2f 0a 73 74 61  ee pTree..*/.sta
ae70: 74 69 63 20 76 6f 69 64 20 66 74 73 33 4e 6f 64  tic void fts3Nod
ae80: 65 46 72 65 65 28 53 65 67 6d 65 6e 74 4e 6f 64  eFree(SegmentNod
ae90: 65 20 2a 70 54 72 65 65 29 7b 0a 20 20 69 66 28  e *pTree){.  if(
aea0: 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65   pTree ){.    Se
aeb0: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 20 3d 20 70  gmentNode *p = p
aec0: 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b  Tree->pLeftmost;
aed0: 0a 20 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65  .    fts3NodeFre
aee0: 65 28 70 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  e(p->pParent);. 
aef0: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
af00: 20 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65       SegmentNode
af10: 20 2a 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52   *pRight = p->pR
af20: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
af30: 70 2d 3e 61 44 61 74 61 21 3d 28 63 68 61 72 20  p->aData!=(char 
af40: 2a 29 26 70 5b 31 5d 20 29 7b 0a 20 20 20 20 20  *)&p[1] ){.     
af50: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
af60: 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  p->aData);.     
af70: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
af80: 20 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d   pRight==0 || p-
af90: 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  >zMalloc==0 );. 
afa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
afb0: 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  e(p->zMalloc);. 
afc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
afd0: 65 28 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20  e(p);.      p = 
afe0: 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20  pRight;.    }.  
aff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
b000: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67   term to the seg
b010: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 6e 73 74  ment being const
b020: 72 75 63 74 65 64 20 62 79 20 74 68 65 20 53 65  ructed by the Se
b030: 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65  gmentWriter obje
b040: 63 74 0a 2a 2a 20 2a 70 70 57 72 69 74 65 72 2e  ct.** *ppWriter.
b050: 20 57 68 65 6e 20 61 64 64 69 6e 67 20 74 68 65   When adding the
b060: 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20 61   first term to a
b070: 20 73 65 67 6d 65 6e 74 2c 20 2a 70 70 57 72 69   segment, *ppWri
b080: 74 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ter should.** be
b090: 20 70 61 73 73 65 64 20 4e 55 4c 4c 2e 20 54 68   passed NULL. Th
b0a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
b0b0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
b0c0: 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62  SegmentWriter ob
b0d0: 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ject.** and retu
b0e0: 72 6e 20 69 74 20 76 69 61 20 74 68 65 20 69 6e  rn it via the in
b0f0: 70 75 74 2f 6f 75 74 70 75 74 20 76 61 72 69 61  put/output varia
b100: 62 6c 65 20 2a 70 70 57 72 69 74 65 72 20 69 6e  ble *ppWriter in
b110: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
b120: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
b130: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
b140: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
b150: 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
b160: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
b170: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 57 72  ic int fts3SegWr
b180: 69 74 65 72 41 64 64 28 0a 20 20 46 74 73 33 54  iterAdd(.  Fts3T
b190: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
b1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
b1b0: 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
b1c0: 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57  le */.  SegmentW
b1d0: 72 69 74 65 72 20 2a 2a 70 70 57 72 69 74 65 72  riter **ppWriter
b1e0: 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
b1f0: 54 3a 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  T: SegmentWriter
b200: 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69 6e   handle */ .  in
b210: 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20 20  t isCopyTerm,   
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b230: 20 54 72 75 65 20 69 66 20 62 75 66 66 65 72 20   True if buffer 
b240: 7a 54 65 72 6d 20 6d 75 73 74 20 62 65 20 63 6f  zTerm must be co
b250: 70 69 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pied */.  const 
b260: 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
b270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
b280: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
b290: 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a  ontaining term *
b2a0: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b2d0: 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
b2e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44    const char *aD
b2f0: 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oclist,         
b300: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
b310: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
b320: 67 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69  g doclist */.  i
b330: 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20 20 20  nt nDoclist     
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b350: 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
b360: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  t in bytes */.){
b370: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
b3a0: 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79 74  rm prefix in byt
b3b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66  es */.  int nSuf
b3c0: 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
b3d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b3e0: 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20 69  of term suffix i
b3f0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
b400: 20 6e 52 65 71 3b 20 20 20 20 20 20 20 20 20 20   nReq;          
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b420: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b430: 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66  required on leaf
b440: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
b450: 44 61 74 61 3b 0a 20 20 53 65 67 6d 65 6e 74 57  Data;.  SegmentW
b460: 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d  riter *pWriter =
b470: 20 2a 70 70 57 72 69 74 65 72 3b 0a 0a 20 20 69   *ppWriter;..  i
b480: 66 28 20 21 70 57 72 69 74 65 72 20 29 7b 0a 20  f( !pWriter ){. 
b490: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
b4a0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
b4b0: 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  mt;..    /* Allo
b4c0: 63 61 74 65 20 74 68 65 20 53 65 67 6d 65 6e 74  cate the Segment
b4d0: 57 72 69 74 65 72 20 73 74 72 75 63 74 75 72 65  Writer structure
b4e0: 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72 20   */.    pWriter 
b4f0: 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72  = (SegmentWriter
b500: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
b510: 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  c(sizeof(Segment
b520: 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 69 66  Writer));.    if
b530: 28 20 21 70 57 72 69 74 65 72 20 29 20 72 65 74  ( !pWriter ) ret
b540: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b550: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72  ;.    memset(pWr
b560: 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
b570: 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29 3b  SegmentWriter));
b580: 0a 20 20 20 20 2a 70 70 57 72 69 74 65 72 20 3d  .    *ppWriter =
b590: 20 70 57 72 69 74 65 72 3b 0a 0a 20 20 20 20 2f   pWriter;..    /
b5a0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * Allocate a buf
b5b0: 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
b5c0: 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74 61 20  accumulate data 
b5d0: 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  */.    pWriter->
b5e0: 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29  aData = (char *)
b5f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 4c  sqlite3_malloc(L
b600: 45 41 46 5f 4d 41 58 29 3b 0a 20 20 20 20 69 66  EAF_MAX);.    if
b610: 28 20 21 70 57 72 69 74 65 72 2d 3e 61 44 61 74  ( !pWriter->aDat
b620: 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
b630: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72  E_NOMEM;.    pWr
b640: 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 4c 45  iter->nSize = LE
b650: 41 46 5f 4d 41 58 3b 0a 0a 20 20 20 20 2f 2a 20  AF_MAX;..    /* 
b660: 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 66 72  Find the next fr
b670: 65 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20 74 68  ee blockid in th
b680: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
b690: 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
b6a0: 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
b6b0: 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f  L_NEXT_SEGMENTS_
b6c0: 49 44 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  ID, &pStmt, 0);.
b6d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b6e0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b6f0: 63 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  c;.    if( SQLIT
b700: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
b710: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
b720: 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 72      pWriter->iFr
b730: 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ee = sqlite3_col
b740: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
b750: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74   0);.      pWrit
b760: 65 72 2d 3e 69 46 69 72 73 74 20 3d 20 70 57 72  er->iFirst = pWr
b770: 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20  iter->iFree;.   
b780: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
b790: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
b7a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b7b0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
b7c0: 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61 74 61   rc;.  }.  nData
b7d0: 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74   = pWriter->nDat
b7e0: 61 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d 20  a;..  nPrefix = 
b7f0: 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
b800: 73 73 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  ss(pWriter->zTer
b810: 6d 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72  m, pWriter->nTer
b820: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
b830: 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54  ;.  nSuffix = nT
b840: 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20  erm-nPrefix;..  
b850: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
b860: 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65  w many bytes are
b870: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
b880: 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  s new entry */. 
b890: 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46   nReq = sqlite3F
b8a0: 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72  ts3VarintLen(nPr
b8b0: 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20 76 61  efix) +    /* va
b8c0: 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rint containing 
b8d0: 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20  prefix size */. 
b8e0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61     sqlite3Fts3Va
b8f0: 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29  rintLen(nSuffix)
b900: 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61   +         /* va
b910: 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rint containing 
b920: 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20  suffix size */. 
b930: 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20 20 20     nSuffix +    
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
b960: 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20  rm suffix */.   
b970: 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
b980: 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20  ntLen(nDoclist) 
b990: 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  +        /* Size
b9a0: 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   of doclist */. 
b9b0: 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20     nDoclist;    
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
b9e0: 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 0a 20  clist data */.. 
b9f0: 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26 26 20   if( nData>0 && 
ba00: 6e 44 61 74 61 2b 6e 52 65 71 3e 4c 45 41 46 5f  nData+nReq>LEAF_
ba10: 4d 41 58 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  MAX ){.    int r
ba20: 63 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  c;..    /* The c
ba30: 75 72 72 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65  urrent leaf node
ba40: 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20   is full. Write 
ba50: 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  it out to the da
ba60: 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72  tabase. */.    r
ba70: 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
ba80: 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d  ment(p, pWriter-
ba90: 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65  >iFree++, pWrite
baa0: 72 2d 3e 61 44 61 74 61 2c 20 6e 44 61 74 61 29  r->aData, nData)
bab0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
bac0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
bad0: 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64   rc;..    /* Add
bae0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
baf0: 6d 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f  m to the interio
bb00: 72 20 6e 6f 64 65 20 74 72 65 65 2e 20 54 68 65  r node tree. The
bb10: 20 74 65 72 6d 20 61 64 64 65 64 20 74 6f 0a 20   term added to. 
bb20: 20 20 20 2a 2a 20 74 68 65 20 69 6e 74 65 72 69     ** the interi
bb30: 6f 72 20 74 72 65 65 20 6d 75 73 74 3a 0a 20 20  or tree must:.  
bb40: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29    **.    **   a)
bb50: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
bb60: 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72   the largest ter
bb70: 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f  m on the leaf no
bb80: 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 0a  de just written.
bb90: 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 74      **      to t
bba0: 68 65 20 64 61 74 61 62 61 73 65 20 28 73 74 69  he database (sti
bbb0: 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ll available in 
bbc0: 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 29 2c  pWriter->zTerm),
bbd0: 20 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20   and.    **.    
bbe0: 2a 2a 20 20 20 62 29 20 62 65 20 6c 65 73 73 20  **   b) be less 
bbf0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
bc00: 20 74 68 65 20 74 65 72 6d 20 61 62 6f 75 74 20   the term about 
bc10: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
bc20: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20  he new.    **   
bc30: 20 20 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54     leaf node (zT
bc40: 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20  erm/nTerm)..    
bc50: 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  **.    ** In oth
bc60: 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73  er words, it mus
bc70: 74 20 62 65 20 74 68 65 20 70 72 65 66 69 78 20  t be the prefix 
bc80: 6f 66 20 7a 54 65 72 6d 20 31 20 62 79 74 65 20  of zTerm 1 byte 
bc90: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20  longer than.    
bca0: 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  ** the common pr
bcb0: 65 66 69 78 20 28 69 66 20 61 6e 79 29 20 6f 66  efix (if any) of
bcc0: 20 7a 54 65 72 6d 20 61 6e 64 20 70 57 72 69 74   zTerm and pWrit
bcd0: 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a  er->zTerm..    *
bce0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  /.    assert( nP
bcf0: 72 65 66 69 78 3c 6e 54 65 72 6d 20 29 3b 0a 20  refix<nTerm );. 
bd00: 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65     rc = fts3Node
bd10: 41 64 64 54 65 72 6d 28 70 2c 20 26 70 57 72 69  AddTerm(p, &pWri
bd20: 74 65 72 2d 3e 70 54 72 65 65 2c 20 69 73 43 6f  ter->pTree, isCo
bd30: 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e  pyTerm, zTerm, n
bd40: 50 72 65 66 69 78 2b 31 29 3b 0a 20 20 20 20 69  Prefix+1);.    i
bd50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bd60: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
bd70: 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
bd80: 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d    pWriter->nTerm
bd90: 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66   = 0;..    nPref
bda0: 69 78 20 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66  ix = 0;.    nSuf
bdb0: 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  fix = nTerm;.   
bdc0: 20 6e 52 65 71 20 3d 20 31 20 2b 20 20 20 20 20   nReq = 1 +     
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69           /* vari
bdf0: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  nt containing pr
be00: 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20  efix size */.   
be10: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61     sqlite3Fts3Va
be20: 72 69 6e 74 4c 65 6e 28 6e 54 65 72 6d 29 20 2b  rintLen(nTerm) +
be30: 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69           /* vari
be40: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75  nt containing su
be50: 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ffix size */.   
be60: 20 20 20 6e 54 65 72 6d 20 2b 20 20 20 20 20 20     nTerm +      
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
be90: 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 20   suffix */.     
bea0: 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
beb0: 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20  ntLen(nDoclist) 
bec0: 2b 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  +      /* Size o
bed0: 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20  f doclist */.   
bee0: 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20     nDoclist;    
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
bf10: 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 7d 0a  ist data */.  }.
bf20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 75 66  .  /* If the buf
bf30: 66 65 72 20 63 75 72 72 65 6e 74 6c 79 20 61 6c  fer currently al
bf40: 6c 6f 63 61 74 65 64 20 69 73 20 74 6f 6f 20 73  located is too s
bf50: 6d 61 6c 6c 20 66 6f 72 20 74 68 69 73 20 65 6e  mall for this en
bf60: 74 72 79 2c 20 72 65 61 6c 6c 6f 63 0a 20 20 2a  try, realloc.  *
bf70: 2a 20 74 68 65 20 62 75 66 66 65 72 20 74 6f 20  * the buffer to 
bf80: 6d 61 6b 65 20 69 74 20 6c 61 72 67 65 20 65 6e  make it large en
bf90: 6f 75 67 68 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ough..  */.  if(
bfa0: 20 6e 52 65 71 3e 70 57 72 69 74 65 72 2d 3e 6e   nReq>pWriter->n
bfb0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 68 61 72  Size ){.    char
bfc0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
bfd0: 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72  _realloc(pWriter
bfe0: 2d 3e 61 44 61 74 61 2c 20 6e 52 65 71 29 3b 0a  ->aData, nReq);.
bff0: 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 20      if( !aNew ) 
c000: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c010: 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72  MEM;.    pWriter
c020: 2d 3e 61 44 61 74 61 20 3d 20 61 4e 65 77 3b 0a  ->aData = aNew;.
c030: 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69      pWriter->nSi
c040: 7a 65 20 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a 20  ze = nReq;.  }. 
c050: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 2b 6e   assert( nData+n
c060: 52 65 71 3c 3d 70 57 72 69 74 65 72 2d 3e 6e 53  Req<=pWriter->nS
c070: 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 70 70  ize );..  /* App
c080: 65 6e 64 20 74 68 65 20 70 72 65 66 69 78 2d 63  end the prefix-c
c090: 6f 6d 70 72 65 73 73 65 64 20 74 65 72 6d 20 61  ompressed term a
c0a0: 6e 64 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68  nd doclist to th
c0b0: 65 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 6e  e buffer. */.  n
c0c0: 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46  Data += sqlite3F
c0d0: 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57  ts3PutVarint(&pW
c0e0: 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61  riter->aData[nDa
c0f0: 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20  ta], nPrefix);. 
c100: 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65   nData += sqlite
c110: 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
c120: 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e  pWriter->aData[n
c130: 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b  Data], nSuffix);
c140: 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74  .  memcpy(&pWrit
c150: 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
c160: 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78  , &zTerm[nPrefix
c170: 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 6e  ], nSuffix);.  n
c180: 44 61 74 61 20 2b 3d 20 6e 53 75 66 66 69 78 3b  Data += nSuffix;
c190: 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69  .  nData += sqli
c1a0: 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
c1b0: 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  (&pWriter->aData
c1c0: 5b 6e 44 61 74 61 5d 2c 20 6e 44 6f 63 6c 69 73  [nData], nDoclis
c1d0: 74 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 57  t);.  memcpy(&pW
c1e0: 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61  riter->aData[nDa
c1f0: 74 61 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e  ta], aDoclist, n
c200: 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 57 72 69  Doclist);.  pWri
c210: 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61  ter->nData = nDa
c220: 74 61 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a  ta + nDoclist;..
c230: 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 63 75    /* Save the cu
c240: 72 72 65 6e 74 20 74 65 72 6d 20 73 6f 20 74 68  rrent term so th
c250: 61 74 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  at it can be use
c260: 64 20 74 6f 20 70 72 65 66 69 78 2d 63 6f 6d 70  d to prefix-comp
c270: 72 65 73 73 20 74 68 65 20 6e 65 78 74 2e 0a 20  ress the next.. 
c280: 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 70   ** If the isCop
c290: 79 54 65 72 6d 20 70 61 72 61 6d 65 74 65 72 20  yTerm parameter 
c2a0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
c2b0: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
c2c0: 20 74 6f 20 62 79 0a 20 20 2a 2a 20 7a 54 65 72   to by.  ** zTer
c2d0: 6d 20 69 73 20 74 72 61 6e 73 69 65 6e 74 2c 20  m is transient, 
c2e0: 73 6f 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f  so take a copy o
c2f0: 66 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  f the term data.
c300: 20 4f 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74   Otherwise, just
c310: 0a 20 20 2a 2a 20 73 74 6f 72 65 20 61 20 63 6f  .  ** store a co
c320: 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  py of the pointe
c330: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  r..  */.  if( is
c340: 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20 20  CopyTerm ){.    
c350: 69 66 28 20 6e 54 65 72 6d 3e 70 57 72 69 74 65  if( nTerm>pWrite
c360: 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  r->nMalloc ){.  
c370: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d      char *zNew =
c380: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
c390: 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f  (pWriter->zMallo
c3a0: 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20  c, nTerm*2);.   
c3b0: 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a     if( !zNew ){.
c3c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c3d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
c3e0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 72 69 74     }.      pWrit
c3f0: 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54  er->nMalloc = nT
c400: 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20 70 57 72  erm*2;.      pWr
c410: 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  iter->zMalloc = 
c420: 7a 4e 65 77 3b 0a 20 20 20 20 20 20 70 57 72 69  zNew;.      pWri
c430: 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65  ter->zTerm = zNe
c440: 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  w;.    }.    ass
c450: 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 7a 54  ert( pWriter->zT
c460: 65 72 6d 3d 3d 70 57 72 69 74 65 72 2d 3e 7a 4d  erm==pWriter->zM
c470: 61 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 6d 65 6d  alloc );.    mem
c480: 63 70 79 28 70 57 72 69 74 65 72 2d 3e 7a 54 65  cpy(pWriter->zTe
c490: 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
c4a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c4b0: 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d  pWriter->zTerm =
c4c0: 20 28 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a   (char *)zTerm;.
c4d0: 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e    }.  pWriter->n
c4e0: 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20  Term = nTerm;.. 
c4f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c500: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  K;.}../*.** Flus
c510: 68 20 61 6c 6c 20 64 61 74 61 20 61 73 73 6f 63  h all data assoc
c520: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 53  iated with the S
c530: 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a  egmentWriter obj
c540: 65 63 74 20 70 57 72 69 74 65 72 20 74 6f 20 74  ect pWriter to t
c550: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
c560: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  This function mu
c570: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  st be called aft
c580: 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 68 61 76  er all terms hav
c590: 65 20 62 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20  e been added.** 
c5a0: 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 75  to the segment u
c5b0: 73 69 6e 67 20 66 74 73 33 53 65 67 57 72 69 74  sing fts3SegWrit
c5c0: 65 72 41 64 64 28 29 2e 20 49 66 20 73 75 63 63  erAdd(). If succ
c5d0: 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
c5e0: 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  K is.** returned
c5f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
c600: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
c610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c620: 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46 6c   fts3SegWriterFl
c630: 75 73 68 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ush(.  Fts3Table
c640: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
c650: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
c660: 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
c670: 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65  /.  SegmentWrite
c680: 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
c690: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 57 72      /* SegmentWr
c6a0: 69 74 65 72 20 74 6f 20 66 6c 75 73 68 20 74 6f  iter to flush to
c6b0: 20 74 68 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74   the db */.  int
c6c0: 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6e0: 56 61 6c 75 65 20 66 6f 72 20 27 6c 65 76 65 6c  Value for 'level
c6f0: 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65  ' column of %_se
c700: 67 64 69 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49  gdir */.  int iI
c710: 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
c720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
c730: 75 65 20 66 6f 72 20 27 69 64 78 27 20 63 6f 6c  ue for 'idx' col
c740: 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20  umn of %_segdir 
c750: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c780: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20  n code */.  if( 
c790: 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 20 29  pWriter->pTree )
c7a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
c7b0: 74 36 34 20 69 4c 61 73 74 20 3d 20 30 3b 20 20  t64 iLast = 0;  
c7c0: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 62      /* Largest b
c7d0: 6c 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20  lock id written 
c7e0: 74 6f 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  to database */. 
c7f0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
c800: 20 69 4c 61 73 74 4c 65 61 66 3b 20 20 20 20 20   iLastLeaf;     
c810: 20 2f 2a 20 4c 61 72 67 65 73 74 20 6c 65 61 66   /* Largest leaf
c820: 20 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74 65   block id writte
c830: 6e 20 74 6f 20 64 62 20 2a 2f 0a 20 20 20 20 63  n to db */.    c
c840: 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55 4c  har *zRoot = NUL
c850: 4c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  L;           /* 
c860: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
c870: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f  r containing roo
c880: 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  t node */.    in
c890: 74 20 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20  t nRoot = 0;    
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c8b0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 52  ize of buffer zR
c8c0: 6f 6f 74 20 2a 2f 0a 0a 20 20 20 20 69 4c 61 73  oot */..    iLas
c8d0: 74 4c 65 61 66 20 3d 20 70 57 72 69 74 65 72 2d  tLeaf = pWriter-
c8e0: 3e 69 46 72 65 65 3b 0a 20 20 20 20 72 63 20 3d  >iFree;.    rc =
c8f0: 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
c900: 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 46  t(p, pWriter->iF
c910: 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e  ree++, pWriter->
c920: 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e  aData, pWriter->
c930: 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  nData);.    if( 
c940: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c950: 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
c960: 4e 6f 64 65 57 72 69 74 65 28 70 2c 20 70 57 72  NodeWrite(p, pWr
c970: 69 74 65 72 2d 3e 70 54 72 65 65 2c 20 31 2c 0a  iter->pTree, 1,.
c980: 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
c990: 72 2d 3e 69 46 69 72 73 74 2c 20 70 57 72 69 74  r->iFirst, pWrit
c9a0: 65 72 2d 3e 69 46 72 65 65 2c 20 26 69 4c 61 73  er->iFree, &iLas
c9b0: 74 2c 20 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f 6f  t, &zRoot, &nRoo
c9c0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
c9d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c9e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ){.      rc = ft
c9f0: 73 33 57 72 69 74 65 53 65 67 64 69 72 28 0a 20  s3WriteSegdir(. 
ca00: 20 20 20 20 20 20 20 20 20 70 2c 20 69 4c 65 76           p, iLev
ca10: 65 6c 2c 20 69 49 64 78 2c 20 70 57 72 69 74 65  el, iIdx, pWrite
ca20: 72 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73 74  r->iFirst, iLast
ca30: 4c 65 61 66 2c 20 69 4c 61 73 74 2c 20 7a 52 6f  Leaf, iLast, zRo
ca40: 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20  ot, nRoot);.    
ca50: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
ca60: 2a 20 54 68 65 20 65 6e 74 69 72 65 20 74 72 65  * The entire tre
ca70: 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f  e fits on the ro
ca80: 6f 74 20 6e 6f 64 65 2e 20 57 72 69 74 65 20 69  ot node. Write i
ca90: 74 20 74 6f 20 74 68 65 20 73 65 67 64 69 72 20  t to the segdir 
caa0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63  table. */.    rc
cab0: 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 64   = fts3WriteSegd
cac0: 69 72 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69  ir(.        p, i
cad0: 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 30 2c 20  Level, iIdx, 0, 
cae0: 30 2c 20 30 2c 20 70 57 72 69 74 65 72 2d 3e 61  0, 0, pWriter->a
caf0: 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e  Data, pWriter->n
cb00: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Data);.  }.  ret
cb10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cb20: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d 65 6d   Release all mem
cb30: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
cb40: 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62  SegmentWriter ob
cb50: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
cb60: 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  he .** first arg
cb70: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
cb80: 20 76 6f 69 64 20 66 74 73 33 53 65 67 57 72 69   void fts3SegWri
cb90: 74 65 72 46 72 65 65 28 53 65 67 6d 65 6e 74 57  terFree(SegmentW
cba0: 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
cbb0: 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 20 29  .  if( pWriter )
cbc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
cbd0: 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74  ee(pWriter->aDat
cbe0: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  a);.    sqlite3_
cbf0: 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 7a 4d  free(pWriter->zM
cc00: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74 73 33  alloc);.    fts3
cc10: 4e 6f 64 65 46 72 65 65 28 70 57 72 69 74 65 72  NodeFree(pWriter
cc20: 2d 3e 70 54 72 65 65 29 3b 0a 20 20 20 20 73 71  ->pTree);.    sq
cc30: 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74  lite3_free(pWrit
cc40: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
cc50: 2a 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75  * The first valu
cc60: 65 20 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d  e in the apVal[]
cc70: 20 61 72 72 61 79 20 69 73 20 61 73 73 75 6d 65   array is assume
cc80: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20  d to contain an 
cc90: 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68 69 73  integer..** This
cca0: 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
ccb0: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20 61  if there exist a
ccc0: 6e 79 20 64 6f 63 75 6d 65 6e 74 73 20 77 69 74  ny documents wit
ccd0: 68 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 74  h docid values t
cce0: 68 61 74 0a 2a 2a 20 61 72 65 20 64 69 66 66 65  hat.** are diffe
ccf0: 72 65 6e 74 20 66 72 6f 6d 20 74 68 61 74 20 69  rent from that i
cd00: 6e 74 65 67 65 72 2e 20 69 2e 65 2e 20 69 66 20  nteger. i.e. if 
cd10: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 64 6f 63  deleting the doc
cd20: 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64  ument with docid
cd30: 0a 2a 2a 20 61 70 56 61 6c 5b 30 5d 20 77 6f 75  .** apVal[0] wou
cd40: 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53 33  ld mean the FTS3
cd50: 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70 74   table were empt
cd60: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  y..**.** If succ
cd70: 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74  essful, *pisEmpt
cd80: 79 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  y is set to true
cd90: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
cda0: 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
cdb0: 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 61 70  r.** document ap
cdc0: 56 61 6c 5b 30 5d 2c 20 6f 72 20 66 61 6c 73 65  Val[0], or false
cdd0: 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20   otherwise, and 
cde0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
cdf0: 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20  urned. If an.** 
ce00: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
ce10: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
ce20: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
ce30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
ce40: 73 33 49 73 45 6d 70 74 79 28 46 74 73 33 54 61  s3IsEmpty(Fts3Ta
ce50: 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ble *p, sqlite3_
ce60: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 69  value **apVal, i
ce70: 6e 74 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20  nt *pisEmpty){. 
ce80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
ce90: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
cea0: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
ceb0: 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50  mt(p, SQL_IS_EMP
cec0: 54 59 2c 20 26 70 53 74 6d 74 2c 20 61 70 56 61  TY, &pStmt, apVa
ced0: 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  l);.  if( rc==SQ
cee0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
cef0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
cf00: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
cf10: 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 69 73  t) ){.      *pis
cf20: 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 5f  Empty = sqlite3_
cf30: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
cf40: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
cf50: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
cf60: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  et(pStmt);.  }. 
cf70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cf80: 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e 53 65 67 6d  *.** Set *pnSegm
cf90: 65 6e 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ent to the numbe
cfa0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 66  r of segments of
cfb0: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e   level iLevel in
cfc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
cfd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
cfe0: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
cff0: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
d000: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
d010: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
d020: 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74 43 6f  nt fts3SegmentCo
d030: 75 6e 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70  unt(Fts3Table *p
d040: 2c 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 69 6e  , int iLevel, in
d050: 74 20 2a 70 6e 53 65 67 6d 65 6e 74 29 7b 0a 20  t *pnSegment){. 
d060: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
d070: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
d080: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65  .  assert( iLeve
d090: 6c 3e 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 66  l>=0 );.  rc = f
d0a0: 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
d0b0: 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 43  L_SELECT_LEVEL_C
d0c0: 4f 55 4e 54 2c 20 26 70 53 74 6d 74 2c 20 30 29  OUNT, &pStmt, 0)
d0d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d0e0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
d0f0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  c;.  sqlite3_bin
d100: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20  d_int(pStmt, 1, 
d110: 69 4c 65 76 65 6c 29 3b 0a 20 20 69 66 28 20 53  iLevel);.  if( S
d120: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
d130: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
d140: 7b 0a 20 20 20 20 2a 70 6e 53 65 67 6d 65 6e 74  {.    *pnSegment
d150: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
d160: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
d170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
d180: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
d190: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  t);.}../*.** Set
d1a0: 20 2a 70 6e 53 65 67 6d 65 6e 74 20 74 6f 20 74   *pnSegment to t
d1b0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
d1c0: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  of segments in t
d1d0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 65 74  he database. Set
d1e0: 0a 2a 2a 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68  .** *pnMax to th
d1f0: 65 20 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e  e largest segmen
d200: 74 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64  t level in the d
d210: 61 74 61 62 61 73 65 20 28 73 65 67 6d 65 6e 74  atabase (segment
d220: 20 6c 65 76 65 6c 73 0a 2a 2a 20 61 72 65 20 73   levels.** are s
d230: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 27 6c 65  tored in the 'le
d240: 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  vel' column of t
d250: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
d260: 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  e)..**.** Return
d270: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
d280: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
d290: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
d2a0: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
d2b0: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d  tic int fts3Segm
d2c0: 65 6e 74 43 6f 75 6e 74 4d 61 78 28 46 74 73 33  entCountMax(Fts3
d2d0: 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Table *p, int *p
d2e0: 6e 53 65 67 6d 65 6e 74 2c 20 69 6e 74 20 2a 70  nSegment, int *p
d2f0: 6e 4d 61 78 29 7b 0a 20 20 73 71 6c 69 74 65 33  nMax){.  sqlite3
d300: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
d310: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
d320: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
d330: 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
d340: 5f 43 4f 55 4e 54 5f 4d 41 58 2c 20 26 70 53 74  _COUNT_MAX, &pSt
d350: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
d360: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
d370: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 53  turn rc;.  if( S
d380: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
d390: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
d3a0: 7b 0a 20 20 20 20 2a 70 6e 53 65 67 6d 65 6e 74  {.    *pnSegment
d3b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
d3c0: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
d3d0: 0a 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71  .    *pnMax = sq
d3e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
d3f0: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  (pStmt, 1);.  }.
d400: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d410: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d  _reset(pStmt);.}
d420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
d430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 66  ction is used af
d440: 74 65 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74  ter merging mult
d450: 69 70 6c 65 20 73 65 67 6d 65 6e 74 73 20 69 6e  iple segments in
d460: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67  to a single larg
d470: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20  e.** segment to 
d480: 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c 20  delete the old, 
d490: 6e 6f 77 20 72 65 64 75 6e 64 61 6e 74 2c 20 73  now redundant, s
d4a0: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20  egment b-trees. 
d4b0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a  Specifically,.**
d4c0: 20 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29   it:.** .**   1)
d4d0: 20 44 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73   Deletes all %_s
d4e0: 65 67 6d 65 6e 74 73 20 65 6e 74 72 69 65 73 20  egments entries 
d4f0: 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74 73  for the segments
d500: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
d510: 20 0a 2a 2a 20 20 20 20 20 20 65 61 63 68 20 6f   .**      each o
d520: 66 20 74 68 65 20 53 65 67 52 65 61 64 65 72 20  f the SegReader 
d530: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 61  objects in the a
d540: 72 72 61 79 20 70 61 73 73 65 64 20 61 73 20 74  rray passed as t
d550: 68 65 20 74 68 69 72 64 20 0a 2a 2a 20 20 20 20  he third .**    
d560: 20 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a    argument, and.
d570: 2a 2a 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65 74  **.**   2) delet
d580: 65 73 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20  es all %_segdir 
d590: 65 6e 74 72 69 65 73 20 77 69 74 68 20 6c 65 76  entries with lev
d5a0: 65 6c 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c  el iLevel, or al
d5b0: 6c 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20  l %_segdir.**   
d5c0: 20 20 20 65 6e 74 72 69 65 73 20 72 65 67 61 72     entries regar
d5d0: 64 6c 65 73 73 20 6f 66 20 6c 65 76 65 6c 20 69  dless of level i
d5e0: 66 20 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a  f (iLevel<0)..**
d5f0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
d600: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
d610: 63 65 73 73 66 75 6c 2c 20 6f 74 68 65 72 77 69  cessful, otherwi
d620: 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
d630: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
d640: 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74  ic int fts3Delet
d650: 65 53 65 67 64 69 72 28 0a 20 20 46 74 73 33 54  eSegdir(.  Fts3T
d660: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
d670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
d680: 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
d690: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  le */.  int iLev
d6a0: 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
d6b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
d6c0: 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74   of %_segdir ent
d6d0: 72 69 65 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ries to delete *
d6e0: 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  /.  Fts3SegReade
d6f0: 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20  r **apSegment,  
d700: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
d710: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
d720: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  s */.  int nRead
d730: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
d740: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
d750: 66 20 61 72 72 61 79 20 61 70 53 65 67 6d 65 6e  f array apSegmen
d760: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
d770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d790: 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
d7a0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d7c0: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
d7d0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
d7e0: 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20  stmt *pDelete;  
d7f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
d800: 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65  tatement to dele
d810: 74 65 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 72 63  te rows */..  rc
d820: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
d830: 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47  , SQL_DELETE_SEG
d840: 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70 44  MENTS_RANGE, &pD
d850: 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 66 6f 72  elete, 0);.  for
d860: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
d870: 5f 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64 65 72  _OK && i<nReader
d880: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33  ; i++){.    Fts3
d890: 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 6d  SegReader *pSegm
d8a0: 65 6e 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  ent = apSegment[
d8b0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
d8c0: 6d 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63  ment->iStartBloc
d8d0: 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
d8e0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44  e3_bind_int64(pD
d8f0: 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 6d 65  elete, 1, pSegme
d900: 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 29  nt->iStartBlock)
d910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d920: 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65  bind_int64(pDele
d930: 74 65 2c 20 32 2c 20 70 53 65 67 6d 65 6e 74 2d  te, 2, pSegment-
d940: 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20  >iEndBlock);.   
d950: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
d960: 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20  pDelete);.      
d970: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
d980: 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20  et(pDelete);.   
d990: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
d9a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d9b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d9c0: 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3e 3d  ..  if( iLevel>=
d9d0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  0 ){.    rc = ft
d9e0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
d9f0: 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 42  _DELETE_SEGDIR_B
da00: 59 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c 65 74  Y_LEVEL, &pDelet
da10: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
da20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
da30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
da40: 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c 20  nd_int(pDelete, 
da50: 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  1, iLevel);.    
da60: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
da70: 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 72  Delete);.      r
da80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
da90: 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20  t(pDelete);.    
daa0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
dab0: 63 20 3d 20 66 74 73 33 53 71 6c 45 78 65 63 28  c = fts3SqlExec(
dac0: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
dad0: 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20  L_SEGDIR, 0);.  
dae0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
daf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
db00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
db10: 61 6c 6c 65 64 2c 20 62 75 66 66 65 72 20 2a 70  alled, buffer *p
db20: 70 4c 69 73 74 20 28 73 69 7a 65 20 2a 70 6e 4c  pList (size *pnL
db30: 69 73 74 20 62 79 74 65 73 29 20 63 6f 6e 74 61  ist bytes) conta
db40: 69 6e 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74 69  ins .** a positi
db50: 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 6d 61 79  on list that may
db60: 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66 65   (or may not) fe
db70: 61 74 75 72 65 20 6d 75 6c 74 69 70 6c 65 20 63  ature multiple c
db80: 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a 20  olumns. This.** 
db90: 66 75 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74 73  function adjusts
dba0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 2a 70 70   the pointer *pp
dbb0: 4c 69 73 74 20 61 6e 64 20 74 68 65 20 6c 65 6e  List and the len
dbc0: 67 74 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20 74  gth *pnList so t
dbd0: 68 61 74 20 74 68 65 79 0a 2a 2a 20 69 64 65 6e  hat they.** iden
dbe0: 74 69 66 79 20 74 68 65 20 73 75 62 73 65 74 20  tify the subset 
dbf0: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
dc00: 6c 69 73 74 20 74 68 61 74 20 63 6f 72 72 65 73  list that corres
dc10: 70 6f 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e 20  ponds to column 
dc20: 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iCol..**.** If t
dc30: 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6e 74 72  here are no entr
dc40: 69 65 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ies in the input
dc50: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
dc60: 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
dc70: 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74 20  then.** *pnList 
dc80: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 62  is set to zero b
dc90: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
dca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dcb0: 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72  fts3ColumnFilter
dcc0: 28 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  (.  int iCol,   
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
dcf0: 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20   filter on */.  
dd00: 63 68 61 72 20 2a 2a 70 70 4c 69 73 74 2c 20 20  char **ppList,  
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74  /* IN/OUT: Point
dd30: 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  er to position l
dd40: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ist */.  int *pn
dd50: 4c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  List            
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
dd70: 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66  UT: Size of buff
dd80: 65 72 20 2a 70 70 4c 69 73 74 20 69 6e 20 62 79  er *ppList in by
dd90: 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  tes */.){.  char
dda0: 20 2a 70 4c 69 73 74 20 3d 20 2a 70 70 4c 69 73   *pList = *ppLis
ddb0: 74 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  t;.  int nList =
ddc0: 20 2a 70 6e 4c 69 73 74 3b 0a 20 20 63 68 61 72   *pnList;.  char
ddd0: 20 2a 70 45 6e 64 20 3d 20 26 70 4c 69 73 74 5b   *pEnd = &pList[
dde0: 6e 4c 69 73 74 5d 3b 0a 20 20 69 6e 74 20 69 43  nList];.  int iC
ddf0: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 68  urrent = 0;.  ch
de00: 61 72 20 2a 70 20 3d 20 70 4c 69 73 74 3b 0a 0a  ar *p = pList;..
de10: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
de20: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  0 );.  while( 1 
de30: 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ){.    char c = 
de40: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c  0;.    while( p<
de50: 70 45 6e 64 20 26 26 20 28 63 20 7c 20 2a 70 29  pEnd && (c | *p)
de60: 26 30 78 46 45 20 29 20 63 20 3d 20 2a 70 2b 2b  &0xFE ) c = *p++
de70: 20 26 20 30 78 38 30 3b 0a 20 20 0a 20 20 20 20   & 0x80;.  .    
de80: 69 66 28 20 69 43 6f 6c 3d 3d 69 43 75 72 72 65  if( iCol==iCurre
de90: 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 73  nt ){.      nLis
dea0: 74 20 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c  t = (int)(p - pL
deb0: 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ist);.      brea
dec0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  k;.    }..    nL
ded0: 69 73 74 20 2d 3d 20 28 69 6e 74 29 28 70 20 2d  ist -= (int)(p -
dee0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69   pList);.    pLi
def0: 73 74 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20  st = p;.    if( 
df00: 6e 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nList==0 ){.    
df10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
df20: 20 20 20 70 20 3d 20 26 70 4c 69 73 74 5b 31 5d     p = &pList[1]
df30: 3b 0a 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74  ;.    p += sqlit
df40: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33  e3Fts3GetVarint3
df50: 32 28 70 2c 20 26 69 43 75 72 72 65 6e 74 29 3b  2(p, &iCurrent);
df60: 0a 20 20 7d 0a 0a 20 20 2a 70 70 4c 69 73 74 20  .  }..  *ppList 
df70: 3d 20 70 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69  = pList;.  *pnLi
df80: 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f  st = nList;.}../
df90: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 33  *.** sqlite3Fts3
dfa0: 53 65 67 52 65 61 64 65 72 49 74 65 72 61 74 65  SegReaderIterate
dfb0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  () callback used
dfc0: 20 77 68 65 6e 20 6d 65 72 67 69 6e 67 20 6d 75   when merging mu
dfd0: 6c 74 69 70 6c 65 20 0a 2a 2a 20 73 65 67 6d 65  ltiple .** segme
dfe0: 6e 74 73 20 74 6f 20 63 72 65 61 74 65 20 61 20  nts to create a 
dff0: 73 69 6e 67 6c 65 2c 20 6c 61 72 67 65 72 20 73  single, larger s
e000: 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
e010: 63 20 69 6e 74 20 66 74 73 33 4d 65 72 67 65 43  c int fts3MergeC
e020: 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 33 54  allback(.  Fts3T
e030: 61 62 6c 65 20 2a 70 2c 0a 20 20 76 6f 69 64 20  able *p,.  void 
e040: 2a 70 43 6f 6e 74 65 78 74 2c 0a 20 20 63 68 61  *pContext,.  cha
e050: 72 20 2a 7a 54 65 72 6d 2c 0a 20 20 69 6e 74 20  r *zTerm,.  int 
e060: 6e 54 65 72 6d 2c 0a 20 20 63 68 61 72 20 2a 61  nTerm,.  char *a
e070: 44 6f 63 6c 69 73 74 2c 0a 20 20 69 6e 74 20 6e  Doclist,.  int n
e080: 44 6f 63 6c 69 73 74 0a 29 7b 0a 20 20 53 65 67  Doclist.){.  Seg
e090: 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 70 70 57  mentWriter **ppW
e0a0: 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74 65   = (SegmentWrite
e0b0: 72 20 2a 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20  r **)pContext;. 
e0c0: 20 72 65 74 75 72 6e 20 66 74 73 33 53 65 67 57   return fts3SegW
e0d0: 72 69 74 65 72 41 64 64 28 70 2c 20 70 70 57 2c  riterAdd(p, ppW,
e0e0: 20 31 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d   1, zTerm, nTerm
e0f0: 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63  , aDoclist, nDoc
e100: 6c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  list);.}../*.** 
e110: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
e120: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
e130: 20 74 68 72 6f 75 67 68 20 61 20 63 6f 6e 74 69   through a conti
e140: 67 75 6f 75 73 20 73 65 74 20 6f 66 20 74 65 72  guous set of ter
e150: 6d 73 20 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ms .** stored in
e160: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
e170: 6e 64 65 78 2e 20 49 74 20 6d 65 72 67 65 73 20  ndex. It merges 
e180: 64 61 74 61 20 63 6f 6e 74 61 69 6e 65 64 20 69  data contained i
e190: 6e 20 6f 6e 65 20 6f 72 20 0a 2a 2a 20 6d 6f 72  n one or .** mor
e1a0: 65 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 73 75  e segments to su
e1b0: 70 70 6f 72 74 20 74 68 69 73 2e 0a 2a 2a 0a 2a  pport this..**.*
e1c0: 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
e1d0: 75 6d 65 6e 74 20 69 73 20 70 61 73 73 65 64 20  ument is passed 
e1e0: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
e1f0: 74 65 72 73 20 74 6f 20 53 65 67 52 65 61 64 65  ters to SegReade
e200: 72 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 61 6c 6c  r objects.** all
e210: 6f 63 61 74 65 64 20 77 69 74 68 20 73 71 6c 69  ocated with sqli
e220: 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
e230: 4e 65 77 28 29 2e 20 54 68 69 73 20 66 75 6e 63  New(). This func
e240: 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20  tion merges the 
e250: 72 61 6e 67 65 20 0a 2a 2a 20 6f 66 20 74 65 72  range .** of ter
e260: 6d 73 20 73 65 6c 65 63 74 65 64 20 62 79 20 65  ms selected by e
e270: 61 63 68 20 53 65 67 52 65 61 64 65 72 2e 20 49  ach SegReader. I
e280: 66 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  f a single term 
e290: 69 73 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  is present in.**
e2a0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73   more than one s
e2b0: 65 67 6d 65 6e 74 2c 20 74 68 65 20 61 73 73 6f  egment, the asso
e2c0: 63 69 61 74 65 64 20 64 6f 63 6c 69 73 74 73 20  ciated doclists 
e2d0: 61 72 65 20 6d 65 72 67 65 64 2e 20 46 6f 72 20  are merged. For 
e2e0: 65 61 63 68 0a 2a 2a 20 74 65 72 6d 20 61 6e 64  each.** term and
e2f0: 20 28 70 6f 73 73 69 62 6c 79 20 6d 65 72 67 65   (possibly merge
e300: 64 29 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68  d) doclist in th
e310: 65 20 6d 65 72 67 65 64 20 72 61 6e 67 65 2c 20  e merged range, 
e320: 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  the callback.** 
e330: 66 75 6e 63 74 69 6f 6e 20 78 46 75 6e 63 20 69  function xFunc i
e340: 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 69  s invoked with i
e350: 74 73 20 61 72 67 75 6d 65 6e 74 73 20 73 65 74  ts arguments set
e360: 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a   as follows..**.
e370: 2a 2a 20 20 20 61 72 67 20 30 3a 20 43 6f 70 79  **   arg 0: Copy
e380: 20 6f 66 20 27 70 27 20 70 61 72 61 6d 65 74 65   of 'p' paramete
e390: 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  r passed to this
e3a0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 61   function.**   a
e3b0: 72 67 20 31 3a 20 43 6f 70 79 20 6f 66 20 27 70  rg 1: Copy of 'p
e3c0: 43 6f 6e 74 65 78 74 27 20 70 61 72 61 6d 65 74  Context' paramet
e3d0: 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  er passed to thi
e3e0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  s function.**   
e3f0: 61 72 67 20 32 3a 20 50 6f 69 6e 74 65 72 20 74  arg 2: Pointer t
e400: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
e410: 69 6e 67 20 74 65 72 6d 0a 2a 2a 20 20 20 61 72  ing term.**   ar
e420: 67 20 33 3a 20 53 69 7a 65 20 6f 66 20 61 72 67  g 3: Size of arg
e430: 20 32 20 62 75 66 66 65 72 20 69 6e 20 62 79 74   2 buffer in byt
e440: 65 73 0a 2a 2a 20 20 20 61 72 67 20 34 3a 20 50  es.**   arg 4: P
e450: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
e460: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c   containing docl
e470: 69 73 74 0a 2a 2a 20 20 20 61 72 67 20 35 3a 20  ist.**   arg 5: 
e480: 53 69 7a 65 20 6f 66 20 61 72 67 20 32 20 62 75  Size of arg 2 bu
e490: 66 66 65 72 20 69 6e 20 62 79 74 65 73 0a 2a 2a  ffer in bytes.**
e4a0: 0a 2a 2a 20 54 68 65 20 34 74 68 20 61 72 67 75  .** The 4th argu
e4b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
e4c0: 63 74 69 6f 6e 20 69 73 20 61 20 70 6f 69 6e 74  ction is a point
e4d0: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
e4e0: 65 20 6f 66 20 74 79 70 65 0a 2a 2a 20 46 74 73  e of type.** Fts
e4f0: 33 53 65 67 46 69 6c 74 65 72 2c 20 64 65 66 69  3SegFilter, defi
e500: 6e 65 64 20 69 6e 20 66 74 73 33 49 6e 74 2e 68  ned in fts3Int.h
e510: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
e520: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
e530: 0a 2a 2a 20 66 75 72 74 68 65 72 20 72 65 73 74  .** further rest
e540: 72 69 63 74 20 74 68 65 20 72 61 6e 67 65 20 6f  rict the range o
e550: 66 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6c  f terms that cal
e560: 6c 62 61 63 6b 73 20 61 72 65 20 6d 61 64 65 20  lbacks are made 
e570: 66 6f 72 20 61 6e 64 0a 2a 2a 20 6d 6f 64 69 66  for and.** modif
e580: 79 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20  y the behaviour 
e590: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
e5a0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
e5b0: 62 6f 76 65 20 73 74 72 75 63 74 75 72 65 0a 2a  bove structure.*
e5c0: 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  * definition for
e5d0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74   details..*/.int
e5e0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
e5f0: 65 61 64 65 72 49 74 65 72 61 74 65 28 0a 20 20  eaderIterate(.  
e600: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e620: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
e630: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
e640: 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53  3SegReader **apS
e650: 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 2f 2a 20  egment,      /* 
e660: 41 72 72 61 79 20 6f 66 20 46 74 73 33 53 65 67  Array of Fts3Seg
e670: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 2a  Reader objects *
e680: 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  /.  int nSegment
e690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e6a0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
e6b0: 70 53 65 67 6d 65 6e 74 20 61 72 72 61 79 20 2a  pSegment array *
e6c0: 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  /.  Fts3SegFilte
e6d0: 72 20 2a 70 46 69 6c 74 65 72 2c 20 20 20 20 20  r *pFilter,     
e6e0: 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
e6f0: 6f 6e 73 20 6f 6e 20 72 61 6e 67 65 20 6f 66 20  ons on range of 
e700: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iteration */.  i
e710: 6e 74 20 28 2a 78 46 75 6e 63 29 28 46 74 73 33  nt (*xFunc)(Fts3
e720: 54 61 62 6c 65 20 2a 2c 20 76 6f 69 64 20 2a 2c  Table *, void *,
e730: 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 63 68   char *, int, ch
e740: 61 72 20 2a 2c 20 69 6e 74 29 2c 20 20 2f 2a 20  ar *, int),  /* 
e750: 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f  Callback */.  vo
e760: 69 64 20 2a 70 43 6f 6e 74 65 78 74 20 20 20 20  id *pContext    
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e780: 20 43 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 65 78   Callback contex
e790: 74 20 28 32 6e 64 20 61 72 67 75 6d 65 6e 74 29  t (2nd argument)
e7a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
e7d0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
e7e0: 0a 20 20 63 68 61 72 20 2a 61 42 75 66 66 65 72  .  char *aBuffer
e7f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e800: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
e810: 6d 65 72 67 65 20 64 6f 63 6c 69 73 74 73 20 69  merge doclists i
e820: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  n */.  int nAllo
e830: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
e840: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
e850: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 42 75 66  ted size of aBuf
e860: 66 65 72 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  fer buffer */.  
e870: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e880: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e890: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e8a0: 2f 0a 0a 20 20 69 6e 74 20 69 73 49 67 6e 6f 72  /..  int isIgnor
e8b0: 65 45 6d 70 74 79 20 3d 20 20 28 70 46 69 6c 74  eEmpty =  (pFilt
e8c0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33  er->flags & FTS3
e8d0: 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f  _SEGMENT_IGNORE_
e8e0: 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74 20 69 73  EMPTY);.  int is
e8f0: 52 65 71 75 69 72 65 50 6f 73 20 3d 20 20 20 28  RequirePos =   (
e900: 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
e910: 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45   FTS3_SEGMENT_RE
e920: 51 55 49 52 45 5f 50 4f 53 29 3b 0a 20 20 69 6e  QUIRE_POS);.  in
e930: 74 20 69 73 43 6f 6c 46 69 6c 74 65 72 20 3d 20  t isColFilter = 
e940: 20 20 20 28 70 46 69 6c 74 65 72 2d 3e 66 6c 61     (pFilter->fla
e950: 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
e960: 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 29  T_COLUMN_FILTER)
e970: 3b 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78  ;.  int isPrefix
e980: 20 3d 20 20 20 20 20 20 20 28 70 46 69 6c 74 65   =       (pFilte
e990: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f  r->flags & FTS3_
e9a0: 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 58 29 3b  SEGMENT_PREFIX);
e9b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
e9c0: 61 72 65 20 7a 65 72 6f 20 73 65 67 6d 65 6e 74  are zero segment
e9d0: 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
e9e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 69   is a no-op. Thi
e9f0: 73 20 73 63 65 6e 61 72 69 6f 0a 20 20 2a 2a 20  s scenario.  ** 
ea00: 63 6f 6d 65 73 20 61 62 6f 75 74 20 6f 6e 6c 79  comes about only
ea10: 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 66 72   when reading fr
ea20: 6f 6d 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61  om an empty data
ea30: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
ea40: 20 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20 67   nSegment==0 ) g
ea50: 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 0a 20  oto finished;.. 
ea60: 20 2f 2a 20 49 66 20 74 68 65 20 46 74 73 33 53   /* If the Fts3S
ea70: 65 67 46 69 6c 74 65 72 20 64 65 66 69 6e 65 73  egFilter defines
ea80: 20 61 20 73 70 65 63 69 66 69 63 20 74 65 72 6d   a specific term
ea90: 20 28 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78   (or term prefix
eaa0: 29 20 74 6f 20 73 65 61 72 63 68 20 0a 20 20 2a  ) to search .  *
eab0: 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61 64 76 61  * for, then adva
eac0: 6e 63 65 20 65 61 63 68 20 73 65 67 6d 65 6e 74  nce each segment
ead0: 20 69 74 65 72 61 74 6f 72 20 75 6e 74 69 6c 20   iterator until 
eae0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74  it points to a t
eaf0: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65 71 75 61  erm of.  ** equa
eb00: 6c 20 6f 72 20 67 72 65 61 74 65 72 20 76 61 6c  l or greater val
eb10: 75 65 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  ue than the spec
eb20: 69 66 69 65 64 20 74 65 72 6d 2e 20 54 68 69 73  ified term. This
eb30: 20 70 72 65 76 65 6e 74 73 20 6d 61 6e 79 0a 20   prevents many. 
eb40: 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20   ** unnecessary 
eb50: 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70 65 72 61  merge/sort opera
eb60: 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 63 61  tions for the ca
eb70: 73 65 20 77 68 65 72 65 20 73 69 6e 67 6c 65 20  se where single 
eb80: 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20 62 2d 74  segment.  ** b-t
eb90: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 63  ree leaf nodes c
eba0: 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 68 61 6e  ontain more than
ebb0: 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a   one term..  */.
ebc0: 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a    if( pFilter->z
ebd0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20  Term ){.    int 
ebe0: 6e 54 65 72 6d 20 3d 20 70 46 69 6c 74 65 72 2d  nTerm = pFilter-
ebf0: 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73  >nTerm;.    cons
ec00: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20  t char *zTerm = 
ec10: 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 3b 0a  pFilter->zTerm;.
ec20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ec30: 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
ec40: 20 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64       Fts3SegRead
ec50: 65 72 20 2a 70 53 65 67 20 3d 20 61 70 53 65 67  er *pSeg = apSeg
ec60: 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 20 20 77  ment[i];.      w
ec70: 68 69 6c 65 28 20 66 74 73 33 53 65 67 52 65 61  hile( fts3SegRea
ec80: 64 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c  derTermCmp(pSeg,
ec90: 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3c 30   zTerm, nTerm)<0
eca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ecb0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
ecc0: 78 74 28 70 53 65 67 29 3b 0a 20 20 20 20 20 20  xt(pSeg);.      
ecd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ece0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  _OK ) goto finis
ecf0: 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
ed00: 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 33 53 65   }.  }..  fts3Se
ed10: 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65  gReaderSort(apSe
ed20: 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c  gment, nSegment,
ed30: 20 6e 53 65 67 6d 65 6e 74 2c 20 66 74 73 33 53   nSegment, fts3S
ed40: 65 67 52 65 61 64 65 72 43 6d 70 29 3b 0a 20 20  egReaderCmp);.  
ed50: 77 68 69 6c 65 28 20 61 70 53 65 67 6d 65 6e 74  while( apSegment
ed60: 5b 30 5d 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20  [0]->aNode ){.  
ed70: 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 61 70    int nTerm = ap
ed80: 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 54 65 72  Segment[0]->nTer
ed90: 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  m;.    char *zTe
eda0: 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  rm = apSegment[0
edb0: 5d 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 69 6e  ]->zTerm;.    in
edc0: 74 20 6e 4d 65 72 67 65 20 3d 20 31 3b 0a 0a 20  t nMerge = 1;.. 
edd0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
ede0: 20 61 20 70 72 65 66 69 78 2d 73 65 61 72 63 68   a prefix-search
edf0: 2c 20 61 6e 64 20 69 66 20 74 68 65 20 74 65 72  , and if the ter
ee00: 6d 20 74 68 61 74 20 61 70 53 65 67 6d 65 6e 74  m that apSegment
ee10: 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20 20 20 2a  [0] points.    *
ee20: 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74 20 73 68  * to does not sh
ee30: 61 72 65 20 61 20 73 75 66 66 69 78 20 77 69 74  are a suffix wit
ee40: 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d  h pFilter->zTerm
ee50: 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20 61 6c 6c  /nTerm, then all
ee60: 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65   .    ** require
ee70: 64 20 63 61 6c 6c 62 61 63 6b 73 20 68 61 76 65  d callbacks have
ee80: 20 62 65 65 6e 20 6d 61 64 65 2e 20 49 6e 20 74   been made. In t
ee90: 68 69 73 20 63 61 73 65 20 65 78 69 74 20 65 61  his case exit ea
eea0: 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rly..    **.    
eeb0: 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66  ** Similarly, if
eec0: 20 74 68 69 73 20 69 73 20 61 20 73 65 61 72 63   this is a searc
eed0: 68 20 66 6f 72 20 61 6e 20 65 78 61 63 74 20 6d  h for an exact m
eee0: 61 74 63 68 2c 20 61 6e 64 20 74 68 65 20 66 69  atch, and the fi
eef0: 72 73 74 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20  rst term.    ** 
ef00: 6f 66 20 73 65 67 6d 65 6e 74 20 61 70 53 65 67  of segment apSeg
ef10: 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f 74 20 61  ment[0] is not a
ef20: 20 6d 61 74 63 68 2c 20 65 78 69 74 20 65 61 72   match, exit ear
ef30: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
ef40: 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72  f( pFilter->zTer
ef50: 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  m ){.      if( n
ef60: 54 65 72 6d 3c 70 46 69 6c 74 65 72 2d 3e 6e 54  Term<pFilter->nT
ef70: 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  erm .       || (
ef80: 21 69 73 50 72 65 66 69 78 20 26 26 20 6e 54 65  !isPrefix && nTe
ef90: 72 6d 3e 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72  rm>pFilter->nTer
efa0: 6d 29 0a 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d  m).       || mem
efb0: 63 6d 70 28 7a 54 65 72 6d 2c 20 70 46 69 6c 74  cmp(zTerm, pFilt
efc0: 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  er->zTerm, pFilt
efd0: 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20  er->nTerm) .    
efe0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
eff0: 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
f000: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69  }.    }..    whi
f010: 6c 65 28 20 6e 4d 65 72 67 65 3c 6e 53 65 67 6d  le( nMerge<nSegm
f020: 65 6e 74 20 0a 20 20 20 20 20 20 20 20 26 26 20  ent .        && 
f030: 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65  apSegment[nMerge
f040: 5d 2d 3e 61 4e 6f 64 65 0a 20 20 20 20 20 20 20  ]->aNode.       
f050: 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d   && apSegment[nM
f060: 65 72 67 65 5d 2d 3e 6e 54 65 72 6d 3d 3d 6e 54  erge]->nTerm==nT
f070: 65 72 6d 20 0a 20 20 20 20 20 20 20 20 26 26 20  erm .        && 
f080: 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 65 72 6d 2c  0==memcmp(zTerm,
f090: 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67   apSegment[nMerg
f0a0: 65 5d 2d 3e 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  e]->zTerm, nTerm
f0b0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  ).    ){.      n
f0c0: 4d 65 72 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Merge++;.    }..
f0d0: 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d      if( nMerge==
f0e0: 31 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45 6d  1 && !isIgnoreEm
f0f0: 70 74 79 20 26 26 20 21 69 73 43 6f 6c 46 69 6c  pty && !isColFil
f100: 74 65 72 20 26 26 20 69 73 52 65 71 75 69 72 65  ter && isRequire
f110: 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 46 74 73  Pos ){.      Fts
f120: 33 53 65 67 52 65 61 64 65 72 20 2a 70 30 20 3d  3SegReader *p0 =
f130: 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 3b 0a 20   apSegment[0];. 
f140: 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28       rc = xFunc(
f150: 70 2c 20 70 43 6f 6e 74 65 78 74 2c 20 7a 54 65  p, pContext, zTe
f160: 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 30 2d 3e 61  rm, nTerm, p0->a
f170: 44 6f 63 6c 69 73 74 2c 20 70 30 2d 3e 6e 44 6f  Doclist, p0->nDo
f180: 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  clist);.      if
f190: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f1a0: 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b  ) goto finished;
f1b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f1c0: 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 3d    int nDoclist =
f1d0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
f1e0: 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
f1f0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
f200: 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20  3_int64 iPrev = 
f210: 30 3b 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  0;    /* Previou
f220: 73 20 64 6f 63 69 64 20 73 74 6f 72 65 64 20 69  s docid stored i
f230: 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20  n doclist */..  
f240: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
f250: 6e 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  nt term of the f
f260: 69 72 73 74 20 6e 4d 65 72 67 65 20 65 6e 74 72  irst nMerge entr
f270: 69 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79  ies in the array
f280: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 46 74 73  .      ** of Fts
f290: 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63  3SegReader objec
f2a0: 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 2e 20  ts is the same. 
f2b0: 54 68 65 20 64 6f 63 6c 69 73 74 73 20 6d 75 73  The doclists mus
f2c0: 74 20 62 65 20 6d 65 72 67 65 64 0a 20 20 20 20  t be merged.    
f2d0: 20 20 2a 2a 20 61 6e 64 20 61 20 73 69 6e 67 6c    ** and a singl
f2e0: 65 20 74 65 72 6d 20 61 64 64 65 64 20 74 6f 20  e term added to 
f2f0: 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2e  the new segment.
f300: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f310: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67  for(i=0; i<nMerg
f320: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
f330: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46 69   fts3SegReaderFi
f340: 72 73 74 44 6f 63 69 64 28 61 70 53 65 67 6d 65  rstDocid(apSegme
f350: 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  nt[i]);.      }.
f360: 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
f370: 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e  derSort(apSegmen
f380: 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 65 72 67  t, nMerge, nMerg
f390: 65 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72  e, fts3SegReader
f3a0: 44 6f 63 6c 69 73 74 43 6d 70 29 3b 0a 20 20 20  DoclistCmp);.   
f3b0: 20 20 20 77 68 69 6c 65 28 20 61 70 53 65 67 6d     while( apSegm
f3c0: 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65 74 4c  ent[0]->pOffsetL
f3d0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ist ){.        i
f3e0: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
f3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f400: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
f410: 68 61 74 20 73 68 61 72 65 20 61 20 64 6f 63 69  hat share a doci
f420: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  d */.        cha
f430: 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r *pList;.      
f440: 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20    int nList;.   
f450: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
f460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f470: 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61  int64 iDocid = a
f480: 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f  pSegment[0]->iDo
f490: 63 69 64 3b 0a 20 20 20 20 20 20 20 20 66 74 73  cid;.        fts
f4a0: 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
f4b0: 63 69 64 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d  cid(apSegment[0]
f4c0: 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
f4d0: 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31  );.        j = 1
f4e0: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
f4f0: 20 6a 3c 6e 4d 65 72 67 65 20 0a 20 20 20 20 20   j<nMerge .     
f500: 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
f510: 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c  ent[j]->pOffsetL
f520: 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
f530: 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d   && apSegment[j]
f540: 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64  ->iDocid==iDocid
f550: 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
f560: 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
f570: 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 61 70  aderNextDocid(ap
f580: 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30  Segment[j], 0, 0
f590: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  );.          j++
f5a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
f5b0: 20 20 20 20 20 69 66 28 20 69 73 43 6f 6c 46 69       if( isColFi
f5c0: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
f5d0: 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74    fts3ColumnFilt
f5e0: 65 72 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c  er(pFilter->iCol
f5f0: 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
f600: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
f610: 20 20 20 20 20 20 69 66 28 20 21 69 73 49 67 6e        if( !isIgn
f620: 6f 72 65 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73  oreEmpty || nLis
f630: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t>0 ){.         
f640: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
f650: 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 44  Fts3VarintLen(iD
f660: 6f 63 69 64 2d 69 50 72 65 76 29 20 2b 20 28 69  ocid-iPrev) + (i
f670: 73 52 65 71 75 69 72 65 50 6f 73 3f 6e 4c 69 73  sRequirePos?nLis
f680: 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  t+1:0);.        
f690: 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 2b 6e    if( nDoclist+n
f6a0: 42 79 74 65 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  Byte>nAlloc ){. 
f6b0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
f6c0: 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20  *aNew;.         
f6d0: 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 44 6f 63     nAlloc = nDoc
f6e0: 6c 69 73 74 2b 6e 42 79 74 65 2a 32 3b 0a 20 20  list+nByte*2;.  
f6f0: 20 20 20 20 20 20 20 20 20 20 61 4e 65 77 20 3d            aNew =
f700: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
f710: 28 61 42 75 66 66 65 72 2c 20 6e 41 6c 6c 6f 63  (aBuffer, nAlloc
f720: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
f730: 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
f740: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f750: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
f760: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
f770: 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
f780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f790: 20 20 20 20 61 42 75 66 66 65 72 20 3d 20 61 4e      aBuffer = aN
f7a0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ew;.          }.
f7b0: 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69            nDocli
f7c0: 73 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  st += sqlite3Fts
f7d0: 33 50 75 74 56 61 72 69 6e 74 28 26 61 42 75 66  3PutVarint(&aBuf
f7e0: 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69  fer[nDoclist], i
f7f0: 44 6f 63 69 64 2d 69 50 72 65 76 29 3b 0a 20 20  Docid-iPrev);.  
f800: 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20          iPrev = 
f810: 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20  iDocid;.        
f820: 20 20 69 66 28 20 69 73 52 65 71 75 69 72 65 50    if( isRequireP
f830: 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  os ){.          
f840: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 66 65    memcpy(&aBuffe
f850: 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 70 4c 69  r[nDoclist], pLi
f860: 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 20 20  st, nList);.    
f870: 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74          nDoclist
f880: 20 2b 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20   += nList;.     
f890: 20 20 20 20 20 20 20 61 42 75 66 66 65 72 5b 6e         aBuffer[n
f8a0: 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30  Doclist++] = '\0
f8b0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
f8c0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
f8d0: 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
f8e0: 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e  ort(apSegment, n
f8f0: 4d 65 72 67 65 2c 20 6a 2c 20 66 74 73 33 53 65  Merge, j, fts3Se
f900: 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
f910: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  p);.      }..   
f920: 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 3e     if( nDoclist>
f930: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
f940: 3d 20 78 46 75 6e 63 28 70 2c 20 70 43 6f 6e 74  = xFunc(p, pCont
f950: 65 78 74 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  ext, zTerm, nTer
f960: 6d 2c 20 61 42 75 66 66 65 72 2c 20 6e 44 6f 63  m, aBuffer, nDoc
f970: 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  list);.        i
f980: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f990: 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
f9a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f9b0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
f9c0: 20 69 73 20 61 20 74 65 72 6d 20 73 70 65 63 69   is a term speci
f9d0: 66 69 65 64 20 74 6f 20 66 69 6c 74 65 72 20 6f  fied to filter o
f9e0: 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6e  n, and this is n
f9f0: 6f 74 20 61 20 70 72 65 66 69 78 0a 20 20 20 20  ot a prefix.    
fa00: 2a 2a 20 73 65 61 72 63 68 2c 20 72 65 74 75 72  ** search, retur
fa10: 6e 20 6e 6f 77 2e 20 54 68 65 20 63 61 6c 6c 62  n now. The callb
fa20: 61 63 6b 20 74 68 61 74 20 63 6f 72 72 65 73 70  ack that corresp
fa30: 6f 6e 64 73 20 74 6f 20 74 68 65 20 72 65 71 75  onds to the requ
fa40: 69 72 65 64 0a 20 20 20 20 2a 2a 20 74 65 72 6d  ired.    ** term
fa50: 20 28 69 66 20 73 75 63 68 20 61 20 74 65 72 6d   (if such a term
fa60: 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 69   exists in the i
fa70: 6e 64 65 78 29 20 68 61 73 20 61 6c 72 65 61 64  ndex) has alread
fa80: 79 20 62 65 65 6e 20 6d 61 64 65 2e 0a 20 20 20  y been made..   
fa90: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
faa0: 74 65 72 2d 3e 7a 54 65 72 6d 20 26 26 20 21 69  ter->zTerm && !i
fab0: 73 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20  sPrefix ){.     
fac0: 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
fad0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
fae0: 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 3b 20 69 2b  =0; i<nMerge; i+
faf0: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  +){.      rc = f
fb00: 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
fb10: 28 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a  (apSegment[i]);.
fb20: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
fb30: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
fb40: 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
fb50: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
fb60: 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c 20  Sort(apSegment, 
fb70: 6e 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65  nSegment, nMerge
fb80: 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  , fts3SegReaderC
fb90: 6d 70 29 3b 0a 20 20 7d 0a 0a 20 66 69 6e 69 73  mp);.  }.. finis
fba0: 68 65 64 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  hed:.  sqlite3_f
fbb0: 72 65 65 28 61 42 75 66 66 65 72 29 3b 0a 20 20  ree(aBuffer);.  
fbc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fbd0: 0a 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 6c 65  .** Merge all le
fbe0: 76 65 6c 20 69 4c 65 76 65 6c 20 73 65 67 6d 65  vel iLevel segme
fbf0: 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  nts in the datab
fc00: 61 73 65 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ase into a singl
fc10: 65 20 0a 2a 2a 20 69 4c 65 76 65 6c 2b 31 20 73  e .** iLevel+1 s
fc20: 65 67 6d 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  egment. Or, if i
fc30: 4c 65 76 65 6c 3c 30 2c 20 6d 65 72 67 65 20 61  Level<0, merge a
fc40: 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f  ll segments into
fc50: 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 73 65 67   a.** single seg
fc60: 6d 65 6e 74 20 77 69 74 68 20 61 20 6c 65 76 65  ment with a leve
fc70: 6c 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  l equal to the n
fc80: 75 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72 67 65  umerically large
fc90: 73 74 20 6c 65 76 65 6c 20 0a 2a 2a 20 63 75 72  st level .** cur
fca0: 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69  rently present i
fcb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
fcc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
fcd0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
fce0: 20 77 69 74 68 20 69 4c 65 76 65 6c 3c 30 2c 20   with iLevel<0, 
fcf0: 62 75 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  but there is onl
fd00: 79 20 6f 6e 65 0a 2a 2a 20 73 65 67 6d 65 6e 74  y one.** segment
fd10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
fd20: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
fd30: 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
fd40: 61 74 65 6c 79 2e 20 0a 2a 2a 20 4f 74 68 65 72  ately. .** Other
fd50: 77 69 73 65 2c 20 69 66 20 73 75 63 63 65 73 73  wise, if success
fd60: 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
fd70: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
fd80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
fd90: 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
fda0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
fdb0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
fdc0: 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74 4d  int fts3SegmentM
fdd0: 65 72 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a  erge(Fts3Table *
fde0: 70 2c 20 69 6e 74 20 69 4c 65 76 65 6c 29 7b 0a  p, int iLevel){.
fdf0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
fe20: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
fe30: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
fe50: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
fe60: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20  /* Index of new 
fe90: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
fea0: 20 69 4e 65 77 4c 65 76 65 6c 3b 20 20 20 20 20   iNewLevel;     
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fec0: 4c 65 76 65 6c 20 74 6f 20 63 72 65 61 74 65 20  Level to create 
fed0: 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20 2a  new segment at *
fee0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
fef0: 20 2a 70 53 74 6d 74 3b 0a 20 20 53 65 67 6d 65   *pStmt;.  Segme
ff00: 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  ntWriter *pWrite
ff10: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65  r = 0;.  int nSe
ff20: 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  gment = 0;      
ff30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ff40: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 62  er of segments b
ff50: 65 69 6e 67 20 6d 65 72 67 65 64 20 2a 2f 0a 20  eing merged */. 
ff60: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
ff70: 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20  *apSegment = 0; 
ff80: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53 65 67   /* Array of Seg
ff90: 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a  ment iterators *
ffa0: 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  /.  Fts3SegFilte
ffb0: 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20 20 20  r filter;       
ffc0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
ffd0: 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64 69  erm filter condi
ffe0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 69  tion */..  if( i
fff0: 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 2f  Level<0 ){.    /
10000 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74  * This call is t
10010 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  o merge all segm
10020 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
10030 62 61 73 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  base to a single
10040 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 2e  .    ** segment.
10050 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68   The level of th
10060 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73  e new segment is
10070 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 68   equal to the th
10080 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
10090 20 20 20 2a 2a 20 67 72 65 61 74 65 73 74 20 73     ** greatest s
100a0 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75 72  egment level cur
100b0 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69  rently present i
100c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
100d0 54 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  The index.    **
100e0 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65 67 6d   of the new segm
100f0 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20 30 2e  ent is always 0.
10100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 49 64 78  .    */.    iIdx
10110 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 66   = 0;.    rc = f
10120 74 73 33 53 65 67 6d 65 6e 74 43 6f 75 6e 74 4d  ts3SegmentCountM
10130 61 78 28 70 2c 20 26 6e 53 65 67 6d 65 6e 74 2c  ax(p, &nSegment,
10140 20 26 69 4e 65 77 4c 65 76 65 6c 29 3b 0a 20 20   &iNewLevel);.  
10150 20 20 69 66 28 20 6e 53 65 67 6d 65 6e 74 3d 3d    if( nSegment==
10160 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
10170 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10180 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
10190 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69    /* This call i
101a0 73 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73  s to merge all s
101b0 65 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c  egments at level
101c0 20 69 4c 65 76 65 6c 2e 20 46 69 6e 64 20 74 68   iLevel. Find th
101d0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 61 76  e next.    ** av
101e0 61 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e 74 20  ailable segment 
101f0 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69  index at level i
10200 4c 65 76 65 6c 2b 31 2e 20 54 68 65 20 63 61 6c  Level+1. The cal
10210 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74 73 33  l to.    ** fts3
10220 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64  AllocateSegdirId
10230 78 28 29 20 77 69 6c 6c 20 6d 65 72 67 65 20 74  x() will merge t
10240 68 65 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c  he segments at l
10250 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20 74 6f  evel iLevel+1 to
10260 20 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c   .    ** a singl
10270 65 20 69 4c 65 76 65 6c 2b 32 20 73 65 67 6d 65  e iLevel+2 segme
10280 6e 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  nt if necessary.
10290 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 4e 65 77  .    */.    iNew
102a0 4c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 2b 31  Level = iLevel+1
102b0 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 41  ;.    rc = fts3A
102c0 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
102d0 28 70 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20 26  (p, iNewLevel, &
102e0 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  iIdx);.    if( r
102f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
10300 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
10310 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 43 6f   = fts3SegmentCo
10320 75 6e 74 28 70 2c 20 69 4c 65 76 65 6c 2c 20 26  unt(p, iLevel, &
10330 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  nSegment);.  }. 
10340 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10350 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
10360 20 20 61 73 73 65 72 74 28 20 6e 53 65 67 6d 65    assert( nSegme
10370 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
10380 28 20 69 4e 65 77 4c 65 76 65 6c 3e 3d 30 20 29  ( iNewLevel>=0 )
10390 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
103a0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 61 72   space for an ar
103b0 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
103c0 74 6f 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  to segment itera
103d0 74 6f 72 73 2e 20 2a 2f 0a 20 20 61 70 53 65 67  tors. */.  apSeg
103e0 6d 65 6e 74 20 3d 20 28 46 74 73 33 53 65 67 52  ment = (Fts3SegR
103f0 65 61 64 65 72 2a 2a 29 73 71 6c 69 74 65 33 5f  eader**)sqlite3_
10400 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74  malloc(sizeof(Ft
10410 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 2a 6e  s3SegReader *)*n
10420 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  Segment);.  if( 
10430 21 61 70 53 65 67 6d 65 6e 74 20 29 7b 0a 20 20  !apSegment ){.  
10440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10450 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
10460 73 65 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 30  set(apSegment, 0
10470 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67  , sizeof(Fts3Seg
10480 52 65 61 64 65 72 20 2a 29 2a 6e 53 65 67 6d 65  Reader *)*nSegme
10490 6e 74 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  nt);..  /* Alloc
104a0 61 74 65 20 61 20 46 74 73 33 53 65 67 52 65 61  ate a Fts3SegRea
104b0 64 65 72 20 73 74 72 75 63 74 75 72 65 20 66 6f  der structure fo
104c0 72 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62  r each segment b
104d0 65 69 6e 67 20 6d 65 72 67 65 64 2e 20 41 20 0a  eing merged. A .
104e0 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61 64    ** Fts3SegRead
104f0 65 72 20 73 74 6f 72 65 73 20 74 68 65 20 73 74  er stores the st
10500 61 74 65 20 64 61 74 61 20 72 65 71 75 69 72 65  ate data require
10510 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
10520 6f 75 67 68 20 61 6c 6c 20 0a 20 20 2a 2a 20 65  ough all .  ** e
10530 6e 74 72 69 65 73 20 6f 6e 20 61 6c 6c 20 6c 65  ntries on all le
10540 61 76 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  aves of a single
10550 20 73 65 67 6d 65 6e 74 2e 20 0a 20 20 2a 2f 0a   segment. .  */.
10560 20 20 61 73 73 65 72 74 28 20 53 51 4c 5f 53 45    assert( SQL_SE
10570 4c 45 43 54 5f 4c 45 56 45 4c 2b 31 3d 3d 53 51  LECT_LEVEL+1==SQ
10580 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 45 56  L_SELECT_ALL_LEV
10590 45 4c 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  EL);.  rc = fts3
105a0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
105b0 45 4c 45 43 54 5f 4c 45 56 45 4c 2b 28 69 4c 65  ELECT_LEVEL+(iLe
105c0 76 65 6c 3c 30 29 2c 20 26 70 53 74 6d 74 2c 20  vel<0), &pStmt, 
105d0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
105e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
105f0 69 6e 69 73 68 65 64 3b 0a 20 20 73 71 6c 69 74  inished;.  sqlit
10600 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
10610 74 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20  t, 1, iLevel);. 
10620 20 66 6f 72 28 69 3d 30 3b 20 53 51 4c 49 54 45   for(i=0; SQLITE
10630 5f 52 4f 57 3d 3d 28 73 71 6c 69 74 65 33 5f 73  _ROW==(sqlite3_s
10640 74 65 70 28 70 53 74 6d 74 29 29 3b 20 69 2b 2b  tep(pStmt)); i++
10650 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
10660 53 65 67 52 65 61 64 65 72 4e 65 77 28 70 2c 20  SegReaderNew(p, 
10670 70 53 74 6d 74 2c 20 69 2c 20 26 61 70 53 65 67  pStmt, i, &apSeg
10680 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66  ment[i]);.    if
10690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
106a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69  ){.      goto fi
106b0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
106c0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
106d0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
106e0 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66   pStmt = 0;.  if
106f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10700 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b  ) goto finished;
10710 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74  ..  memset(&filt
10720 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
10730 73 33 53 65 67 46 69 6c 74 65 72 29 29 3b 0a 20  s3SegFilter));. 
10740 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20   filter.flags = 
10750 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51  FTS3_SEGMENT_REQ
10760 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66 69 6c 74  UIRE_POS;.  filt
10770 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28 69 4c 65  er.flags |= (iLe
10780 76 65 6c 3c 30 20 3f 20 46 54 53 33 5f 53 45 47  vel<0 ? FTS3_SEG
10790 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54  MENT_IGNORE_EMPT
107a0 59 20 3a 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  Y : 0);.  rc = s
107b0 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
107c0 64 65 72 49 74 65 72 61 74 65 28 70 2c 20 61 70  derIterate(p, ap
107d0 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e  Segment, nSegmen
107e0 74 2c 0a 20 20 20 20 20 20 26 66 69 6c 74 65 72  t,.      &filter
107f0 2c 20 66 74 73 33 4d 65 72 67 65 43 61 6c 6c 62  , fts3MergeCallb
10800 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 26 70 57  ack, (void *)&pW
10810 72 69 74 65 72 0a 20 20 29 3b 0a 20 20 69 66 28  riter.  );.  if(
10820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10830 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
10840 0a 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65  .  rc = fts3Dele
10850 74 65 53 65 67 64 69 72 28 70 2c 20 69 4c 65 76  teSegdir(p, iLev
10860 65 6c 2c 20 61 70 53 65 67 6d 65 6e 74 2c 20 6e  el, apSegment, n
10870 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  Segment);.  if( 
10880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10890 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
108a0 67 57 72 69 74 65 72 46 6c 75 73 68 28 70 2c 20  gWriterFlush(p, 
108b0 70 57 72 69 74 65 72 2c 20 69 4e 65 77 4c 65 76  pWriter, iNewLev
108c0 65 6c 2c 20 69 49 64 78 29 3b 0a 20 20 7d 0a 0a  el, iIdx);.  }..
108d0 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 66 74 73   finished:.  fts
108e0 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 70  3SegWriterFree(p
108f0 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28 20 61  Writer);.  if( a
10900 70 53 65 67 6d 65 6e 74 20 29 7b 0a 20 20 20 20  pSegment ){.    
10910 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d  for(i=0; i<nSegm
10920 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ent; i++){.     
10930 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
10940 65 61 64 65 72 46 72 65 65 28 70 2c 20 61 70 53  eaderFree(p, apS
10950 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20  egment[i]);.    
10960 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
10970 65 65 28 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20  ee(apSegment);. 
10980 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
10990 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74  et(pStmt);.  ret
109a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
109b0 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 61   This is a compa
109c0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75  rison function u
109d0 73 65 64 20 61 73 20 61 20 71 73 6f 72 74 28 29  sed as a qsort()
109e0 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 73   callback when s
109f0 6f 72 74 69 6e 67 0a 2a 2a 20 61 6e 20 61 72 72  orting.** an arr
10a00 61 79 20 6f 66 20 70 65 6e 64 69 6e 67 20 74 65  ay of pending te
10a10 72 6d 73 20 62 79 20 74 65 72 6d 2e 20 54 68 69  rms by term. Thi
10a20 73 20 6f 63 63 75 72 73 20 61 73 20 70 61 72 74  s occurs as part
10a30 20 6f 66 20 66 6c 75 73 68 69 6e 67 0a 2a 2a 20   of flushing.** 
10a40 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
10a50 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
10a60 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  s hash table to 
10a70 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
10a80 0a 73 74 61 74 69 63 20 69 6e 74 20 71 73 6f 72  .static int qsor
10a90 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76  tCompare(const v
10aa0 6f 69 64 20 2a 6c 68 73 2c 20 63 6f 6e 73 74 20  oid *lhs, const 
10ab0 76 6f 69 64 20 2a 72 68 73 29 7b 0a 20 20 63 68  void *rhs){.  ch
10ac0 61 72 20 2a 7a 31 20 3d 20 66 74 73 33 48 61 73  ar *z1 = fts3Has
10ad0 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68 45  hKey(*(Fts3HashE
10ae0 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 63  lem **)lhs);.  c
10af0 68 61 72 20 2a 7a 32 20 3d 20 66 74 73 33 48 61  har *z2 = fts3Ha
10b00 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68  shKey(*(Fts3Hash
10b10 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20 20  Elem **)rhs);.  
10b20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33 48 61 73  int n1 = fts3Has
10b30 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33 48  hKeysize(*(Fts3H
10b40 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b  ashElem **)lhs);
10b50 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66 74 73 33  .  int n2 = fts3
10b60 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74  HashKeysize(*(Ft
10b70 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68  s3HashElem **)rh
10b80 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20 28  s);..  int n = (
10b90 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29  n1<n2 ? n1 : n2)
10ba0 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63  ;.  int c = memc
10bb0 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a 20  mp(z1, z2, n);. 
10bc0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
10bd0 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20   c = n1 - n2;.  
10be0 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
10bf0 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 74  ../* .** Flush t
10c00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
10c10 65 6e 64 69 6e 67 54 65 72 6d 73 20 74 6f 20 61  endingTerms to a
10c20 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65 6e 74   level 0 segment
10c30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10c40 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
10c50 46 6c 75 73 68 28 46 74 73 33 54 61 62 6c 65 20  Flush(Fts3Table 
10c60 2a 70 29 7b 0a 20 20 46 74 73 33 48 61 73 68 45  *p){.  Fts3HashE
10c70 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 6e  lem *pElem;.  in
10c80 74 20 69 64 78 2c 20 72 63 2c 20 69 3b 0a 20 20  t idx, rc, i;.  
10c90 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61  Fts3HashElem **a
10ca0 70 45 6c 65 6d 3b 20 20 20 20 20 20 20 20 20 20  pElem;          
10cb0 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 6f 69 6e  /* Array of poin
10cc0 74 65 72 73 20 74 6f 20 68 61 73 68 20 65 6c 65  ters to hash ele
10cd0 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ments */.  int n
10ce0 45 6c 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Elem;           
10cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10d00 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
10d10 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 2a 2f 0a   new segment */.
10d20 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
10d30 2a 70 57 72 69 74 65 72 20 3d 20 30 3b 20 20 20  *pWriter = 0;   
10d40 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 77 72 69    /* Used to wri
10d50 74 65 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a  te the segment *
10d60 2f 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  /..  /* Find the
10d70 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
10d80 20 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20   that will make 
10d90 75 70 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65  up the new segme
10da0 6e 74 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a  nt. If there.  *
10db0 2a 20 61 72 65 20 6e 6f 20 74 65 72 6d 73 2c 20  * are no terms, 
10dc0 72 65 74 75 72 6e 20 65 61 72 6c 79 20 28 64 6f  return early (do
10dd0 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 77   not bother to w
10de0 72 69 74 65 20 61 6e 20 65 6d 70 74 79 20 73 65  rite an empty se
10df0 67 6d 65 6e 74 29 2e 0a 20 20 2a 2f 0a 20 20 6e  gment)..  */.  n
10e00 45 6c 65 6d 20 3d 20 66 74 73 33 48 61 73 68 43  Elem = fts3HashC
10e10 6f 75 6e 74 28 26 70 2d 3e 70 65 6e 64 69 6e 67  ount(&p->pending
10e20 54 65 72 6d 73 29 3b 0a 20 20 69 66 28 20 6e 45  Terms);.  if( nE
10e30 6c 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  lem==0 ){.    as
10e40 73 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64 69 6e  sert( p->nPendin
10e50 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  gData==0 );.    
10e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10e70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
10e80 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 69  rmine the next i
10e90 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 30 2c  ndex at level 0,
10ea0 20 6d 65 72 67 69 6e 67 20 61 73 20 6e 65 63 65   merging as nece
10eb0 73 73 61 72 79 2e 20 2a 2f 0a 20 20 72 63 20 3d  ssary. */.  rc =
10ec0 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67   fts3AllocateSeg
10ed0 64 69 72 49 64 78 28 70 2c 20 30 2c 20 26 69 64  dirIdx(p, 0, &id
10ee0 78 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  x);.  if( rc!=SQ
10ef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 0a  eturn rc;.  } ..
10f10 20 20 61 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74    apElem = sqlit
10f20 65 33 5f 6d 61 6c 6c 6f 63 28 6e 45 6c 65 6d 2a  e3_malloc(nElem*
10f30 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45  sizeof(Fts3HashE
10f40 6c 65 6d 20 2a 29 29 3b 0a 20 20 69 66 28 20 21  lem *));.  if( !
10f50 61 70 45 6c 65 6d 20 29 7b 0a 20 20 20 20 72 65  apElem ){.    re
10f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10f70 4d 3b 0a 20 20 7d 0a 0a 20 20 69 20 3d 20 30 3b  M;.  }..  i = 0;
10f80 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 66 74 73  .  for(pElem=fts
10f90 33 48 61 73 68 46 69 72 73 74 28 26 70 2d 3e 70  3HashFirst(&p->p
10fa0 65 6e 64 69 6e 67 54 65 72 6d 73 29 3b 20 70 45  endingTerms); pE
10fb0 6c 65 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48  lem; pElem=fts3H
10fc0 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
10fd0 0a 20 20 20 20 61 70 45 6c 65 6d 5b 69 2b 2b 5d  .    apElem[i++]
10fe0 20 3d 20 70 45 6c 65 6d 3b 0a 20 20 7d 0a 20 20   = pElem;.  }.  
10ff0 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 6c 65 6d  assert( i==nElem
11000 20 29 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 28 73   );..  /* TODO(s
11010 68 65 73 73 29 20 53 68 6f 75 6c 64 20 77 65 20  hess) Should we 
11020 61 6c 6c 6f 77 20 75 73 65 72 2d 64 65 66 69 6e  allow user-defin
11030 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
11040 75 65 6e 63 65 73 2c 0a 20 20 2a 2a 20 68 65 72  uences,.  ** her
11050 65 3f 20 20 49 20 74 68 69 6e 6b 20 77 65 20 6f  e?  I think we o
11060 6e 6c 79 20 6e 65 65 64 20 74 68 61 74 20 6f 6e  nly need that on
11070 63 65 20 77 65 20 73 75 70 70 6f 72 74 20 70 72  ce we support pr
11080 65 66 69 78 20 73 65 61 72 63 68 65 73 2e 0a 20  efix searches.. 
11090 20 2a 2a 20 41 6c 73 6f 2c 20 73 68 6f 75 6c 64   ** Also, should
110a0 20 77 65 20 62 65 20 75 73 69 6e 67 20 71 73 6f   we be using qso
110b0 72 74 28 29 3f 0a 20 20 2a 2f 0a 20 20 69 66 28  rt()?.  */.  if(
110c0 20 6e 45 6c 65 6d 3e 31 20 29 7b 0a 20 20 20 20   nElem>1 ){.    
110d0 71 73 6f 72 74 28 61 70 45 6c 65 6d 2c 20 6e 45  qsort(apElem, nE
110e0 6c 65 6d 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  lem, sizeof(Fts3
110f0 48 61 73 68 45 6c 65 6d 20 2a 29 2c 20 71 73 6f  HashElem *), qso
11100 72 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 7d 0a  rtCompare);.  }.
11110 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
11120 20 73 65 67 6d 65 6e 74 20 74 72 65 65 20 69 6e   segment tree in
11130 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
11140 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   */.  for(i=0; r
11150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11160 69 3c 6e 45 6c 65 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nElem; i++){. 
11170 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11180 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 28 61   = fts3HashKey(a
11190 70 45 6c 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 69  pElem[i]);.    i
111a0 6e 74 20 6e 20 3d 20 66 74 73 33 48 61 73 68 4b  nt n = fts3HashK
111b0 65 79 73 69 7a 65 28 61 70 45 6c 65 6d 5b 69 5d  eysize(apElem[i]
111c0 29 3b 0a 20 20 20 20 50 65 6e 64 69 6e 67 4c 69  );.    PendingLi
111d0 73 74 20 2a 70 4c 69 73 74 20 3d 20 66 74 73 33  st *pList = fts3
111e0 48 61 73 68 44 61 74 61 28 61 70 45 6c 65 6d 5b  HashData(apElem[
111f0 69 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  i]);.    rc = ft
11200 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 70  s3SegWriterAdd(p
11210 2c 20 26 70 57 72 69 74 65 72 2c 20 30 2c 20 7a  , &pWriter, 0, z
11220 2c 20 6e 2c 20 70 4c 69 73 74 2d 3e 61 44 61 74  , n, pList->aDat
11230 61 2c 20 70 4c 69 73 74 2d 3e 6e 44 61 74 61 2b  a, pList->nData+
11240 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
11250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11260 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57     rc = fts3SegW
11270 72 69 74 65 72 46 6c 75 73 68 28 70 2c 20 70 57  riterFlush(p, pW
11280 72 69 74 65 72 2c 20 30 2c 20 69 64 78 29 3b 0a  riter, 0, idx);.
11290 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
112a0 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 73  ll allocated res
112b0 6f 75 72 63 65 73 20 62 65 66 6f 72 65 20 72 65  ources before re
112c0 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 66 74 73  turning */.  fts
112d0 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 70  3SegWriterFree(p
112e0 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Writer);.  sqlit
112f0 65 33 5f 66 72 65 65 28 61 70 45 6c 65 6d 29 3b  e3_free(apElem);
11300 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65  .  sqlite3Fts3Pe
11310 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28  ndingTermsClear(
11320 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
11340 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
11350 20 77 6f 72 6b 20 66 6f 72 20 74 68 65 20 78 55   work for the xU
11360 70 64 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  pdate method of 
11370 46 54 53 33 20 76 69 72 74 75 61 6c 0a 2a 2a 20  FTS3 virtual.** 
11380 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  tables..*/.int s
11390 71 6c 69 74 65 33 46 74 73 33 55 70 64 61 74 65  qlite3Fts3Update
113a0 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
113b0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20  3_vtab *pVtab,  
113c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
113d0 33 20 76 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f  3 vtab object */
113e0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
11410 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  gument array */.
11420 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
11430 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20  **apVal,        
11440 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
11450 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c  guments */.  sql
11460 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
11470 64 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d            /* 
11480 4f 55 54 3a 20 54 68 65 20 61 66 66 65 63 74 65  OUT: The affecte
11490 64 20 28 6f 72 20 65 66 66 65 63 74 65 64 29 20  d (or effected) 
114a0 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74  rowid */.){.  Ft
114b0 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
114c0 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b  s3Table *)pVtab;
114d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
114e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
114f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
11500 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 6d  e */.  int isRem
11510 6f 76 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ove = 0;        
11520 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
11530 6f 72 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  or an UPDATE or 
11540 44 45 4c 45 54 45 20 2a 2f 0a 20 20 73 71 6c 69  DELETE */.  sqli
11550 74 65 33 5f 69 6e 74 36 34 20 69 52 65 6d 6f 76  te3_int64 iRemov
11560 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 52  e = 0;      /* R
11570 6f 77 69 64 20 72 65 6d 6f 76 65 64 20 62 79 20  owid removed by 
11580 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
11590 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
115a0 73 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72  s is a DELETE or
115b0 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
115c0 6e 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c  n, remove the ol
115d0 64 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69  d record. */.  i
115e0 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
115f0 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 21  _type(apVal[0])!
11600 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
11610 20 20 20 20 69 6e 74 20 69 73 45 6d 70 74 79 3b      int isEmpty;
11620 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 73  .    rc = fts3Is
11630 45 6d 70 74 79 28 70 2c 20 61 70 56 61 6c 2c 20  Empty(p, apVal, 
11640 26 69 73 45 6d 70 74 79 29 3b 0a 20 20 20 20 69  &isEmpty);.    i
11650 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11660 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
11670 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 20  Empty ){.       
11680 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 74 68 69   /* Deleting thi
11690 73 20 72 6f 77 20 6d 65 61 6e 73 20 74 68 65 20  s row means the 
116a0 77 68 6f 6c 65 20 74 61 62 6c 65 20 69 73 20 65  whole table is e
116b0 6d 70 74 79 2e 20 49 6e 20 74 68 69 73 20 63 61  mpty. In this ca
116c0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  se.        ** de
116d0 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lete the content
116e0 73 20 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 74  s of all three t
116f0 61 62 6c 65 73 20 61 6e 64 20 74 68 72 6f 77 20  ables and throw 
11700 61 77 61 79 20 61 6e 79 0a 20 20 20 20 20 20 20  away any.       
11710 20 2a 2a 20 64 61 74 61 20 69 6e 20 74 68 65 20   ** data in the 
11720 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73  pendingTerms has
11730 68 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  h table..       
11740 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
11750 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70   fts3DeleteAll(p
11760 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11770 20 20 20 20 20 20 20 20 69 73 52 65 6d 6f 76 65          isRemove
11780 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 52   = 1;.        iR
11790 65 6d 6f 76 65 20 3d 20 73 71 6c 69 74 65 33 5f  emove = sqlite3_
117a0 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
117b0 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  l[0]);.        r
117c0 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
117d0 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 69 52 65  ermsDocid(p, iRe
117e0 6d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  move);.        i
117f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
11810 20 3d 20 66 74 73 33 44 65 6c 65 74 65 54 65 72   = fts3DeleteTer
11820 6d 73 28 70 2c 20 61 70 56 61 6c 29 3b 0a 20 20  ms(p, apVal);.  
11830 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
11840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11850 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74           rc = ft
11860 73 33 53 71 6c 45 78 65 63 28 70 2c 20 53 51 4c  s3SqlExec(p, SQL
11870 5f 44 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 2c  _DELETE_CONTENT,
11880 20 61 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20   apVal);.       
11890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
118a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
118b0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  .  .  /* If this
118c0 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   is an INSERT or
118d0 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
118e0 6e 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 65  n, insert the ne
118f0 77 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69  w record. */.  i
11900 66 28 20 6e 41 72 67 3e 31 20 26 26 20 72 63 3d  f( nArg>1 && rc=
11910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11920 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72    rc = fts3Inser
11930 74 44 61 74 61 28 70 2c 20 61 70 56 61 6c 2c 20  tData(p, apVal, 
11940 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  pRowid);.    if(
11950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11960 26 20 28 21 69 73 52 65 6d 6f 76 65 20 7c 7c 20  & (!isRemove || 
11970 2a 70 52 6f 77 69 64 21 3d 69 52 65 6d 6f 76 65  *pRowid!=iRemove
11980 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
11990 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
119a0 44 6f 63 69 64 28 70 2c 20 2a 70 52 6f 77 69 64  Docid(p, *pRowid
119b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
119c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
119d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
119e0 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70 2c 20  3InsertTerms(p, 
119f0 61 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  apVal);.    }.  
11a00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
11a10 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20  }../* .** Flush 
11a20 61 6e 79 20 64 61 74 61 20 69 6e 20 74 68 65 20  any data in the 
11a30 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61  pending-terms ha
11a40 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
11a50 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
11a60 0a 2a 2a 20 6d 65 72 67 65 20 61 6c 6c 20 73 65  .** merge all se
11a70 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  gments in the da
11a80 74 61 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e  tabase (includin
11a90 67 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  g the new segmen
11aa0 74 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  t, if .** there 
11ab0 77 61 73 20 61 6e 79 20 64 61 74 61 20 74 6f 20  was any data to 
11ac0 66 6c 75 73 68 29 20 69 6e 74 6f 20 61 20 73 69  flush) into a si
11ad0 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 20 0a 2a  ngle segment. .*
11ae0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
11af0 33 4f 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61  3Optimize(Fts3Ta
11b00 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ble *p){.  int r
11b10 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
11b20 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
11b30 41 56 45 50 4f 49 4e 54 20 66 74 73 33 22 2c 20  AVEPOINT fts3", 
11b40 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
11b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11b60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11b70 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
11b80 73 46 6c 75 73 68 28 70 29 3b 0a 20 20 20 20 69  sFlush(p);.    i
11b90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11ba0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
11bb0 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28  ts3SegmentMerge(
11bc0 70 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  p, -1);.    }.  
11bd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
11bf0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
11c00 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 66  ->db, "RELEASE f
11c10 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ts3", 0, 0, 0);.
11c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c30 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
11c40 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54  >db, "ROLLBACK T
11c50 4f 20 66 74 73 33 20 3b 20 52 45 4c 45 41 53 45  O fts3 ; RELEASE
11c60 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29   fts3", 0, 0, 0)
11c70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11c80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
11c90 69 66 0a                                         if.