/ Hex Artifact Content
Login

Artifact 69e6fb5a387aa7eb1f9d89e5bce35d21b879602e:


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 70 2d 3e 69 4c  tPos);.    p->iL
3830: 61 73 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20  astPos = iPos;. 
3840: 20 7d 0a 0a 20 70 65 6e 64 69 6e 67 6c 69 73 74   }.. pendinglist
3850: 61 70 70 65 6e 64 5f 6f 75 74 3a 0a 20 20 2a 70  append_out:.  *p
3860: 52 63 20 3d 20 72 63 3b 0a 20 20 69 66 28 20 70  Rc = rc;.  if( p
3870: 21 3d 2a 70 70 20 29 7b 0a 20 20 20 20 2a 70 70  !=*pp ){.    *pp
3880: 20 3d 20 70 3b 0a 20 20 20 20 72 65 74 75 72 6e   = p;.    return
3890: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
38a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b   0;.}../*.** Tok
38b0: 65 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d 74 65  enize the nul-te
38c0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
38d0: 7a 54 65 78 74 20 61 6e 64 20 61 64 64 20 61 6c  zText and add al
38e0: 6c 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68 65 0a  l tokens to the.
38f0: 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  ** pending-terms
3900: 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 54 68 65   hash-table. The
3910: 20 64 6f 63 69 64 20 75 73 65 64 20 69 73 20 74   docid used is t
3920: 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  hat currently st
3930: 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e 69 50  ored in.** p->iP
3940: 72 65 76 44 6f 63 69 64 2c 20 61 6e 64 20 74 68  revDocid, and th
3950: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65 63  e column is spec
3960: 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e  ified by argumen
3970: 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  t iCol..**.** If
3980: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
3990: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
39a0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
39b0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
39c0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
39d0: 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  nt fts3PendingTe
39e0: 72 6d 73 41 64 64 28 46 74 73 33 54 61 62 6c 65  rmsAdd(Fts3Table
39f0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3a00: 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69 43 6f 6c  *zText, int iCol
3a10: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
3a20: 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 69 6e 74  nt iStart;.  int
3a30: 20 69 45 6e 64 3b 0a 20 20 69 6e 74 20 69 50 6f   iEnd;.  int iPo
3a40: 73 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  s;..  char const
3a50: 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20   *zToken;.  int 
3a60: 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74  nToken;..  sqlit
3a70: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54  e3_tokenizer *pT
3a80: 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70 54  okenizer = p->pT
3a90: 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c 69  okenizer;.  sqli
3aa0: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
3ab0: 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64  dule const *pMod
3ac0: 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72  ule = pTokenizer
3ad0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71 6c  ->pModule;.  sql
3ae0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
3af0: 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 69  ursor *pCsr;.  i
3b00: 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71 6c 69  nt (*xNext)(sqli
3b10: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75  te3_tokenizer_cu
3b20: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a 20  rsor *pCursor,. 
3b30: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a       const char*
3b40: 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a  *,int*,int*,int*
3b50: 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65 72  ,int*);..  asser
3b60: 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26 26  t( pTokenizer &&
3b70: 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20 72   pModule );..  r
3b80: 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70  c = pModule->xOp
3b90: 65 6e 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 7a  en(pTokenizer, z
3ba0: 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72 29  Text, -1, &pCsr)
3bb0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3bc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
3bd0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
3be0: 73 72 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 20 3d  sr->pTokenizer =
3bf0: 20 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 0a 20 20   pTokenizer;..  
3c00: 78 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d  xNext = pModule-
3c10: 3e 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28  >xNext;.  while(
3c20: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20   SQLITE_OK==rc. 
3c30: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
3c40: 4b 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70  K==(rc = xNext(p
3c50: 43 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e  Csr, &zToken, &n
3c60: 54 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20  Token, &iStart, 
3c70: 26 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20  &iEnd, &iPos)). 
3c80: 20 29 7b 0a 20 20 20 20 50 65 6e 64 69 6e 67 4c   ){.    PendingL
3c90: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 20  ist *pList;..   
3ca0: 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 73 20 63 61   /* Positions ca
3cb0: 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69 76 65  nnot be negative
3cc0: 3b 20 77 65 20 75 73 65 20 2d 31 20 61 73 20 61  ; we use -1 as a
3cd0: 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 6e 74 65   terminator inte
3ce0: 72 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 54  rnally..    ** T
3cf0: 6f 6b 65 6e 73 20 6d 75 73 74 20 68 61 76 65 20  okens must have 
3d00: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67 74  a non-zero lengt
3d10: 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  h..    */.    if
3d20: 28 20 69 50 6f 73 3c 30 20 7c 7c 20 21 7a 54 6f  ( iPos<0 || !zTo
3d30: 6b 65 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d 30  ken || nToken<=0
3d40: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
3d50: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
3d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d70: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 28 50 65  .    pList = (Pe
3d80: 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33  ndingList *)fts3
3d90: 48 61 73 68 46 69 6e 64 28 26 70 2d 3e 70 65 6e  HashFind(&p->pen
3da0: 64 69 6e 67 54 65 72 6d 73 2c 20 7a 54 6f 6b 65  dingTerms, zToke
3db0: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
3dc0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
3dd0: 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
3de0: 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e 6e 44  ta -= (pList->nD
3df0: 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73  ata + nToken + s
3e00: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
3e10: 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  em));.    }.    
3e20: 69 66 28 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  if( fts3PendingL
3e30: 69 73 74 41 70 70 65 6e 64 28 26 70 4c 69 73 74  istAppend(&pList
3e40: 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c  , p->iPrevDocid,
3e50: 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 72 63   iCol, iPos, &rc
3e60: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
3e70: 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49 6e  List==fts3HashIn
3e80: 73 65 72 74 28 26 70 2d 3e 70 65 6e 64 69 6e 67  sert(&p->pending
3e90: 54 65 72 6d 73 2c 20 7a 54 6f 6b 65 6e 2c 20 6e  Terms, zToken, n
3ea0: 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20 29 7b  Token, pList) ){
3eb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c  .        /* Mall
3ec0: 6f 63 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  oc failed while 
3ed0: 69 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65  inserting the ne
3ee0: 77 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61  w entry. This ca
3ef0: 6e 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  n only .        
3f00: 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ** happen if the
3f10: 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76 69 6f  re was no previo
3f20: 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  us entry for thi
3f30: 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20 20 20  s token..       
3f40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
3f50: 72 74 28 20 30 3d 3d 66 74 73 33 48 61 73 68 46  rt( 0==fts3HashF
3f60: 69 6e 64 28 26 70 2d 3e 70 65 6e 64 69 6e 67 54  ind(&p->pendingT
3f70: 65 72 6d 73 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  erms, zToken, nT
3f80: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 20  oken) );.       
3f90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
3fa0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ist);.        rc
3fb0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
3fc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3fd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
3fe0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
3ff0: 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 2b 3d  >nPendingData +=
4000: 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b   (pList->nData +
4010: 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f 66   nToken + sizeof
4020: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29 29 3b  (Fts3HashElem));
4030: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4d  .    }.  }..  pM
4040: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 43  odule->xClose(pC
4050: 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  sr);.  return (r
4060: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
4070: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
4080: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c  ;.}../* .** Call
4090: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
40a0: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  n indicates that
40b0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
40c0: 73 20 74 6f 20 0a 2a 2a 20 66 74 73 33 50 65 6e  s to .** fts3Pen
40d0: 64 69 6e 67 54 65 72 6d 73 41 64 64 28 29 20 61  dingTermsAdd() a
40e0: 72 65 20 74 6f 20 61 64 64 20 74 65 72 6d 2f 70  re to add term/p
40f0: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 70 61 69  osition-list pai
4100: 72 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f  rs for the.** co
4110: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 6f  ntents of the do
4120: 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69  cument with doci
4130: 64 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a 73 74 61  d iDocid..*/.sta
4140: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
4150: 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 46 74  ingTermsDocid(Ft
4160: 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69  s3Table *p, sqli
4170: 74 65 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 29  te_int64 iDocid)
4180: 7b 0a 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73  {.  /* TODO(shes
4190: 73 29 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68  s) Explore wheth
41a0: 65 72 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75  er partially flu
41b0: 73 68 69 6e 67 20 74 68 65 20 62 75 66 66 65 72  shing the buffer
41c0: 20 6f 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d   on.  ** forced-
41d0: 66 6c 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76  flush would prov
41e0: 69 64 65 20 62 65 74 74 65 72 20 70 65 72 66 6f  ide better perfo
41f0: 72 6d 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65  rmance.  I suspe
4200: 63 74 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  ct that if.  ** 
4210: 77 65 20 6f 72 64 65 72 65 64 20 74 68 65 20 64  we ordered the d
4220: 6f 63 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20  oclists by size 
4230: 61 6e 64 20 66 6c 75 73 68 65 64 20 74 68 65 20  and flushed the 
4240: 6c 61 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68  largest until th
4250: 65 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61  e.  ** buffer wa
4260: 73 20 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68  s half empty, th
4270: 61 74 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65  at would let the
4280: 20 6c 65 73 73 20 66 72 65 71 75 65 6e 74 20 74   less frequent t
4290: 65 72 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61  erms.  ** genera
42a0: 74 65 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73  te longer doclis
42b0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ts..  */.  if( i
42c0: 44 6f 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44  Docid<=p->iPrevD
42d0: 6f 63 69 64 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64  ocid || p->nPend
42e0: 69 6e 67 44 61 74 61 3e 46 54 53 33 5f 4d 41 58  ingData>FTS3_MAX
42f0: 5f 50 45 4e 44 49 4e 47 5f 44 41 54 41 20 29 7b  _PENDING_DATA ){
4300: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
4310: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
4320: 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
4330: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
4340: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
4350: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65 76  ;.  }.  p->iPrev
4360: 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
4370: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4380: 4f 4b 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  OK;.}..void sqli
4390: 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
43a0: 72 6d 73 43 6c 65 61 72 28 46 74 73 33 54 61 62  rmsClear(Fts3Tab
43b0: 6c 65 20 2a 70 29 7b 0a 20 20 46 74 73 33 48 61  le *p){.  Fts3Ha
43c0: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
43d0: 20 66 6f 72 28 70 45 6c 65 6d 3d 66 74 73 33 48   for(pElem=fts3H
43e0: 61 73 68 46 69 72 73 74 28 26 70 2d 3e 70 65 6e  ashFirst(&p->pen
43f0: 64 69 6e 67 54 65 72 6d 73 29 3b 20 70 45 6c 65  dingTerms); pEle
4400: 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48 61 73  m; pElem=fts3Has
4410: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
4420: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4430: 66 74 73 33 48 61 73 68 44 61 74 61 28 70 45 6c  fts3HashData(pEl
4440: 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 66 74 73 33  em));.  }.  fts3
4450: 48 61 73 68 43 6c 65 61 72 28 26 70 2d 3e 70 65  HashClear(&p->pe
4460: 6e 64 69 6e 67 54 65 72 6d 73 29 3b 0a 20 20 70  ndingTerms);.  p
4470: 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
4480: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
4490: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
44a0: 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55 70 64  lled by the xUpd
44b0: 61 74 65 28 29 20 6d 65 74 68 6f 64 20 61 73 20  ate() method as 
44c0: 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45 52  part of an INSER
44d0: 54 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  T.** operation. 
44e0: 49 74 20 61 64 64 73 20 65 6e 74 72 69 65 73 20  It adds entries 
44f0: 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
4500: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
4510: 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e  to the.** pendin
4520: 67 54 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  gTerms hash tabl
4530: 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  e..**.** Argumen
4540: 74 20 61 70 56 61 6c 20 69 73 20 74 68 65 20 73  t apVal is the s
4550: 61 6d 65 20 61 73 20 74 68 65 20 73 69 6d 69 6c  ame as the simil
4560: 61 72 6c 79 20 6e 61 6d 65 64 20 61 72 67 75 6d  arly named argum
4570: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a  ent passed to.**
4580: 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28   fts3InsertData(
4590: 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 44 6f  ). Parameter iDo
45a0: 63 69 64 20 69 73 20 74 68 65 20 64 6f 63 69 64  cid is the docid
45b0: 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77 2e   of the new row.
45c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
45d0: 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 46  ts3InsertTerms(F
45e0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c  ts3Table *p, sql
45f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
4600: 61 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  al){.  int i;   
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
4630: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
4640: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 70 2d 3e 6e   for(i=2; i<p->n
4650: 43 6f 6c 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b 0a  Column+2; i++){.
4660: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4670: 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
4680: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
4690: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69  lue_text(apVal[i
46a0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 78  ]);.    if( zTex
46b0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t ){.      int r
46c0: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
46d0: 65 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78 74  ermsAdd(p, zText
46e0: 2c 20 69 2d 32 29 3b 0a 20 20 20 20 20 20 69 66  , i-2);.      if
46f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4700: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4710: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
4720: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4730: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4740: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4750: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
4760: 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65  the xUpdate() me
4770: 74 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53 45  thod for an INSE
4780: 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  RT operation..**
4790: 20 54 68 65 20 61 70 56 61 6c 20 70 61 72 61 6d   The apVal param
47a0: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 61  eter is passed a
47b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70 56   copy of the apV
47c0: 61 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  al argument pass
47d0: 65 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65 20  ed by.** SQLite 
47e0: 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 28 29  to the xUpdate()
47f0: 20 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a   method. i.e:.**
4800: 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20 20  .**   apVal[0]  
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f                No
4820: 74 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45 52  t used for INSER
4830: 54 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31 5d  T..**   apVal[1]
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 72 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61 6c  rowid.**   apVal
4860: 5b 32 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [2]             
4870: 20 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73 65     Left-most use
4880: 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r-defined column
4890: 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61  .**   ....**   a
48a0: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
48b0: 31 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f 73  1]     Right-mos
48c0: 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63  t user-defined c
48d0: 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61 6c  olumn.**   apVal
48e0: 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20  [p->nColumn+2]  
48f0: 20 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d 6e     Hidden column
4900: 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20   with same name 
4910: 61 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61 70  as table.**   ap
4920: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33  Val[p->nColumn+3
4930: 5d 20 20 20 20 20 48 69 64 64 65 6e 20 22 64 6f  ]     Hidden "do
4940: 63 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c 69  cid" column (ali
4950: 61 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a 2f  as for rowid).*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
4970: 49 6e 73 65 72 74 44 61 74 61 28 0a 20 20 46 74  InsertData(.  Ft
4980: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
49a0: 20 46 75 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65   Full-text table
49b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
49c0: 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20  lue **apVal,    
49d0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
49e0: 66 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73 65  f values to inse
49f0: 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rt */.  sqlite3_
4a00: 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 20 20  int64 *piDocid  
4a10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4a20: 44 6f 63 69 64 20 66 6f 72 20 72 6f 77 20 6a 75  Docid for row ju
4a30: 73 74 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29  st inserted */.)
4a40: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
4a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
4aa0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
4ab0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4ac0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 3b 20  pContentInsert; 
4ad0: 20 20 2f 2a 20 49 4e 53 45 52 54 20 49 4e 54 4f    /* INSERT INTO
4ae0: 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45   %_content VALUE
4af0: 53 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20 2f 2a 20  S(...) */..  /* 
4b00: 4c 6f 63 61 74 65 20 74 68 65 20 73 74 61 74 65  Locate the state
4b10: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 75 73 65 64  ment handle used
4b20: 20 74 6f 20 69 6e 73 65 72 74 20 64 61 74 61 20   to insert data 
4b30: 69 6e 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65  into the %_conte
4b40: 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  nt.  ** table. T
4b50: 68 65 20 53 51 4c 20 66 6f 72 20 74 68 69 73 20  he SQL for this 
4b60: 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20  statement is:.  
4b70: 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54  **.  **   INSERT
4b80: 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20   INTO %_content 
4b90: 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c 20  VALUES(?, ?, ?, 
4ba0: 2e 2e 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ...).  **.  ** T
4bb0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 66 65 61  he statement fea
4bc0: 74 75 72 65 73 20 4e 20 27 3f 27 20 76 61 72 69  tures N '?' vari
4bd0: 61 62 6c 65 73 2c 20 77 68 65 72 65 20 4e 20 69  ables, where N i
4be0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
4bf0: 75 73 65 72 0a 20 20 2a 2a 20 64 65 66 69 6e 65  user.  ** define
4c00: 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
4c10: 20 46 54 53 33 20 74 61 62 6c 65 2c 20 70 6c 75   FTS3 table, plu
4c20: 73 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 64 6f  s one for the do
4c30: 63 69 64 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a  cid field..  */.
4c40: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
4c50: 6d 74 28 70 2c 20 53 51 4c 5f 43 4f 4e 54 45 4e  mt(p, SQL_CONTEN
4c60: 54 5f 49 4e 53 45 52 54 2c 20 26 70 43 6f 6e 74  T_INSERT, &pCont
4c70: 65 6e 74 49 6e 73 65 72 74 2c 20 26 61 70 56 61  entInsert, &apVa
4c80: 6c 5b 31 5d 29 3b 0a 20 20 69 66 28 20 72 63 21  l[1]);.  if( rc!
4c90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4ca0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
4cb0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20  ..  /* There is 
4cc0: 61 20 71 75 69 72 6b 20 68 65 72 65 2e 20 54 68  a quirk here. Th
4cd0: 65 20 75 73 65 72 73 20 49 4e 53 45 52 54 20 73  e users INSERT s
4ce0: 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 68 61 76  tatement may hav
4cf0: 65 20 73 70 65 63 69 66 69 65 64 0a 20 20 2a 2a  e specified.  **
4d00: 20 61 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65   a value for the
4d10: 20 22 72 6f 77 69 64 22 20 66 69 65 6c 64 2c 20   "rowid" field, 
4d20: 66 6f 72 20 74 68 65 20 22 64 6f 63 69 64 22 20  for the "docid" 
4d30: 66 69 65 6c 64 2c 20 6f 72 20 66 6f 72 20 62 6f  field, or for bo
4d40: 74 68 2e 0a 20 20 2a 2a 20 57 68 69 63 68 20 69  th..  ** Which i
4d50: 73 20 61 20 70 72 6f 62 6c 65 6d 2c 20 73 69 6e  s a problem, sin
4d60: 63 65 20 22 72 6f 77 69 64 22 20 61 6e 64 20 22  ce "rowid" and "
4d70: 64 6f 63 69 64 22 20 61 72 65 20 61 6c 69 61 73  docid" are alias
4d80: 65 73 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  es for the.  ** 
4d90: 73 61 6d 65 20 76 61 6c 75 65 2e 20 46 6f 72 20  same value. For 
4da0: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
4db0: 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  **   INSERT INTO
4dc0: 20 66 74 73 33 74 62 6c 28 72 6f 77 69 64 2c 20   fts3tbl(rowid, 
4dd0: 64 6f 63 69 64 29 20 56 41 4c 55 45 53 28 31 2c  docid) VALUES(1,
4de0: 20 32 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   2);.  **.  ** I
4df0: 6e 20 46 54 53 33 2c 20 69 66 20 61 20 6e 6f 6e  n FTS3, if a non
4e00: 2d 4e 55 4c 4c 20 64 6f 63 69 64 20 76 61 6c 75  -NULL docid valu
4e10: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4e20: 69 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  it is the value.
4e30: 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 2e 20 4f    ** inserted. O
4e40: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 72 6f  therwise, the ro
4e50: 77 69 64 20 76 61 6c 75 65 20 69 73 20 75 73 65  wid value is use
4e60: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  d..  */.  if( SQ
4e70: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
4e80: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
4e90: 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e  Val[3+p->nColumn
4ea0: 5d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ]) ){.    rc = s
4eb0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
4ec0: 65 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74  e(pContentInsert
4ed0: 2c 20 31 2c 20 61 70 56 61 6c 5b 33 2b 70 2d 3e  , 1, apVal[3+p->
4ee0: 6e 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 20 20 69  nColumn]);.    i
4ef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4f00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
4f10: 7d 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  }..  /* Execute 
4f20: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
4f30: 20 69 6e 73 65 72 74 20 74 68 65 20 72 65 63 6f   insert the reco
4f40: 72 64 2e 20 53 65 74 20 2a 70 69 44 6f 63 69 64  rd. Set *piDocid
4f50: 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 6e 65   to the .  ** ne
4f60: 77 20 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 0a  w docid value. .
4f70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73    */.  sqlite3_s
4f80: 74 65 70 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65  tep(pContentInse
4f90: 72 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  rt);.  rc = sqli
4fa0: 74 65 33 5f 72 65 73 65 74 28 70 43 6f 6e 74 65  te3_reset(pConte
4fb0: 6e 74 49 6e 73 65 72 74 29 3b 0a 0a 20 20 2a 70  ntInsert);..  *p
4fc0: 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33  iDocid = sqlite3
4fd0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
4fe0: 69 64 28 70 2d 3e 64 62 29 3b 0a 20 20 72 65 74  id(p->db);.  ret
4ff0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  urn rc;.}..../*.
5000: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61  ** Remove all da
5010: 74 61 20 66 72 6f 6d 20 74 68 65 20 46 54 53 33  ta from the FTS3
5020: 20 74 61 62 6c 65 2e 20 43 6c 65 61 72 20 74 68   table. Clear th
5030: 65 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e  e hash table con
5040: 74 61 69 6e 69 6e 67 0a 2a 2a 20 70 65 6e 64 69  taining.** pendi
5050: 6e 67 20 74 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ng terms..*/.sta
5060: 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65  tic int fts3Dele
5070: 74 65 41 6c 6c 28 46 74 73 33 54 61 62 6c 65 20  teAll(Fts3Table 
5080: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
50b0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44   code */..  /* D
50c0: 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
50d0: 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69  nts of the pendi
50e0: 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61  ng-terms hash ta
50f0: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
5100: 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
5110: 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a  sClear(p);..  /*
5120: 20 44 65 6c 65 74 65 20 65 76 65 72 79 74 68 69   Delete everythi
5130: 6e 67 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f  ng from the %_co
5140: 6e 74 65 6e 74 2c 20 25 5f 73 65 67 6d 65 6e 74  ntent, %_segment
5150: 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72 20 74  s and %_segdir t
5160: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 72 63 20 3d  ables. */.  rc =
5170: 20 66 74 73 33 53 71 6c 45 78 65 63 28 70 2c 20   fts3SqlExec(p, 
5180: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43  SQL_DELETE_ALL_C
5190: 4f 4e 54 45 4e 54 2c 20 30 29 3b 0a 20 20 69 66  ONTENT, 0);.  if
51a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
51b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
51c0: 53 71 6c 45 78 65 63 28 70 2c 20 53 51 4c 5f 44  SqlExec(p, SQL_D
51d0: 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e  ELETE_ALL_SEGMEN
51e0: 54 53 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  TS, 0);.  }.  if
51f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5200: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
5210: 53 71 6c 45 78 65 63 28 70 2c 20 53 51 4c 5f 44  SqlExec(p, SQL_D
5220: 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52  ELETE_ALL_SEGDIR
5230: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
5240: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5250: 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  The first elemen
5260: 74 20 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d  t in the apVal[]
5270: 20 61 72 72 61 79 20 69 73 20 61 73 73 75 6d 65   array is assume
5280: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
5290: 20 64 6f 63 69 64 0a 2a 2a 20 28 61 6e 20 69 6e   docid.** (an in
52a0: 74 65 67 65 72 29 20 6f 66 20 61 20 72 6f 77 20  teger) of a row 
52b0: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
52c0: 74 65 64 2e 20 52 65 6d 6f 76 65 20 61 6c 6c 20  ted. Remove all 
52d0: 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 0a 2a  terms from the.*
52e0: 2a 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  * full-text inde
52f0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
5300: 20 66 74 73 33 44 65 6c 65 74 65 54 65 72 6d 73   fts3DeleteTerms
5310: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73  (Fts3Table *p, s
5320: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5330: 70 56 61 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pVal){.  int rc;
5340: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5350: 2a 70 53 65 6c 65 63 74 3b 0a 0a 20 20 72 63 20  *pSelect;..  rc 
5360: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
5370: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54   SQL_SELECT_CONT
5380: 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70  ENT_BY_ROWID, &p
5390: 53 65 6c 65 63 74 2c 20 61 70 56 61 6c 29 3b 0a  Select, apVal);.
53a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
53b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53  _OK ){.    if( S
53c0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
53d0: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
53e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
53f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
5400: 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  i<=p->nColumn; i
5410: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
5420: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d  st char *zText =
5430: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
5440: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
5450: 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a  xt(pSelect, i);.
5460: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
5470: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64  3PendingTermsAdd
5480: 28 70 2c 20 7a 54 65 78 74 2c 20 2d 31 29 3b 0a  (p, zText, -1);.
5490: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
54a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
54b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
54c0: 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  eset(pSelect);. 
54d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
54e0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
54f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5500: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5510: 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29  3_reset(pSelect)
5520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
5530: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  rd declaration t
5540: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
5550: 65 20 63 69 72 63 75 6c 61 72 20 64 65 70 65 6e  e circular depen
5560: 64 65 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a  dency between.**
5570: 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 33 53   functions fts3S
5580: 65 67 6d 65 6e 74 4d 65 72 67 65 28 29 20 61 6e  egmentMerge() an
5590: 64 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  d fts3AllocateSe
55a0: 67 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74  gdirIdx()..*/.st
55b0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
55c0: 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61  mentMerge(Fts3Ta
55d0: 62 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ble *, int);../*
55e0: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
55f0: 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e  on allocates a n
5600: 65 77 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  ew level iLevel 
5610: 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 65 67  index in the seg
5620: 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 20 55 73  dir table..** Us
5630: 75 61 6c 6c 79 2c 20 69 6e 64 65 78 65 73 20 61  ually, indexes a
5640: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74  re allocated wit
5650: 68 69 6e 20 61 20 6c 65 76 65 6c 20 73 65 71 75  hin a level sequ
5660: 65 6e 74 69 61 6c 6c 79 20 73 74 61 72 74 69 6e  entially startin
5670: 67 0a 2a 2a 20 77 69 74 68 20 30 2c 20 73 6f 20  g.** with 0, so 
5680: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  the allocated in
5690: 64 65 78 20 69 73 20 6f 6e 65 20 67 72 65 61 74  dex is one great
56a0: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
56b0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
56c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
56d0: 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20 25   max(idx) FROM %
56e0: 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65  _segdir WHERE le
56f0: 76 65 6c 20 3d 20 3a 69 4c 65 76 65 6c 0a 2a 2a  vel = :iLevel.**
5700: 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
5710: 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
5720: 79 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55  y FTS3_MERGE_COU
5730: 4e 54 20 69 6e 64 65 78 65 73 20 61 74 20 74 68  NT indexes at th
5740: 65 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 6c  e requested.** l
5750: 65 76 65 6c 2c 20 74 68 65 79 20 61 72 65 20 6d  evel, they are m
5760: 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  erged into a sin
5770: 67 6c 65 20 6c 65 76 65 6c 20 28 69 4c 65 76 65  gle level (iLeve
5780: 6c 2b 31 29 20 73 65 67 6d 65 6e 74 20 61 6e 64  l+1) segment and
5790: 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
57a0: 65 64 20 69 6e 64 65 78 20 69 73 20 30 2e 0a 2a  ed index is 0..*
57b0: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
57c0: 75 6c 2c 20 2a 70 69 49 64 78 20 69 73 20 73 65  ul, *piIdx is se
57d0: 74 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  t to the allocat
57e0: 65 64 20 69 6e 64 65 78 20 73 6c 6f 74 20 61 6e  ed index slot an
57f0: 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 72  d SQLITE_OK.** r
5800: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
5810: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
5820: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5830: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
5840: 69 6e 74 20 66 74 73 33 41 6c 6c 6f 63 61 74 65  int fts3Allocate
5850: 53 65 67 64 69 72 49 64 78 28 46 74 73 33 54 61  SegdirIdx(Fts3Ta
5860: 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 4c 65 76  ble *p, int iLev
5870: 65 6c 2c 20 69 6e 74 20 2a 70 69 49 64 78 29 7b  el, int *piIdx){
5880: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
58b0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
58c0: 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b 20 20  tmt *pNextIdx;  
58d0: 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
58e0: 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61 74 20  for next idx at 
58f0: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a 2f 0a  level iLevel */.
5900: 20 20 69 6e 74 20 69 4e 65 78 74 3b 20 20 20 20    int iNext;    
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 71    /* Result of q
5930: 75 65 72 79 20 70 4e 65 78 74 49 64 78 20 2a 2f  uery pNextIdx */
5940: 0a 0a 20 20 2f 2a 20 53 65 74 20 76 61 72 69 61  ..  /* Set varia
5950: 62 6c 65 20 69 4e 65 78 74 20 74 6f 20 74 68 65  ble iNext to the
5960: 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
5970: 73 65 67 64 69 72 20 69 6e 64 65 78 20 61 74 20  segdir index at 
5980: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 2a 2f  level iLevel. */
5990: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
59a0: 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f  tmt(p, SQL_NEXT_
59b0: 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26  SEGMENT_INDEX, &
59c0: 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20  pNextIdx, 0);.  
59d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
59e0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
59f0: 5f 62 69 6e 64 5f 69 6e 74 28 70 4e 65 78 74 49  _bind_int(pNextI
5a00: 64 78 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a  dx, 1, iLevel);.
5a10: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
5a20: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
5a30: 28 70 4e 65 78 74 49 64 78 29 20 29 7b 0a 20 20  (pNextIdx) ){.  
5a40: 20 20 20 20 69 4e 65 78 74 20 3d 20 73 71 6c 69      iNext = sqli
5a50: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
5a60: 28 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20  (pNextIdx, 0);. 
5a70: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
5a80: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4e 65 78  lite3_reset(pNex
5a90: 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  tIdx);.  }..  if
5aa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5ab0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 4e 65  ){.    /* If iNe
5ac0: 78 74 20 69 73 20 46 54 53 33 5f 4d 45 52 47 45  xt is FTS3_MERGE
5ad0: 5f 43 4f 55 4e 54 2c 20 69 6e 64 69 63 61 74 69  _COUNT, indicati
5ae0: 6e 67 20 74 68 61 74 20 6c 65 76 65 6c 20 69 4c  ng that level iL
5af0: 65 76 65 6c 20 69 73 20 61 6c 72 65 61 64 79 0a  evel is already.
5b00: 20 20 20 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72      ** full, mer
5b10: 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  ge all segments 
5b20: 69 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  in level iLevel 
5b30: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c  into a single iL
5b40: 65 76 65 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65  evel+1.    ** se
5b50: 67 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61  gment and alloca
5b60: 74 65 20 28 6e 65 77 6c 79 20 66 72 65 65 64 29  te (newly freed)
5b70: 20 69 6e 64 65 78 20 30 20 61 74 20 6c 65 76 65   index 0 at leve
5b80: 6c 20 69 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77  l iLevel. Otherw
5b90: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69  ise,.    ** if i
5ba0: 4e 65 78 74 20 69 73 20 6c 65 73 73 20 74 68 61  Next is less tha
5bb0: 6e 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55  n FTS3_MERGE_COU
5bc0: 4e 54 2c 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64  NT, allocate ind
5bd0: 65 78 20 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f  ex iNext..    */
5be0: 0a 20 20 20 20 69 66 28 20 69 4e 65 78 74 3e 3d  .    if( iNext>=
5bf0: 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
5c00: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
5c10: 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28  ts3SegmentMerge(
5c20: 70 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  p, iLevel);.    
5c30: 20 20 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20 20    *piIdx = 0;.  
5c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
5c50: 70 69 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a 20  piIdx = iNext;. 
5c60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
5c70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5c80: 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
5c90: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
5ca0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
5cb0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
5cc0: 69 6e 20 74 68 65 0a 2a 2a 20 73 65 67 6d 65 6e  in the.** segmen
5cd0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
5ce0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
5cf0: 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 72  eturned. If ther
5d00: 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 74 65 72  e is no next ter
5d10: 6d 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  m,.** SQLITE_DON
5d20: 45 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  E. Otherwise, an
5d30: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
5d40: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
5d50: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  t fts3SegReaderN
5d60: 65 78 74 28 46 74 73 33 53 65 67 52 65 61 64 65  ext(Fts3SegReade
5d70: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 63  r *pReader){.  c
5d80: 68 61 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  har *pNext;     
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5da0: 2a 20 43 75 72 73 6f 72 20 76 61 72 69 61 62 6c  * Cursor variabl
5db0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  e */.  int nPref
5dc0: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
5dd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5de0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 65 72   of bytes in ter
5df0: 6d 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  m prefix */.  in
5e00: 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20  t nSuffix;      
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5e20: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
5e30: 20 69 6e 20 74 65 72 6d 20 73 75 66 66 69 78 20   in term suffix 
5e40: 2a 2f 0a 0a 20 20 69 66 28 20 21 70 52 65 61 64  */..  if( !pRead
5e50: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 7b 0a  er->aDoclist ){.
5e60: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61      pNext = pRea
5e70: 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 65  der->aNode;.  }e
5e80: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  lse{.    pNext =
5e90: 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c   &pReader->aDocl
5ea0: 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f  ist[pReader->nDo
5eb0: 63 6c 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20 20 69  clist];.  }..  i
5ec0: 66 28 20 21 70 4e 65 78 74 20 7c 7c 20 70 4e 65  f( !pNext || pNe
5ed0: 78 74 3e 3d 26 70 52 65 61 64 65 72 2d 3e 61 4e  xt>=&pReader->aN
5ee0: 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f  ode[pReader->nNo
5ef0: 64 65 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  de] ){.    int r
5f00: 63 3b 0a 20 20 20 20 69 66 28 20 21 70 52 65 61  c;.    if( !pRea
5f10: 64 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  der->pStmt ){.  
5f20: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f      pReader->aNo
5f30: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  de = 0;.      re
5f40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5f50: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
5f60: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 65 61  qlite3_step(pRea
5f70: 64 65 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  der->pStmt);.   
5f80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5f90: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 52 65  ROW ){.      pRe
5fa0: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b  ader->aNode = 0;
5fb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 72  .      return (r
5fc0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
5fd0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
5fe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61  ;.    }.    pRea
5ff0: 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 73 71 6c  der->nNode = sql
6000: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
6010: 73 28 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74  s(pReader->pStmt
6020: 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 61 64 65  , 0);.    pReade
6030: 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68 61 72  r->aNode = (char
6040: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
6050: 6e 5f 62 6c 6f 62 28 70 52 65 61 64 65 72 2d 3e  n_blob(pReader->
6060: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70  pStmt, 0);.    p
6070: 4e 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d 3e  Next = pReader->
6080: 61 4e 6f 64 65 3b 0a 20 20 7d 0a 20 20 0a 20 20  aNode;.  }.  .  
6090: 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33  pNext += sqlite3
60a0: 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  Fts3GetVarint32(
60b0: 70 4e 65 78 74 2c 20 26 6e 50 72 65 66 69 78 29  pNext, &nPrefix)
60c0: 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c  ;.  pNext += sql
60d0: 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
60e0: 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 53 75 66  t32(pNext, &nSuf
60f0: 66 69 78 29 3b 0a 0a 20 20 69 66 28 20 6e 50 72  fix);..  if( nPr
6100: 65 66 69 78 2b 6e 53 75 66 66 69 78 3e 70 52 65  efix+nSuffix>pRe
6110: 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63  ader->nTermAlloc
6120: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   ){.    int nNew
6130: 20 3d 20 28 6e 50 72 65 66 69 78 2b 6e 53 75 66   = (nPrefix+nSuf
6140: 66 69 78 29 2a 32 3b 0a 20 20 20 20 63 68 61 72  fix)*2;.    char
6150: 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *zNew = sqlite3
6160: 5f 72 65 61 6c 6c 6f 63 28 70 52 65 61 64 65 72  _realloc(pReader
6170: 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a  ->zTerm, nNew);.
6180: 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b      if( !zNew ){
6190: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
61a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
61b0: 7d 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a  }.    pReader->z
61c0: 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20  Term = zNew;.   
61d0: 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41   pReader->nTermA
61e0: 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d  lloc = nNew;.  }
61f0: 0a 20 20 6d 65 6d 63 70 79 28 26 70 52 65 61 64  .  memcpy(&pRead
6200: 65 72 2d 3e 7a 54 65 72 6d 5b 6e 50 72 65 66 69  er->zTerm[nPrefi
6210: 78 5d 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66 66  x], pNext, nSuff
6220: 69 78 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e  ix);.  pReader->
6230: 6e 54 65 72 6d 20 3d 20 6e 50 72 65 66 69 78 2b  nTerm = nPrefix+
6240: 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78 74  nSuffix;.  pNext
6250: 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20 70   += nSuffix;.  p
6260: 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33 46  Next += sqlite3F
6270: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
6280: 4e 65 78 74 2c 20 26 70 52 65 61 64 65 72 2d 3e  Next, &pReader->
6290: 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 61 73 73  nDoclist);.  ass
62a0: 65 72 74 28 20 70 4e 65 78 74 3c 26 70 52 65 61  ert( pNext<&pRea
62b0: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
62c0: 65 72 2d 3e 6e 4e 6f 64 65 5d 20 29 3b 0a 20 20  er->nNode] );.  
62d0: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
62e0: 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 70 52 65  t = pNext;.  pRe
62f0: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
6300: 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
6310: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6320: 0a 2a 2a 20 53 65 74 20 74 68 65 20 53 65 67 52  .** Set the SegR
6330: 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20 74  eader to point t
6340: 6f 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69  o the first doci
6350: 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
6360: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
6370: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
6380: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
6390: 76 6f 69 64 20 66 74 73 33 53 65 67 52 65 61 64  void fts3SegRead
63a0: 65 72 46 69 72 73 74 44 6f 63 69 64 28 46 74 73  erFirstDocid(Fts
63b0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
63c0: 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  der){.  int n;. 
63d0: 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72   assert( pReader
63e0: 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20  ->aDoclist );.  
63f0: 61 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72  assert( !pReader
6400: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29 3b  ->pOffsetList );
6410: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 46 74  .  n = sqlite3Ft
6420: 73 33 47 65 74 56 61 72 69 6e 74 28 70 52 65 61  s3GetVarint(pRea
6430: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 26  der->aDoclist, &
6440: 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 29  pReader->iDocid)
6450: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66  ;.  pReader->pOf
6460: 66 73 65 74 4c 69 73 74 20 3d 20 26 70 52 65 61  fsetList = &pRea
6470: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d  der->aDoclist[n]
6480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
6490: 63 65 20 74 68 65 20 53 65 67 52 65 61 64 65 72  ce the SegReader
64a0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
64b0: 20 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 20 74   next docid in t
64c0: 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 61 73  he doclist.** as
64d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
64e0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a  e current term..
64f0: 2a 2a 20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ** .** If argume
6500: 6e 74 73 20 70 70 4f 66 66 73 65 74 4c 69 73 74  nts ppOffsetList
6510: 20 61 6e 64 20 70 6e 4f 66 66 73 65 74 4c 69 73   and pnOffsetLis
6520: 74 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20  t are not NULL, 
6530: 74 68 65 6e 20 0a 2a 2a 20 2a 70 70 4f 66 66 73  then .** *ppOffs
6540: 65 74 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f  etList is set to
6550: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
6560: 72 73 74 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65  rst column-offse
6570: 74 20 6c 69 73 74 0a 2a 2a 20 69 6e 20 74 68 65  t list.** in the
6580: 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 28   doclist entry (
6590: 69 2e 65 2e 20 69 6d 6d 65 64 69 61 74 65 6c 79  i.e. immediately
65a0: 20 70 61 73 74 20 74 68 65 20 64 6f 63 69 64 20   past the docid 
65b0: 76 61 72 69 6e 74 29 2e 0a 2a 2a 20 2a 70 6e 4f  varint)..** *pnO
65c0: 66 66 73 65 74 4c 69 73 74 20 69 73 20 73 65 74  ffsetList is set
65d0: 20 74 6f 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   to the length o
65e0: 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c  f the set of col
65f0: 75 6d 6e 2d 6f 66 66 73 65 74 0a 2a 2a 20 6c 69  umn-offset.** li
6600: 73 74 73 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  sts, not includi
6610: 6e 67 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  ng the nul-termi
6620: 6e 61 74 6f 72 20 62 79 74 65 2e 20 46 6f 72 20  nator byte. For 
6630: 65 78 61 6d 70 6c 65 3a 0a 2a 2f 0a 73 74 61 74  example:.*/.stat
6640: 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 52  ic void fts3SegR
6650: 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 0a  eaderNextDocid(.
6660: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
6670: 2a 70 52 65 61 64 65 72 2c 0a 20 20 63 68 61 72  *pReader,.  char
6680: 20 2a 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 2c   **ppOffsetList,
6690: 0a 20 20 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74  .  int *pnOffset
66a0: 4c 69 73 74 0a 29 7b 0a 20 20 63 68 61 72 20 2a  List.){.  char *
66b0: 70 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66  p = pReader->pOf
66c0: 66 73 65 74 4c 69 73 74 3b 0a 20 20 63 68 61 72  fsetList;.  char
66d0: 20 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 6f   c = 0;..  /* Po
66e0: 69 6e 74 65 72 20 70 20 63 75 72 72 65 6e 74 6c  inter p currentl
66f0: 79 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  y points at the 
6700: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6e  first byte of an
6710: 20 6f 66 66 73 65 74 20 6c 69 73 74 2e 20 54 68   offset list. Th
6720: 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
6730: 20 74 77 6f 20 6c 69 6e 65 73 20 61 64 76 61 6e   two lines advan
6740: 63 65 20 69 74 20 74 6f 20 70 6f 69 6e 74 20 6f  ce it to point o
6750: 6e 65 20 62 79 74 65 20 70 61 73 74 20 74 68 65  ne byte past the
6760: 20 65 6e 64 20 6f 66 0a 20 20 2a 2a 20 74 68 65   end of.  ** the
6770: 20 73 61 6d 65 20 6f 66 66 73 65 74 20 6c 69 73   same offset lis
6780: 74 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  t..  */.  while(
6790: 20 2a 70 20 7c 20 63 20 29 20 63 20 3d 20 2a 70   *p | c ) c = *p
67a0: 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 70 2b 2b  ++ & 0x80;.  p++
67b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 69  ;..  /* If requi
67c0: 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
67d0: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
67e0: 65 73 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65  es with a pointe
67f0: 72 20 74 6f 20 61 6e 64 20 74 68 65 0a 20 20 2a  r to and the.  *
6800: 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72  * size of the pr
6810: 65 76 69 6f 75 73 20 6f 66 66 73 65 74 2d 6c 69  evious offset-li
6820: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
6830: 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20  pOffsetList ){. 
6840: 20 20 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74     *ppOffsetList
6850: 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66   = pReader->pOff
6860: 73 65 74 4c 69 73 74 3b 0a 20 20 20 20 2a 70 6e  setList;.    *pn
6870: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 20 2d  OffsetList = p -
6880: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
6890: 74 4c 69 73 74 20 2d 20 31 3b 0a 20 20 7d 0a 0a  tList - 1;.  }..
68a0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
68b0: 65 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65  e no more entrie
68c0: 73 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  s in the doclist
68d0: 2c 20 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73  , set pOffsetLis
68e0: 74 20 74 6f 0a 20 20 2a 2a 20 4e 55 4c 4c 2e 20  t to.  ** NULL. 
68f0: 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 46  Otherwise, set F
6900: 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 44 6f  ts3SegReader.iDo
6910: 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  cid to the next 
6920: 64 6f 63 69 64 20 61 6e 64 0a 20 20 2a 2a 20 46  docid and.  ** F
6930: 74 73 33 53 65 67 52 65 61 64 65 72 2e 70 4f 66  ts3SegReader.pOf
6940: 66 73 65 74 4c 69 73 74 20 74 6f 20 70 6f 69 6e  fsetList to poin
6950: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6f 66  t to the next of
6960: 66 73 65 74 20 6c 69 73 74 20 62 65 66 6f 72 65  fset list before
6970: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  .  ** returning.
6980: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3e 3d 26  .  */.  if( p>=&
6990: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
69a0: 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  t[pReader->nDocl
69b0: 69 73 74 5d 20 29 7b 0a 20 20 20 20 70 52 65 61  ist] ){.    pRea
69c0: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
69d0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
69e0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
69f0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 70 52 65   iDelta;.    pRe
6a00: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
6a10: 74 20 3d 20 70 20 2b 20 73 71 6c 69 74 65 33 46  t = p + sqlite3F
6a20: 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20  ts3GetVarint(p, 
6a30: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 52  &iDelta);.    pR
6a40: 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b 3d  eader->iDocid +=
6a50: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 0a 7d 0a 0a   iDelta;.  }.}..
6a60: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 61  /*.** Free all a
6a70: 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
6a80: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 69  iated with the i
6a90: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
6aa0: 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64  s the .** second
6ab0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
6ac0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  id sqlite3Fts3Se
6ad0: 67 52 65 61 64 65 72 46 72 65 65 28 46 74 73 33  gReaderFree(Fts3
6ae0: 54 61 62 6c 65 20 2a 70 2c 20 46 74 73 33 53 65  Table *p, Fts3Se
6af0: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
6b00: 29 7b 0a 20 20 69 66 28 20 70 52 65 61 64 65 72  ){.  if( pReader
6b10: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 65 61   ){.    if( pRea
6b20: 64 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  der->pStmt ){.  
6b30: 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
6b40: 6c 65 61 66 2d 72 61 6e 67 65 20 53 45 4c 45 43  leaf-range SELEC
6b50: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
6b60: 68 65 20 61 4c 65 61 76 65 73 53 74 6d 74 5b 5d  he aLeavesStmt[]
6b70: 20 61 72 72 61 79 2c 0a 20 20 20 20 20 20 2a 2a   array,.      **
6b80: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
6b90: 62 65 20 72 65 75 73 65 64 20 77 68 65 6e 20 72  be reused when r
6ba0: 65 71 75 69 72 65 64 20 62 79 20 61 6e 6f 74 68  equired by anoth
6bb0: 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 20 20  er query..      
6bc0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
6bd0: 20 70 2d 3e 6e 4c 65 61 76 65 73 53 74 6d 74 3c   p->nLeavesStmt<
6be0: 70 2d 3e 6e 4c 65 61 76 65 73 54 6f 74 61 6c 20  p->nLeavesTotal 
6bf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6c00: 5f 72 65 73 65 74 28 70 52 65 61 64 65 72 2d 3e  _reset(pReader->
6c10: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 2d  pStmt);.      p-
6c20: 3e 61 4c 65 61 76 65 73 53 74 6d 74 5b 70 2d 3e  >aLeavesStmt[p->
6c30: 6e 4c 65 61 76 65 73 53 74 6d 74 2b 2b 5d 20 3d  nLeavesStmt++] =
6c40: 20 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74 3b   pReader->pStmt;
6c50: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6c60: 65 33 5f 66 72 65 65 28 70 52 65 61 64 65 72 2d  e3_free(pReader-
6c70: 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c  >zTerm);.    sql
6c80: 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65  ite3_free(pReade
6c90: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
6ca0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
6cb0: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
6cc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6cd0: 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77  Fts3SegReaderNew
6ce0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
6cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6d00: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
6d10: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
6d20: 20 69 6e 74 20 69 41 67 65 2c 20 20 20 20 20 20   int iAge,      
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 22 61 67 65   /* Segment "age
6d50: 22 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ". */.  sqlite3_
6d60: 69 6e 74 36 34 20 69 53 74 61 72 74 4c 65 61 66  int64 iStartLeaf
6d70: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
6d80: 20 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73   leaf to travers
6d90: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
6da0: 6e 74 36 34 20 69 45 6e 64 4c 65 61 66 2c 20 20  nt64 iEndLeaf,  
6db0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20         /* Final 
6dc0: 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65  leaf to traverse
6dd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
6de0: 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20  t64 iEndBlock,  
6df0: 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 62        /* Final b
6e00: 6c 6f 63 6b 20 6f 66 20 73 65 67 6d 65 6e 74 20  lock of segment 
6e10: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6e20: 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  *zRoot,         
6e30: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
6e40: 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e  ontaining root n
6e50: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ode */.  int nRo
6e60: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
6e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
6e80: 20 6f 66 20 62 75 66 66 65 72 20 63 6f 6e 74 61   of buffer conta
6e90: 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
6ea0: 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
6eb0: 65 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20  er **ppReader   
6ec0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c       /* OUT: All
6ed0: 6f 63 61 74 65 64 20 46 74 73 33 53 65 67 52 65  ocated Fts3SegRe
6ee0: 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ader */.){.  int
6ef0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f10: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6f20: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
6f30: 70 52 65 61 64 65 72 3b 20 20 20 20 20 20 20 20  pReader;        
6f40: 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
6f50: 74 65 64 20 53 65 67 52 65 61 64 65 72 20 6f 62  ted SegReader ob
6f60: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ject */.  int nE
6f70: 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
6f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
6f90: 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  es to allocate s
6fa0: 65 67 6d 65 6e 74 20 72 6f 6f 74 20 6e 6f 64 65  egment root node
6fb0: 20 2a 2f 0a 0a 20 20 69 66 28 20 69 53 74 61 72   */..  if( iStar
6fc0: 74 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  tLeaf==0 ){.    
6fd0: 6e 45 78 74 72 61 20 3d 20 6e 52 6f 6f 74 3b 0a  nExtra = nRoot;.
6fe0: 20 20 7d 0a 0a 20 20 70 52 65 61 64 65 72 20 3d    }..  pReader =
6ff0: 20 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20   (Fts3SegReader 
7000: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
7010: 28 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52  (sizeof(Fts3SegR
7020: 65 61 64 65 72 29 20 2b 20 6e 45 78 74 72 61 29  eader) + nExtra)
7030: 3b 0a 20 20 69 66 28 20 21 70 52 65 61 64 65 72  ;.  if( !pReader
7040: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7050: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
7060: 0a 20 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65  .  memset(pReade
7070: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
7080: 33 53 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20  3SegReader));.  
7090: 70 52 65 61 64 65 72 2d 3e 69 53 74 61 72 74 42  pReader->iStartB
70a0: 6c 6f 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61  lock = iStartLea
70b0: 66 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 49  f;.  pReader->iI
70c0: 64 78 20 3d 20 69 41 67 65 3b 0a 20 20 70 52 65  dx = iAge;.  pRe
70d0: 61 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b 20  ader->iEndBlock 
70e0: 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20 20  = iEndBlock;..  
70f0: 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 20  if( nExtra ){.  
7100: 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
7110: 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  segment is store
7120: 64 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f  d in the root no
7130: 64 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61 64  de. */.    pRead
7140: 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68 61  er->aNode = (cha
7150: 72 20 2a 29 26 70 52 65 61 64 65 72 5b 31 5d 3b  r *)&pReader[1];
7160: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e  .    pReader->nN
7170: 6f 64 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20  ode = nRoot;.   
7180: 20 6d 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d   memcpy(pReader-
7190: 3e 61 4e 6f 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e  >aNode, zRoot, n
71a0: 52 6f 6f 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Root);.  }else{.
71b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
71c0: 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a   *pStmt;..    /*
71d0: 20 49 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   If the text of 
71e0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
71f0: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
7200: 6f 75 67 68 20 61 20 63 6f 6e 74 69 67 75 6f 75  ough a contiguou
7210: 73 0a 20 20 20 20 2a 2a 20 73 65 74 20 6f 66 20  s.    ** set of 
7220: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25  entries in the %
7230: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
7240: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
7250: 20 63 6f 6d 70 6f 73 65 64 2c 0a 20 20 20 20 2a   composed,.    *
7260: 2a 20 63 6f 6d 70 6f 73 65 20 69 74 20 6e 6f 77  * compose it now
7270: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
7280: 20 21 70 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76   !p->zSelectLeav
7290: 65 73 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a  es ){.      p->z
72a0: 53 65 6c 65 63 74 4c 65 61 76 65 73 20 3d 20 73  SelectLeaves = s
72b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
72c0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
72d0: 54 20 62 6c 6f 63 6b 20 46 52 4f 4d 20 25 51 2e  T block FROM %Q.
72e0: 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48  '%q_segments' WH
72f0: 45 52 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57  ERE blockid BETW
7300: 45 45 4e 20 3f 20 41 4e 44 20 3f 20 22 0a 20 20  EEN ? AND ? ".  
7310: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
7320: 59 20 62 6c 6f 63 6b 69 64 22 2c 20 70 2d 3e 7a  Y blockid", p->z
7330: 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Db, p->zName.   
7340: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
7350: 21 70 2d 3e 7a 53 65 6c 65 63 74 4c 65 61 76 65  !p->zSelectLeave
7360: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  s ){.        rc 
7370: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7380: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e          goto fin
7390: 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ished;.      }. 
73a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
73b0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65  there are no fre
73c0: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  e statements in 
73d0: 74 68 65 20 61 4c 65 61 76 65 73 53 74 6d 74 5b  the aLeavesStmt[
73e0: 5d 20 61 72 72 61 79 2c 20 70 72 65 70 61 72 65  ] array, prepare
73f0: 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 73 74  .    ** a new st
7400: 61 74 65 6d 65 6e 74 20 6e 6f 77 2e 20 4f 74 68  atement now. Oth
7410: 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 20  erwise, reuse a 
7420: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
7430: 6e 74 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 61  nt from.    ** a
7440: 4c 65 61 76 65 73 53 74 6d 74 5b 5d 2e 0a 20 20  LeavesStmt[]..  
7450: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
7460: 6e 4c 65 61 76 65 73 53 74 6d 74 3d 3d 30 20 29  nLeavesStmt==0 )
7470: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  {.      if( p->n
7480: 4c 65 61 76 65 73 54 6f 74 61 6c 3d 3d 70 2d 3e  LeavesTotal==p->
7490: 6e 4c 65 61 76 65 73 41 6c 6c 6f 63 20 29 7b 0a  nLeavesAlloc ){.
74a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77          int nNew
74b0: 20 3d 20 70 2d 3e 6e 4c 65 61 76 65 73 41 6c 6c   = p->nLeavesAll
74c0: 6f 63 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 20  oc + 16;.       
74d0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
74e0: 61 4e 65 77 20 3d 20 28 73 71 6c 69 74 65 33 5f  aNew = (sqlite3_
74f0: 73 74 6d 74 20 2a 2a 29 73 71 6c 69 74 65 33 5f  stmt **)sqlite3_
7500: 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
7510: 20 20 20 20 20 70 2d 3e 61 4c 65 61 76 65 73 53       p->aLeavesS
7520: 74 6d 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66  tmt, nNew*sizeof
7530: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29  (sqlite3_stmt *)
7540: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
7550: 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
7560: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
7570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7580: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e          goto fin
7590: 69 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ished;.        }
75a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 65 61  .        p->nLea
75b0: 76 65 73 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  vesAlloc = nNew;
75c0: 0a 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 20 3d 20 61 4e 65 77 3b 0a  vesStmt = aNew;.
75e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
75f0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
7600: 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 70 2d 3e  re_v2(p->db, p->
7610: 7a 53 65 6c 65 63 74 4c 65 61 76 65 73 2c 20 2d  zSelectLeaves, -
7620: 31 2c 20 26 70 52 65 61 64 65 72 2d 3e 70 53 74  1, &pReader->pSt
7630: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  mt, 0);.      if
7640: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7650: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
7660: 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
7670: 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 65 61 76  }.      p->nLeav
7680: 65 73 54 6f 74 61 6c 2b 2b 3b 0a 20 20 20 20 7d  esTotal++;.    }
7690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 61  else{.      pRea
76a0: 64 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 2d 3e  der->pStmt = p->
76b0: 61 4c 65 61 76 65 73 53 74 6d 74 5b 2d 2d 70 2d  aLeavesStmt[--p-
76c0: 3e 6e 4c 65 61 76 65 73 53 74 6d 74 5d 3b 0a 20  >nLeavesStmt];. 
76d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 69 6e     }..    /* Bin
76e0: 64 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  d the start and 
76f0: 65 6e 64 20 6c 65 61 66 20 62 6c 6f 63 6b 69 64  end leaf blockid
7700: 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  s to the prepare
7710: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
7720: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
7730: 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 65 61 64  bind_int64(pRead
7740: 65 72 2d 3e 70 53 74 6d 74 2c 20 31 2c 20 69 53  er->pStmt, 1, iS
7750: 74 61 72 74 4c 65 61 66 29 3b 0a 20 20 20 20 73  tartLeaf);.    s
7760: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
7770: 34 28 70 52 65 61 64 65 72 2d 3e 70 53 74 6d 74  4(pReader->pStmt
7780: 2c 20 32 2c 20 69 45 6e 64 4c 65 61 66 29 3b 0a  , 2, iEndLeaf);.
7790: 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33 53    }.  rc = fts3S
77a0: 65 67 52 65 61 64 65 72 4e 65 78 74 28 70 52 65  egReaderNext(pRe
77b0: 61 64 65 72 29 3b 0a 0a 20 66 69 6e 69 73 68 65  ader);.. finishe
77c0: 64 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  d:.  if( rc==SQL
77d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
77e0: 70 52 65 61 64 65 72 20 3d 20 70 52 65 61 64 65  pReader = pReade
77f0: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
7800: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
7810: 61 64 65 72 46 72 65 65 28 70 2c 20 70 52 65 61  aderFree(p, pRea
7820: 64 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  der);.  }.  retu
7830: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
7840: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
7850: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
7860: 63 74 69 6f 6e 20 69 73 20 65 78 70 65 63 74 65  ction is expecte
7870: 64 20 74 6f 20 62 65 20 61 20 73 74 61 74 65 6d  d to be a statem
7880: 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  ent of.** the fo
7890: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
78a0: 43 54 20 0a 2a 2a 20 20 20 20 20 69 64 78 2c 20  CT .**     idx, 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 2d 2d 20 63 6f 6c 20 30 0a 2a 2a 20 20 20 20   -- col 0.**    
78d0: 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 20 20   start_block,   
78e0: 20 20 20 20 20 20 20 2d 2d 20 63 6f 6c 20 31 0a         -- col 1.
78f0: 2a 2a 20 20 20 20 20 6c 65 61 76 65 73 5f 65 6e  **     leaves_en
7900: 64 5f 62 6c 6f 63 6b 2c 20 20 20 20 20 2d 2d 20  d_block,     -- 
7910: 63 6f 6c 20 32 0a 2a 2a 20 20 20 20 20 65 6e 64  col 2.**     end
7920: 5f 62 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  _block,         
7930: 20 20 20 2d 2d 20 63 6f 6c 20 33 0a 2a 2a 20 20     -- col 3.**  
7940: 20 20 20 72 6f 6f 74 20 20 20 20 20 20 20 20 20     root         
7950: 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6c 20           -- col 
7960: 34 0a 2a 2a 20 20 20 46 52 4f 4d 20 25 5f 73 65  4.**   FROM %_se
7970: 67 64 69 72 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  gdir ....**.** T
7980: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
7990: 6f 63 61 74 65 73 20 61 6e 64 20 69 6e 69 74 69  ocates and initi
79a0: 61 6c 69 7a 65 73 20 61 20 46 74 73 33 53 65 67  alizes a Fts3Seg
79b0: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
79c0: 20 74 6f 0a 2a 2a 20 69 74 65 72 61 74 65 20 74   to.** iterate t
79d0: 68 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d 73  hrough the terms
79e0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
79f0: 65 67 6d 65 6e 74 20 69 64 65 6e 74 69 66 69 65  egment identifie
7a00: 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 75 72 72  d by the.** curr
7a10: 65 6e 74 20 72 6f 77 20 74 68 61 74 20 70 53 74  ent row that pSt
7a20: 6d 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  mt is pointing t
7a30: 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  o. .**.** If suc
7a40: 63 65 73 73 66 75 6c 2c 20 74 68 65 20 46 74 73  cessful, the Fts
7a50: 33 53 65 67 52 65 61 64 65 72 20 69 73 20 6c 65  3SegReader is le
7a60: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
7a70: 68 65 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  he first term.**
7a80: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
7a90: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
7aa0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
7ab0: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
7ac0: 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
7ad0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7ae0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
7af0: 52 65 61 64 65 72 4e 65 77 28 0a 20 20 46 74 73  ReaderNew(.  Fts
7b00: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b20: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
7b30: 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
7b40: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20  3_stmt *pStmt,  
7b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7b60: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 69 6e 74 20   above */.  int 
7b70: 69 41 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  iAge,           
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7b90: 65 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f  egment "age". */
7ba0: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
7bb0: 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20   **ppReader     
7bc0: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63     /* OUT: Alloc
7bd0: 61 74 65 64 20 46 74 73 33 53 65 67 52 65 61 64  ated Fts3SegRead
7be0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  er */.){.  retur
7bf0: 6e 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  n sqlite3Fts3Seg
7c00: 52 65 61 64 65 72 4e 65 77 28 70 2c 20 69 41 67  ReaderNew(p, iAg
7c10: 65 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e, .      sqlite
7c20: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
7c30: 53 74 6d 74 2c 20 31 29 2c 0a 20 20 20 20 20 20  Stmt, 1),.      
7c40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
7c50: 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 29 2c 0a  nt64(pStmt, 2),.
7c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
7c70: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
7c80: 2c 20 33 29 2c 0a 20 20 20 20 20 20 73 71 6c 69  , 3),.      sqli
7c90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
7ca0: 70 53 74 6d 74 2c 20 34 29 2c 0a 20 20 20 20 20  pStmt, 4),.     
7cb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7cc0: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 34 29 2c  bytes(pStmt, 4),
7cd0: 0a 20 20 20 20 20 20 70 70 52 65 61 64 65 72 0a  .      ppReader.
7ce0: 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f    );.}../*.** Co
7cf0: 6d 70 61 72 65 20 74 68 65 20 65 6e 74 72 69 65  mpare the entrie
7d00: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
7d10: 74 77 6f 20 46 74 73 33 53 65 67 52 65 61 64 65  two Fts3SegReade
7d20: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 2a  r structures. .*
7d30: 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * Comparison is 
7d40: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
7d50: 2a 20 20 20 31 29 20 45 4f 46 20 69 73 20 67 72  *   1) EOF is gr
7d60: 65 61 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45  eater than not E
7d70: 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 54  OF..**.**   2) T
7d80: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 73  he current terms
7d90: 20 28 69 66 20 61 6e 79 29 20 61 72 65 20 63 6f   (if any) are co
7da0: 6d 70 61 72 65 64 20 77 69 74 68 20 6d 65 6d 63  mpared with memc
7db0: 6d 70 28 29 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20  mp(). If one.** 
7dc0: 20 20 20 20 20 74 65 72 6d 20 69 73 20 61 20 70       term is a p
7dd0: 72 65 66 69 78 20 6f 66 20 61 6e 6f 74 68 65 72  refix of another
7de0: 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 74 65 72  , the longer ter
7df0: 6d 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  m is considered 
7e00: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 72 67  the.**      larg
7e10: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42  er..**.**   3) B
7e20: 79 20 73 65 67 6d 65 6e 74 20 61 67 65 2e 20 41  y segment age. A
7e30: 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74 20  n older segment 
7e40: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 61  is considered la
7e50: 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rger..*/.static 
7e60: 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65  int fts3SegReade
7e70: 72 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64  rCmp(Fts3SegRead
7e80: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65  er *pLhs, Fts3Se
7e90: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a  gReader *pRhs){.
7ea0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
7eb0: 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70  pLhs->aNode && p
7ec0: 52 68 73 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20  Rhs->aNode ){.  
7ed0: 20 20 69 6e 74 20 72 63 32 20 3d 20 70 4c 68 73    int rc2 = pLhs
7ee0: 2d 3e 6e 54 65 72 6d 20 2d 20 70 52 68 73 2d 3e  ->nTerm - pRhs->
7ef0: 6e 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 72  nTerm;.    if( r
7f00: 63 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c2<0 ){.      rc
7f10: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e   = memcmp(pLhs->
7f20: 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65  zTerm, pRhs->zTe
7f30: 72 6d 2c 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 29  rm, pLhs->nTerm)
7f40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7f50: 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70     rc = memcmp(p
7f60: 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73  Lhs->zTerm, pRhs
7f70: 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 6e  ->zTerm, pRhs->n
7f80: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Term);.    }.   
7f90: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
7fa0: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
7fb0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
7fc0: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 61 4e 6f   rc = (pLhs->aNo
7fd0: 64 65 3d 3d 30 29 20 2d 20 28 70 52 68 73 2d 3e  de==0) - (pRhs->
7fe0: 61 4e 6f 64 65 3d 3d 30 29 3b 0a 20 20 7d 0a 20  aNode==0);.  }. 
7ff0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
8000: 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64    rc = pRhs->iId
8010: 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a  x - pLhs->iIdx;.
8020: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
8030: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
8040: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 64  rc;.}../*.** A d
8050: 69 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 69  ifferent compari
8060: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  son function for
8070: 20 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63   SegReader struc
8080: 74 75 72 65 73 2e 20 49 6e 20 74 68 69 73 0a 2a  tures. In this.*
8090: 2a 20 76 65 72 73 69 6f 6e 2c 20 69 74 20 69 73  * version, it is
80a0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 65 61   assumed that ea
80b0: 63 68 20 53 65 67 52 65 61 64 65 72 20 70 6f 69  ch SegReader poi
80c0: 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
80d0: 69 6e 0a 2a 2a 20 61 20 64 6f 63 6c 69 73 74 20  in.** a doclist 
80e0: 66 6f 72 20 69 64 65 6e 74 69 63 61 6c 20 74 65  for identical te
80f0: 72 6d 73 2e 20 43 6f 6d 70 61 72 69 73 6f 6e 20  rms. Comparison 
8100: 69 73 20 6d 61 64 65 20 61 73 20 66 6f 6c 6c 6f  is made as follo
8110: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45  ws:.**.**   1) E
8120: 4f 46 20 28 65 6e 64 20 6f 66 20 64 6f 63 6c 69  OF (end of docli
8130: 73 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 29  st in this case)
8140: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
8150: 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20   not EOF..**.** 
8160: 20 20 32 29 20 42 79 20 63 75 72 72 65 6e 74 20    2) By current 
8170: 64 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  docid..**.**   3
8180: 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65  ) By segment age
8190: 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65  . An older segme
81a0: 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  nt is considered
81b0: 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74   larger..*/.stat
81c0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
81d0: 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 28 46  aderDoclistCmp(F
81e0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c  ts3SegReader *pL
81f0: 68 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65  hs, Fts3SegReade
8200: 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20  r *pRhs){.  int 
8210: 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66  rc = (pLhs->pOff
8220: 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68  setList==0)-(pRh
8230: 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d  s->pOffsetList==
8240: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  0);.  if( rc==0 
8250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d  ){.    if( pLhs-
8260: 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69  >iDocid==pRhs->i
8270: 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 72  Docid ){.      r
8280: 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d  c = pRhs->iIdx -
8290: 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20   pLhs->iIdx;.   
82a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
82b0: 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64   = (pLhs->iDocid
82c0: 20 3e 20 70 52 68 73 2d 3e 69 44 6f 63 69 64 29   > pRhs->iDocid)
82d0: 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d   ? 1 : -1;.    }
82e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
82f0: 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52  Lhs->aNode && pR
8300: 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72  hs->aNode );.  r
8310: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8320: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  ** Compare the t
8330: 65 72 6d 20 74 68 61 74 20 74 68 65 20 46 74 73  erm that the Fts
8340: 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63  3SegReader objec
8350: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
8360: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a  first argument.*
8370: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 77 69 74 68  * points to with
8380: 20 74 68 65 20 74 65 72 6d 20 73 70 65 63 69 66   the term specif
8390: 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74 73  ied by arguments
83a0: 20 7a 54 65 72 6d 20 61 6e 64 20 6e 54 65 72 6d   zTerm and nTerm
83b0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
83c0: 70 53 65 67 20 69 74 65 72 61 74 6f 72 20 69 73  pSeg iterator is
83d0: 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46 2c   already at EOF,
83e0: 20 72 65 74 75 72 6e 20 30 2e 20 4f 74 68 65 72   return 0. Other
83f0: 77 69 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  wise, return.** 
8400: 2d 76 65 20 69 66 20 74 68 65 20 70 53 65 67 20  -ve if the pSeg 
8410: 74 65 72 6d 20 69 73 20 6c 65 73 73 20 74 68 61  term is less tha
8420: 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 30  n zTerm/nTerm, 0
8430: 20 69 66 20 74 68 65 20 74 77 6f 20 74 65 72 6d   if the two term
8440: 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20  s are.** equal, 
8450: 6f 72 20 2b 76 65 20 69 66 20 74 68 65 20 70 53  or +ve if the pS
8460: 65 67 20 74 65 72 6d 20 69 73 20 67 72 65 61 74  eg term is great
8470: 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54  er than zTerm/nT
8480: 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erm..*/.static i
8490: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
84a0: 54 65 72 6d 43 6d 70 28 0a 20 20 46 74 73 33 53  TermCmp(.  Fts3S
84b0: 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 2c 20  egReader *pSeg, 
84c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
84d0: 67 6d 65 6e 74 20 72 65 61 64 65 72 20 6f 62 6a  gment reader obj
84e0: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
84f0: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
8500: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
8510: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f 20 2a   to compare to *
8520: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  /.  int nTerm   
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
8550: 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20 62 79 74  erm zTerm in byt
8560: 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  es */.){.  int r
8570: 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  es = 0;.  if( pS
8580: 65 67 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20  eg->aNode ){.   
8590: 20 69 66 28 20 70 53 65 67 2d 3e 6e 54 65 72 6d   if( pSeg->nTerm
85a0: 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  >nTerm ){.      
85b0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65  res = memcmp(pSe
85c0: 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  g->zTerm, zTerm,
85d0: 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c   nTerm);.    }el
85e0: 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
85f0: 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65  memcmp(pSeg->zTe
8600: 72 6d 2c 20 7a 54 65 72 6d 2c 20 70 53 65 67 2d  rm, zTerm, pSeg-
8610: 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20  >nTerm);.    }. 
8620: 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
8630: 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 53 65  .      res = pSe
8640: 67 2d 3e 6e 54 65 72 6d 2d 6e 54 65 72 6d 3b 0a  g->nTerm-nTerm;.
8650: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8660: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
8670: 20 41 72 67 75 6d 65 6e 74 20 61 70 53 65 67 6d   Argument apSegm
8680: 65 6e 74 20 69 73 20 61 6e 20 61 72 72 61 79 20  ent is an array 
8690: 6f 66 20 6e 53 65 67 6d 65 6e 74 20 65 6c 65 6d  of nSegment elem
86a0: 65 6e 74 73 2e 20 49 74 20 69 73 20 6b 6e 6f 77  ents. It is know
86b0: 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 66 69  n that.** the fi
86c0: 6e 61 6c 20 28 6e 53 65 67 6d 65 6e 74 2d 6e 53  nal (nSegment-nS
86d0: 75 73 70 65 63 74 29 20 6d 65 6d 62 65 72 73 20  uspect) members 
86e0: 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 73  are already in s
86f0: 6f 72 74 65 64 20 6f 72 64 65 72 0a 2a 2a 20 28  orted order.** (
8700: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
8710: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
8720: 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 29 2e 20  tion provided). 
8730: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
8740: 75 66 66 6c 65 73 0a 2a 2a 20 74 68 65 20 61 72  uffles.** the ar
8750: 72 61 79 20 61 72 6f 75 6e 64 20 75 6e 74 69 6c  ray around until
8760: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 61 72 65   all entries are
8770: 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
8780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8790: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
87a0: 72 74 28 0a 20 20 46 74 73 33 53 65 67 52 65 61  rt(.  Fts3SegRea
87b0: 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c  der **apSegment,
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 74 6f       /* Array to
87e0: 20 73 6f 72 74 20 65 6e 74 72 69 65 73 20 6f 66   sort entries of
87f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
8800: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8820: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
8830: 61 70 53 65 67 6d 65 6e 74 20 61 72 72 61 79 20  apSegment array 
8840: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 73 70 65 63  */.  int nSuspec
8850: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20      /* Unsorted 
8880: 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20  entry count */. 
8890: 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73   int (*xCmp)(Fts
88a0: 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74  3SegReader *, Ft
88b0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 20  s3SegReader *)  
88c0: 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75  /* Comparison fu
88d0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  nction */.){.  i
88e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8900: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
8910: 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ble */..  assert
8920: 28 20 6e 53 75 73 70 65 63 74 3c 3d 6e 53 65 67  ( nSuspect<=nSeg
8930: 6d 65 6e 74 20 29 3b 0a 0a 20 20 69 66 28 20 6e  ment );..  if( n
8940: 53 75 73 70 65 63 74 3d 3d 6e 53 65 67 6d 65 6e  Suspect==nSegmen
8950: 74 20 29 20 6e 53 75 73 70 65 63 74 2d 2d 3b 0a  t ) nSuspect--;.
8960: 20 20 66 6f 72 28 69 3d 6e 53 75 73 70 65 63 74    for(i=nSuspect
8970: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
8980: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66      int j;.    f
8990: 6f 72 28 6a 3d 69 3b 20 6a 3c 28 6e 53 65 67 6d  or(j=i; j<(nSegm
89a0: 65 6e 74 2d 31 29 3b 20 6a 2b 2b 29 7b 0a 20 20  ent-1); j++){.  
89b0: 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
89c0: 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 69  r *pTmp;.      i
89d0: 66 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65 6e  f( xCmp(apSegmen
89e0: 74 5b 6a 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b  t[j], apSegment[
89f0: 6a 2b 31 5d 29 3c 30 20 29 20 62 72 65 61 6b 3b  j+1])<0 ) break;
8a00: 0a 20 20 20 20 20 20 70 54 6d 70 20 3d 20 61 70  .      pTmp = ap
8a10: 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 3b 0a 20 20  Segment[j+1];.  
8a20: 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b      apSegment[j+
8a30: 31 5d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 6a  1] = apSegment[j
8a40: 5d 3b 0a 20 20 20 20 20 20 61 70 53 65 67 6d 65  ];.      apSegme
8a50: 6e 74 5b 6a 5d 20 3d 20 70 54 6d 70 3b 0a 20 20  nt[j] = pTmp;.  
8a60: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66    }.  }..#ifndef
8a70: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 43 68 65   NDEBUG.  /* Che
8a80: 63 6b 20 74 68 61 74 20 74 68 65 20 6c 69 73 74  ck that the list
8a90: 20 72 65 61 6c 6c 79 20 69 73 20 73 6f 72 74 65   really is sorte
8aa0: 64 20 6e 6f 77 2e 20 2a 2f 0a 20 20 66 6f 72 28  d now. */.  for(
8ab0: 69 3d 30 3b 20 69 3c 28 6e 53 75 73 70 65 63 74  i=0; i<(nSuspect
8ac0: 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  -1); i++){.    a
8ad0: 73 73 65 72 74 28 20 78 43 6d 70 28 61 70 53 65  ssert( xCmp(apSe
8ae0: 67 6d 65 6e 74 5b 69 5d 2c 20 61 70 53 65 67 6d  gment[i], apSegm
8af0: 65 6e 74 5b 69 2b 31 5d 29 3c 30 20 29 3b 0a 20  ent[i+1])<0 );. 
8b00: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20   }.#endif.}../* 
8b10: 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72 65 63  .** Insert a rec
8b20: 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 73  ord into the %_s
8b30: 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 0a 2a  egments table..*
8b40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
8b50: 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 0a 20  3WriteSegment(. 
8b60: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
8b90: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
8ba0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
8bb0: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck,           /*
8bc0: 20 42 6c 6f 63 6b 20 69 64 20 66 6f 72 20 6e 65   Block id for ne
8bd0: 77 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 63 68 61  w block */.  cha
8be0: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c00: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
8c10: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 62 6c 6f  r containing blo
8c20: 63 6b 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ck data */.  int
8c30: 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c50: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a  Size of buffer z
8c60: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
8c70: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
8c80: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20  pStmt;.  int rc 
8c90: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
8ca0: 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 4d   SQL_INSERT_SEGM
8cb0: 45 4e 54 53 2c 20 26 70 53 74 6d 74 2c 20 30 29  ENTS, &pStmt, 0)
8cc0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
8cd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
8ce0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
8cf0: 70 53 74 6d 74 2c 20 31 2c 20 69 42 6c 6f 63 6b  pStmt, 1, iBlock
8d00: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
8d10: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
8d20: 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53 51  tmt, 2, z, n, SQ
8d30: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
8d40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8d50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
8d60: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
8d70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
8d80: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
8d90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
8da0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
8db0: 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72 65 63  .** Insert a rec
8dc0: 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 73  ord into the %_s
8dd0: 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a  egdir table..*/.
8de0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 57  static int fts3W
8df0: 72 69 74 65 53 65 67 64 69 72 28 0a 20 20 46 74  riteSegdir(.  Ft
8e00: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e20: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
8e30: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
8e40: 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
8e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
8e60: 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
8e70: 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69  field */.  int i
8e80: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
8e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
8ea0: 6c 75 65 20 66 6f 72 20 22 69 64 78 22 20 66 69  lue for "idx" fi
8eb0: 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
8ec0: 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f  _int64 iStartBlo
8ed0: 63 6b 2c 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ck,      /* Valu
8ee0: 65 20 66 6f 72 20 22 73 74 61 72 74 5f 62 6c 6f  e for "start_blo
8ef0: 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  ck" field */.  s
8f00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
8f10: 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 2f  afEndBlock,    /
8f20: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 61  * Value for "lea
8f30: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  ves_end_block" f
8f40: 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ield */.  sqlite
8f50: 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63  3_int64 iEndBloc
8f60: 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  k,        /* Val
8f70: 75 65 20 66 6f 72 20 22 65 6e 64 5f 62 6c 6f 63  ue for "end_bloc
8f80: 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 63 68  k" field */.  ch
8f90: 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8fb0: 20 42 6c 6f 62 20 76 61 6c 75 65 20 66 6f 72 20   Blob value for 
8fc0: 22 72 6f 6f 74 22 20 66 69 65 6c 64 20 2a 2f 0a  "root" field */.
8fd0: 20 20 69 6e 74 20 6e 52 6f 6f 74 20 20 20 20 20    int nRoot     
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
9000: 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 7a  ytes in buffer z
9010: 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  Root */.){.  sql
9020: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
9030: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
9040: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
9050: 49 4e 53 45 52 54 5f 53 45 47 44 49 52 2c 20 26  INSERT_SEGDIR, &
9060: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
9070: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9080: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
9090: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
90a0: 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71   iLevel);.    sq
90b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
90c0: 53 74 6d 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a  Stmt, 2, iIdx);.
90d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
90e0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 2c  _int64(pStmt, 3,
90f0: 20 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20   iStartBlock);. 
9100: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9110: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 34 2c 20  int64(pStmt, 4, 
9120: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 29 3b 0a  iLeafEndBlock);.
9130: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
9140: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 35 2c  _int64(pStmt, 5,
9150: 20 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20   iEndBlock);.   
9160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
9170: 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 36  nd_blob(pStmt, 6
9180: 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20  , zRoot, nRoot, 
9190: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
91a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
91b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
91c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
91d0: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
91e0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
91f0: 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  mt);.    }.  }. 
9200: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9210: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9220: 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  size of the comm
9230: 6f 6e 20 70 72 65 66 69 78 20 28 69 66 20 61 6e  on prefix (if an
9240: 79 29 20 73 68 61 72 65 64 20 62 79 20 7a 50 72  y) shared by zPr
9250: 65 76 20 61 6e 64 0a 2a 2a 20 7a 4e 65 78 74 2c  ev and.** zNext,
9260: 20 69 6e 20 62 79 74 65 73 2e 20 46 6f 72 20 65   in bytes. For e
9270: 78 61 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a 2a 20 20  xample, .**.**  
9280: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
9290: 65 73 73 28 22 61 62 63 22 2c 20 33 2c 20 22 61  ess("abc", 3, "a
92a0: 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20  bcdef", 6)   // 
92b0: 72 65 74 75 72 6e 73 20 33 0a 2a 2a 20 20 20 66  returns 3.**   f
92c0: 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
92d0: 73 28 22 61 62 58 22 2c 20 33 2c 20 22 61 62 63  s("abX", 3, "abc
92e0: 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65  def", 6)   // re
92f0: 74 75 72 6e 73 20 32 0a 2a 2a 20 20 20 66 74 73  turns 2.**   fts
9300: 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
9310: 22 61 62 58 22 2c 20 33 2c 20 22 58 62 63 64 65  "abX", 3, "Xbcde
9320: 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75  f", 6)   // retu
9330: 72 6e 73 20 30 0a 2a 2f 0a 73 74 61 74 69 63 20  rns 0.*/.static 
9340: 69 6e 74 20 66 74 73 33 50 72 65 66 69 78 43 6f  int fts3PrefixCo
9350: 6d 70 72 65 73 73 28 0a 20 20 63 6f 6e 73 74 20  mpress(.  const 
9360: 63 68 61 72 20 2a 7a 50 72 65 76 2c 20 20 20 20  char *zPrev,    
9370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
9380: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
9390: 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a  revious term */.
93a0: 20 20 69 6e 74 20 6e 50 72 65 76 2c 20 20 20 20    int nPrev,    
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
93d0: 66 65 72 20 7a 50 72 65 76 20 69 6e 20 62 79 74  fer zPrev in byt
93e0: 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
93f0: 61 72 20 2a 7a 4e 65 78 74 2c 20 20 20 20 20 20  ar *zNext,      
9400: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
9410: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 65 78  r containing nex
9420: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
9430: 6e 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  nNext           
9440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9450: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 4e  ize of buffer zN
9460: 65 78 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ext in bytes */.
9470: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
9480: 72 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26  r(n=0; n<nPrev &
9490: 26 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78  & zPrev[n]==zNex
94a0: 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65  t[n]; n++);.  re
94b0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
94c0: 20 41 64 64 20 74 65 72 6d 20 7a 54 65 72 6d 20   Add term zTerm 
94d0: 74 6f 20 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f  to the SegmentNo
94e0: 64 65 2e 20 49 74 20 69 73 20 67 75 61 72 61 6e  de. It is guaran
94f0: 74 65 65 64 20 74 68 61 74 20 7a 54 65 72 6d 20  teed that zTerm 
9500: 69 73 20 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63  is larger.** (ac
9510: 63 6f 72 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d  cording to memcm
9520: 70 29 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  p) than the prev
9530: 69 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  ious term..*/.st
9540: 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64  atic int fts3Nod
9550: 65 41 64 64 54 65 72 6d 28 0a 20 20 46 74 73 33  eAddTerm(.  Fts3
9560: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
9570: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
9580: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
9590: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  */.  SegmentNode
95a0: 20 2a 2a 70 70 54 72 65 65 2c 20 20 20 20 20 20   **ppTree,      
95b0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
95c0: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64  SegmentNode hand
95d0: 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43  le */ .  int isC
95e0: 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20  opyTerm,        
95f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9600: 20 69 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20   if zTerm/nTerm 
9610: 69 73 20 74 72 61 6e 73 69 65 6e 74 20 2a 2f 0a  is transient */.
9620: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
9630: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
9640: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9650: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
9660: 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  g term */.  int 
9670: 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
9680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9690: 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
96a0: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 67  ytes */.){.  Seg
96b0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 20  mentNode *pTree 
96c0: 3d 20 2a 70 70 54 72 65 65 3b 0a 20 20 69 6e 74  = *ppTree;.  int
96d0: 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f   rc;.  SegmentNo
96e0: 64 65 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  de *pNew;..  /* 
96f0: 46 69 72 73 74 20 74 72 79 20 74 6f 20 61 70 70  First try to app
9700: 65 6e 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20  end the term to 
9710: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
9720: 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69  . Return early i
9730: 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20  f .  ** this is 
9740: 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
9750: 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20   if( pTree ){.  
9760: 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70 54    int nData = pT
9770: 72 65 65 2d 3e 6e 44 61 74 61 3b 20 20 20 20 20  ree->nData;     
9780: 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
9790: 6f 66 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73  of node in bytes
97a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 71   */.    int nReq
97b0: 20 3d 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20   = nData;       
97c0: 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
97d0: 64 20 73 70 61 63 65 20 61 66 74 65 72 20 61 64  d space after ad
97e0: 64 69 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  ding zTerm */.  
97f0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20    int nPrefix;  
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9820: 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
9830: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
9840: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9860: 20 53 75 66 66 69 78 20 6c 65 6e 67 74 68 20 2a   Suffix length *
9870: 2f 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  /..    nPrefix =
9880: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
9890: 65 73 73 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d  ess(pTree->zTerm
98a0: 2c 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 2c 20  , pTree->nTerm, 
98b0: 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
98c0: 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
98d0: 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 20  rm-nPrefix;..   
98e0: 20 6e 52 65 71 20 2b 3d 20 73 71 6c 69 74 65 33   nReq += sqlite3
98f0: 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50  Fts3VarintLen(nP
9900: 72 65 66 69 78 29 2b 73 71 6c 69 74 65 33 46 74  refix)+sqlite3Ft
9910: 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66  s3VarintLen(nSuf
9920: 66 69 78 29 2b 6e 53 75 66 66 69 78 3b 0a 20 20  fix)+nSuffix;.  
9930: 20 20 69 66 28 20 6e 52 65 71 3c 3d 49 4e 54 45    if( nReq<=INTE
9940: 52 49 4f 52 5f 4d 41 58 20 7c 7c 20 21 70 54 72  RIOR_MAX || !pTr
9950: 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20 20  ee->zTerm ){..  
9960: 20 20 20 20 69 66 28 20 6e 52 65 71 3e 49 4e 54      if( nReq>INT
9970: 45 52 49 4f 52 5f 4d 41 58 20 29 7b 0a 20 20 20  ERIOR_MAX ){.   
9980: 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 75       /* An unusu
9990: 61 6c 20 63 61 73 65 3a 20 74 68 69 73 20 69 73  al case: this is
99a0: 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
99b0: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
99c0: 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20  he node.        
99d0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74 69  ** and the stati
99e0: 63 20 6e 6f 64 65 20 62 75 66 66 65 72 20 28 49  c node buffer (I
99f0: 4e 54 45 52 49 4f 52 5f 4d 41 58 20 62 79 74 65  NTERIOR_MAX byte
9a00: 73 29 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 0a  s) is not large.
9a10: 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 6f 75 67          ** enoug
9a20: 68 2e 20 55 73 65 20 61 20 73 65 70 61 72 61 74  h. Use a separat
9a30: 65 6c 79 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  ely malloced buf
9a40: 66 65 72 20 69 6e 73 74 65 61 64 20 54 68 69 73  fer instead This
9a50: 20 77 61 73 74 65 73 0a 20 20 20 20 20 20 20 20   wastes.        
9a60: 2a 2a 20 49 4e 54 45 52 49 4f 52 5f 4d 41 58 20  ** INTERIOR_MAX 
9a70: 62 79 74 65 73 2c 20 62 75 74 20 73 69 6e 63 65  bytes, but since
9a80: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 6f   this scenario o
9a90: 6e 6c 79 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  nly comes about 
9aa0: 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
9ab0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
9ac0: 74 61 69 6e 20 74 77 6f 20 74 65 72 6d 73 20 74  tain two terms t
9ad0: 68 61 74 20 73 68 61 72 65 20 61 20 70 72 65 66  hat share a pref
9ae0: 69 78 20 6f 66 20 61 6c 6d 6f 73 74 20 32 4b 42  ix of almost 2KB
9af0: 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
9b00: 69 73 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74  is is not expect
9b10: 65 64 20 74 6f 20 62 65 20 61 20 73 65 72 69 6f  ed to be a serio
9b20: 75 73 20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20 20  us problem. .   
9b30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9b40: 61 73 73 65 72 74 28 20 70 54 72 65 65 2d 3e 61  assert( pTree->a
9b50: 44 61 74 61 3d 3d 28 63 68 61 72 20 2a 29 26 70  Data==(char *)&p
9b60: 54 72 65 65 5b 31 5d 20 29 3b 0a 20 20 20 20 20  Tree[1] );.     
9b70: 20 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61 20     pTree->aData 
9b80: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
9b90: 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a  3_malloc(nReq);.
9ba0: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 54 72          if( !pTr
9bb0: 65 65 2d 3e 61 44 61 74 61 20 29 7b 0a 20 20 20  ee->aData ){.   
9bc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9bd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
9bf0: 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e       if( pTree->
9c00: 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  zTerm ){.       
9c10: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
9c20: 70 72 65 66 69 78 2d 6c 65 6e 67 74 68 20 66 69  prefix-length fi
9c30: 65 6c 64 20 66 6f 72 20 66 69 72 73 74 20 74 65  eld for first te
9c40: 72 6d 20 69 6e 20 61 20 6e 6f 64 65 20 2a 2f 0a  rm in a node */.
9c50: 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d          nData +=
9c60: 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
9c70: 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44  arint(&pTree->aD
9c80: 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65  ata[nData], nPre
9c90: 66 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  fix);.      }.. 
9ca0: 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71       nData += sq
9cb0: 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
9cc0: 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61  nt(&pTree->aData
9cd0: 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78  [nData], nSuffix
9ce0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9cf0: 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44  &pTree->aData[nD
9d00: 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ata], &zTerm[nPr
9d10: 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
9d20: 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 44  .      pTree->nD
9d30: 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 53  ata = nData + nS
9d40: 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70 54 72  uffix;.      pTr
9d50: 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a 20  ee->nEntry++;.. 
9d60: 20 20 20 20 20 69 66 28 20 69 73 43 6f 70 79 54       if( isCopyT
9d70: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  erm ){.        i
9d80: 66 28 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f  f( pTree->nMallo
9d90: 63 3c 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  c<nTerm ){.     
9da0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20       char *zNew 
9db0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
9dc0: 63 28 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63  c(pTree->zMalloc
9dd0: 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20  , nTerm*2);.    
9de0: 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20        if( !zNew 
9df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
9e00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9e10: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
9e20: 20 20 20 20 20 20 20 20 20 20 70 54 72 65 65 2d            pTree-
9e30: 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d  >nMalloc = nTerm
9e40: 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  *2;.          pT
9e50: 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a  ree->zMalloc = z
9e60: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
9e70: 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54         pTree->zT
9e80: 65 72 6d 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61  erm = pTree->zMa
9e90: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 6d 65  lloc;.        me
9ea0: 6d 63 70 79 28 70 54 72 65 65 2d 3e 7a 54 65 72  mcpy(pTree->zTer
9eb0: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
9ec0: 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d  ;.        pTree-
9ed0: 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a  >nTerm = nTerm;.
9ee0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9ef0: 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65 72       pTree->zTer
9f00: 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72  m = (char *)zTer
9f10: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65  m;.        pTree
9f20: 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b  ->nTerm = nTerm;
9f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
9f40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9f50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9f60: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
9f70: 73 20 74 6f 20 68 65 72 65 2c 20 69 74 20 77 61  s to here, it wa
9f80: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
9f90: 6f 20 61 70 70 65 6e 64 20 7a 54 65 72 6d 20 74  o append zTerm t
9fa0: 6f 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  o the.  ** curre
9fb0: 6e 74 20 6e 6f 64 65 2e 20 43 72 65 61 74 65 20  nt node. Create 
9fc0: 61 20 6e 65 77 20 6e 6f 64 65 20 28 61 20 72 69  a new node (a ri
9fd0: 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 74  ght-sibling of t
9fe0: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 29  he current node)
9ff0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  ..  ** If this i
a000: 73 20 74 68 65 20 66 69 72 73 74 20 6e 6f 64 65  s the first node
a010: 20 69 6e 20 74 68 65 20 74 72 65 65 2c 20 74 68   in the tree, th
a020: 65 20 74 65 72 6d 20 69 73 20 61 64 64 65 64 20  e term is added 
a030: 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  to it..  **.  **
a040: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
a050: 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 64 64 65  term is not adde
a060: 64 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 6f 64  d to the new nod
a070: 65 2c 20 69 74 20 69 73 20 6c 65 66 74 20 65 6d  e, it is left em
a080: 70 74 79 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 77  pty for.  ** now
a090: 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 74  . Instead, the t
a0a0: 65 72 6d 20 69 73 20 69 6e 73 65 72 74 65 64 20  erm is inserted 
a0b0: 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
a0c0: 6f 66 20 70 54 72 65 65 2e 20 49 66 20 70 54 72  of pTree. If pTr
a0d0: 65 65 20 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 20  ee .  ** has no 
a0e0: 70 61 72 65 6e 74 2c 20 6f 6e 65 20 69 73 20 63  parent, one is c
a0f0: 72 65 61 74 65 64 20 68 65 72 65 2e 0a 20 20 2a  reated here..  *
a100: 2f 0a 20 20 70 4e 65 77 20 3d 20 28 53 65 67 6d  /.  pNew = (Segm
a110: 65 6e 74 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65  entNode *)sqlite
a120: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
a130: 53 65 67 6d 65 6e 74 4e 6f 64 65 29 20 2b 20 49  SegmentNode) + I
a140: 4e 54 45 52 49 4f 52 5f 4d 41 58 29 3b 0a 20 20  NTERIOR_MAX);.  
a150: 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
a160: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a170: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
a180: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
a190: 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 29  of(SegmentNode))
a1a0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44 61 74 61 20  ;.  pNew->nData 
a1b0: 3d 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49 4e  = 1 + FTS3_VARIN
a1c0: 54 5f 4d 41 58 3b 0a 20 20 70 4e 65 77 2d 3e 61  T_MAX;.  pNew->a
a1d0: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26  Data = (char *)&
a1e0: 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69 66 28 20  pNew[1];..  if( 
a1f0: 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65 67  pTree ){.    Seg
a200: 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e  mentNode *pParen
a210: 74 20 3d 20 70 54 72 65 65 2d 3e 70 50 61 72 65  t = pTree->pPare
a220: 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  nt;.    rc = fts
a230: 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20  3NodeAddTerm(p, 
a240: 26 70 50 61 72 65 6e 74 2c 20 69 73 43 6f 70 79  &pParent, isCopy
a250: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
a260: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72  rm);.    if( pTr
a270: 65 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ee->pParent==0 )
a280: 7b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 70  {.      pTree->p
a290: 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
a2a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 65  ;.    }.    pTre
a2b0: 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65 77  e->pRight = pNew
a2c0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66  ;.    pNew->pLef
a2d0: 74 6d 6f 73 74 20 3d 20 70 54 72 65 65 2d 3e 70  tmost = pTree->p
a2e0: 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 70 4e  Leftmost;.    pN
a2f0: 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
a300: 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  arent;.    pNew-
a310: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65  >zMalloc = pTree
a320: 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70  ->zMalloc;.    p
a330: 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 70  New->nMalloc = p
a340: 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20  Tree->nMalloc;. 
a350: 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f     pTree->zMallo
a360: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
a370: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d      pNew->pLeftm
a380: 6f 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ost = pNew;.    
a390: 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64  rc = fts3NodeAdd
a3a0: 54 65 72 6d 28 70 2c 20 26 70 4e 65 77 2c 20 69  Term(p, &pNew, i
a3b0: 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d  sCopyTerm, zTerm
a3c0: 2c 20 6e 54 65 72 6d 29 3b 20 0a 20 20 7d 0a 0a  , nTerm); .  }..
a3d0: 20 20 2a 70 70 54 72 65 65 20 3d 20 70 4e 65 77    *ppTree = pNew
a3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a3f0: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
a400: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 74 73 33  unction for fts3
a410: 4e 6f 64 65 57 72 69 74 65 28 29 2e 0a 2a 2f 0a  NodeWrite()..*/.
a420: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54  static int fts3T
a430: 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 0a 20  reeFinishNode(. 
a440: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54   SegmentNode *pT
a450: 72 65 65 2c 20 0a 20 20 69 6e 74 20 69 48 65 69  ree, .  int iHei
a460: 67 68 74 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  ght, .  sqlite3_
a470: 69 6e 74 36 34 20 69 4c 65 66 74 43 68 69 6c 64  int64 iLeftChild
a480: 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 61 72 74  .){.  int nStart
a490: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 48 65 69  ;.  assert( iHei
a4a0: 67 68 74 3e 3d 31 20 26 26 20 69 48 65 69 67 68  ght>=1 && iHeigh
a4b0: 74 3c 31 32 38 20 29 3b 0a 20 20 6e 53 74 61 72  t<128 );.  nStar
a4c0: 74 20 3d 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  t = FTS3_VARINT_
a4d0: 4d 41 58 20 2d 20 73 71 6c 69 74 65 33 46 74 73  MAX - sqlite3Fts
a4e0: 33 56 61 72 69 6e 74 4c 65 6e 28 69 4c 65 66 74  3VarintLen(iLeft
a4f0: 43 68 69 6c 64 29 3b 0a 20 20 70 54 72 65 65 2d  Child);.  pTree-
a500: 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 20 3d  >aData[nStart] =
a510: 20 28 63 68 61 72 29 69 48 65 69 67 68 74 3b 0a   (char)iHeight;.
a520: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74    sqlite3Fts3Put
a530: 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61  Varint(&pTree->a
a540: 44 61 74 61 5b 6e 53 74 61 72 74 2b 31 5d 2c 20  Data[nStart+1], 
a550: 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 72  iLeftChild);.  r
a560: 65 74 75 72 6e 20 6e 53 74 61 72 74 3b 0a 7d 0a  eturn nStart;.}.
a570: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
a580: 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 65 20   buffer for the 
a590: 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 70 54 72  segment node pTr
a5a0: 65 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  ee and all of it
a5b0: 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 0a 2a  s peers to the.*
a5c0: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 6e  * database. Then
a5d0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
a5e0: 69 6f 6e 20 72 65 63 75 72 73 69 76 65 6c 79 20  ion recursively 
a5f0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61 72  to write the par
a600: 65 6e 74 20 6f 66 20 0a 2a 2a 20 70 54 72 65 65  ent of .** pTree
a610: 20 61 6e 64 20 69 74 73 20 70 65 65 72 73 20 74   and its peers t
a620: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
a630: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
a640: 66 20 70 54 72 65 65 20 69 73 20 61 20 72 6f 6f  f pTree is a roo
a650: 74 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 77  t node, do not w
a660: 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 64  rite it to the d
a670: 61 74 61 62 61 73 65 2e 20 49 6e 73 74 65 61 64  atabase. Instead
a680: 2c 0a 2a 2a 20 73 65 74 20 6f 75 74 70 75 74 20  ,.** set output 
a690: 76 61 72 69 61 62 6c 65 73 20 2a 70 61 52 6f 6f  variables *paRoo
a6a0: 74 20 61 6e 64 20 2a 70 6e 52 6f 6f 74 20 74 6f  t and *pnRoot to
a6b0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 6f   contain the roo
a6c0: 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  t node..**.** If
a6d0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
a6e0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
a6f0: 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76 61  ed and output va
a700: 72 69 61 62 6c 65 20 2a 70 69 4c 61 73 74 20 69  riable *piLast i
a710: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20  s.** set to the 
a720: 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64 20  largest blockid 
a730: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
a740: 61 74 61 62 61 73 65 20 28 6f 72 20 7a 65 72 6f  atabase (or zero
a750: 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b 73   if no.** blocks
a760: 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 74 6f   were written to
a770: 20 74 68 65 20 64 62 29 2e 20 4f 74 68 65 72 77   the db). Otherw
a780: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
a790: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
a7a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
a7b0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64  atic int fts3Nod
a7c0: 65 57 72 69 74 65 28 0a 20 20 46 74 73 33 54 61  eWrite(.  Fts3Ta
a7d0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
a7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
a7f0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
a800: 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  e */.  SegmentNo
a810: 64 65 20 2a 70 54 72 65 65 2c 20 20 20 20 20 20  de *pTree,      
a820: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
a830: 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  tNode handle */.
a840: 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 20    int iHeight,  
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 74    /* Height of t
a870: 68 69 73 20 6e 6f 64 65 20 69 6e 20 74 72 65 65  his node in tree
a880: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
a890: 74 36 34 20 69 4c 65 61 66 2c 20 20 20 20 20 20  t64 iLeaf,      
a8a0: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69        /* Block i
a8b0: 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66 20  d of first leaf 
a8c0: 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
a8d0: 33 5f 69 6e 74 36 34 20 69 46 72 65 65 2c 20 20  3_int64 iFree,  
a8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
a8f0: 63 6b 20 69 64 20 6f 66 20 6e 65 78 74 20 66 72  ck id of next fr
a900: 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67  ee slot in %_seg
a910: 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ments */.  sqlit
a920: 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73 74  e3_int64 *piLast
a930: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ,          /* OU
a940: 54 3a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6c  T: Block id of l
a950: 61 73 74 20 65 6e 74 72 79 20 77 72 69 74 74 65  ast entry writte
a960: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61  n */.  char **pa
a970: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
a980: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
a990: 61 74 61 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64  ata for root nod
a9a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 6f  e */.  int *pnRo
a9b0: 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
a9c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
a9d0: 69 7a 65 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65  ize of root node
a9e0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
a9f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
aa00: 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 54  E_OK;..  if( !pT
aa10: 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a  ree->pParent ){.
aa20: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65      /* Root node
aa30: 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a 2f   of the tree. */
aa40: 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20  .    int nStart 
aa50: 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68  = fts3TreeFinish
aa60: 4e 6f 64 65 28 70 54 72 65 65 2c 20 69 48 65 69  Node(pTree, iHei
aa70: 67 68 74 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20  ght, iLeaf);.   
aa80: 20 2a 70 69 4c 61 73 74 20 3d 20 69 46 72 65 65   *piLast = iFree
aa90: 2d 31 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f 74 20  -1;.    *pnRoot 
aaa0: 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 2d  = pTree->nData -
aab0: 20 6e 53 74 61 72 74 3b 0a 20 20 20 20 2a 70 61   nStart;.    *pa
aac0: 52 6f 6f 74 20 3d 20 26 70 54 72 65 65 2d 3e 61  Root = &pTree->a
aad0: 44 61 74 61 5b 6e 53 74 61 72 74 5d 3b 0a 20 20  Data[nStart];.  
aae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 53 65 67 6d 65  }else{.    Segme
aaf0: 6e 74 4e 6f 64 65 20 2a 70 49 74 65 72 3b 0a 20  ntNode *pIter;. 
ab00: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
ab10: 20 69 4e 65 78 74 46 72 65 65 20 3d 20 69 46 72   iNextFree = iFr
ab20: 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ee;.    sqlite3_
ab30: 69 6e 74 36 34 20 69 4e 65 78 74 4c 65 61 66 20  int64 iNextLeaf 
ab40: 3d 20 69 4c 65 61 66 3b 0a 20 20 20 20 66 6f 72  = iLeaf;.    for
ab50: 28 70 49 74 65 72 3d 70 54 72 65 65 2d 3e 70 4c  (pIter=pTree->pL
ab60: 65 66 74 6d 6f 73 74 3b 20 70 49 74 65 72 20 26  eftmost; pIter &
ab70: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
ab80: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 52   pIter=pIter->pR
ab90: 69 67 68 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  ight){.      int
aba0: 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54 72   nStart = fts3Tr
abb0: 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 49 74  eeFinishNode(pIt
abc0: 65 72 2c 20 69 48 65 69 67 68 74 2c 20 69 4e 65  er, iHeight, iNe
abd0: 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  xtLeaf);.      i
abe0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 70 49 74 65  nt nWrite = pIte
abf0: 72 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72  r->nData - nStar
ac00: 74 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d  t;.  .      rc =
ac10: 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
ac20: 74 28 70 2c 20 69 4e 65 78 74 46 72 65 65 2c 20  t(p, iNextFree, 
ac30: 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 6e 53  &pIter->aData[nS
ac40: 74 61 72 74 5d 2c 20 6e 57 72 69 74 65 29 3b 0a  tart], nWrite);.
ac50: 20 20 20 20 20 20 69 4e 65 78 74 46 72 65 65 2b        iNextFree+
ac60: 2b 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 4c 65  +;.      iNextLe
ac70: 61 66 20 2b 3d 20 28 70 49 74 65 72 2d 3e 6e 45  af += (pIter->nE
ac80: 6e 74 72 79 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ntry+1);.    }. 
ac90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
aca0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
acb0: 73 65 72 74 28 20 69 4e 65 78 74 4c 65 61 66 3d  sert( iNextLeaf=
acc0: 3d 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20  =iFree );.      
acd0: 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69  rc = fts3NodeWri
ace0: 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  te(.          p,
acf0: 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 2c   pTree->pParent,
ad00: 20 69 48 65 69 67 68 74 2b 31 2c 20 69 46 72 65   iHeight+1, iFre
ad10: 65 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 70 69  e, iNextFree, pi
ad20: 4c 61 73 74 2c 20 70 61 52 6f 6f 74 2c 20 70 6e  Last, paRoot, pn
ad30: 52 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  Root.      );.  
ad40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
ad50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
ad60: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
ad70: 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
ad80: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
ad90: 72 65 65 20 70 54 72 65 65 2e 0a 2a 2f 0a 73 74  ree pTree..*/.st
ada0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4e 6f  atic void fts3No
adb0: 64 65 46 72 65 65 28 53 65 67 6d 65 6e 74 4e 6f  deFree(SegmentNo
adc0: 64 65 20 2a 70 54 72 65 65 29 7b 0a 20 20 69 66  de *pTree){.  if
add0: 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53  ( pTree ){.    S
ade0: 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 20 3d 20  egmentNode *p = 
adf0: 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74  pTree->pLeftmost
ae00: 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65 46 72  ;.    fts3NodeFr
ae10: 65 65 28 70 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  ee(p->pParent);.
ae20: 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a      while( p ){.
ae30: 20 20 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64        SegmentNod
ae40: 65 20 2a 70 52 69 67 68 74 20 3d 20 70 2d 3e 70  e *pRight = p->p
ae50: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
ae60: 20 70 2d 3e 61 44 61 74 61 21 3d 28 63 68 61 72   p->aData!=(char
ae70: 20 2a 29 26 70 5b 31 5d 20 29 7b 0a 20 20 20 20   *)&p[1] ){.    
ae80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ae90: 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  (p->aData);.    
aea0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
aeb0: 28 20 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ( pRight==0 || p
aec0: 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  ->zMalloc==0 );.
aed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
aee0: 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  ee(p->zMalloc);.
aef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
af00: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 70 20 3d  ee(p);.      p =
af10: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20   pRight;.    }. 
af20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
af30: 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 73 65  a term to the se
af40: 67 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 6e 73  gment being cons
af50: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 53  tructed by the S
af60: 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a  egmentWriter obj
af70: 65 63 74 0a 2a 2a 20 2a 70 70 57 72 69 74 65 72  ect.** *ppWriter
af80: 2e 20 57 68 65 6e 20 61 64 64 69 6e 67 20 74 68  . When adding th
af90: 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20  e first term to 
afa0: 61 20 73 65 67 6d 65 6e 74 2c 20 2a 70 70 57 72  a segment, *ppWr
afb0: 69 74 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  iter should.** b
afc0: 65 20 70 61 73 73 65 64 20 4e 55 4c 4c 2e 20 54  e passed NULL. T
afd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
afe0: 6c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  l allocate a new
aff0: 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f   SegmentWriter o
b000: 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 72 65 74  bject.** and ret
b010: 75 72 6e 20 69 74 20 76 69 61 20 74 68 65 20 69  urn it via the i
b020: 6e 70 75 74 2f 6f 75 74 70 75 74 20 76 61 72 69  nput/output vari
b030: 61 62 6c 65 20 2a 70 70 57 72 69 74 65 72 20 69  able *ppWriter i
b040: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
b050: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
b060: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
b070: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
b080: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
b090: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
b0a0: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 57  tic int fts3SegW
b0b0: 72 69 74 65 72 41 64 64 28 0a 20 20 46 74 73 33  riterAdd(.  Fts3
b0c0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
b0e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
b0f0: 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  dle */.  Segment
b100: 57 72 69 74 65 72 20 2a 2a 70 70 57 72 69 74 65  Writer **ppWrite
b110: 72 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  r,       /* IN/O
b120: 55 54 3a 20 53 65 67 6d 65 6e 74 57 72 69 74 65  UT: SegmentWrite
b130: 72 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69  r handle */ .  i
b140: 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20  nt isCopyTerm,  
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b160: 2a 20 54 72 75 65 20 69 66 20 62 75 66 66 65 72  * True if buffer
b170: 20 7a 54 65 72 6d 20 6d 75 73 74 20 62 65 20 63   zTerm must be c
b180: 6f 70 69 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  opied */.  const
b190: 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
b1b0: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
b1c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
b1d0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b200: 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
b210: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
b220: 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20  Doclist,        
b230: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b240: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
b250: 6e 67 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  ng doclist */.  
b260: 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20 20  int nDoclist    
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
b290: 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  st in bytes */.)
b2a0: 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  {.  int nPrefix;
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 70 72 65 66 69 78 20 69 6e 20 62 79  erm prefix in by
b2e0: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  tes */.  int nSu
b2f0: 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
b300: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b310: 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20   of term suffix 
b320: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
b330: 74 20 6e 52 65 71 3b 20 20 20 20 20 20 20 20 20  t nReq;         
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b350: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
b360: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61   required on lea
b370: 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  f page */.  int 
b380: 6e 44 61 74 61 3b 0a 20 20 53 65 67 6d 65 6e 74  nData;.  Segment
b390: 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
b3a0: 3d 20 2a 70 70 57 72 69 74 65 72 3b 0a 0a 20 20  = *ppWriter;..  
b3b0: 69 66 28 20 21 70 57 72 69 74 65 72 20 29 7b 0a  if( !pWriter ){.
b3c0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
b3d0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
b3e0: 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  tmt;..    /* All
b3f0: 6f 63 61 74 65 20 74 68 65 20 53 65 67 6d 65 6e  ocate the Segmen
b400: 74 57 72 69 74 65 72 20 73 74 72 75 63 74 75 72  tWriter structur
b410: 65 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72  e */.    pWriter
b420: 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74 65   = (SegmentWrite
b430: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
b440: 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  oc(sizeof(Segmen
b450: 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 69  tWriter));.    i
b460: 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72 65  f( !pWriter ) re
b470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b480: 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57  M;.    memset(pW
b490: 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
b4a0: 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29  (SegmentWriter))
b4b0: 3b 0a 20 20 20 20 2a 70 70 57 72 69 74 65 72 20  ;.    *ppWriter 
b4c0: 3d 20 70 57 72 69 74 65 72 3b 0a 0a 20 20 20 20  = pWriter;..    
b4d0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* Allocate a bu
b4e0: 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
b4f0: 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74 61   accumulate data
b500: 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72 2d   */.    pWriter-
b510: 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a  >aData = (char *
b520: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
b530: 4c 45 41 46 5f 4d 41 58 29 3b 0a 20 20 20 20 69  LEAF_MAX);.    i
b540: 66 28 20 21 70 57 72 69 74 65 72 2d 3e 61 44 61  f( !pWriter->aDa
b550: 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ta ) return SQLI
b560: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57  TE_NOMEM;.    pW
b570: 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 4c  riter->nSize = L
b580: 45 41 46 5f 4d 41 58 3b 0a 0a 20 20 20 20 2f 2a  EAF_MAX;..    /*
b590: 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 66   Find the next f
b5a0: 72 65 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20 74  ree blockid in t
b5b0: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
b5c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ble */.    rc = 
b5d0: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
b5e0: 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53  QL_NEXT_SEGMENTS
b5f0: 5f 49 44 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  _ID, &pStmt, 0);
b600: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b610: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
b620: 72 63 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  rc;.    if( SQLI
b630: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
b640: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
b650: 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46       pWriter->iF
b660: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ree = sqlite3_co
b670: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
b680: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69  , 0);.      pWri
b690: 74 65 72 2d 3e 69 46 69 72 73 74 20 3d 20 70 57  ter->iFirst = pW
b6a0: 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20  riter->iFree;.  
b6b0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
b6c0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
b6d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
b6e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
b6f0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61 74  n rc;.  }.  nDat
b700: 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  a = pWriter->nDa
b710: 74 61 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d  ta;..  nPrefix =
b720: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
b730: 65 73 73 28 70 57 72 69 74 65 72 2d 3e 7a 54 65  ess(pWriter->zTe
b740: 72 6d 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54 65  rm, pWriter->nTe
b750: 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
b760: 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  );.  nSuffix = n
b770: 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20  Term-nPrefix;.. 
b780: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
b790: 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72  ow many bytes ar
b7a0: 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  e required by th
b7b0: 69 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  is new entry */.
b7c0: 20 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33    nReq = sqlite3
b7d0: 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50  Fts3VarintLen(nP
b7e0: 72 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20 76  refix) +    /* v
b7f0: 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  arint containing
b800: 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a   prefix size */.
b810: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56      sqlite3Fts3V
b820: 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78  arintLen(nSuffix
b830: 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76  ) +         /* v
b840: 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  arint containing
b850: 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a   suffix size */.
b860: 20 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20 20      nSuffix +   
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b890: 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20  erm suffix */.  
b8a0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72    sqlite3Fts3Var
b8b0: 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29  intLen(nDoclist)
b8c0: 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a   +        /* Siz
b8d0: 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  e of doclist */.
b8e0: 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20      nDoclist;   
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
b910: 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 0a  oclist data */..
b920: 20 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26 26    if( nData>0 &&
b930: 20 6e 44 61 74 61 2b 6e 52 65 71 3e 4c 45 41 46   nData+nReq>LEAF
b940: 5f 4d 41 58 20 29 7b 0a 20 20 20 20 69 6e 74 20  _MAX ){.    int 
b950: 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  rc;..    /* The 
b960: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 6e 6f 64  current leaf nod
b970: 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65  e is full. Write
b980: 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 64   it out to the d
b990: 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20  atabase. */.    
b9a0: 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
b9b0: 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72  gment(p, pWriter
b9c0: 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72 69 74  ->iFree++, pWrit
b9d0: 65 72 2d 3e 61 44 61 74 61 2c 20 6e 44 61 74 61  er->aData, nData
b9e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
b9f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ba00: 6e 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  n rc;..    /* Ad
ba10: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  d the current te
ba20: 72 6d 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69  rm to the interi
ba30: 6f 72 20 6e 6f 64 65 20 74 72 65 65 2e 20 54 68  or node tree. Th
ba40: 65 20 74 65 72 6d 20 61 64 64 65 64 20 74 6f 0a  e term added to.
ba50: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 74 65 72      ** the inter
ba60: 69 6f 72 20 74 72 65 65 20 6d 75 73 74 3a 0a 20  ior tree must:. 
ba70: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61     **.    **   a
ba80: 29 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  ) be greater tha
ba90: 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65  n the largest te
baa0: 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e  rm on the leaf n
bab0: 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ode just written
bac0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  .    **      to 
bad0: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 73 74  the database (st
bae0: 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ill available in
baf0: 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 29   pWriter->zTerm)
bb00: 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20  , and.    **.   
bb10: 20 2a 2a 20 20 20 62 29 20 62 65 20 6c 65 73 73   **   b) be less
bb20: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
bb30: 6f 20 74 68 65 20 74 65 72 6d 20 61 62 6f 75 74  o the term about
bb40: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
bb50: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20  the new.    **  
bb60: 20 20 20 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a      leaf node (z
bb70: 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20  Term/nTerm)..   
bb80: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74   **.    ** In ot
bb90: 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75  her words, it mu
bba0: 73 74 20 62 65 20 74 68 65 20 70 72 65 66 69 78  st be the prefix
bbb0: 20 6f 66 20 7a 54 65 72 6d 20 31 20 62 79 74 65   of zTerm 1 byte
bbc0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20   longer than.   
bbd0: 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70   ** the common p
bbe0: 72 65 66 69 78 20 28 69 66 20 61 6e 79 29 20 6f  refix (if any) o
bbf0: 66 20 7a 54 65 72 6d 20 61 6e 64 20 70 57 72 69  f zTerm and pWri
bc00: 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20  ter->zTerm..    
bc10: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  */.    assert( n
bc20: 50 72 65 66 69 78 3c 6e 54 65 72 6d 20 29 3b 0a  Prefix<nTerm );.
bc30: 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
bc40: 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70 57 72  eAddTerm(p, &pWr
bc50: 69 74 65 72 2d 3e 70 54 72 65 65 2c 20 69 73 43  iter->pTree, isC
bc60: 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  opyTerm, zTerm, 
bc70: 6e 50 72 65 66 69 78 2b 31 29 3b 0a 20 20 20 20  nPrefix+1);.    
bc80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bc90: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
bca0: 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
bcb0: 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72     pWriter->nTer
bcc0: 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 50 72 65  m = 0;..    nPre
bcd0: 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 6e 53 75  fix = 0;.    nSu
bce0: 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  ffix = nTerm;.  
bcf0: 20 20 6e 52 65 71 20 3d 20 31 20 2b 20 20 20 20    nReq = 1 +    
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72            /* var
bd20: 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  int containing p
bd30: 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  refix size */.  
bd40: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56      sqlite3Fts3V
bd50: 61 72 69 6e 74 4c 65 6e 28 6e 54 65 72 6d 29 20  arintLen(nTerm) 
bd60: 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72  +         /* var
bd70: 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  int containing s
bd80: 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  uffix size */.  
bd90: 20 20 20 20 6e 54 65 72 6d 20 2b 20 20 20 20 20      nTerm +     
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
bdc0: 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20  m suffix */.    
bdd0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72    sqlite3Fts3Var
bde0: 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29  intLen(nDoclist)
bdf0: 20 2b 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20   +      /* Size 
be00: 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
be10: 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20      nDoclist;   
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
be40: 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 7d  list data */.  }
be50: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 75  ..  /* If the bu
be60: 66 66 65 72 20 63 75 72 72 65 6e 74 6c 79 20 61  ffer currently a
be70: 6c 6c 6f 63 61 74 65 64 20 69 73 20 74 6f 6f 20  llocated is too 
be80: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 69 73 20 65  small for this e
be90: 6e 74 72 79 2c 20 72 65 61 6c 6c 6f 63 0a 20 20  ntry, realloc.  
bea0: 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20 74 6f  ** the buffer to
beb0: 20 6d 61 6b 65 20 69 74 20 6c 61 72 67 65 20 65   make it large e
bec0: 6e 6f 75 67 68 2e 0a 20 20 2a 2f 0a 20 20 69 66  nough..  */.  if
bed0: 28 20 6e 52 65 71 3e 70 57 72 69 74 65 72 2d 3e  ( nReq>pWriter->
bee0: 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 68 61  nSize ){.    cha
bef0: 72 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *aNew = sqlite
bf00: 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65  3_realloc(pWrite
bf10: 72 2d 3e 61 44 61 74 61 2c 20 6e 52 65 71 29 3b  r->aData, nReq);
bf20: 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29  .    if( !aNew )
bf30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
bf40: 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65  OMEM;.    pWrite
bf50: 72 2d 3e 61 44 61 74 61 20 3d 20 61 4e 65 77 3b  r->aData = aNew;
bf60: 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53  .    pWriter->nS
bf70: 69 7a 65 20 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a  ize = nReq;.  }.
bf80: 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 2b    assert( nData+
bf90: 6e 52 65 71 3c 3d 70 57 72 69 74 65 72 2d 3e 6e  nReq<=pWriter->n
bfa0: 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 70  Size );..  /* Ap
bfb0: 70 65 6e 64 20 74 68 65 20 70 72 65 66 69 78 2d  pend the prefix-
bfc0: 63 6f 6d 70 72 65 73 73 65 64 20 74 65 72 6d 20  compressed term 
bfd0: 61 6e 64 20 64 6f 63 6c 69 73 74 20 74 6f 20 74  and doclist to t
bfe0: 68 65 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20  he buffer. */.  
bff0: 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
c000: 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
c010: 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
c020: 61 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a  ata], nPrefix);.
c030: 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74    nData += sqlit
c040: 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
c050: 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b  &pWriter->aData[
c060: 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29  nData], nSuffix)
c070: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69  ;.  memcpy(&pWri
c080: 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ter->aData[nData
c090: 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69  ], &zTerm[nPrefi
c0a0: 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  x], nSuffix);.  
c0b0: 6e 44 61 74 61 20 2b 3d 20 6e 53 75 66 66 69 78  nData += nSuffix
c0c0: 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c  ;.  nData += sql
c0d0: 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
c0e0: 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74  t(&pWriter->aDat
c0f0: 61 5b 6e 44 61 74 61 5d 2c 20 6e 44 6f 63 6c 69  a[nData], nDocli
c100: 73 74 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  st);.  memcpy(&p
c110: 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
c120: 61 74 61 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20  ata], aDoclist, 
c130: 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 57 72  nDoclist);.  pWr
c140: 69 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44  iter->nData = nD
c150: 61 74 61 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a  ata + nDoclist;.
c160: 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 63  .  /* Save the c
c170: 75 72 72 65 6e 74 20 74 65 72 6d 20 73 6f 20 74  urrent term so t
c180: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 75 73  hat it can be us
c190: 65 64 20 74 6f 20 70 72 65 66 69 78 2d 63 6f 6d  ed to prefix-com
c1a0: 70 72 65 73 73 20 74 68 65 20 6e 65 78 74 2e 0a  press the next..
c1b0: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
c1c0: 70 79 54 65 72 6d 20 70 61 72 61 6d 65 74 65 72  pyTerm parameter
c1d0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
c1e0: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c1f0: 64 20 74 6f 20 62 79 0a 20 20 2a 2a 20 7a 54 65  d to by.  ** zTe
c200: 72 6d 20 69 73 20 74 72 61 6e 73 69 65 6e 74 2c  rm is transient,
c210: 20 73 6f 20 74 61 6b 65 20 61 20 63 6f 70 79 20   so take a copy 
c220: 6f 66 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  of the term data
c230: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6a 75 73  . Otherwise, jus
c240: 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 61 20 63  t.  ** store a c
c250: 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  opy of the point
c260: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  er..  */.  if( i
c270: 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20  sCopyTerm ){.   
c280: 20 69 66 28 20 6e 54 65 72 6d 3e 70 57 72 69 74   if( nTerm>pWrit
c290: 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20  er->nMalloc ){. 
c2a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20       char *zNew 
c2b0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
c2c0: 63 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  c(pWriter->zMall
c2d0: 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20  oc, nTerm*2);.  
c2e0: 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b      if( !zNew ){
c2f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c300: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c310: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 72 69      }.      pWri
c320: 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e  ter->nMalloc = n
c330: 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20 70 57  Term*2;.      pW
c340: 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d  riter->zMalloc =
c350: 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 70 57 72   zNew;.      pWr
c360: 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e  iter->zTerm = zN
c370: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ew;.    }.    as
c380: 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 7a  sert( pWriter->z
c390: 54 65 72 6d 3d 3d 70 57 72 69 74 65 72 2d 3e 7a  Term==pWriter->z
c3a0: 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 6d 65  Malloc );.    me
c3b0: 6d 63 70 79 28 70 57 72 69 74 65 72 2d 3e 7a 54  mcpy(pWriter->zT
c3c0: 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
c3d0: 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
c3e0: 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20   pWriter->zTerm 
c3f0: 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b  = (char *)zTerm;
c400: 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e  .  }.  pWriter->
c410: 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a  nTerm = nTerm;..
c420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c430: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  OK;.}../*.** Flu
c440: 73 68 20 61 6c 6c 20 64 61 74 61 20 61 73 73 6f  sh all data asso
c450: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
c460: 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62  SegmentWriter ob
c470: 6a 65 63 74 20 70 57 72 69 74 65 72 20 74 6f 20  ject pWriter to 
c480: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
c490: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c4a0: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66  ust be called af
c4b0: 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 68 61  ter all terms ha
c4c0: 76 65 20 62 65 65 6e 20 61 64 64 65 64 0a 2a 2a  ve been added.**
c4d0: 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
c4e0: 75 73 69 6e 67 20 66 74 73 33 53 65 67 57 72 69  using fts3SegWri
c4f0: 74 65 72 41 64 64 28 29 2e 20 49 66 20 73 75 63  terAdd(). If suc
c500: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
c510: 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  OK is.** returne
c520: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
c530: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
c540: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
c550: 74 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46  t fts3SegWriterF
c560: 6c 75 73 68 28 0a 20 20 46 74 73 33 54 61 62 6c  lush(.  Fts3Tabl
c570: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
c580: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
c590: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
c5a0: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74  */.  SegmentWrit
c5b0: 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
c5c0: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 57       /* SegmentW
c5d0: 72 69 74 65 72 20 74 6f 20 66 6c 75 73 68 20 74  riter to flush t
c5e0: 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20 20 69 6e  o the db */.  in
c5f0: 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c610: 20 56 61 6c 75 65 20 66 6f 72 20 27 6c 65 76 65   Value for 'leve
c620: 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73  l' column of %_s
c630: 65 67 64 69 72 20 2a 2f 0a 20 20 69 6e 74 20 69  egdir */.  int i
c640: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
c650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
c660: 6c 75 65 20 66 6f 72 20 27 69 64 78 27 20 63 6f  lue for 'idx' co
c670: 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69 72  lumn of %_segdir
c680: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
c6b0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28  rn code */.  if(
c6c0: 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 20   pWriter->pTree 
c6d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
c6e0: 6e 74 36 34 20 69 4c 61 73 74 3b 20 20 20 20 20  nt64 iLast;     
c6f0: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
c700: 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e  block id written
c710: 20 74 6f 20 64 61 74 61 62 61 73 65 20 2a 2f 0a   to database */.
c720: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
c730: 34 20 69 4c 61 73 74 4c 65 61 66 3b 20 20 20 20  4 iLastLeaf;    
c740: 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 6c 65 61    /* Largest lea
c750: 66 20 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74  f block id writt
c760: 65 6e 20 74 6f 20 64 62 20 2a 2f 0a 20 20 20 20  en to db */.    
c770: 63 68 61 72 20 2a 7a 52 6f 6f 74 3b 20 20 20 20  char *zRoot;    
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c790: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
c7a0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f  er containing ro
c7b0: 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 69  ot node */.    i
c7c0: 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 20  nt nRoot;       
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7e0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a  Size of buffer z
c7f0: 52 6f 6f 74 20 2a 2f 0a 0a 20 20 20 20 69 4c 61  Root */..    iLa
c800: 73 74 4c 65 61 66 20 3d 20 70 57 72 69 74 65 72  stLeaf = pWriter
c810: 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20 72 63 20  ->iFree;.    rc 
c820: 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
c830: 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69  nt(p, pWriter->i
c840: 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d  Free++, pWriter-
c850: 3e 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d  >aData, pWriter-
c860: 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >nData);.    if(
c870: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c880: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
c890: 33 4e 6f 64 65 57 72 69 74 65 28 70 2c 20 70 57  3NodeWrite(p, pW
c8a0: 72 69 74 65 72 2d 3e 70 54 72 65 65 2c 20 31 2c  riter->pTree, 1,
c8b0: 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74  .          pWrit
c8c0: 65 72 2d 3e 69 46 69 72 73 74 2c 20 70 57 72 69  er->iFirst, pWri
c8d0: 74 65 72 2d 3e 69 46 72 65 65 2c 20 26 69 4c 61  ter->iFree, &iLa
c8e0: 73 74 2c 20 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f  st, &zRoot, &nRo
c8f0: 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ot);.    }.    i
c900: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c910: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
c920: 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 0a  ts3WriteSegdir(.
c930: 20 20 20 20 20 20 20 20 20 20 70 2c 20 69 4c 65            p, iLe
c940: 76 65 6c 2c 20 69 49 64 78 2c 20 70 57 72 69 74  vel, iIdx, pWrit
c950: 65 72 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73  er->iFirst, iLas
c960: 74 4c 65 61 66 2c 20 69 4c 61 73 74 2c 20 7a 52  tLeaf, iLast, zR
c970: 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
c980: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
c990: 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 74 72  /* The entire tr
c9a0: 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72  ee fits on the r
c9b0: 6f 6f 74 20 6e 6f 64 65 2e 20 57 72 69 74 65 20  oot node. Write 
c9c0: 69 74 20 74 6f 20 74 68 65 20 73 65 67 64 69 72  it to the segdir
c9d0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72   table. */.    r
c9e0: 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
c9f0: 64 69 72 28 0a 20 20 20 20 20 20 20 20 70 2c 20  dir(.        p, 
ca00: 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 30 2c  iLevel, iIdx, 0,
ca10: 20 30 2c 20 30 2c 20 70 57 72 69 74 65 72 2d 3e   0, 0, pWriter->
ca20: 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e  aData, pWriter->
ca30: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 72 65  nData);.  }.  re
ca40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ca50: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d 65  * Release all me
ca60: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
ca70: 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f   SegmentWriter o
ca80: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
ca90: 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 61 72  the .** first ar
caa0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
cab0: 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 57 72  c void fts3SegWr
cac0: 69 74 65 72 46 72 65 65 28 53 65 67 6d 65 6e 74  iterFree(Segment
cad0: 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
cae0: 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 20  {.  if( pWriter 
caf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
cb00: 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 61  ree(pWriter->aDa
cb10: 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
cb20: 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 7a  _free(pWriter->z
cb30: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74 73  Malloc);.    fts
cb40: 33 4e 6f 64 65 46 72 65 65 28 70 57 72 69 74 65  3NodeFree(pWrite
cb50: 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20 20 20 73  r->pTree);.    s
cb60: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
cb70: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
cb80: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61 6c  ** The first val
cb90: 75 65 20 69 6e 20 74 68 65 20 61 70 56 61 6c 5b  ue in the apVal[
cba0: 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75 6d  ] array is assum
cbb0: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e  ed to contain an
cbc0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68 69   integer..** Thi
cbd0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73  s function tests
cbe0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20   if there exist 
cbf0: 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73 20 77 69  any documents wi
cc00: 74 68 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20  th docid values 
cc10: 74 68 61 74 0a 2a 2a 20 61 72 65 20 64 69 66 66  that.** are diff
cc20: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 61 74 20  erent from that 
cc30: 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e 20 69 66  integer. i.e. if
cc40: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 64 6f   deleting the do
cc50: 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69  cument with doci
cc60: 64 0a 2a 2a 20 61 70 56 61 6c 5b 30 5d 20 77 6f  d.** apVal[0] wo
cc70: 75 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53  uld mean the FTS
cc80: 33 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70  3 table were emp
cc90: 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ty..**.** If suc
cca0: 63 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70  cessful, *pisEmp
ccb0: 74 79 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ty is set to tru
ccc0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  e if the table i
ccd0: 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66  s empty except f
cce0: 6f 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 61  or.** document a
ccf0: 70 56 61 6c 5b 30 5d 2c 20 6f 72 20 66 61 6c 73  pVal[0], or fals
cd00: 65 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e 64  e otherwise, and
cd10: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
cd20: 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a  turned. If an.**
cd30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
cd40: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
cd50: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
cd60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
cd70: 74 73 33 49 73 45 6d 70 74 79 28 46 74 73 33 54  ts3IsEmpty(Fts3T
cd80: 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  able *p, sqlite3
cd90: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20  _value **apVal, 
cda0: 69 6e 74 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a  int *pisEmpty){.
cdb0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
cdc0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
cdd0: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
cde0: 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f 45 4d  tmt(p, SQL_IS_EM
cdf0: 50 54 59 2c 20 26 70 53 74 6d 74 2c 20 61 70 56  PTY, &pStmt, apV
ce00: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  al);.  if( rc==S
ce10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ce20: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
ce30: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
ce40: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 69  mt) ){.      *pi
ce50: 73 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33  sEmpty = sqlite3
ce60: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
ce70: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
ce80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
ce90: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  set(pStmt);.  }.
cea0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ceb0: 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e 53 65 67  /*.** Set *pnSeg
cec0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 75 6d 62  ment to the numb
ced0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f  er of segments o
cee0: 66 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69  f level iLevel i
cef0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
cf00: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
cf10: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
cf20: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
cf30: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
cf40: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
cf50: 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74 43  int fts3SegmentC
cf60: 6f 75 6e 74 28 46 74 73 33 54 61 62 6c 65 20 2a  ount(Fts3Table *
cf70: 70 2c 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 69  p, int iLevel, i
cf80: 6e 74 20 2a 70 6e 53 65 67 6d 65 6e 74 29 7b 0a  nt *pnSegment){.
cf90: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
cfa0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
cfb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ..  assert( iLev
cfc0: 65 6c 3e 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  el>=0 );.  rc = 
cfd0: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
cfe0: 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f  QL_SELECT_LEVEL_
cff0: 43 4f 55 4e 54 2c 20 26 70 53 74 6d 74 2c 20 30  COUNT, &pStmt, 0
d000: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d010: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
d020: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  rc;.  sqlite3_bi
d030: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
d040: 20 69 4c 65 76 65 6c 29 3b 0a 20 20 69 66 28 20   iLevel);.  if( 
d050: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
d060: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
d070: 29 7b 0a 20 20 20 20 2a 70 6e 53 65 67 6d 65 6e  ){.    *pnSegmen
d080: 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
d090: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
d0a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
d0b0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
d0c0: 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  mt);.}../*.** Se
d0d0: 74 20 2a 70 6e 53 65 67 6d 65 6e 74 20 74 6f 20  t *pnSegment to 
d0e0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
d0f0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
d100: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 65  the database. Se
d110: 74 0a 2a 2a 20 2a 70 6e 4d 61 78 20 74 6f 20 74  t.** *pnMax to t
d120: 68 65 20 6c 61 72 67 65 73 74 20 73 65 67 6d 65  he largest segme
d130: 6e 74 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20  nt level in the 
d140: 64 61 74 61 62 61 73 65 20 28 73 65 67 6d 65 6e  database (segmen
d150: 74 20 6c 65 76 65 6c 73 0a 2a 2a 20 61 72 65 20  t levels.** are 
d160: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 27 6c  stored in the 'l
d170: 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel' column of 
d180: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
d190: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  le)..**.** Retur
d1a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
d1b0: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
d1c0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
d1d0: 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  de if not..*/.st
d1e0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
d1f0: 6d 65 6e 74 43 6f 75 6e 74 4d 61 78 28 46 74 73  mentCountMax(Fts
d200: 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a  3Table *p, int *
d210: 70 6e 53 65 67 6d 65 6e 74 2c 20 69 6e 74 20 2a  pnSegment, int *
d220: 70 6e 4d 61 78 29 7b 0a 20 20 73 71 6c 69 74 65  pnMax){.  sqlite
d230: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
d240: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
d250: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
d260: 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49  SQL_SELECT_SEGDI
d270: 52 5f 43 4f 55 4e 54 5f 4d 41 58 2c 20 26 70 53  R_COUNT_MAX, &pS
d280: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
d290: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
d2a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
d2b0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
d2c0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
d2d0: 29 7b 0a 20 20 20 20 2a 70 6e 53 65 67 6d 65 6e  ){.    *pnSegmen
d2e0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
d2f0: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
d300: 3b 0a 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73  ;.    *pnMax = s
d310: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
d320: 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 7d  t(pStmt, 1);.  }
d330: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
d340: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
d350: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d360: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
d370: 66 74 65 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c  fter merging mul
d380: 74 69 70 6c 65 20 73 65 67 6d 65 6e 74 73 20 69  tiple segments i
d390: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72  nto a single lar
d3a0: 67 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f  ge.** segment to
d3b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c   delete the old,
d3c0: 20 6e 6f 77 20 72 65 64 75 6e 64 61 6e 74 2c 20   now redundant, 
d3d0: 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e  segment b-trees.
d3e0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a   Specifically,.*
d3f0: 2a 20 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31  * it:.** .**   1
d400: 29 20 44 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f  ) Deletes all %_
d410: 73 65 67 6d 65 6e 74 73 20 65 6e 74 72 69 65 73  segments entries
d420: 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74   for the segment
d430: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
d440: 68 20 0a 2a 2a 20 20 20 20 20 20 65 61 63 68 20  h .**      each 
d450: 6f 66 20 74 68 65 20 53 65 67 52 65 61 64 65 72  of the SegReader
d460: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
d470: 61 72 72 61 79 20 70 61 73 73 65 64 20 61 73 20  array passed as 
d480: 74 68 65 20 74 68 69 72 64 20 0a 2a 2a 20 20 20  the third .**   
d490: 20 20 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64     argument, and
d4a0: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65  .**.**   2) dele
d4b0: 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 64 69 72  tes all %_segdir
d4c0: 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 6c 65   entries with le
d4d0: 76 65 6c 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61  vel iLevel, or a
d4e0: 6c 6c 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20  ll %_segdir.**  
d4f0: 20 20 20 20 65 6e 74 72 69 65 73 20 72 65 67 61      entries rega
d500: 72 64 6c 65 73 73 20 6f 66 20 6c 65 76 65 6c 20  rdless of level 
d510: 69 66 20 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a  if (iLevel<0)..*
d520: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
d530: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
d540: 63 63 65 73 73 66 75 6c 2c 20 6f 74 68 65 72 77  ccessful, otherw
d550: 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
d560: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
d570: 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65  tic int fts3Dele
d580: 74 65 53 65 67 64 69 72 28 0a 20 20 46 74 73 33  teSegdir(.  Fts3
d590: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d5b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
d5c0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  dle */.  int iLe
d5d0: 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
d5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
d5f0: 6c 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e  l of %_segdir en
d600: 74 72 69 65 73 20 74 6f 20 64 65 6c 65 74 65 20  tries to delete 
d610: 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
d620: 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20  er **apSegment, 
d630: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
d640: 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63   SegReader objec
d650: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ts */.  int nRea
d660: 64 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  der             
d670: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
d680: 6f 66 20 61 72 72 61 79 20 61 70 53 65 67 6d 65  of array apSegme
d690: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
d6a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d6c0: 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
d6d0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6f0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
d700: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
d710: 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20  _stmt *pDelete; 
d720: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
d730: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c  statement to del
d740: 65 74 65 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 72  ete rows */..  r
d750: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
d760: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
d770: 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70  GMENTS_RANGE, &p
d780: 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 66 6f  Delete, 0);.  fo
d790: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d7a0: 45 5f 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64 65  E_OK && i<nReade
d7b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  r; i++){.    Fts
d7c0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
d7d0: 6d 65 6e 74 20 3d 20 61 70 53 65 67 6d 65 6e 74  ment = apSegment
d7e0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  [i];.    if( pSe
d7f0: 67 6d 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f  gment->iStartBlo
d800: 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck ){.      sqli
d810: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
d820: 44 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 6d  Delete, 1, pSegm
d830: 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b  ent->iStartBlock
d840: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d850: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
d860: 65 74 65 2c 20 32 2c 20 70 53 65 67 6d 65 6e 74  ete, 2, pSegment
d870: 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20  ->iEndBlock);.  
d880: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
d890: 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  (pDelete);.     
d8a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
d8b0: 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  set(pDelete);.  
d8c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
d8d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d8e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d8f0: 7d 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3e  }..  if( iLevel>
d900: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  =0 ){.    rc = f
d910: 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
d920: 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f  L_DELETE_SEGDIR_
d930: 42 59 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c 65  BY_LEVEL, &pDele
d940: 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  te, 0);.    if( 
d950: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
d970: 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c  ind_int(pDelete,
d980: 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20   1, iLevel);.   
d990: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
d9a0: 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20  pDelete);.      
d9b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
d9c0: 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20  et(pDelete);.   
d9d0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
d9e0: 72 63 20 3d 20 66 74 73 33 53 71 6c 45 78 65 63  rc = fts3SqlExec
d9f0: 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41  (p, SQL_DELETE_A
da00: 4c 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20  LL_SEGDIR, 0);. 
da10: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
da20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
da30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
da40: 63 61 6c 6c 65 64 2c 20 62 75 66 66 65 72 20 2a  called, buffer *
da50: 70 70 4c 69 73 74 20 28 73 69 7a 65 20 2a 70 6e  ppList (size *pn
da60: 4c 69 73 74 20 62 79 74 65 73 29 20 63 6f 6e 74  List bytes) cont
da70: 61 69 6e 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74  ains .** a posit
da80: 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 6d 61  ion list that ma
da90: 79 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66  y (or may not) f
daa0: 65 61 74 75 72 65 20 6d 75 6c 74 69 70 6c 65 20  eature multiple 
dab0: 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a  columns. This.**
dac0: 20 66 75 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74   function adjust
dad0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 2a 70  s the pointer *p
dae0: 70 4c 69 73 74 20 61 6e 64 20 74 68 65 20 6c 65  pList and the le
daf0: 6e 67 74 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20  ngth *pnList so 
db00: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 69 64 65  that they.** ide
db10: 6e 74 69 66 79 20 74 68 65 20 73 75 62 73 65 74  ntify the subset
db20: 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
db30: 20 6c 69 73 74 20 74 68 61 74 20 63 6f 72 72 65   list that corre
db40: 73 70 6f 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e  sponds to column
db50: 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iCol..**.** If 
db60: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6e 74  there are no ent
db70: 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ries in the inpu
db80: 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  t position list 
db90: 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c  for column iCol,
dba0: 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74   then.** *pnList
dbb0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
dbc0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
dbd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
dbe0: 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65   fts3ColumnFilte
dbf0: 72 28 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  r(.  int iCol,  
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
dc20: 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20  o filter on */. 
dc30: 20 63 68 61 72 20 2a 2a 70 70 4c 69 73 74 2c 20   char **ppList, 
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e   /* IN/OUT: Poin
dc60: 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  ter to position 
dc70: 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  list */.  int *p
dc80: 6e 4c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  nList           
dc90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
dca0: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66  OUT: Size of buf
dcb0: 66 65 72 20 2a 70 70 4c 69 73 74 20 69 6e 20 62  fer *ppList in b
dcc0: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ytes */.){.  cha
dcd0: 72 20 2a 70 4c 69 73 74 20 3d 20 2a 70 70 4c 69  r *pList = *ppLi
dce0: 73 74 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20  st;.  int nList 
dcf0: 3d 20 2a 70 6e 4c 69 73 74 3b 0a 20 20 63 68 61  = *pnList;.  cha
dd00: 72 20 2a 70 45 6e 64 20 3d 20 26 70 4c 69 73 74  r *pEnd = &pList
dd10: 5b 6e 4c 69 73 74 5d 3b 0a 20 20 69 6e 74 20 69  [nList];.  int i
dd20: 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  Current = 0;.  c
dd30: 68 61 72 20 2a 70 20 3d 20 70 4c 69 73 74 3b 0a  har *p = pList;.
dd40: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
dd50: 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  =0 );.  while( 1
dd60: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d   ){.    char c =
dd70: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   0;.    while( p
dd80: 3c 70 45 6e 64 20 26 26 20 28 63 20 7c 20 2a 70  <pEnd && (c | *p
dd90: 29 26 30 78 46 45 20 29 20 63 20 3d 20 2a 70 2b  )&0xFE ) c = *p+
dda0: 2b 20 26 20 30 78 38 30 3b 0a 20 20 0a 20 20 20  + & 0x80;.  .   
ddb0: 20 69 66 28 20 69 43 6f 6c 3d 3d 69 43 75 72 72   if( iCol==iCurr
ddc0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ent ){.      nLi
ddd0: 73 74 20 3d 20 28 70 20 2d 20 70 4c 69 73 74 29  st = (p - pList)
dde0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ddf0: 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74 20     }..    nList 
de00: 2d 3d 20 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a  -= (p - pList);.
de10: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
de20: 20 20 20 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20     if( nList==0 
de30: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
de40: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70      }.    p = &p
de50: 4c 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b  List[1];.    p +
de60: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
de70: 56 61 72 69 6e 74 33 32 28 70 2c 20 26 69 43 75  Varint32(p, &iCu
de80: 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a  rrent);.  }..  *
de90: 70 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  ppList = pList;.
dea0: 20 20 2a 70 6e 4c 69 73 74 20 3d 20 6e 4c 69 73    *pnList = nLis
deb0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  t;.}../*.** sqli
dec0: 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
ded0: 49 74 65 72 61 74 65 28 29 20 63 61 6c 6c 62 61  Iterate() callba
dee0: 63 6b 20 75 73 65 64 20 77 68 65 6e 20 6d 65 72  ck used when mer
def0: 67 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  ging multiple .*
df00: 2a 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 63 72  * segments to cr
df10: 65 61 74 65 20 61 20 73 69 6e 67 6c 65 2c 20 6c  eate a single, l
df20: 61 72 67 65 72 20 73 65 67 6d 65 6e 74 2e 0a 2a  arger segment..*
df30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
df40: 33 4d 65 72 67 65 43 61 6c 6c 62 61 63 6b 28 0a  3MergeCallback(.
df50: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 0a    Fts3Table *p,.
df60: 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
df70: 2c 0a 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  ,.  char *zTerm,
df80: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 0a 20 20  .  int nTerm,.  
df90: 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 0a  char *aDoclist,.
dfa0: 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 0a 29    int nDoclist.)
dfb0: 7b 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65  {.  SegmentWrite
dfc0: 72 20 2a 2a 70 70 57 20 3d 20 28 53 65 67 6d 65  r **ppW = (Segme
dfd0: 6e 74 57 72 69 74 65 72 20 2a 2a 29 70 43 6f 6e  ntWriter **)pCon
dfe0: 74 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 66  text;.  return f
dff0: 74 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28  ts3SegWriterAdd(
e000: 70 2c 20 70 70 57 2c 20 31 2c 20 7a 54 65 72 6d  p, ppW, 1, zTerm
e010: 2c 20 6e 54 65 72 6d 2c 20 61 44 6f 63 6c 69 73  , nTerm, aDoclis
e020: 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 7d 0a  t, nDoclist);.}.
e030: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
e040: 53 65 67 52 65 61 64 65 72 49 74 65 72 61 74 65  SegReaderIterate
e050: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
e060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e070: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
e080: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
e090: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
e0a0: 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  *apSegment,     
e0b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73   /* Array of Fts
e0c0: 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63  3SegReader objec
e0d0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  ts */.  int nSeg
e0e0: 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ment,           
e0f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e100: 6f 66 20 61 70 53 65 67 6d 65 6e 74 20 61 72 72  of apSegment arr
e110: 61 79 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46  ay */.  Fts3SegF
e120: 69 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 2c 20  ilter *pFilter, 
e130: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
e140: 69 63 74 69 6f 6e 73 20 6f 6e 20 72 61 6e 67 65  ictions on range
e150: 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f   of iteration */
e160: 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
e170: 46 74 73 33 54 61 62 6c 65 20 2a 2c 20 76 6f 69  Fts3Table *, voi
e180: 64 20 2a 2c 20 63 68 61 72 20 2a 2c 20 69 6e 74  d *, char *, int
e190: 2c 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 2c 20  , char *, int), 
e1a0: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a   /* Callback */.
e1b0: 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 63 6f    /* Callback co
e1e0: 6e 74 65 78 74 20 28 32 6e 64 20 61 72 67 75 6d  ntext (2nd argum
e1f0: 65 6e 74 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ent) */.){.  int
e200: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e220: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
e230: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 42 75  e */.  char *aBu
e240: 66 66 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ffer = 0;       
e250: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
e260: 20 74 6f 20 6d 65 72 67 65 20 64 6f 63 6c 69 73   to merge doclis
e270: 74 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ts in */.  int n
e280: 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
e290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
e2a0: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
e2b0: 61 42 75 66 66 65 72 20 62 75 66 66 65 72 20 2a  aBuffer buffer *
e2c0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e2d0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e2e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e2f0: 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 49  de */..  int isI
e300: 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 20 28 70  gnoreEmpty =  (p
e310: 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  Filter->flags & 
e320: 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e  FTS3_SEGMENT_IGN
e330: 4f 52 45 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e  ORE_EMPTY);.  in
e340: 74 20 69 73 52 65 71 75 69 72 65 50 6f 73 20 3d  t isRequirePos =
e350: 20 20 20 28 70 46 69 6c 74 65 72 2d 3e 66 6c 61     (pFilter->fla
e360: 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
e370: 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 29 3b 0a  T_REQUIRE_POS);.
e380: 20 20 69 6e 74 20 69 73 43 6f 6c 46 69 6c 74 65    int isColFilte
e390: 72 20 3d 20 20 20 20 28 70 46 69 6c 74 65 72 2d  r =    (pFilter-
e3a0: 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45  >flags & FTS3_SE
e3b0: 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c  GMENT_COLUMN_FIL
e3c0: 54 45 52 29 3b 0a 20 20 69 6e 74 20 69 73 50 72  TER);.  int isPr
e3d0: 65 66 69 78 20 3d 20 20 20 20 20 20 20 28 70 46  efix =       (pF
e3e0: 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  ilter->flags & F
e3f0: 54 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46  TS3_SEGMENT_PREF
e400: 49 58 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  IX);..  /* If th
e410: 65 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20  e Fts3SegFilter 
e420: 64 65 66 69 6e 65 73 20 61 20 73 70 65 63 69 66  defines a specif
e430: 69 63 20 74 65 72 6d 20 28 6f 72 20 74 65 72 6d  ic term (or term
e440: 20 70 72 65 66 69 78 29 20 74 6f 20 73 65 61 72   prefix) to sear
e450: 63 68 20 0a 20 20 2a 2a 20 66 6f 72 2c 20 74 68  ch .  ** for, th
e460: 65 6e 20 61 64 76 61 6e 63 65 20 65 61 63 68 20  en advance each 
e470: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
e480: 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
e490: 20 74 6f 20 61 20 74 65 72 6d 20 6f 66 0a 20 20   to a term of.  
e4a0: 2a 2a 20 65 71 75 61 6c 20 6f 72 20 67 72 65 61  ** equal or grea
e4b0: 74 65 72 20 76 61 6c 75 65 20 74 68 61 6e 20 74  ter value than t
e4c0: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
e4d0: 6d 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  m. This prevents
e4e0: 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 6e 6e 65 63   many.  ** unnec
e4f0: 65 73 73 61 72 79 20 6d 65 72 67 65 2f 73 6f 72  essary merge/sor
e500: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72  t operations for
e510: 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
e520: 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 0a 20  single segment. 
e530: 20 2a 2a 20 62 2d 74 72 65 65 20 6c 65 61 66 20   ** b-tree leaf 
e540: 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 20 6d 6f  nodes contain mo
e550: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d  re than one term
e560: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
e570: 6c 74 65 72 2d 3e 7a 54 65 72 6d 20 29 7b 0a 20  lter->zTerm ){. 
e580: 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70     int nTerm = p
e590: 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 3b 0a 20  Filter->nTerm;. 
e5a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e5b0: 54 65 72 6d 20 3d 20 70 46 69 6c 74 65 72 2d 3e  Term = pFilter->
e5c0: 7a 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 69  zTerm;.    for(i
e5d0: 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 6e 74 3b 20  =0; i<nSegment; 
e5e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 33  i++){.      Fts3
e5f0: 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20  SegReader *pSeg 
e600: 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a  = apSegment[i];.
e610: 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
e620: 33 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d  3SegReaderTermCm
e630: 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e  p(pSeg, zTerm, n
e640: 54 65 72 6d 29 3c 30 20 29 7b 0a 20 20 20 20 20  Term)<0 ){.     
e650: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
e660: 65 61 64 65 72 4e 65 78 74 28 70 53 65 67 29 3b  eaderNext(pSeg);
e670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
e680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
e690: 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  o finished;.    
e6a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e6b0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
e6c0: 72 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53  rt(apSegment, nS
e6d0: 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74  egment, nSegment
e6e0: 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  , fts3SegReaderC
e6f0: 6d 70 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 70  mp);.  while( ap
e700: 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 4e 6f 64  Segment[0]->aNod
e710: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 65  e ){.    int nTe
e720: 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  rm = apSegment[0
e730: 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 63 68  ]->nTerm;.    ch
e740: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 61 70 53 65  ar *zTerm = apSe
e750: 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b  gment[0]->zTerm;
e760: 0a 20 20 20 20 69 6e 74 20 6e 4d 65 72 67 65 20  .    int nMerge 
e770: 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 1;..    /* If 
e780: 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78  this is a prefix
e790: 2d 73 65 61 72 63 68 2c 20 61 6e 64 20 69 66 20  -search, and if 
e7a0: 74 68 65 20 74 65 72 6d 20 74 68 61 74 20 61 70  the term that ap
e7b0: 53 65 67 6d 65 6e 74 5b 30 5d 20 70 6f 69 6e 74  Segment[0] point
e7c0: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 65 73  s.    ** to does
e7d0: 20 6e 6f 74 20 73 68 61 72 65 20 61 20 73 75 66   not share a suf
e7e0: 66 69 78 20 77 69 74 68 20 70 46 69 6c 74 65 72  fix with pFilter
e7f0: 2d 3e 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 74  ->zTerm/nTerm, t
e800: 68 65 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  hen all .    ** 
e810: 72 65 71 75 69 72 65 64 20 63 61 6c 6c 62 61 63  required callbac
e820: 6b 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  ks have been mad
e830: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
e840: 65 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20  exit early..    
e850: 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61  **.    ** Simila
e860: 72 6c 79 2c 20 69 66 20 74 68 69 73 20 69 73 20  rly, if this is 
e870: 61 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  a search for an 
e880: 65 78 61 63 74 20 6d 61 74 63 68 2c 20 61 6e 64  exact match, and
e890: 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 0a   the first term.
e8a0: 20 20 20 20 2a 2a 20 6f 66 20 73 65 67 6d 65 6e      ** of segmen
e8b0: 74 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 69  t apSegment[0] i
e8c0: 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 65  s not a match, e
e8d0: 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a  xit early..    *
e8e0: 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 74 65  /.    if( pFilte
e8f0: 72 2d 3e 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20  r->zTerm ){.    
e900: 20 20 69 66 28 20 6e 54 65 72 6d 3c 70 46 69 6c    if( nTerm<pFil
e910: 74 65 72 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20  ter->nTerm .    
e920: 20 20 20 7c 7c 20 28 21 69 73 50 72 65 66 69 78     || (!isPrefix
e930: 20 26 26 20 6e 54 65 72 6d 3e 70 46 69 6c 74 65   && nTerm>pFilte
e940: 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20 20 20  r->nTerm).      
e950: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 54 65 72 6d   || memcmp(zTerm
e960: 2c 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d  , pFilter->zTerm
e970: 2c 20 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d  , pFilter->nTerm
e980: 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
e990: 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b    goto finished;
e9a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e9b0: 20 20 20 20 77 68 69 6c 65 28 20 6e 4d 65 72 67      while( nMerg
e9c0: 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20 20 20 20  e<nSegment .    
e9d0: 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74      && apSegment
e9e0: 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f 64 65 0a  [nMerge]->aNode.
e9f0: 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67          && apSeg
ea00: 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 6e 54  ment[nMerge]->nT
ea10: 65 72 6d 3d 3d 6e 54 65 72 6d 20 0a 20 20 20 20  erm==nTerm .    
ea20: 20 20 20 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70      && 0==memcmp
ea30: 28 7a 54 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e  (zTerm, apSegmen
ea40: 74 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d  t[nMerge]->zTerm
ea50: 2c 20 6e 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a  , nTerm).    ){.
ea60: 20 20 20 20 20 20 6e 4d 65 72 67 65 2b 2b 3b 0a        nMerge++;.
ea70: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e      }..    if( n
ea80: 4d 65 72 67 65 3d 3d 31 20 26 26 20 21 69 73 49  Merge==1 && !isI
ea90: 67 6e 6f 72 65 45 6d 70 74 79 20 26 26 20 21 69  gnoreEmpty && !i
eaa0: 73 43 6f 6c 46 69 6c 74 65 72 20 26 26 20 69 73  sColFilter && is
eab0: 52 65 71 75 69 72 65 50 6f 73 20 29 7b 0a 20 20  RequirePos ){.  
eac0: 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
ead0: 72 20 2a 70 30 20 3d 20 61 70 53 65 67 6d 65 6e  r *p0 = apSegmen
eae0: 74 5b 30 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  t[0];.      rc =
eaf0: 20 78 46 75 6e 63 28 70 2c 20 70 43 6f 6e 74 65   xFunc(p, pConte
eb00: 78 74 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  xt, zTerm, nTerm
eb10: 2c 20 70 30 2d 3e 61 44 6f 63 6c 69 73 74 2c 20  , p0->aDoclist, 
eb20: 70 30 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  p0->nDoclist);. 
eb30: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
eb40: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
eb50: 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 65 6c 73  nished;.    }els
eb60: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f  e{.      int nDo
eb70: 63 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  clist = 0;      
eb80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
eb90: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  doclist */.     
eba0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
ebb0: 50 72 65 76 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Prev = 0;    /* 
ebc0: 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 73  Previous docid s
ebd0: 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c 69 73 74  tored in doclist
ebe0: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
ebf0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 6f  e current term o
ec00: 66 20 74 68 65 20 66 69 72 73 74 20 6e 4d 65 72  f the first nMer
ec10: 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
ec20: 65 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2a  e array.      **
ec30: 20 6f 66 20 46 74 73 33 53 65 67 52 65 61 64 65   of Fts3SegReade
ec40: 72 20 6f 62 6a 65 63 74 73 20 69 73 20 74 68 65  r objects is the
ec50: 20 73 61 6d 65 2e 20 54 68 65 20 64 6f 63 6c 69   same. The docli
ec60: 73 74 73 20 6d 75 73 74 20 62 65 20 6d 65 72 67  sts must be merg
ec70: 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ed.      ** and 
ec80: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 61 64  a single term ad
ec90: 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ded to the new s
eca0: 65 67 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  egment..      */
ecb0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
ecc0: 69 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a  i<nMerge; i++){.
ecd0: 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52          fts3SegR
ece0: 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28  eaderFirstDocid(
ecf0: 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20  apSegment[i]);. 
ed00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
ed10: 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 61  3SegReaderSort(a
ed20: 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65  pSegment, nMerge
ed30: 2c 20 6e 4d 65 72 67 65 2c 20 66 74 73 33 53 65  , nMerge, fts3Se
ed40: 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
ed50: 70 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  p);.      while(
ed60: 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 70   apSegment[0]->p
ed70: 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20 20  OffsetList ){.  
ed80: 20 20 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20        int j;    
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
edb0: 6d 65 6e 74 73 20 74 68 61 74 20 73 68 61 72 65  ments that share
edc0: 20 61 20 64 6f 63 69 64 20 2a 2f 0a 20 20 20 20   a docid */.    
edd0: 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 3b      char *pList;
ede0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  .        int nLi
edf0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  st;.        int 
ee00: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 73  nByte;.        s
ee10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
ee20: 63 69 64 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  cid = apSegment[
ee30: 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20  0]->iDocid;.    
ee40: 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
ee50: 72 4e 65 78 74 44 6f 63 69 64 28 61 70 53 65 67  rNextDocid(apSeg
ee60: 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c  ment[0], &pList,
ee70: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
ee80: 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 20    j = 1;.       
ee90: 20 77 68 69 6c 65 28 20 6a 3c 6e 4d 65 72 67 65   while( j<nMerge
eea0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
eeb0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70   apSegment[j]->p
eec0: 4f 66 66 73 65 74 4c 69 73 74 20 0a 20 20 20 20  OffsetList .    
eed0: 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67          && apSeg
eee0: 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d  ment[j]->iDocid=
eef0: 3d 69 44 6f 63 69 64 20 0a 20 20 20 20 20 20 20  =iDocid .       
ef00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
ef10: 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
ef20: 6f 63 69 64 28 61 70 53 65 67 6d 65 6e 74 5b 6a  ocid(apSegment[j
ef30: 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
ef40: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
ef50: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
ef60: 69 73 43 6f 6c 46 69 6c 74 65 72 20 29 7b 0a 20  isColFilter ){. 
ef70: 20 20 20 20 20 20 20 20 20 66 74 73 33 43 6f 6c           fts3Col
ef80: 75 6d 6e 46 69 6c 74 65 72 28 70 46 69 6c 74 65  umnFilter(pFilte
ef90: 72 2d 3e 69 43 6f 6c 2c 20 26 70 4c 69 73 74 2c  r->iCol, &pList,
efa0: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
efb0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
efc0: 20 21 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20   !isIgnoreEmpty 
efd0: 7c 7c 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 20 20  || nList>0 ){.  
efe0: 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
eff0: 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
f000: 74 4c 65 6e 28 69 44 6f 63 69 64 2d 69 50 72 65  tLen(iDocid-iPre
f010: 76 29 20 2b 20 28 69 73 52 65 71 75 69 72 65 50  v) + (isRequireP
f020: 6f 73 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a 20  os?nList+1:0);. 
f030: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 6f           if( nDo
f040: 63 6c 69 73 74 2b 6e 42 79 74 65 3e 6e 41 6c 6c  clist+nByte>nAll
f050: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  oc ){.          
f060: 20 20 63 68 61 72 20 2a 61 4e 65 77 3b 0a 20 20    char *aNew;.  
f070: 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63            nAlloc
f080: 20 3d 20 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74   = nDoclist+nByt
f090: 65 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e*2;.           
f0a0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
f0b0: 72 65 61 6c 6c 6f 63 28 61 42 75 66 66 65 72 2c  realloc(aBuffer,
f0c0: 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20   nAlloc);.      
f0d0: 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20        if( !aNew 
f0e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
f0f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
f100: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
f110: 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b    goto finished;
f120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
f130: 20 20 20 20 20 20 20 20 20 20 20 61 42 75 66 66             aBuff
f140: 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  er = aNew;.     
f150: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f160: 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 73 71 6c   nDoclist += sql
f170: 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
f180: 74 28 26 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c  t(&aBuffer[nDocl
f190: 69 73 74 5d 2c 20 69 44 6f 63 69 64 2d 69 50 72  ist], iDocid-iPr
f1a0: 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ev);.          i
f1b0: 50 72 65 76 20 3d 20 69 44 6f 63 69 64 3b 0a 20  Prev = iDocid;. 
f1c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
f1d0: 65 71 75 69 72 65 50 6f 73 20 29 7b 0a 20 20 20  equirePos ){.   
f1e0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
f1f0: 26 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73  &aBuffer[nDoclis
f200: 74 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74  t], pList, nList
f210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
f220: 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73 74  Doclist += nList
f230: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 42  ;.            aB
f240: 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b  uffer[nDoclist++
f250: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
f260: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
f270: 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67  .        fts3Seg
f280: 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65 67  ReaderSort(apSeg
f290: 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c  ment, nMerge, j,
f2a0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
f2b0: 63 6c 69 73 74 43 6d 70 29 3b 0a 20 20 20 20 20  clistCmp);.     
f2c0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 44   }..      if( nD
f2d0: 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20  oclist>0 ){.    
f2e0: 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70      rc = xFunc(p
f2f0: 2c 20 70 43 6f 6e 74 65 78 74 2c 20 7a 54 65 72  , pContext, zTer
f300: 6d 2c 20 6e 54 65 72 6d 2c 20 61 42 75 66 66 65  m, nTerm, aBuffe
f310: 72 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  r, nDoclist);.  
f320: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f330: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
f340: 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
f350: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f360: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 65 72  f there is a ter
f370: 6d 20 73 70 65 63 69 66 69 65 64 20 74 6f 20 66  m specified to f
f380: 69 6c 74 65 72 20 6f 6e 2c 20 61 6e 64 20 74 68  ilter on, and th
f390: 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 65 66  is is not a pref
f3a0: 69 78 0a 20 20 20 20 2a 2a 20 73 65 61 72 63 68  ix.    ** search
f3b0: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
f3c0: 65 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  e callback that 
f3d0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
f3e0: 68 65 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  he required.    
f3f0: 2a 2a 20 74 65 72 6d 20 28 69 66 20 73 75 63 68  ** term (if such
f400: 20 61 20 74 65 72 6d 20 65 78 69 73 74 73 20 69   a term exists i
f410: 6e 20 74 68 65 20 69 6e 64 65 78 29 20 68 61 73  n the index) has
f420: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
f430: 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  de..    */.    i
f440: 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72  f( pFilter->zTer
f450: 6d 20 26 26 20 21 69 73 50 72 65 66 69 78 20 29  m && !isPrefix )
f460: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e  {.      goto fin
f470: 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ished;.    }..  
f480: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65    for(i=0; i<nMe
f490: 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rge; i++){.     
f4a0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
f4b0: 64 65 72 4e 65 78 74 28 61 70 53 65 67 6d 65 6e  derNext(apSegmen
f4c0: 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  t[i]);.      if(
f4d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f4e0: 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
f4f0: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53 65      }.    fts3Se
f500: 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65  gReaderSort(apSe
f510: 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c  gment, nSegment,
f520: 20 6e 4d 65 72 67 65 2c 20 66 74 73 33 53 65 67   nMerge, fts3Seg
f530: 52 65 61 64 65 72 43 6d 70 29 3b 0a 20 20 7d 0a  ReaderCmp);.  }.
f540: 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 73 71  . finished:.  sq
f550: 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 66  lite3_free(aBuff
f560: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
f570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
f580: 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65 76 65   all level iLeve
f590: 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
f5a0: 65 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  e database into 
f5b0: 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69 4c 65  a single .** iLe
f5c0: 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e 20 4f  vel+1 segment. O
f5d0: 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30 2c 20  r, if iLevel<0, 
f5e0: 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
f5f0: 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ts into a.** sin
f600: 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68  gle segment with
f610: 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c 20 74   a level equal t
f620: 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  o the numericall
f630: 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 20  y largest level 
f640: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 72  .** currently pr
f650: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
f660: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
f670: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
f680: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69 4c 65   called with iLe
f690: 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65 72 65  vel<0, but there
f6a0: 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20   is only one.** 
f6b0: 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64  segment in the d
f6c0: 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f  atabase, SQLITE_
f6d0: 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
f6e0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 2a   immediately. .*
f6f0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
f700: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
f710: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
f720: 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
f730: 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20 53 51  ccurs, .** an SQ
f740: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
f750: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
f760: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
f770: 65 67 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33  egmentMerge(Fts3
f780: 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 4c  Table *p, int iL
f790: 65 76 65 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 20  evel){.  int i; 
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
f7c0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
f7d0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
f800: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  e */.  int iIdx;
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
f830: 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 2a  of new segment *
f840: 2f 0a 20 20 69 6e 74 20 69 4e 65 77 4c 65 76 65  /.  int iNewLeve
f850: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
f860: 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
f870: 63 72 65 61 74 65 20 6e 65 77 20 73 65 67 6d 65  create new segme
f880: 6e 74 20 61 74 20 2a 2f 0a 20 20 73 71 6c 69 74  nt at */.  sqlit
f890: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f8a0: 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
f8b0: 2a 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  *pWriter = 0;.  
f8c0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
f8d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f8e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
f8f0: 6d 65 6e 74 73 20 62 65 69 6e 67 20 6d 65 72 67  ments being merg
f900: 65 64 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52  ed */.  Fts3SegR
f910: 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e  eader **apSegmen
f920: 74 20 3d 20 30 3b 20 20 2f 2a 20 41 72 72 61 79  t = 0;  /* Array
f930: 20 6f 66 20 53 65 67 6d 65 6e 74 20 69 74 65 72   of Segment iter
f940: 61 74 6f 72 73 20 2a 2f 0a 20 20 46 74 73 33 53  ators */.  Fts3S
f950: 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72 3b  egFilter filter;
f960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
f970: 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74 65  gment term filte
f980: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 0a  r condition */..
f990: 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
f9a0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
f9b0: 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67 65 20 61  ll is to merge a
f9c0: 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ll segments in t
f9d0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
f9e0: 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a 2a 20 73   single.    ** s
f9f0: 65 67 6d 65 6e 74 2e 20 54 68 65 20 6c 65 76 65  egment. The leve
fa00: 6c 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65 67  l of the new seg
fa10: 6d 65 6e 74 20 69 73 20 65 71 75 61 6c 20 74 6f  ment is equal to
fa20: 20 74 68 65 20 74 68 65 20 6e 75 6d 65 72 69 63   the the numeric
fa30: 61 6c 6c 79 20 0a 20 20 20 20 2a 2a 20 67 72 65  ally .    ** gre
fa40: 61 74 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65  atest segment le
fa50: 76 65 6c 20 63 75 72 72 65 6e 74 6c 79 20 70 72  vel currently pr
fa60: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
fa70: 61 62 61 73 65 2e 20 54 68 65 20 69 6e 64 65 78  abase. The index
fa80: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e  .    ** of the n
fa90: 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6c  ew segment is al
faa0: 77 61 79 73 20 30 2e 0a 20 20 20 20 2a 2f 0a 20  ways 0..    */. 
fab0: 20 20 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 20     iIdx = 0;.   
fac0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e   rc = fts3Segmen
fad0: 74 43 6f 75 6e 74 4d 61 78 28 70 2c 20 26 6e 53  tCountMax(p, &nS
fae0: 65 67 6d 65 6e 74 2c 20 26 69 4e 65 77 4c 65 76  egment, &iNewLev
faf0: 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  el);.    if( nSe
fb00: 67 6d 65 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  gment==1 ){.    
fb10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb20: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  DONE;.    }.  }e
fb30: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
fb40: 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67   call is to merg
fb50: 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61  e all segments a
fb60: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20  t level iLevel. 
fb70: 46 69 6e 64 20 74 68 65 20 6e 65 78 74 0a 20 20  Find the next.  
fb80: 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73    ** available s
fb90: 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 61 74 20  egment index at 
fba0: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 2e 20  level iLevel+1. 
fbb0: 54 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  The call to.    
fbc0: 2a 2a 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53  ** fts3AllocateS
fbd0: 65 67 64 69 72 49 64 78 28 29 20 77 69 6c 6c 20  egdirIdx() will 
fbe0: 6d 65 72 67 65 20 74 68 65 20 73 65 67 6d 65 6e  merge the segmen
fbf0: 74 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  ts at level iLev
fc00: 65 6c 2b 31 20 74 6f 20 0a 20 20 20 20 2a 2a 20  el+1 to .    ** 
fc10: 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b  a single iLevel+
fc20: 32 20 73 65 67 6d 65 6e 74 20 69 66 20 6e 65 63  2 segment if nec
fc30: 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
fc40: 20 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 69     iNewLevel = i
fc50: 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 72 63 20  Level+1;.    rc 
fc60: 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  = fts3AllocateSe
fc70: 67 64 69 72 49 64 78 28 70 2c 20 69 4e 65 77 4c  gdirIdx(p, iNewL
fc80: 65 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20 20  evel, &iIdx);.  
fc90: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fca0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
fcb0: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
fcc0: 67 6d 65 6e 74 43 6f 75 6e 74 28 70 2c 20 69 4c  gmentCount(p, iL
fcd0: 65 76 65 6c 2c 20 26 6e 53 65 67 6d 65 6e 74 29  evel, &nSegment)
fce0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
fcf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
fd00: 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
fd10: 20 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20   nSegment>0 );. 
fd20: 20 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76   assert( iNewLev
fd30: 65 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  el>=0 );..  /* A
fd40: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
fd50: 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  r an array of po
fd60: 69 6e 74 65 72 73 20 74 6f 20 73 65 67 6d 65 6e  inters to segmen
fd70: 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a  t iterators. */.
fd80: 20 20 61 70 53 65 67 6d 65 6e 74 20 3d 20 28 46    apSegment = (F
fd90: 74 73 33 53 65 67 52 65 61 64 65 72 2a 2a 29 73  ts3SegReader**)s
fda0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
fdb0: 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
fdc0: 65 72 20 2a 29 2a 6e 53 65 67 6d 65 6e 74 29 3b  er *)*nSegment);
fdd0: 0a 20 20 69 66 28 20 21 61 70 53 65 67 6d 65 6e  .  if( !apSegmen
fde0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
fdf0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fe00: 7d 0a 20 20 6d 65 6d 73 65 74 28 61 70 53 65 67  }.  memset(apSeg
fe10: 6d 65 6e 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ment, 0, sizeof(
fe20: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
fe30: 2a 6e 53 65 67 6d 65 6e 74 29 3b 0a 0a 20 20 2f  *nSegment);..  /
fe40: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 46 74 73  * Allocate a Fts
fe50: 33 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63  3SegReader struc
fe60: 74 75 72 65 20 66 6f 72 20 65 61 63 68 20 73 65  ture for each se
fe70: 67 6d 65 6e 74 20 62 65 69 6e 67 20 6d 65 72 67  gment being merg
fe80: 65 64 2e 20 41 20 0a 20 20 2a 2a 20 46 74 73 33  ed. A .  ** Fts3
fe90: 53 65 67 52 65 61 64 65 72 20 73 74 6f 72 65 73  SegReader stores
fea0: 20 74 68 65 20 73 74 61 74 65 20 64 61 74 61 20   the state data 
feb0: 72 65 71 75 69 72 65 64 20 74 6f 20 69 74 65 72  required to iter
fec0: 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
fed0: 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 6e  .  ** entries on
fee0: 20 61 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 61   all leaves of a
fef0: 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e   single segment.
ff00: 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
ff10: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
ff20: 4c 2b 31 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f  L+1==SQL_SELECT_
ff30: 41 4c 4c 5f 4c 45 56 45 4c 29 3b 0a 20 20 72 63  ALL_LEVEL);.  rc
ff40: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
ff50: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56  , SQL_SELECT_LEV
ff60: 45 4c 2b 28 69 4c 65 76 65 6c 3c 30 29 2c 20 26  EL+(iLevel<0), &
ff70: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
ff80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ff90: 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
ffa0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
ffb0: 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65  nt(pStmt, 1, iLe
ffc0: 76 65 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  vel);.  for(i=0;
ffd0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 73 71   SQLITE_ROW==(sq
ffe0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
fff0: 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  )); i++){.    rc
10000 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
10010 4e 65 77 28 70 2c 20 70 53 74 6d 74 2c 20 69 2c  New(p, pStmt, i,
10020 20 26 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b   &apSegment[i]);
10030 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10050 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
10060 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
10070 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
10080 74 6d 74 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20  tmt);.  pStmt = 
10090 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
100a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
100b0 6e 69 73 68 65 64 3b 0a 0a 20 20 6d 65 6d 73 65  nished;..  memse
100c0 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69  t(&filter, 0, si
100d0 7a 65 6f 66 28 46 74 73 33 53 65 67 46 69 6c 74  zeof(Fts3SegFilt
100e0 65 72 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e 66  er));.  filter.f
100f0 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d  lags = FTS3_SEGM
10100 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b  ENT_REQUIRE_POS;
10110 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
10120 7c 3d 20 28 69 4c 65 76 65 6c 3c 30 20 3f 20 46  |= (iLevel<0 ? F
10130 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f  TS3_SEGMENT_IGNO
10140 52 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a 20  RE_EMPTY : 0);. 
10150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
10160 33 53 65 67 52 65 61 64 65 72 49 74 65 72 61 74  3SegReaderIterat
10170 65 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 2c 20  e(p, apSegment, 
10180 6e 53 65 67 6d 65 6e 74 2c 0a 20 20 20 20 20 20  nSegment,.      
10190 26 66 69 6c 74 65 72 2c 20 66 74 73 33 4d 65 72  &filter, fts3Mer
101a0 67 65 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  geCallback, (voi
101b0 64 20 2a 29 26 70 57 72 69 74 65 72 0a 20 20 29  d *)&pWriter.  )
101c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
101d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e  TE_OK ) goto fin
101e0 69 73 68 65 64 3b 0a 0a 20 20 72 63 20 3d 20 66  ished;..  rc = f
101f0 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72 28  ts3DeleteSegdir(
10200 70 2c 20 69 4c 65 76 65 6c 2c 20 61 70 53 65 67  p, iLevel, apSeg
10210 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  ment, nSegment);
10220 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
10240 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46 6c   fts3SegWriterFl
10250 75 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c 20  ush(p, pWriter, 
10260 69 4e 65 77 4c 65 76 65 6c 2c 20 69 49 64 78 29  iNewLevel, iIdx)
10270 3b 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65 64  ;.  }.. finished
10280 3a 0a 20 20 66 74 73 33 53 65 67 57 72 69 74 65  :.  fts3SegWrite
10290 72 46 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a  rFree(pWriter);.
102a0 20 20 69 66 28 20 61 70 53 65 67 6d 65 6e 74 20    if( apSegment 
102b0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
102c0 69 3c 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29  i<nSegment; i++)
102d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
102e0 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
102f0 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d  (p, apSegment[i]
10300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10310 69 74 65 33 5f 66 72 65 65 28 61 70 53 65 67 6d  ite3_free(apSegm
10320 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
10330 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
10340 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10350 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
10360 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  a comparison fun
10370 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20 61 20  ction used as a 
10380 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61 63 6b  qsort() callback
10390 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a 2a   when sorting.**
103a0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 65 6e   an array of pen
103b0 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20 74 65  ding terms by te
103c0 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  rm. This occurs 
103d0 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75 73 68  as part of flush
103e0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
103f0 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69  nts of the pendi
10400 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61  ng-terms hash ta
10410 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ble to the datab
10420 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
10430 6e 74 20 71 73 6f 72 74 43 6f 6d 70 61 72 65 28  nt qsortCompare(
10440 63 6f 6e 73 74 20 76 6f 69 64 20 2a 6c 68 73 2c  const void *lhs,
10450 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 72 68 73   const void *rhs
10460 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 20 3d 20  ){.  char *z1 = 
10470 66 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74  fts3HashKey(*(Ft
10480 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68  s3HashElem **)lh
10490 73 29 3b 0a 20 20 63 68 61 72 20 2a 7a 32 20 3d  s);.  char *z2 =
104a0 20 66 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46   fts3HashKey(*(F
104b0 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72  ts3HashElem **)r
104c0 68 73 29 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20  hs);.  int n1 = 
104d0 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28  fts3HashKeysize(
104e0 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  *(Fts3HashElem *
104f0 2a 29 6c 68 73 29 3b 0a 20 20 69 6e 74 20 6e 32  *)lhs);.  int n2
10500 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73 69   = fts3HashKeysi
10510 7a 65 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65  ze(*(Fts3HashEle
10520 6d 20 2a 2a 29 72 68 73 29 3b 0a 0a 20 20 69 6e  m **)rhs);..  in
10530 74 20 6e 20 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e  t n = (n1<n2 ? n
10540 31 20 3a 20 6e 32 29 3b 0a 20 20 69 6e 74 20 63  1 : n2);.  int c
10550 20 3d 20 6d 65 6d 63 6d 70 28 7a 31 2c 20 7a 32   = memcmp(z1, z2
10560 2c 20 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30  , n);.  if( c==0
10570 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d   ){.    c = n1 -
10580 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n2;.  }.  retur
10590 6e 20 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20  n c;.}.../* .** 
105a0 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e  Flush the conten
105b0 74 73 20 6f 66 20 70 65 6e 64 69 6e 67 54 65 72  ts of pendingTer
105c0 6d 73 20 74 6f 20 61 20 6c 65 76 65 6c 20 30 20  ms to a level 0 
105d0 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  segment..*/.int 
105e0 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
105f0 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 46 74 73  ngTermsFlush(Fts
10600 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 46 74  3Table *p){.  Ft
10610 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65  s3HashElem *pEle
10620 6d 3b 0a 20 20 69 6e 74 20 69 64 78 2c 20 72 63  m;.  int idx, rc
10630 2c 20 69 3b 0a 20 20 46 74 73 33 48 61 73 68 45  , i;.  Fts3HashE
10640 6c 65 6d 20 2a 2a 61 70 45 6c 65 6d 3b 20 20 20  lem **apElem;   
10650 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
10660 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 68  of pointers to h
10670 61 73 68 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ash elements */.
10680 20 20 69 6e 74 20 6e 45 6c 65 6d 3b 20 20 20 20    int nElem;    
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
106b0 65 72 6d 73 20 69 6e 20 6e 65 77 20 73 65 67 6d  erms in new segm
106c0 65 6e 74 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  ent */.  Segment
106d0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
106e0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73 65 64  = 0;     /* Used
106f0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 73 65   to write the se
10700 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46  gment */..  /* F
10710 69 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ind the number o
10720 66 20 74 65 72 6d 73 20 74 68 61 74 20 77 69 6c  f terms that wil
10730 6c 20 6d 61 6b 65 20 75 70 20 74 68 65 20 6e 65  l make up the ne
10740 77 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 74 68  w segment. If th
10750 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20  ere.  ** are no 
10760 74 65 72 6d 73 2c 20 72 65 74 75 72 6e 20 65 61  terms, return ea
10770 72 6c 79 20 28 64 6f 20 6e 6f 74 20 62 6f 74 68  rly (do not both
10780 65 72 20 74 6f 20 77 72 69 74 65 20 61 6e 20 65  er to write an e
10790 6d 70 74 79 20 73 65 67 6d 65 6e 74 29 2e 0a 20  mpty segment).. 
107a0 20 2a 2f 0a 20 20 6e 45 6c 65 6d 20 3d 20 66 74   */.  nElem = ft
107b0 73 33 48 61 73 68 43 6f 75 6e 74 28 26 70 2d 3e  s3HashCount(&p->
107c0 70 65 6e 64 69 6e 67 54 65 72 6d 73 29 3b 0a 20  pendingTerms);. 
107d0 20 69 66 28 20 6e 45 6c 65 6d 3d 3d 30 20 29 7b   if( nElem==0 ){
107e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
107f0 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
10800 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10810 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
10820 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
10830 20 6e 65 78 74 20 69 6e 64 65 78 20 61 74 20 6c   next index at l
10840 65 76 65 6c 20 30 2c 20 6d 65 72 67 69 6e 67 20  evel 0, merging 
10850 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f  as necessary. */
10860 0a 20 20 72 63 20 3d 20 66 74 73 33 41 6c 6c 6f  .  rc = fts3Allo
10870 63 61 74 65 53 65 67 64 69 72 49 64 78 28 70 2c  cateSegdirIdx(p,
10880 20 30 2c 20 26 69 64 78 29 3b 0a 20 20 69 66 28   0, &idx);.  if(
10890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
108a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
108b0 0a 20 20 7d 20 0a 0a 20 20 61 70 45 6c 65 6d 20  .  } ..  apElem 
108c0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
108d0 28 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74  (nElem*sizeof(Ft
108e0 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a  s3HashElem *));.
108f0 20 20 69 66 28 20 21 61 70 45 6c 65 6d 20 29 7b    if( !apElem ){
10900 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10910 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
10920 20 69 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 45   i = 0;.  for(pE
10930 6c 65 6d 3d 66 74 73 33 48 61 73 68 46 69 72 73  lem=fts3HashFirs
10940 74 28 26 70 2d 3e 70 65 6e 64 69 6e 67 54 65 72  t(&p->pendingTer
10950 6d 73 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  ms); pElem; pEle
10960 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28 70  m=fts3HashNext(p
10970 45 6c 65 6d 29 29 7b 0a 20 20 20 20 61 70 45 6c  Elem)){.    apEl
10980 65 6d 5b 69 2b 2b 5d 20 3d 20 70 45 6c 65 6d 3b  em[i++] = pElem;
10990 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
109a0 3d 3d 6e 45 6c 65 6d 20 29 3b 0a 0a 20 20 2f 2a  ==nElem );..  /*
109b0 20 54 4f 44 4f 28 73 68 65 73 73 29 20 53 68 6f   TODO(shess) Sho
109c0 75 6c 64 20 77 65 20 61 6c 6c 6f 77 20 75 73 65  uld we allow use
109d0 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  r-defined collat
109e0 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 2c 0a 20  ion sequences,. 
109f0 20 2a 2a 20 68 65 72 65 3f 20 20 49 20 74 68 69   ** here?  I thi
10a00 6e 6b 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  nk we only need 
10a10 74 68 61 74 20 6f 6e 63 65 20 77 65 20 73 75 70  that once we sup
10a20 70 6f 72 74 20 70 72 65 66 69 78 20 73 65 61 72  port prefix sear
10a30 63 68 65 73 2e 0a 20 20 2a 2a 20 41 6c 73 6f 2c  ches..  ** Also,
10a40 20 73 68 6f 75 6c 64 20 77 65 20 62 65 20 75 73   should we be us
10a50 69 6e 67 20 71 73 6f 72 74 28 29 3f 0a 20 20 2a  ing qsort()?.  *
10a60 2f 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20  /.  if( nElem>1 
10a70 29 7b 0a 20 20 20 20 71 73 6f 72 74 28 61 70 45  ){.    qsort(apE
10a80 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a 65  lem, nElem, size
10a90 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20  of(Fts3HashElem 
10aa0 2a 29 2c 20 71 73 6f 72 74 43 6f 6d 70 61 72 65  *), qsortCompare
10ab0 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72  );.  }...  /* Wr
10ac0 69 74 65 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ite the segment 
10ad0 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 64 61  tree into the da
10ae0 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 66 6f 72  tabase. */.  for
10af0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
10b00 5f 4f 4b 20 26 26 20 69 3c 6e 45 6c 65 6d 3b 20  _OK && i<nElem; 
10b10 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
10b20 63 68 61 72 20 2a 7a 20 3d 20 66 74 73 33 48 61  char *z = fts3Ha
10b30 73 68 4b 65 79 28 61 70 45 6c 65 6d 5b 69 5d 29  shKey(apElem[i])
10b40 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 66 74  ;.    int n = ft
10b50 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 61 70  s3HashKeysize(ap
10b60 45 6c 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 50 65  Elem[i]);.    Pe
10b70 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
10b80 20 3d 20 66 74 73 33 48 61 73 68 44 61 74 61 28   = fts3HashData(
10b90 61 70 45 6c 65 6d 5b 69 5d 29 3b 0a 20 20 20 20  apElem[i]);.    
10ba0 72 63 20 3d 20 66 74 73 33 53 65 67 57 72 69 74  rc = fts3SegWrit
10bb0 65 72 41 64 64 28 70 2c 20 26 70 57 72 69 74 65  erAdd(p, &pWrite
10bc0 72 2c 20 30 2c 20 7a 2c 20 6e 2c 20 70 4c 69 73  r, 0, z, n, pLis
10bd0 74 2d 3e 61 44 61 74 61 2c 20 70 4c 69 73 74 2d  t->aData, pList-
10be0 3e 6e 44 61 74 61 2b 31 29 3b 0a 20 20 7d 0a 20  >nData+1);.  }. 
10bf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10c00 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  OK ){.    rc = f
10c10 74 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73  ts3SegWriterFlus
10c20 68 28 70 2c 20 70 57 72 69 74 65 72 2c 20 30 2c  h(p, pWriter, 0,
10c30 20 69 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   idx);.  }..  /*
10c40 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61   Free all alloca
10c50 74 65 64 20 72 65 73 6f 75 72 63 65 73 20 62 65  ted resources be
10c60 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a  fore returning *
10c70 2f 0a 20 20 66 74 73 33 53 65 67 57 72 69 74 65  /.  fts3SegWrite
10c80 72 46 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a  rFree(pWriter);.
10c90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
10ca0 70 45 6c 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  pElem);.  sqlite
10cb0 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
10cc0 73 43 6c 65 61 72 28 70 29 3b 0a 20 20 72 65 74  sClear(p);.  ret
10cd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10ce0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
10cf0 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72  oes the work for
10d00 20 74 68 65 20 78 55 70 64 61 74 65 20 6d 65 74   the xUpdate met
10d10 68 6f 64 20 6f 66 20 46 54 53 33 20 76 69 72 74  hod of FTS3 virt
10d20 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 0a 2a  ual.** tables..*
10d30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
10d40 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28 0a 20  3UpdateMethod(. 
10d50 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
10d60 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  Vtab,           
10d70 20 2f 2a 20 46 54 53 33 20 76 74 61 62 20 6f 62   /* FTS3 vtab ob
10d80 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ject */.  int nA
10d90 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
10da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10db0 65 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72  e of argument ar
10dc0 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ray */.  sqlite3
10dd0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20  _value **apVal, 
10de0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
10df0 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  y of arguments *
10e00 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
10e10 20 2a 70 52 6f 77 69 64 20 20 20 20 20 20 20 20   *pRowid        
10e20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20      /* OUT: The 
10e30 61 66 66 65 63 74 65 64 20 28 6f 72 20 65 66 66  affected (or eff
10e40 65 63 74 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a  ected) rowid */.
10e50 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  ){.  Fts3Table *
10e60 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a  p = (Fts3Table *
10e70 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVtab;.  int rc
10e80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
10e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10ea0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
10eb0 74 20 69 73 52 65 6d 6f 76 65 20 3d 20 30 3b 20  t isRemove = 0; 
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ed0 20 54 72 75 65 20 66 6f 72 20 61 6e 20 55 50 44   True for an UPD
10ee0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f  ATE or DELETE */
10ef0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
10f00 20 69 52 65 6d 6f 76 65 3b 20 20 20 20 20 20 20   iRemove;       
10f10 20 20 20 2f 2a 20 52 6f 77 69 64 20 72 65 6d 6f     /* Rowid remo
10f20 76 65 64 20 62 79 20 55 50 44 41 54 45 20 6f 72  ved by UPDATE or
10f30 20 44 45 4c 45 54 45 20 2a 2f 0a 0a 20 20 2f 2a   DELETE */..  /*
10f40 20 49 66 20 74 68 69 73 20 69 73 20 61 20 44 45   If this is a DE
10f50 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 6f  LETE or UPDATE o
10f60 70 65 72 61 74 69 6f 6e 2c 20 72 65 6d 6f 76 65  peration, remove
10f70 20 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e   the old record.
10f80 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
10f90 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
10fa0 61 6c 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  al[0])!=SQLITE_N
10fb0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ULL ){.    int i
10fc0 73 45 6d 70 74 79 3b 0a 20 20 20 20 72 63 20 3d  sEmpty;.    rc =
10fd0 20 66 74 73 33 49 73 45 6d 70 74 79 28 70 2c 20   fts3IsEmpty(p, 
10fe0 61 70 56 61 6c 2c 20 26 69 73 45 6d 70 74 79 29  apVal, &isEmpty)
10ff0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
11000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11010 20 69 66 28 20 69 73 45 6d 70 74 79 20 29 7b 0a   if( isEmpty ){.
11020 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
11030 69 6e 67 20 74 68 69 73 20 72 6f 77 20 6d 65 61  ing this row mea
11040 6e 73 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62  ns the whole tab
11050 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 49 6e 20  le is empty. In 
11060 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 20 20  this case.      
11070 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
11080 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20  contents of all 
11090 74 68 72 65 65 20 74 61 62 6c 65 73 20 61 6e 64  three tables and
110a0 20 74 68 72 6f 77 20 61 77 61 79 20 61 6e 79 0a   throw away any.
110b0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
110c0 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 54 65  in the pendingTe
110d0 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  rms hash table..
110e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
110f0 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
11100 74 65 41 6c 6c 28 70 29 3b 0a 20 20 20 20 20 20  teAll(p);.      
11110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
11120 73 52 65 6d 6f 76 65 20 3d 20 31 3b 0a 20 20 20  sRemove = 1;.   
11130 20 20 20 20 20 69 52 65 6d 6f 76 65 20 3d 20 73       iRemove = s
11140 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
11150 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  64(apVal[0]);.  
11160 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50        rc = fts3P
11170 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64  endingTermsDocid
11180 28 70 2c 20 69 52 65 6d 6f 76 65 29 3b 0a 20 20  (p, iRemove);.  
11190 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
111a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
111b0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65       rc = fts3De
111c0 6c 65 74 65 54 65 72 6d 73 28 70 2c 20 61 70 56  leteTerms(p, apV
111d0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  al);.          i
111e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
111f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11200 72 63 20 3d 20 66 74 73 33 53 71 6c 45 78 65 63  rc = fts3SqlExec
11210 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43  (p, SQL_DELETE_C
11220 4f 4e 54 45 4e 54 2c 20 61 70 56 61 6c 29 3b 0a  ONTENT, apVal);.
11230 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11240 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11250 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
11260 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e  If this is an IN
11270 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f  SERT or UPDATE o
11280 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72 74  peration, insert
11290 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e   the new record.
112a0 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   */.  if( nArg>1
112b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
112c0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
112d0 73 33 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20  s3InsertData(p, 
112e0 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a  apVal, pRowid);.
112f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11300 54 45 5f 4f 4b 20 26 26 20 28 21 69 73 52 65 6d  TE_OK && (!isRem
11310 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69 64 21 3d  ove || *pRowid!=
11320 69 52 65 6d 6f 76 65 29 20 29 7b 0a 20 20 20 20  iRemove) ){.    
11330 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
11340 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20  ngTermsDocid(p, 
11350 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  *pRowid);.    }.
11360 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11380 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 54 65  c = fts3InsertTe
11390 72 6d 73 28 70 2c 20 61 70 56 61 6c 29 3b 0a 20  rms(p, apVal);. 
113a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
113b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
113c0 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
113d0 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  in the pending-t
113e0 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20  erms hash table 
113f0 74 6f 20 64 69 73 6b 2e 20 49 66 20 73 75 63 63  to disk. If succ
11400 65 73 73 66 75 6c 2c 0a 2a 2a 20 6d 65 72 67 65  essful,.** merge
11410 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
11420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
11430 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
11440 20 73 65 67 6d 65 6e 74 2c 20 69 66 20 0a 2a 2a   segment, if .**
11450 20 74 68 65 72 65 20 77 61 73 20 61 6e 79 20 64   there was any d
11460 61 74 61 20 74 6f 20 66 6c 75 73 68 29 20 69 6e  ata to flush) in
11470 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  to a single segm
11480 65 6e 74 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ent. .*/.int sql
11490 69 74 65 33 46 74 73 33 4f 70 74 69 6d 69 7a 65  ite3Fts3Optimize
114a0 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a  (Fts3Table *p){.
114b0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
114c0 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72  e3Fts3PendingTer
114d0 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66  msFlush(p);.  if
114e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
114f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
11500 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20  SegmentMerge(p, 
11510 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  -1);.  }.  retur
11520 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a  n rc;.}..#endif.