/ Hex Artifact Content
Login

Artifact f442223e4a1914dc1fc12b65af7e4f2c255fa47c:


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: 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e  nclude "fts3Int.
02c0: 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h".#if !defined(
02d0: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
02e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
02f0: 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 6e  NABLE_FTS3)..#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 0a 23 64 65 66 69  tdlib.h>...#defi
0340: 6e 65 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  ne FTS_MAX_APPEN
0350: 44 41 42 4c 45 5f 48 45 49 47 48 54 20 31 36 0a  DABLE_HEIGHT 16.
0360: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 66 75 6c 6c  ./*.** When full
0370: 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64 65  -text index node
0380: 73 20 61 72 65 20 6c 6f 61 64 65 64 20 66 72 6f  s are loaded fro
0390: 6d 20 64 69 73 6b 2c 20 74 68 65 20 62 75 66 66  m disk, the buff
03a0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
03b0: 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  are loaded into 
03c0: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  has the followin
03d0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  g number of byte
03e0: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 61 74 20  s of padding at 
03f0: 74 68 65 20 65 6e 64 20 0a 2a 2a 20 6f 66 20 69  the end .** of i
0400: 74 2e 20 69 2e 65 2e 20 69 66 20 61 20 66 75 6c  t. i.e. if a ful
0410: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64  l-text index nod
0420: 65 20 69 73 20 39 30 30 20 62 79 74 65 73 20 69  e is 900 bytes i
0430: 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 61 20 62  n size, then a b
0440: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 39 32 30 20  uffer.** of 920 
0450: 62 79 74 65 73 20 69 73 20 61 6c 6c 6f 63 61 74  bytes is allocat
0460: 65 64 20 66 6f 72 20 69 74 2e 0a 2a 2a 0a 2a 2a  ed for it..**.**
0470: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
0480: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 70 6f   if we have a po
0490: 69 6e 74 65 72 20 69 6e 74 6f 20 61 20 62 75 66  inter into a buf
04a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
04b0: 6f 64 65 20 64 61 74 61 2c 0a 2a 2a 20 69 74 20  ode data,.** it 
04c0: 69 73 20 61 6c 77 61 79 73 20 73 61 66 65 20 74  is always safe t
04d0: 6f 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f  o read up to two
04e0: 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20 69 74   varints from it
04f0: 20 77 69 74 68 6f 75 74 20 72 69 73 6b 69 6e 67   without risking
0500: 20 61 6e 0a 2a 2a 20 6f 76 65 72 72 65 61 64 2c   an.** overread,
0510: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64   even if the nod
0520: 65 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70  e data is corrup
0530: 74 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ted..*/.#define 
0540: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
0550: 47 20 28 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  G (FTS3_VARINT_M
0560: 41 58 2a 32 29 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  AX*2)../*.** Und
0570: 65 72 20 63 65 72 74 61 69 6e 20 63 69 72 63 75  er certain circu
0580: 6d 73 74 61 6e 63 65 73 2c 20 62 2d 74 72 65 65  mstances, b-tree
0590: 20 6e 6f 64 65 73 20 28 64 6f 63 6c 69 73 74 73   nodes (doclists
05a0: 29 20 63 61 6e 20 62 65 20 6c 6f 61 64 65 64 20  ) can be loaded 
05b0: 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 69  into.** memory i
05c0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 69 6e 73  ncrementally ins
05d0: 74 65 61 64 20 6f 66 20 61 6c 6c 20 61 74 20 6f  tead of all at o
05e0: 6e 63 65 2e 20 54 68 69 73 20 63 61 6e 20 62 65  nce. This can be
05f0: 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
0600: 63 65 0a 2a 2a 20 77 69 6e 20 28 72 65 64 75 63  ce.** win (reduc
0610: 65 64 20 49 4f 20 61 6e 64 20 43 50 55 29 20 69  ed IO and CPU) i
0620: 66 20 53 51 4c 69 74 65 20 73 74 6f 70 73 20 63  f SQLite stops c
0630: 61 6c 6c 69 6e 67 20 74 68 65 20 76 69 72 74 75  alling the virtu
0640: 61 6c 20 74 61 62 6c 65 20 78 4e 65 78 74 28 29  al table xNext()
0650: 0a 2a 2a 20 6d 65 74 68 6f 64 20 62 65 66 6f 72  .** method befor
0660: 65 20 72 65 74 72 69 65 76 69 6e 67 20 61 6c 6c  e retrieving all
0670: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 28   query results (
0680: 61 73 20 6d 61 79 20 68 61 70 70 65 6e 2c 20 66  as may happen, f
0690: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69  or example,.** i
06a0: 66 20 61 20 71 75 65 72 79 20 68 61 73 20 61 20  f a query has a 
06b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 29 2e 0a 2a  LIMIT clause)..*
06c0: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c  *.** Incremental
06d0: 20 6c 6f 61 64 69 6e 67 20 69 73 20 75 73 65 64   loading is used
06e0: 20 66 6f 72 20 62 2d 74 72 65 65 20 6e 6f 64 65   for b-tree node
06f0: 73 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  s FTS3_NODE_CHUN
0700: 4b 5f 54 48 52 45 53 48 4f 4c 44 20 0a 2a 2a 20  K_THRESHOLD .** 
0710: 62 79 74 65 73 20 61 6e 64 20 6c 61 72 67 65 72  bytes and larger
0720: 2e 20 4e 6f 64 65 73 20 61 72 65 20 6c 6f 61 64  . Nodes are load
0730: 65 64 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20  ed in chunks of 
0740: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0750: 49 5a 45 20 62 79 74 65 73 2e 0a 2a 2a 20 54 68  IZE bytes..** Th
0760: 65 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  e code is writte
0770: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61  n so that the ha
0780: 72 64 20 6c 6f 77 65 72 2d 6c 69 6d 69 74 20 66  rd lower-limit f
0790: 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 73 65  or each of these
07a0: 20 76 61 6c 75 65 73 20 0a 2a 2a 20 69 73 20 31   values .** is 1
07b0: 2e 20 43 6c 65 61 72 6c 79 20 73 75 63 68 20 73  . Clearly such s
07c0: 6d 61 6c 6c 20 76 61 6c 75 65 73 20 77 6f 75 6c  mall values woul
07d0: 64 20 62 65 20 69 6e 65 66 66 69 63 69 65 6e 74  d be inefficient
07e0: 2c 20 62 75 74 20 63 61 6e 20 62 65 20 75 73 65  , but can be use
07f0: 66 75 6c 20 0a 2a 2a 20 66 6f 72 20 74 65 73 74  ful .** for test
0800: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
0810: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75  .** If this modu
0820: 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68  le is built with
0830: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66   SQLITE_TEST def
0840: 69 6e 65 64 2c 20 74 68 65 73 65 20 63 6f 6e 73  ined, these cons
0850: 74 61 6e 74 73 20 6d 61 79 0a 2a 2a 20 62 65 20  tants may.** be 
0860: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
0870: 6e 74 69 6d 65 20 66 6f 72 20 74 65 73 74 69 6e  ntime for testin
0880: 67 20 70 75 72 70 6f 73 65 73 2e 20 46 69 6c 65  g purposes. File
0890: 20 66 74 73 33 5f 74 65 73 74 2e 63 20 63 6f 6e   fts3_test.c con
08a0: 74 61 69 6e 73 0a 2a 2a 20 61 20 54 63 6c 20 69  tains.** a Tcl i
08b0: 6e 74 65 72 66 61 63 65 20 74 6f 20 72 65 61 64  nterface to read
08c0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 76   and write the v
08d0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  alues..*/.#ifdef
08e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
08f0: 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64 65 5f   test_fts3_node_
0900: 63 68 75 6e 6b 73 69 7a 65 20 3d 20 28 34 2a 31  chunksize = (4*1
0910: 30 32 34 29 3b 0a 69 6e 74 20 74 65 73 74 5f 66  024);.int test_f
0920: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74  ts3_node_chunk_t
0930: 68 72 65 73 68 6f 6c 64 20 3d 20 28 34 2a 31 30  hreshold = (4*10
0940: 32 34 29 2a 34 3b 0a 23 20 64 65 66 69 6e 65 20  24)*4;.# define 
0950: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0960: 49 5a 45 20 20 20 20 20 20 20 74 65 73 74 5f 66  IZE       test_f
0970: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 73 69  ts3_node_chunksi
0980: 7a 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33  ze.# define FTS3
0990: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45  _NODE_CHUNK_THRE
09a0: 53 48 4f 4c 44 20 74 65 73 74 5f 66 74 73 33 5f  SHOLD test_fts3_
09b0: 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74 68 72 65 73  node_chunk_thres
09c0: 68 6f 6c 64 0a 23 65 6c 73 65 0a 23 20 64 65 66  hold.#else.# def
09d0: 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48  ine FTS3_NODE_CH
09e0: 55 4e 4b 53 49 5a 45 20 28 34 2a 31 30 32 34 29  UNKSIZE (4*1024)
09f0: 20 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33 5f   .# define FTS3_
0a00: 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53  NODE_CHUNK_THRES
0a10: 48 4f 4c 44 20 28 46 54 53 33 5f 4e 4f 44 45 5f  HOLD (FTS3_NODE_
0a20: 43 48 55 4e 4b 53 49 5a 45 2a 34 29 0a 23 65 6e  CHUNKSIZE*4).#en
0a30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
0a40: 77 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  wo values that m
0a50: 61 79 20 62 65 20 6d 65 61 6e 69 6e 67 66 75 6c  ay be meaningful
0a60: 6c 79 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ly bound to the 
0a70: 3a 31 20 70 61 72 61 6d 65 74 65 72 20 69 6e 0a  :1 parameter in.
0a80: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 53 51  ** statements SQ
0a90: 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 20 61  L_REPLACE_STAT a
0aa0: 6e 64 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54  nd SQL_SELECT_ST
0ab0: 41 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  AT..*/.#define F
0ac0: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
0ad0: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0ae0: 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52  FTS_STAT_INCRMER
0af0: 47 45 48 49 4e 54 20 31 0a 23 64 65 66 69 6e 65  GEHINT 1.#define
0b00: 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
0b10: 43 52 4d 45 52 47 45 20 32 0a 0a 2f 2a 0a 2a 2a  CRMERGE 2../*.**
0b20: 20 49 66 20 46 54 53 5f 4c 4f 47 5f 4d 45 52 47   If FTS_LOG_MERG
0b30: 45 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 63  ES is defined, c
0b40: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
0b50: 29 20 74 6f 20 72 65 70 6f 72 74 20 65 61 63 68  ) to report each
0b60: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 61 6e   automatic.** an
0b70: 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  d incremental me
0b80: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68  rge operation th
0b90: 61 74 20 74 61 6b 65 73 20 70 6c 61 63 65 2e 20  at takes place. 
0ba0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
0bb0: 20 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 46   .** debugging F
0bc0: 54 53 20 6f 6e 6c 79 2c 20 69 74 20 73 68 6f 75  TS only, it shou
0bd0: 6c 64 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 62  ld not usually b
0be0: 65 20 74 75 72 6e 65 64 20 6f 6e 20 69 6e 20 70  e turned on in p
0bf0: 72 6f 64 75 63 74 69 6f 6e 0a 2a 2a 20 73 79 73  roduction.** sys
0c00: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tems..*/.#ifdef 
0c10: 46 54 53 33 5f 4c 4f 47 5f 4d 45 52 47 45 53 0a  FTS3_LOG_MERGES.
0c20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
0c30: 4c 6f 67 4d 65 72 67 65 28 69 6e 74 20 6e 4d 65  LogMerge(int nMe
0c40: 72 67 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  rge, sqlite3_int
0c50: 36 34 20 69 41 62 73 4c 65 76 65 6c 29 7b 0a 20  64 iAbsLevel){. 
0c60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
0c70: 49 54 45 5f 4f 4b 2c 20 22 25 64 2d 77 61 79 20  ITE_OK, "%d-way 
0c80: 6d 65 72 67 65 20 66 72 6f 6d 20 6c 65 76 65 6c  merge from level
0c90: 20 25 64 22 2c 20 6e 4d 65 72 67 65 2c 20 28 69   %d", nMerge, (i
0ca0: 6e 74 29 69 41 62 73 4c 65 76 65 6c 29 3b 0a 7d  nt)iAbsLevel);.}
0cb0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 66  .#else.#define f
0cc0: 74 73 33 4c 6f 67 4d 65 72 67 65 28 78 2c 20 79  ts3LogMerge(x, y
0cd0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64  ).#endif...typed
0ce0: 65 66 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e  ef struct Pendin
0cf0: 67 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73  gList PendingLis
0d00: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0d10: 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65  t SegmentNode Se
0d20: 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64  gmentNode;.typed
0d30: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e  ef struct Segmen
0d40: 74 57 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57  tWriter SegmentW
0d50: 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  riter;../*.** An
0d60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0d70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20   following data 
0d80: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
0d90: 64 20 74 6f 20 62 75 69 6c 64 20 64 6f 63 6c 69  d to build docli
0da0: 73 74 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  sts.** increment
0db0: 61 6c 6c 79 2e 20 53 65 65 20 66 75 6e 63 74 69  ally. See functi
0dc0: 6f 6e 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  on fts3PendingLi
0dd0: 73 74 41 70 70 65 6e 64 28 29 20 66 6f 72 20 64  stAppend() for d
0de0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63  etails..*/.struc
0df0: 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 7b 0a  t PendingList {.
0e00: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 63    int nData;.  c
0e10: 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e  har *aData;.  in
0e20: 74 20 6e 53 70 61 63 65 3b 0a 20 20 73 71 6c 69  t nSpace;.  sqli
0e30: 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 44  te3_int64 iLastD
0e40: 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ocid;.  sqlite3_
0e50: 69 6e 74 36 34 20 69 4c 61 73 74 43 6f 6c 3b 0a  int64 iLastCol;.
0e60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0e70: 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a 0a 2f  iLastPos;.};.../
0e80: 2a 0a 2a 2a 20 45 61 63 68 20 63 75 72 73 6f 72  *.** Each cursor
0e90: 20 68 61 73 20 61 20 28 70 6f 73 73 69 62 6c 79   has a (possibly
0ea0: 20 65 6d 70 74 79 29 20 6c 69 6e 6b 65 64 20 6c   empty) linked l
0eb0: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ist of the follo
0ec0: 77 69 6e 67 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  wing objects..*/
0ed0: 0a 73 74 72 75 63 74 20 46 74 73 33 44 65 66 65  .struct Fts3Defe
0ee0: 72 72 65 64 54 6f 6b 65 6e 20 7b 0a 20 20 46 74  rredToken {.  Ft
0ef0: 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
0f00: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a  Token;        /*
0f10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 72 72   Pointer to corr
0f20: 65 73 70 6f 6e 64 69 6e 67 20 65 78 70 72 20 74  esponding expr t
0f30: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oken */.  int iC
0f40: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
0f60: 75 6d 6e 20 74 6f 6b 65 6e 20 6d 75 73 74 20 6f  umn token must o
0f70: 63 63 75 72 20 69 6e 20 2a 2f 0a 20 20 46 74 73  ccur in */.  Fts
0f80: 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
0f90: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0fa0: 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
0fb0: 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
0fc0: 2a 2f 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  */.  PendingList
0fd0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
0fe0: 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
0ff0: 69 73 20 61 73 73 65 6d 62 6c 65 64 20 68 65 72  is assembled her
1000: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
1010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1020: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
1030: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1040: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d  through the term
1050: 73 20 6f 6e 0a 2a 2a 20 61 20 63 6f 6e 74 69 67  s on.** a contig
1060: 75 6f 75 73 20 73 65 74 20 6f 66 20 73 65 67 6d  uous set of segm
1070: 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20  ent b-tree leaf 
1080: 6e 6f 64 65 73 2e 20 41 6c 74 68 6f 75 67 68 20  nodes. Although 
1090: 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 0a 2a  the details of.*
10a0: 2a 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  * this structure
10b0: 20 61 72 65 20 6f 6e 6c 79 20 6d 61 6e 69 70 75   are only manipu
10c0: 6c 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e  lated by code in
10d0: 20 74 68 69 73 20 66 69 6c 65 2c 20 6f 70 61 71   this file, opaq
10e0: 75 65 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 6f 66  ue handles.** of
10f0: 20 74 79 70 65 20 46 74 73 33 53 65 67 52 65 61   type Fts3SegRea
1100: 64 65 72 2a 20 61 72 65 20 61 6c 73 6f 20 75 73  der* are also us
1110: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 66 74  ed by code in ft
1120: 73 33 2e 63 20 74 6f 20 69 74 65 72 61 74 65 20  s3.c to iterate 
1130: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 65 72 6d 73  through.** terms
1140: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 74   when querying t
1150: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
1160: 65 78 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  ex. See function
1170: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  s:.**.**   sqlit
1180: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e  e3Fts3SegReaderN
1190: 65 77 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ew().**   sqlite
11a0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
11b0: 65 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ee().**   sqlite
11c0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74  3Fts3SegReaderIt
11d0: 65 72 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20 4d 65  erate().**.** Me
11e0: 74 68 6f 64 73 20 75 73 65 64 20 74 6f 20 6d 61  thods used to ma
11f0: 6e 69 70 75 6c 61 74 65 20 46 74 73 33 53 65 67  nipulate Fts3Seg
1200: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
1210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1220: 65 67 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a  egReaderNext().*
1230: 2a 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65  *   fts3SegReade
1240: 72 46 69 72 73 74 44 6f 63 69 64 28 29 0a 2a 2a  rFirstDocid().**
1250: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
1260: 4e 65 78 74 44 6f 63 69 64 28 29 0a 2a 2f 0a 73  NextDocid().*/.s
1270: 74 72 75 63 74 20 46 74 73 33 53 65 67 52 65 61  truct Fts3SegRea
1280: 64 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78  der {.  int iIdx
1290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12b0: 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 2c 20 6f   within level, o
12c0: 72 20 30 78 37 46 46 46 46 46 46 46 20 66 6f 72  r 0x7FFFFFFF for
12d0: 20 50 54 20 2a 2f 0a 20 20 75 38 20 62 4c 6f 6f   PT */.  u8 bLoo
12e0: 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kup;            
12f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1300: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
1310: 6c 79 20 2a 2f 0a 20 20 75 38 20 72 6f 6f 74 4f  ly */.  u8 rootO
1320: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1340: 66 6f 72 20 61 20 72 6f 6f 74 2d 6f 6e 6c 79 20  for a root-only 
1350: 72 65 61 64 65 72 20 2a 2f 0a 0a 20 20 73 71 6c  reader */..  sql
1360: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1370: 74 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  tBlock;      /* 
1380: 52 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c  Rowid of first l
1390: 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61  eaf block to tra
13a0: 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  verse */.  sqlit
13b0: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
13c0: 64 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f  dBlock;    /* Ro
13d0: 77 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61  wid of final lea
13e0: 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65  f block to trave
13f0: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
1400: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
1410: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
1420: 64 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b  d of final block
1430: 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20   in segment (or 
1440: 30 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  0) */.  sqlite3_
1450: 69 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c  int64 iCurrentBl
1460: 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ock;    /* Curre
1470: 6e 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f  nt leaf block (o
1480: 72 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20  r 0) */..  char 
1490: 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  *aNode;         
14a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14b0: 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61  inter to node da
14c0: 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ta (or NULL) */.
14d0: 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20    int nNode;    
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
1500: 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72  fer at aNode (or
1510: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f   0) */.  int nPo
1520: 70 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20  pulate;         
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
1540: 30 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66  0, bytes of buff
1550: 65 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65  er aNode[] loade
1560: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  d */.  sqlite3_b
1570: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
1580: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
1590: 20 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64   NULL, blob hand
15a0: 6c 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20  le to read node 
15b0: 2a 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c  */..  Fts3HashEl
15c0: 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b  em **ppNextElem;
15d0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
15e0: 20 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52   set by fts3SegR
15f0: 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65  eaderNext(). The
1600: 73 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64  se may be read d
1610: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  irectly.  ** by 
1620: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79  the caller. They
1630: 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20   are valid from 
1640: 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74  the time Segment
1650: 52 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75  ReaderNew() retu
1660: 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53  rns.  ** until S
1670: 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74  egmentReaderNext
1680: 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1690: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
16a0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28  SQLITE_OK.  ** (
16b0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  i.e. SQLITE_DONE
16c0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  )..  */.  int nT
16d0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1700: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1710: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1740: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1750: 20 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63    int nTermAlloc
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1770: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1780: 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66  ize of zTerm buf
1790: 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  fer */.  char *a
17a0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17c0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f  ter to doclist o
17d0: 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
17e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1810: 64 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65  doclist in curre
1820: 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f  nt entry */..  /
1830: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
1850: 65 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61  ed by fts3SegRea
1860: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74  derNextDocid() t
1870: 6f 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20  o iterate .  ** 
1880: 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72  through the curr
1890: 65 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f  ent doclist (aDo
18a0: 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e  clist/nDoclist).
18b0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f  .  */.  char *pO
18c0: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74  ffsetList;.  int
18d0: 20 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20   nOffsetList;   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f0: 46 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70  For descending p
1900: 65 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65  ending seg-reade
1910: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c  rs only */.  sql
1920: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69  ite3_int64 iDoci
1930: 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66  d;.};..#define f
1940: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
1950: 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70  nding(p) ((p)->p
1960: 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64  pNextElem!=0).#d
1970: 65 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61  efine fts3SegRea
1980: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29  derIsRootOnly(p)
1990: 20 28 28 70 29 2d 3e 72 6f 6f 74 4f 6e 6c 79 21   ((p)->rootOnly!
19a0: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  =0)../*.** An in
19b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
19c0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
19d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 67   to create a seg
19e0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 20 74  ment b-tree in t
19f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
1a00: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 74  The internal det
1a10: 61 69 6c 73 20 6f 66 20 74 68 69 73 20 74 79 70  ails of this typ
1a20: 65 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73  e are only acces
1a30: 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f  sed by the.** fo
1a40: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
1a50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1a60: 65 67 57 72 69 74 65 72 41 64 64 28 29 0a 2a 2a  egWriterAdd().**
1a70: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72     fts3SegWriter
1a80: 46 6c 75 73 68 28 29 0a 2a 2a 20 20 20 66 74 73  Flush().**   fts
1a90: 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 29  3SegWriterFree()
1aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
1ab0: 6e 74 57 72 69 74 65 72 20 7b 0a 20 20 53 65 67  ntWriter {.  Seg
1ac0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 3b  mentNode *pTree;
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74 65 72  Pointer to inter
1af0: 69 6f 72 20 74 72 65 65 20 73 74 72 75 63 74 75  ior tree structu
1b00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
1b10: 69 6e 74 36 34 20 69 46 69 72 73 74 3b 20 20 20  int64 iFirst;   
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b30: 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65   slot in %_segme
1b40: 6e 74 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  nts written */. 
1b50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1b60: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
1b70: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
1b80: 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
1b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72   */.  char *zTer
1ba0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1bb0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1bc0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72   to previous ter
1bd0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
1be0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1c10: 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69   in zTerm */.  i
1c20: 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20  nt nMalloc;     
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63  * Size of malloc
1c50: 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61  'd buffer at zMa
1c60: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
1c70: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  zMalloc;        
1c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c            /* Mal
1c90: 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73  loc'd space (pos
1ca0: 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20  sibly) used for 
1cb0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
1cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ce0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  ze of allocation
1cf0: 20 61 74 20 61 44 61 74 61 20 2a 2f 0a 20 20 69   at aData */.  i
1d00: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
1d30: 69 6e 20 61 44 61 74 61 20 2a 2f 0a 20 20 63 68  in aData */.  ch
1d40: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 6c 6f 63   Pointer to bloc
1d70: 6b 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  k from malloc() 
1d80: 2a 2f 0a 20 20 69 36 34 20 6e 4c 65 61 66 44 61  */.  i64 nLeafDa
1d90: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1da0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db0: 66 20 62 79 74 65 73 20 6f 66 20 6c 65 61 66 20  f bytes of leaf 
1dc0: 64 61 74 61 20 77 72 69 74 74 65 6e 20 2a 2f 0a  data written */.
1dd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53  };../*.** Type S
1de0: 65 67 6d 65 6e 74 4e 6f 64 65 20 69 73 20 75 73  egmentNode is us
1df0: 65 64 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ed by the follow
1e00: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
1e10: 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  ons to create.**
1e20: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 70 61   the interior pa
1e30: 72 74 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  rt of the segmen
1e40: 74 20 62 2b 2d 74 72 65 65 20 73 74 72 75 63 74  t b+-tree struct
1e50: 75 72 65 73 20 28 65 76 65 72 79 74 68 69 6e 67  ures (everything
1e60: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c   except.** the l
1e70: 65 61 66 20 6e 6f 64 65 73 29 2e 20 54 68 65 73  eaf nodes). Thes
1e80: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
1e90: 74 79 70 65 20 61 72 65 20 6f 6e 6c 79 20 65 76  type are only ev
1ea0: 65 72 20 75 73 65 64 20 62 79 20 63 6f 64 65 0a  er used by code.
1eb0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 66 74  ** within the ft
1ec0: 73 33 53 65 67 57 72 69 74 65 72 58 58 58 28 29  s3SegWriterXXX()
1ed0: 20 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74   family of funct
1ee0: 69 6f 6e 73 20 64 65 73 63 72 69 62 65 64 20 61  ions described a
1ef0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74  bove..**.**   ft
1f00: 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 29 0a  s3NodeAddTerm().
1f10: 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 57 72 69  **   fts3NodeWri
1f20: 74 65 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f  te().**   fts3No
1f30: 64 65 46 72 65 65 28 29 0a 2a 2a 0a 2a 2a 20 57  deFree().**.** W
1f40: 68 65 6e 20 61 20 62 2b 74 72 65 65 20 69 73 20  hen a b+tree is 
1f50: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1f60: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
1f70: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1f80: 20 6d 65 72 67 65 0a 2a 2a 20 6f 72 20 74 68 65   merge.** or the
1f90: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
1fa0: 61 62 6c 65 20 62 65 69 6e 67 20 66 6c 75 73 68  able being flush
1fb0: 65 64 29 2c 20 6c 65 61 76 65 73 20 61 72 65 20  ed), leaves are 
1fc0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fd0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
1fe0: 6c 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  le as soon as th
1ff0: 65 79 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ey are completel
2000: 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 65  y populated. The
2010: 20 69 6e 74 65 72 69 6f 72 20 6f 66 0a 2a 2a 20   interior of.** 
2020: 74 68 65 20 74 72 65 65 20 69 73 20 61 73 73 65  the tree is asse
2030: 6d 62 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  mbled in memory 
2040: 61 6e 64 20 77 72 69 74 74 65 6e 20 6f 75 74 20  and written out 
2050: 6f 6e 6c 79 20 6f 6e 63 65 20 61 6c 6c 20 6c 65  only once all le
2060: 61 76 65 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  aves have.** bee
2070: 6e 20 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20  n populated and 
2080: 73 74 6f 72 65 64 2e 20 54 68 69 73 20 69 73 20  stored. This is 
2090: 4f 6b 2c 20 61 73 20 74 68 65 20 62 2b 2d 74 72  Ok, as the b+-tr
20a0: 65 65 20 66 61 6e 6f 75 74 20 69 73 20 75 73 75  ee fanout is usu
20b0: 61 6c 6c 79 0a 2a 2a 20 76 65 72 79 20 6c 61 72  ally.** very lar
20c0: 67 65 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ge, meaning that
20d0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6f 66   the interior of
20e0: 20 74 68 65 20 74 72 65 65 20 63 6f 6e 73 75 6d   the tree consum
20f0: 65 73 20 72 65 6c 61 74 69 76 65 6c 79 20 0a 2a  es relatively .*
2100: 2a 20 6c 69 74 74 6c 65 20 6d 65 6d 6f 72 79 2e  * little memory.
2110: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
2120: 6e 74 4e 6f 64 65 20 7b 0a 20 20 53 65 67 6d 65  ntNode {.  Segme
2130: 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b  ntNode *pParent;
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2150: 72 65 6e 74 20 6e 6f 64 65 20 28 6f 72 20 4e 55  rent node (or NU
2160: 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65  LL for root node
2170: 29 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  ) */.  SegmentNo
2180: 64 65 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20  de *pRight;     
2190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
21a0: 72 20 74 6f 20 72 69 67 68 74 2d 73 69 62 6c 69  r to right-sibli
21b0: 6e 67 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  ng */.  SegmentN
21c0: 6f 64 65 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20  ode *pLeftmost; 
21d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
21e0: 65 72 20 74 6f 20 6c 65 66 74 2d 6d 6f 73 74 20  er to left-most 
21f0: 6e 6f 64 65 20 6f 66 20 74 68 69 73 20 64 65 70  node of this dep
2200: 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74  th */.  int nEnt
2210: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
2220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2230: 72 20 6f 66 20 74 65 72 6d 73 20 77 72 69 74 74  r of terms writt
2240: 65 6e 20 74 6f 20 6e 6f 64 65 20 73 6f 20 66 61  en to node so fa
2250: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  r */.  char *zTe
2260: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2270: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2280: 72 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65  r to previous te
2290: 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  rm buffer */.  i
22a0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22d0: 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  s in zTerm */.  
22e0: 69 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20  int nMalloc;    
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f  /* Size of mallo
2310: 63 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d  c'd buffer at zM
2320: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
2330: 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20  *zMalloc;       
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2350: 6c 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f  lloc'd space (po
2360: 73 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72  ssibly) used for
2370: 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20   zTerm */.  int 
2380: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23a0: 79 74 65 73 20 6f 66 20 76 61 6c 69 64 20 64 61  ytes of valid da
23b0: 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  ta so far */.  c
23c0: 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e0: 2a 20 4e 6f 64 65 20 64 61 74 61 20 2a 2f 0a 7d  * Node data */.}
23f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 20 76  ;../*.** Valid v
2400: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 73 65  alues for the se
2410: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2420: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 0a   fts3SqlStmt()..
2430: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  */.#define SQL_D
2440: 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 20 20 20  ELETE_CONTENT   
2450: 20 20 20 20 20 20 20 20 20 20 30 0a 23 64 65 66            0.#def
2460: 69 6e 65 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59  ine SQL_IS_EMPTY
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c     1.#define SQL
2490: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
24a0: 45 4e 54 20 20 20 20 20 20 20 20 20 32 20 0a 23  ENT         2 .#
24b0: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
24c0: 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 20 20  E_ALL_SEGMENTS  
24d0: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
24e0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
24f0: 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20 34  EGDIR          4
2500: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
2510: 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 20  ETE_ALL_DOCSIZE 
2520: 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
2530: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  e SQL_DELETE_ALL
2540: 5f 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20  _STAT           
2550: 20 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53   6.#define SQL_S
2560: 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59  ELECT_CONTENT_BY
2570: 5f 52 4f 57 49 44 20 20 20 20 37 0a 23 64 65 66  _ROWID    7.#def
2580: 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  ine SQL_NEXT_SEG
2590: 4d 45 4e 54 5f 49 4e 44 45 58 20 20 20 20 20 20  MENT_INDEX      
25a0: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 53 51 4c     8.#define SQL
25b0: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53  _INSERT_SEGMENTS
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23 64              9.#d
25d0: 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53  efine SQL_NEXT_S
25e0: 45 47 4d 45 4e 54 53 5f 49 44 20 20 20 20 20 20  EGMENTS_ID      
25f0: 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53      10.#define S
2600: 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49 52  QL_INSERT_SEGDIR
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 31 0a               11.
2620: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
2630: 43 54 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20  CT_LEVEL        
2640: 20 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65        12.#define
2650: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
2660: 4c 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 31  L_RANGE        1
2670: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  3.#define SQL_SE
2680: 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e 54  LECT_LEVEL_COUNT
2690: 20 20 20 20 20 20 20 20 31 34 0a 23 64 65 66 69          14.#defi
26a0: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45  ne SQL_SELECT_SE
26b0: 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 20 20  GDIR_MAX_LEVEL  
26c0: 20 31 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   15.#define SQL_
26d0: 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45  DELETE_SEGDIR_LE
26e0: 56 45 4c 20 20 20 20 20 20 20 31 36 0a 23 64 65  VEL       16.#de
26f0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2700: 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 20 20  SEGMENTS_RANGE  
2710: 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 53 51     17.#define SQ
2720: 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54  L_CONTENT_INSERT
2730: 20 20 20 20 20 20 20 20 20 20 20 20 31 38 0a 23              18.#
2740: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2750: 45 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  E_DOCSIZE       
2760: 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20       19.#define 
2770: 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
2780: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 32 30  IZE           20
2790: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c  .#define SQL_SEL
27a0: 45 43 54 5f 44 4f 43 53 49 5a 45 20 20 20 20 20  ECT_DOCSIZE     
27b0: 20 20 20 20 20 20 20 32 31 0a 23 64 65 66 69 6e         21.#defin
27c0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  e SQL_SELECT_STA
27d0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
27e0: 32 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52  22.#define SQL_R
27f0: 45 50 4c 41 43 45 5f 53 54 41 54 20 20 20 20 20  EPLACE_STAT     
2800: 20 20 20 20 20 20 20 20 20 32 33 0a 0a 23 64 65           23..#de
2810: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
2820: 41 4c 4c 5f 50 52 45 46 49 58 5f 4c 45 56 45 4c  ALL_PREFIX_LEVEL
2830: 20 20 20 32 34 0a 23 64 65 66 69 6e 65 20 53 51     24.#define SQ
2840: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 54 45 52  L_DELETE_ALL_TER
2850: 4d 53 5f 53 45 47 44 49 52 20 20 20 32 35 0a 23  MS_SEGDIR   25.#
2860: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2870: 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 20 20  E_SEGDIR_RANGE  
2880: 20 20 20 20 20 32 36 0a 23 64 65 66 69 6e 65 20       26.#define 
2890: 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c  SQL_SELECT_ALL_L
28a0: 41 4e 47 49 44 20 20 20 20 20 20 20 20 20 32 37  ANGID         27
28b0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 46 49 4e  .#define SQL_FIN
28c0: 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 20 20 20  D_MERGE_LEVEL   
28d0: 20 20 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e         28.#defin
28e0: 65 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e  e SQL_MAX_LEAF_N
28f0: 4f 44 45 5f 45 53 54 49 4d 41 54 45 20 20 20 20  ODE_ESTIMATE    
2900: 32 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  29.#define SQL_D
2910: 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54  ELETE_SEGDIR_ENT
2920: 52 59 20 20 20 20 20 20 20 33 30 0a 23 64 65 66  RY       30.#def
2930: 69 6e 65 20 53 51 4c 5f 53 48 49 46 54 5f 53 45  ine SQL_SHIFT_SE
2940: 47 44 49 52 5f 45 4e 54 52 59 20 20 20 20 20 20  GDIR_ENTRY      
2950: 20 20 33 31 0a 23 64 65 66 69 6e 65 20 53 51 4c    31.#define SQL
2960: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 20 20  _SELECT_SEGDIR  
2970: 20 20 20 20 20 20 20 20 20 20 20 33 32 0a 23 64             32.#d
2980: 65 66 69 6e 65 20 53 51 4c 5f 43 48 4f 4d 50 5f  efine SQL_CHOMP_
2990: 53 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20  SEGDIR          
29a0: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 53      33.#define S
29b0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
29c0: 50 45 4e 44 41 42 4c 45 20 20 20 20 20 33 34 0a  PENDABLE     34.
29d0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
29e0: 43 54 5f 49 4e 44 45 58 45 53 20 20 20 20 20 20  CT_INDEXES      
29f0: 20 20 20 20 20 20 33 35 0a 23 64 65 66 69 6e 65        35.#define
2a00: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45   SQL_SELECT_MXLE
2a10: 56 45 4c 20 20 20 20 20 20 20 20 20 20 20 20 33  VEL            3
2a20: 36 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  6..#define SQL_S
2a30: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47  ELECT_LEVEL_RANG
2a40: 45 32 20 20 20 20 20 20 20 33 37 0a 23 64 65 66  E2       37.#def
2a50: 69 6e 65 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c  ine SQL_UPDATE_L
2a60: 45 56 45 4c 5f 49 44 58 20 20 20 20 20 20 20 20  EVEL_IDX        
2a70: 20 20 33 38 0a 23 64 65 66 69 6e 65 20 53 51 4c    38.#define SQL
2a80: 5f 55 50 44 41 54 45 5f 4c 45 56 45 4c 20 20 20  _UPDATE_LEVEL   
2a90: 20 20 20 20 20 20 20 20 20 20 20 33 39 0a 0a 2f             39../
2aa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ab0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62  on is used to ob
2ac0: 74 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70  tain an SQLite p
2ad0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2ae0: 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20  t handle.** for 
2af0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64  the statement id
2b00: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
2b10: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2b20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
2b30: 2a 2a 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ** *pp is set to
2b40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
2b50: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
2b60: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2b70: 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
2b80: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
2b90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ba0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
2bb0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
2bc0: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70  * If argument ap
2bd0: 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Val is not NULL,
2be0: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f   then it must po
2bf0: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
2c00: 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74  with.** at least
2c10: 20 61 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73   as many entries
2c20: 20 61 73 20 74 68 65 20 72 65 71 75 65 73 74 65   as the requeste
2c30: 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  d statement has 
2c40: 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  bound .** parame
2c50: 74 65 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73  ters. The values
2c60: 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68   are bound to th
2c70: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72  e statements par
2c80: 61 6d 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a  ameters before.*
2c90: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  * returning..*/.
2ca0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
2cb0: 71 6c 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61  qlStmt(.  Fts3Ta
2cc0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
2cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
2ce0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
2cf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74  e */.  int eStmt
2d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2d20: 20 74 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e   the SQL_XXX con
2d30: 73 74 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a  stants above */.
2d40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2d50: 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
2d60: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
2d70: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ent handle */.  
2d80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2d90: 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2da0: 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e  /* Values to bin
2db0: 64 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a  d to statement *
2dc0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
2dd0: 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f  r *azSql[] = {./
2de0: 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 0  */  "DELETE
2df0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e   FROM %Q.'%q_con
2e00: 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69  tent' WHERE rowi
2e10: 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f  d = ?",./* 1  */
2e20: 20 20 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58    "SELECT NOT EX
2e30: 49 53 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69  ISTS(SELECT doci
2e40: 64 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f  d FROM %Q.'%q_co
2e50: 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77  ntent' WHERE row
2e60: 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a  id!=?)",./* 2  *
2e70: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /  "DELETE FROM 
2e80: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22  %Q.'%q_content'"
2e90: 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c  ,./* 3  */  "DEL
2ea0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2eb0: 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34  segments'",./* 4
2ec0: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52    */  "DELETE FR
2ed0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
2ee0: 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44  '",./* 5  */  "D
2ef0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
2f00: 71 5f 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20  q_docsize'",./* 
2f10: 36 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  6  */  "DELETE F
2f20: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27  ROM %Q.'%q_stat'
2f30: 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45  ",./* 7  */  "SE
2f40: 4c 45 43 54 20 25 73 20 57 48 45 52 45 20 72 6f  LECT %s WHERE ro
2f50: 77 69 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f  wid=?",./* 8  */
2f60: 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43    "SELECT (SELEC
2f70: 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20  T max(idx) FROM 
2f80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
2f90: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20  HERE level = ?) 
2fa0: 2b 20 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20  + 1",./* 9  */  
2fb0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51  "REPLACE INTO %Q
2fc0: 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62  .'%q_segments'(b
2fd0: 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56  lockid, block) V
2fe0: 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a  ALUES(?, ?)",./*
2ff0: 20 31 30 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   10 */  "SELECT 
3000: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54  coalesce((SELECT
3010: 20 6d 61 78 28 62 6c 6f 63 6b 69 64 29 20 46 52   max(blockid) FR
3020: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  OM %Q.'%q_segmen
3030: 74 73 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f  ts') + 1, 1)",./
3040: 2a 20 31 31 20 2a 2f 20 20 22 52 45 50 4c 41 43  * 11 */  "REPLAC
3050: 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65  E INTO %Q.'%q_se
3060: 67 64 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f  gdir' VALUES(?,?
3070: 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20  ,?,?,?,?)",..   
3080: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
3090: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64   segments in ord
30a0: 65 72 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  er from oldest t
30b0: 6f 20 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20  o newest.*/ ./* 
30c0: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69  12 */  "SELECT i
30d0: 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c  dx, start_block,
30e0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
30f0: 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f  k, end_block, ro
3100: 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ot ".           
3110: 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65   "FROM %Q.'%q_se
3120: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3130: 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69  l = ? ORDER BY i
3140: 64 78 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a  dx ASC",./* 13 *
3150: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
3160: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
3170: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
3180: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
31a0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
31b0: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  ' WHERE level BE
31c0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20  TWEEN ? AND ?". 
31d0: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
31e0: 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c  R BY level DESC,
31f0: 20 69 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31   idx ASC",../* 1
3200: 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f  4 */  "SELECT co
3210: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27  unt(*) FROM %Q.'
3220: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3230: 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20   level = ?",./* 
3240: 31 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d  15 */  "SELECT m
3250: 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25  ax(level) FROM %
3260: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
3270: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
3280: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20  N ? AND ?",../* 
3290: 31 36 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  16 */  "DELETE F
32a0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
32b0: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  r' WHERE level =
32c0: 20 3f 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22   ?",./* 17 */  "
32d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
32e0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45  %q_segments' WHE
32f0: 52 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45  RE blockid BETWE
3300: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20  EN ? AND ?",./* 
3310: 31 38 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49  18 */  "INSERT I
3320: 4e 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  NTO %Q.'%q_conte
3330: 6e 74 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c  nt' VALUES(%s)",
3340: 0a 2f 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45  ./* 19 */  "DELE
3350: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64  TE FROM %Q.'%q_d
3360: 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f  ocsize' WHERE do
3370: 63 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20  cid = ?",./* 20 
3380: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54  */  "REPLACE INT
3390: 4f 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  O %Q.'%q_docsize
33a0: 27 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a  ' VALUES(?,?)",.
33b0: 2f 2a 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43  /* 21 */  "SELEC
33c0: 54 20 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27  T size FROM %Q.'
33d0: 25 71 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52  %q_docsize' WHER
33e0: 45 20 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32  E docid=?",./* 2
33f0: 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61  2 */  "SELECT va
3400: 6c 75 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  lue FROM %Q.'%q_
3410: 73 74 61 74 27 20 57 48 45 52 45 20 69 64 3d 3f  stat' WHERE id=?
3420: 22 2c 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45  ",./* 23 */  "RE
3430: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25  PLACE INTO %Q.'%
3440: 71 5f 73 74 61 74 27 20 56 41 4c 55 45 53 28 3f  q_stat' VALUES(?
3450: 2c 3f 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20  ,?)",./* 24 */  
3460: 22 22 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22  "",./* 25 */  ""
3470: 2c 0a 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c  ,../* 26 */ "DEL
3480: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
3490: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
34a0: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
34b0: 44 20 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22  D ?",./* 27 */ "
34c0: 53 45 4c 45 43 54 20 3f 20 55 4e 49 4f 4e 20 53  SELECT ? UNION S
34d0: 45 4c 45 43 54 20 6c 65 76 65 6c 20 2f 20 28 31  ELECT level / (1
34e0: 30 32 34 20 2a 20 3f 29 20 46 52 4f 4d 20 25 51  024 * ?) FROM %Q
34f0: 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c 0a 0a  .'%q_segdir'",..
3500: 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
3510: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  t is used to det
3520: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 6c 65 76  ermine which lev
3530: 65 6c 20 74 6f 20 72 65 61 64 20 74 68 65 20 69  el to read the i
3540: 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 77 68 65  nput from.** whe
3550: 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 6e 20  n performing an 
3560: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
3570: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  e. It returns th
3580: 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  e absolute level
3590: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74 68   number.** of th
35a0: 65 20 6f 6c 64 65 73 74 20 6c 65 76 65 6c 20 69  e oldest level i
35b0: 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63 6f  n the db that co
35c0: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
35d0: 3f 20 73 65 67 6d 65 6e 74 73 2e 20 4f 72 2c 0a  ? segments. Or,.
35e0: 2a 2a 20 69 66 20 6e 6f 20 6c 65 76 65 6c 20 69  ** if no level i
35f0: 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
3600: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
3610: 61 6e 20 3f 20 73 65 67 6d 65 6e 74 73 2c 20 74  an ? segments, t
3620: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
3630: 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 72 6f 77  returns zero row
3640: 73 2e 20 20 2a 2f 0a 2f 2a 20 32 38 20 2a 2f 20  s.  */./* 28 */ 
3650: 22 53 45 4c 45 43 54 20 6c 65 76 65 6c 20 46 52  "SELECT level FR
3660: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
3670: 27 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c  ' GROUP BY level
3680: 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29   HAVING count(*)
3690: 3e 3d 3f 22 0a 20 20 20 20 20 20 20 20 20 22 20  >=?".         " 
36a0: 20 4f 52 44 45 52 20 42 59 20 28 6c 65 76 65 6c   ORDER BY (level
36b0: 20 25 25 20 31 30 32 34 29 20 41 53 43 20 4c 49   %% 1024) ASC LI
36c0: 4d 49 54 20 31 22 2c 0a 0a 2f 2a 20 45 73 74 69  MIT 1",../* Esti
36d0: 6d 61 74 65 20 74 68 65 20 75 70 70 65 72 20 6c  mate the upper l
36e0: 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
36f0: 65 72 20 6f 66 20 6c 65 61 66 20 6e 6f 64 65 73  er of leaf nodes
3700: 20 69 6e 20 61 20 6e 65 77 20 73 65 67 6d 65 6e   in a new segmen
3710: 74 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  t.** created by 
3720: 6d 65 72 67 69 6e 67 20 74 68 65 20 6f 6c 64 65  merging the olde
3730: 73 74 20 3a 32 20 73 65 67 6d 65 6e 74 73 20 66  st :2 segments f
3740: 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  rom absolute lev
3750: 65 6c 20 3a 31 2e 20 53 65 65 20 0a 2a 2a 20 66  el :1. See .** f
3760: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 46  unction sqlite3F
3770: 74 73 33 49 6e 63 72 6d 65 72 67 65 28 29 20 66  ts3Incrmerge() f
3780: 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f 0a  or details.  */.
3790: 2f 2a 20 32 39 20 2a 2f 20 22 53 45 4c 45 43 54  /* 29 */ "SELECT
37a0: 20 32 20 2a 20 74 6f 74 61 6c 28 31 20 2b 20 6c   2 * total(1 + l
37b0: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
37c0: 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 20 22  - start_block) "
37d0: 0a 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f  .         "  FRO
37e0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
37f0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
3800: 20 41 4e 44 20 69 64 78 20 3c 20 3f 22 2c 0a 0a   AND idx < ?",..
3810: 2f 2a 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  /* SQL_DELETE_SE
3820: 47 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20  GDIR_ENTRY.**   
3830: 44 65 6c 65 74 65 20 74 68 65 20 25 5f 73 65 67  Delete the %_seg
3840: 64 69 72 20 65 6e 74 72 79 20 6f 6e 20 61 62 73  dir entry on abs
3850: 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 20 77  olute level :1 w
3860: 69 74 68 20 69 6e 64 65 78 20 3a 32 2e 20 20 2a  ith index :2.  *
3870: 2f 0a 2f 2a 20 33 30 20 2a 2f 20 22 44 45 4c 45  /./* 30 */ "DELE
3880: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  TE FROM %Q.'%q_s
3890: 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76  egdir' WHERE lev
38a0: 65 6c 20 3d 20 3f 20 41 4e 44 20 69 64 78 20 3d  el = ? AND idx =
38b0: 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 48 49   ?",../* SQL_SHI
38c0: 46 54 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 0a  FT_SEGDIR_ENTRY.
38d0: 2a 2a 20 20 20 4d 6f 64 69 66 79 20 74 68 65 20  **   Modify the 
38e0: 69 64 78 20 76 61 6c 75 65 20 66 6f 72 20 74 68  idx value for th
38f0: 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20 69  e segment with i
3900: 64 78 3d 3a 33 20 6f 6e 20 61 62 73 6f 6c 75 74  dx=:3 on absolut
3910: 65 20 6c 65 76 65 6c 20 3a 32 0a 2a 2a 20 20 20  e level :2.**   
3920: 74 6f 20 3a 31 2e 20 20 2a 2f 0a 2f 2a 20 33 31  to :1.  */./* 31
3930: 20 2a 2f 20 22 55 50 44 41 54 45 20 25 51 2e 27   */ "UPDATE %Q.'
3940: 25 71 5f 73 65 67 64 69 72 27 20 53 45 54 20 69  %q_segdir' SET i
3950: 64 78 20 3d 20 3f 20 57 48 45 52 45 20 6c 65 76  dx = ? WHERE lev
3960: 65 6c 3d 3f 20 41 4e 44 20 69 64 78 3d 3f 22 2c  el=? AND idx=?",
3970: 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c 45 43 54 5f  ../* SQL_SELECT_
3980: 53 45 47 44 49 52 0a 2a 2a 20 20 20 52 65 61 64  SEGDIR.**   Read
3990: 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20   a single entry 
39a0: 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69  from the %_segdi
39b0: 72 20 74 61 62 6c 65 2e 20 54 68 65 20 65 6e 74  r table. The ent
39c0: 72 79 20 66 72 6f 6d 20 61 62 73 6f 6c 75 74 65  ry from absolute
39d0: 20 0a 2a 2a 20 20 20 6c 65 76 65 6c 20 3a 31 20   .**   level :1 
39e0: 77 69 74 68 20 69 6e 64 65 78 20 76 61 6c 75 65  with index value
39f0: 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33 32 20 2a   :2.  */./* 32 *
3a00: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
3a10: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
3a20: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
3a30: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
3a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
3a50: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
3a60: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  ' WHERE level = 
3a70: 3f 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a  ? AND idx = ?",.
3a80: 0a 2f 2a 20 53 51 4c 5f 43 48 4f 4d 50 5f 53 45  ./* SQL_CHOMP_SE
3a90: 47 44 49 52 0a 2a 2a 20 20 20 55 70 64 61 74 65  GDIR.**   Update
3aa0: 20 74 68 65 20 73 74 61 72 74 5f 62 6c 6f 63 6b   the start_block
3ab0: 20 28 3a 31 29 20 61 6e 64 20 72 6f 6f 74 20 28   (:1) and root (
3ac0: 3a 32 29 20 66 69 65 6c 64 73 20 6f 66 20 74 68  :2) fields of th
3ad0: 65 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20  e %_segdir.**   
3ae0: 65 6e 74 72 79 20 6c 6f 63 61 74 65 64 20 6f 6e  entry located on
3af0: 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
3b00: 3a 33 20 77 69 74 68 20 69 6e 64 65 78 20 3a 34  :3 with index :4
3b10: 2e 20 20 2a 2f 0a 2f 2a 20 33 33 20 2a 2f 20 20  .  */./* 33 */  
3b20: 22 55 50 44 41 54 45 20 25 51 2e 27 25 71 5f 73  "UPDATE %Q.'%q_s
3b30: 65 67 64 69 72 27 20 53 45 54 20 73 74 61 72 74  egdir' SET start
3b40: 5f 62 6c 6f 63 6b 20 3d 20 3f 2c 20 72 6f 6f 74  _block = ?, root
3b50: 20 3d 20 3f 22 0a 20 20 20 20 20 20 20 20 20 20   = ?".          
3b60: 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 20 3d    "WHERE level =
3b70: 20 3f 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c   ? AND idx = ?",
3b80: 0a 0a 2f 2a 20 53 51 4c 5f 53 45 47 4d 45 4e 54  ../* SQL_SEGMENT
3b90: 5f 49 53 5f 41 50 50 45 4e 44 41 42 4c 45 0a 2a  _IS_APPENDABLE.*
3ba0: 2a 20 20 20 52 65 74 75 72 6e 20 61 20 73 69 6e  *   Return a sin
3bb0: 67 6c 65 20 72 6f 77 20 69 66 20 74 68 65 20 73  gle row if the s
3bc0: 65 67 6d 65 6e 74 20 77 69 74 68 20 65 6e 64 5f  egment with end_
3bd0: 62 6c 6f 63 6b 3d 3f 20 69 73 20 61 70 70 65 6e  block=? is appen
3be0: 64 61 62 6c 65 2e 20 4f 72 0a 2a 2a 20 20 20 6e  dable. Or.**   n
3bf0: 6f 20 72 6f 77 73 20 6f 74 68 65 72 77 69 73 65  o rows otherwise
3c00: 2e 20 20 2a 2f 0a 2f 2a 20 33 34 20 2a 2f 20 20  .  */./* 34 */  
3c10: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 25  "SELECT 1 FROM %
3c20: 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 20  Q.'%q_segments' 
3c30: 57 48 45 52 45 20 62 6c 6f 63 6b 69 64 3d 3f 20  WHERE blockid=? 
3c40: 41 4e 44 20 62 6c 6f 63 6b 20 49 53 20 4e 55 4c  AND block IS NUL
3c50: 4c 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c 45  L",../* SQL_SELE
3c60: 43 54 5f 49 4e 44 45 58 45 53 0a 2a 2a 20 20 20  CT_INDEXES.**   
3c70: 52 65 74 75 72 6e 20 74 68 65 20 6c 69 73 74 20  Return the list 
3c80: 6f 66 20 76 61 6c 69 64 20 73 65 67 6d 65 6e 74  of valid segment
3c90: 20 69 6e 64 65 78 65 73 20 66 6f 72 20 61 62 73   indexes for abs
3ca0: 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3f 20 20 2a  olute level ?  *
3cb0: 2f 0a 2f 2a 20 33 35 20 2a 2f 20 20 22 53 45 4c  /./* 35 */  "SEL
3cc0: 45 43 54 20 69 64 78 20 46 52 4f 4d 20 25 51 2e  ECT idx FROM %Q.
3cd0: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
3ce0: 45 20 6c 65 76 65 6c 3d 3f 20 4f 52 44 45 52 20  E level=? ORDER 
3cf0: 42 59 20 31 20 41 53 43 22 2c 0a 0a 2f 2a 20 53  BY 1 ASC",../* S
3d00: 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45 56 45  QL_SELECT_MXLEVE
3d10: 4c 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 74 68  L.**   Return th
3d20: 65 20 6c 61 72 67 65 73 74 20 72 65 6c 61 74 69  e largest relati
3d30: 76 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20  ve level in the 
3d40: 46 54 53 20 69 6e 64 65 78 20 6f 72 20 69 6e 64  FTS index or ind
3d50: 65 78 65 73 2e 20 20 2a 2f 0a 2f 2a 20 33 36 20  exes.  */./* 36 
3d60: 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28  */  "SELECT max(
3d70: 20 6c 65 76 65 6c 20 25 25 20 31 30 32 34 20 29   level %% 1024 )
3d80: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
3d90: 64 69 72 27 22 2c 0a 0a 20 20 20 20 20 20 20 20  dir'",..        
3da0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 73 65 67 6d    /* Return segm
3db0: 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 66 72  ents in order fr
3dc0: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
3dd0: 65 73 74 2e 2a 2f 20 0a 2f 2a 20 33 37 20 2a 2f  est.*/ ./* 37 */
3de0: 20 20 22 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c    "SELECT level,
3df0: 20 69 64 78 2c 20 65 6e 64 5f 62 6c 6f 63 6b 20   idx, end_block 
3e00: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46  ".            "F
3e10: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
3e20: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42  r' WHERE level B
3e30: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 22  ETWEEN ? AND ? "
3e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52  .            "OR
3e50: 44 45 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53  DER BY level DES
3e60: 43 2c 20 69 64 78 20 41 53 43 22 2c 0a 0a 20 20  C, idx ASC",..  
3e70: 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74          /* Updat
3e80: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65  e statements use
3e90: 64 20 77 68 69 6c 65 20 70 72 6f 6d 6f 74 69 6e  d while promotin
3ea0: 67 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  g segments */./*
3eb0: 20 33 38 20 2a 2f 20 20 22 55 50 44 41 54 45 20   38 */  "UPDATE 
3ec0: 4f 52 20 46 41 49 4c 20 25 51 2e 27 25 71 5f 73  OR FAIL %Q.'%q_s
3ed0: 65 67 64 69 72 27 20 53 45 54 20 6c 65 76 65 6c  egdir' SET level
3ee0: 3d 2d 31 2c 69 64 78 3d 3f 20 22 0a 20 20 20 20  =-1,idx=? ".    
3ef0: 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 6c          "WHERE l
3f00: 65 76 65 6c 3d 3f 20 41 4e 44 20 69 64 78 3d 3f  evel=? AND idx=?
3f10: 22 2c 0a 2f 2a 20 33 39 20 2a 2f 20 20 22 55 50  ",./* 39 */  "UP
3f20: 44 41 54 45 20 4f 52 20 46 41 49 4c 20 25 51 2e  DATE OR FAIL %Q.
3f30: 27 25 71 5f 73 65 67 64 69 72 27 20 53 45 54 20  '%q_segdir' SET 
3f40: 6c 65 76 65 6c 3d 3f 20 57 48 45 52 45 20 6c 65  level=? WHERE le
3f50: 76 65 6c 3d 2d 31 22 0a 0a 20 20 7d 3b 0a 20 20  vel=-1"..  };.  
3f60: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3f70: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  OK;.  sqlite3_st
3f80: 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 61 73  mt *pStmt;..  as
3f90: 73 65 72 74 28 20 53 69 7a 65 6f 66 41 72 72 61  sert( SizeofArra
3fa0: 79 28 61 7a 53 71 6c 29 3d 3d 53 69 7a 65 6f 66  y(azSql)==Sizeof
3fb0: 41 72 72 61 79 28 70 2d 3e 61 53 74 6d 74 29 20  Array(p->aStmt) 
3fc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 53 74  );.  assert( eSt
3fd0: 6d 74 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 61  mt<SizeofArray(a
3fe0: 7a 53 71 6c 29 20 26 26 20 65 53 74 6d 74 3e 3d  zSql) && eStmt>=
3ff0: 30 20 29 3b 0a 20 20 0a 20 20 70 53 74 6d 74 20  0 );.  .  pStmt 
4000: 3d 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74  = p->aStmt[eStmt
4010: 5d 3b 0a 20 20 69 66 28 20 21 70 53 74 6d 74 20  ];.  if( !pStmt 
4020: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
4030: 6c 3b 0a 20 20 20 20 69 66 28 20 65 53 74 6d 74  l;.    if( eStmt
4040: 3d 3d 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e  ==SQL_CONTENT_IN
4050: 53 45 52 54 20 29 7b 0a 20 20 20 20 20 20 7a 53  SERT ){.      zS
4060: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
4070: 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74  intf(azSql[eStmt
4080: 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e  ], p->zDb, p->zN
4090: 61 6d 65 2c 20 70 2d 3e 7a 57 72 69 74 65 45 78  ame, p->zWriteEx
40a0: 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  prlist);.    }el
40b0: 73 65 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51  se if( eStmt==SQ
40c0: 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54  L_SELECT_CONTENT
40d0: 5f 42 59 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  _BY_ROWID ){.   
40e0: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
40f0: 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b  3_mprintf(azSql[
4100: 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 52 65 61 64  eStmt], p->zRead
4110: 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d  Exprlist);.    }
4120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
4130: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4140: 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c  tf(azSql[eStmt],
4150: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
4160: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
4170: 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  ( !zSql ){.     
4180: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4190: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
41a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
41b0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
41c0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
41d0: 53 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  Stmt, NULL);.   
41e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
41f0: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  zSql);.      ass
4200: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
4210: 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 20 29  OK || pStmt==0 )
4220: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 53 74 6d 74  ;.      p->aStmt
4230: 5b 65 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74 3b  [eStmt] = pStmt;
4240: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4250: 20 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 69 6e   apVal ){.    in
4260: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61  t i;.    int nPa
4270: 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  ram = sqlite3_bi
4280: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
4290: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 66  nt(pStmt);.    f
42a0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
42b0: 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 50 61 72 61  TE_OK && i<nPara
42c0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  m; i++){.      r
42d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
42e0: 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 2b  _value(pStmt, i+
42f0: 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20  1, apVal[i]);.  
4300: 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 20 3d 20    }.  }.  *pp = 
4310: 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  pStmt;.  return 
4320: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  rc;.}...static i
4330: 6e 74 20 66 74 73 33 53 65 6c 65 63 74 44 6f 63  nt fts3SelectDoc
4340: 73 69 7a 65 28 0a 20 20 46 74 73 33 54 61 62 6c  size(.  Fts3Tabl
4350: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
4360: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
4370: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
4380: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4390: 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20  iDocid,         
43a0: 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 62 69    /* Docid to bi
43b0: 6e 64 20 66 6f 72 20 53 51 4c 5f 53 45 4c 45 43  nd for SQL_SELEC
43c0: 54 5f 44 4f 43 53 49 5a 45 20 2a 2f 0a 20 20 73  T_DOCSIZE */.  s
43d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
43e0: 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f  Stmt           /
43f0: 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74  * OUT: Statement
4400: 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20   handle */.){.  
4410: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
4420: 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
4430: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 72 65 71  /* Statement req
4440: 75 65 73 74 65 64 20 66 72 6f 6d 20 66 74 73 33  uested from fts3
4450: 53 71 6c 53 74 6d 74 28 29 20 2a 2f 0a 20 20 69  SqlStmt() */.  i
4460: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4480: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
4490: 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
44a0: 53 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f 53  Stmt(pTab, SQL_S
44b0: 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 2c 20 26  ELECT_DOCSIZE, &
44c0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
44d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
44e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
44f0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
4500: 31 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  1, iDocid);.    
4510: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
4520: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  p(pStmt);.    if
4530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
4540: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   || sqlite3_colu
4550: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30  mn_type(pStmt, 0
4560: 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  )!=SQLITE_BLOB )
4570: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
4580: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
4590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
45a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
45b0: 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  = FTS_CORRUPT_VT
45c0: 41 42 3b 0a 20 20 20 20 20 20 70 53 74 6d 74 20  AB;.      pStmt 
45d0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
45e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
45f0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
4600: 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74  .  *ppStmt = pSt
4610: 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  mt;.  return rc;
4620: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
4630: 74 73 33 53 65 6c 65 63 74 44 6f 63 74 6f 74 61  ts3SelectDoctota
4640: 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  l(.  Fts3Table *
4650: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
4660: 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
4670: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
4680: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
4690: 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f  Stmt           /
46a0: 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74  * OUT: Statement
46b0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20   handle */.){.  
46c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
46d0: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
46e0: 63 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  c;.  rc = fts3Sq
46f0: 6c 53 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f  lStmt(pTab, SQL_
4700: 53 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53  SELECT_STAT, &pS
4710: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
4720: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4730: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
4740: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46  _int(pStmt, 1, F
4750: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
4760: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
4770: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 21 3d  e3_step(pStmt)!=
4780: 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20  SQLITE_ROW.     
4790: 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
47a0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29  n_type(pStmt, 0)
47b0: 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20  !=SQLITE_BLOB.  
47c0: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
47d0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
47e0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
47f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
4800: 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54  rc = FTS_CORRUPT
4810: 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 70 53 74  _VTAB;.      pSt
4820: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
4830: 7d 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53  }.  *ppStmt = pS
4840: 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  tmt;.  return rc
4850: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
4860: 46 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a  Fts3SelectDocsiz
4870: 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
4880: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
4890: 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
48a0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
48b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
48c0: 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  cid,           /
48d0: 2a 20 44 6f 63 69 64 20 74 6f 20 72 65 61 64 20  * Docid to read 
48e0: 73 69 7a 65 20 64 61 74 61 20 66 6f 72 20 2a 2f  size data for */
48f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4900: 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20  **ppStmt        
4910: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65     /* OUT: State
4920: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29  ment handle */.)
4930: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53  {.  return fts3S
4940: 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 70 54 61  electDocsize(pTa
4950: 62 2c 20 69 44 6f 63 69 64 2c 20 70 70 53 74 6d  b, iDocid, ppStm
4960: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d  t);.}../*.** Sim
4970: 69 6c 61 72 20 74 6f 20 66 74 73 33 53 71 6c 53  ilar to fts3SqlS
4980: 74 6d 74 28 29 2e 20 45 78 63 65 70 74 2c 20 61  tmt(). Except, a
4990: 66 74 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65  fter binding the
49a0: 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 0a 2a   parameters in.*
49b0: 2a 20 61 72 72 61 79 20 61 70 56 61 6c 5b 5d 20  * array apVal[] 
49c0: 74 6f 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  to the SQL state
49d0: 6d 65 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  ment identified 
49e0: 62 79 20 65 53 74 6d 74 2c 20 74 68 65 20 73 74  by eStmt, the st
49f0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65 78  atement.** is ex
4a00: 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ecuted..**.** Re
4a10: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
4a20: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
4a30: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
4a40: 20 65 78 65 63 75 74 65 64 2c 20 6f 72 20 61 6e   executed, or an
4a50: 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  .** SQLite error
4a60: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
4a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4a80: 66 74 73 33 53 71 6c 45 78 65 63 28 0a 20 20 69  fts3SqlExec(.  i
4a90: 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20  nt *pRC,        
4aa0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
4ab0: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33  t code */.  Fts3
4ac0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
4ad0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53 33       /* The FTS3
4ae0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4af0: 65 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20  eStmt,          
4b00: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
4b10: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 76   statement to ev
4b20: 61 6c 75 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69  aluate */.  sqli
4b30: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
4b40: 6c 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  l    /* Paramete
4b50: 72 73 20 74 6f 20 62 69 6e 64 20 2a 2f 0a 29 7b  rs to bind */.){
4b60: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4b70: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
4b80: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
4b90: 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74  eturn;.  rc = ft
4ba0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 65 53 74  s3SqlStmt(p, eSt
4bb0: 6d 74 2c 20 26 70 53 74 6d 74 2c 20 61 70 56 61  mt, &pStmt, apVa
4bc0: 6c 29 3b 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  l); .  if( rc==S
4bd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4be0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
4bf0: 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  mt);.    rc = sq
4c00: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
4c10: 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d  t);.  }.  *pRC =
4c20: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
4c30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e 73  his function ens
4c40: 75 72 65 73 20 74 68 61 74 20 74 68 65 20 63 61  ures that the ca
4c50: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
4c60: 64 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  d an exclusive .
4c70: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
4c80: 74 61 62 6c 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  table-lock on th
4c90: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
4ca0: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
4cb0: 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 77 72  ed before .** wr
4cc0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
4cd0: 65 20 66 74 73 33 20 74 61 62 6c 65 2e 20 49 66  e fts3 table. If
4ce0: 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6e 6f   this lock is no
4cf0: 74 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74  t acquired first
4d00: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
4d10: 6c 6c 65 72 20 6d 61 79 20 65 6e 64 20 75 70 20  ller may end up 
4d20: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61  attempting to ta
4d30: 6b 65 20 74 68 69 73 20 6c 6f 63 6b 20 61 73 20  ke this lock as 
4d40: 70 61 72 74 20 6f 66 20 63 6f 6d 6d 69 74 74 69  part of committi
4d50: 6e 67 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  ng.** a transact
4d60: 69 6f 6e 2c 20 63 61 75 73 69 6e 67 20 53 51 4c  ion, causing SQL
4d70: 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ite to return SQ
4d80: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 6f 72 20 0a  LITE_LOCKED or .
4d90: 2a 2a 20 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  ** LOCKED_SHARED
4da0: 43 41 43 48 45 74 6f 20 61 20 43 4f 4d 4d 49 54  CACHEto a COMMIT
4db0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
4dc0: 49 74 20 69 73 20 62 65 73 74 20 74 6f 20 61 76  It is best to av
4dd0: 6f 69 64 20 74 68 69 73 20 62 65 63 61 75 73 65  oid this because
4de0: 20 69 66 20 46 54 53 33 20 72 65 74 75 72 6e 73   if FTS3 returns
4df0: 20 61 6e 79 20 65 72 72 6f 72 20 77 68 65 6e 20   any error when 
4e00: 0a 2a 2a 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  .** committing a
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
4e20: 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
4e30: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
4e40: 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 20 41 6e 64  ed back. .** And
4e50: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 77 68 61   this is not wha
4e60: 74 20 75 73 65 72 73 20 65 78 70 65 63 74 20 77  t users expect w
4e70: 68 65 6e 20 74 68 65 79 20 67 65 74 20 53 51 4c  hen they get SQL
4e80: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
4e90: 44 43 41 43 48 45 2e 20 0a 2a 2a 20 49 74 20 63  DCACHE. .** It c
4ea0: 61 6e 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  an still happen 
4eb0: 69 66 20 74 68 65 20 75 73 65 72 20 6c 6f 63 6b  if the user lock
4ec0: 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  s the underlying
4ed0: 20 74 61 62 6c 65 73 20 64 69 72 65 63 74 6c 79   tables directly
4ee0: 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20   .** instead of 
4ef0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 6d 20 76  accessing them v
4f00: 69 61 20 46 54 53 2e 0a 2a 2f 0a 73 74 61 74 69  ia FTS..*/.stati
4f10: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 6c  c int fts3Writel
4f20: 6f 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ock(Fts3Table *p
4f30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4f40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66  LITE_OK;.  .  if
4f50: 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
4f60: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
4f70: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
4f80: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
4f90: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c  lStmt(p, SQL_DEL
4fa0: 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c  ETE_SEGDIR_LEVEL
4fb0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
4fc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4fd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
4fe0: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
4ff0: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
5000: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
5010: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
5020: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
5030: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tmt);.    }.  }.
5040: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5050: 0a 2f 2a 0a 2a 2a 20 46 54 53 20 6d 61 69 6e 74  ./*.** FTS maint
5060: 61 69 6e 73 20 61 20 73 65 70 61 72 61 74 65 20  ains a separate 
5070: 69 6e 64 65 78 65 73 20 66 6f 72 20 65 61 63 68  indexes for each
5080: 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 28 61 20   language-id (a 
5090: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 29 2e  32-bit integer).
50a0: 0a 2a 2a 20 57 69 74 68 69 6e 20 65 61 63 68 20  .** Within each 
50b0: 6c 61 6e 67 75 61 67 65 20 69 64 2c 20 61 20 73  language id, a s
50c0: 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 69 73  eparate index is
50d0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 74 6f 20 73   maintained to s
50e0: 74 6f 72 65 20 74 68 65 0a 2a 2a 20 64 6f 63 75  tore the.** docu
50f0: 6d 65 6e 74 20 74 65 72 6d 73 2c 20 61 6e 64 20  ment terms, and 
5100: 65 61 63 68 20 63 6f 6e 66 69 67 75 72 65 64 20  each configured 
5110: 70 72 65 66 69 78 20 73 69 7a 65 20 28 63 6f 6e  prefix size (con
5120: 66 69 67 75 72 65 64 20 74 68 65 20 46 54 53 20  figured the FTS 
5130: 0a 2a 2a 20 22 70 72 65 66 69 78 3d 22 20 6f 70  .** "prefix=" op
5140: 74 69 6f 6e 29 2e 20 41 6e 64 20 65 61 63 68 20  tion). And each 
5150: 69 6e 64 65 78 20 63 6f 6e 73 69 73 74 73 20 6f  index consists o
5160: 66 20 6d 75 6c 74 69 70 6c 65 20 6c 65 76 65 6c  f multiple level
5170: 73 20 28 22 72 65 6c 61 74 69 76 65 0a 2a 2a 20  s ("relative.** 
5180: 6c 65 76 65 6c 73 22 29 2e 0a 2a 2a 0a 2a 2a 20  levels")..**.** 
5190: 41 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  All three of the
51a0: 73 65 20 76 61 6c 75 65 73 20 28 74 68 65 20 6c  se values (the l
51b0: 61 6e 67 75 61 67 65 20 69 64 2c 20 74 68 65 20  anguage id, the 
51c0: 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 61  specific index a
51d0: 6e 64 20 74 68 65 0a 2a 2a 20 6c 65 76 65 6c 20  nd the.** level 
51e0: 77 69 74 68 69 6e 20 74 68 65 20 69 6e 64 65 78  within the index
51f0: 29 20 61 72 65 20 65 6e 63 6f 64 65 64 20 69 6e  ) are encoded in
5200: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
5210: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a  values stored.**
5220: 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   in the %_segdir
5230: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2e 20   table on disk. 
5240: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5250: 20 75 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   used to convert
5260: 20 74 68 72 65 65 0a 2a 2a 20 73 65 70 61 72 61   three.** separa
5270: 74 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 76 61 6c  te component val
5280: 75 65 73 20 69 6e 74 6f 20 74 68 65 20 73 69 6e  ues into the sin
5290: 67 6c 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  gle 64-bit integ
52a0: 65 72 20 76 61 6c 75 65 20 74 68 61 74 0a 2a 2a  er value that.**
52b0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
52c0: 71 75 65 72 79 20 74 68 65 20 25 5f 73 65 67 64  query the %_segd
52d0: 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ir table..**.** 
52e0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 65 61  Specifically, ea
52f0: 63 68 20 6c 61 6e 67 75 61 67 65 2d 69 64 2f 69  ch language-id/i
5300: 6e 64 65 78 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ndex combination
5310: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 31 30   is allocated 10
5320: 32 34 20 0a 2a 2a 20 36 34 2d 62 69 74 20 69 6e  24 .** 64-bit in
5330: 74 65 67 65 72 20 6c 65 76 65 6c 20 76 61 6c 75  teger level valu
5340: 65 73 20 28 22 61 62 73 6f 6c 75 74 65 20 6c 65  es ("absolute le
5350: 76 65 6c 73 22 29 2e 20 54 68 65 20 6d 61 69 6e  vels"). The main
5360: 20 74 65 72 6d 73 20 69 6e 64 65 78 0a 2a 2a 20   terms index.** 
5370: 66 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20  for language-id 
5380: 30 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 76 61  0 is allocate va
5390: 6c 75 65 73 20 30 2d 31 30 32 33 2e 20 54 68 65  lues 0-1023. The
53a0: 20 66 69 72 73 74 20 70 72 65 66 69 78 20 69 6e   first prefix in
53b0: 64 65 78 0a 2a 2a 20 28 69 66 20 61 6e 79 29 20  dex.** (if any) 
53c0: 66 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20  for language-id 
53d0: 30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 76  0 is allocated v
53e0: 61 6c 75 65 73 20 31 30 32 34 2d 32 30 34 37 2e  alues 1024-2047.
53f0: 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 4c   And so on..** L
5400: 61 6e 67 75 61 67 65 20 31 20 69 6e 64 65 78 65  anguage 1 indexe
5410: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
5420: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
5430: 6f 77 69 6e 67 20 6c 61 6e 67 75 61 67 65 20 30  owing language 0
5440: 2e 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20 66 6f 72 20  ..**.** So, for 
5450: 61 20 73 79 73 74 65 6d 20 77 69 74 68 20 6e 50  a system with nP
5460: 72 65 66 69 78 20 70 72 65 66 69 78 20 69 6e 64  refix prefix ind
5470: 65 78 65 73 20 63 6f 6e 66 69 67 75 72 65 64 2c  exes configured,
5480: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a   the block of.**
5490: 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73   absolute levels
54a0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
54b0: 73 20 74 6f 20 6c 61 6e 67 75 61 67 65 2d 69 64  s to language-id
54c0: 20 69 4c 61 6e 67 69 64 20 61 6e 64 20 69 6e 64   iLangid and ind
54d0: 65 78 20 0a 2a 2a 20 69 49 6e 64 65 78 20 73 74  ex .** iIndex st
54e0: 61 72 74 73 20 61 74 20 61 62 73 6f 6c 75 74 65  arts at absolute
54f0: 20 6c 65 76 65 6c 20 28 28 69 4c 61 6e 67 69 64   level ((iLangid
5500: 20 2a 20 28 6e 50 72 65 66 69 78 2b 31 29 20 2b   * (nPrefix+1) +
5510: 20 69 49 6e 64 65 78 29 20 2a 20 31 30 32 34 29   iIndex) * 1024)
5520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
5530: 74 65 33 5f 69 6e 74 36 34 20 67 65 74 41 62 73  te3_int64 getAbs
5540: 6f 6c 75 74 65 4c 65 76 65 6c 28 0a 20 20 46 74  oluteLevel(.  Ft
5550: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5570: 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
5580: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  le */.  int iLan
5590: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
55a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
55b0: 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  age id */.  int 
55c0: 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  iIndex,         
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
55e0: 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64 65  ndex in p->aInde
55f0: 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  x[] */.  int iLe
5600: 76 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  vel             
5610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
5620: 6c 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  l of segments */
5630: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
5640: 74 36 34 20 69 42 61 73 65 3b 20 20 20 20 20 20  t64 iBase;      
5650: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
5660: 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 66 6f  bsolute level fo
5670: 72 20 69 4c 61 6e 67 69 64 2f 69 49 6e 64 65 78  r iLangid/iIndex
5680: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 4c   */.  assert( iL
5690: 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73  angid>=0 );.  as
56a0: 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e  sert( p->nIndex>
56b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
56c0: 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
56d0: 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
56e0: 0a 20 20 69 42 61 73 65 20 3d 20 28 28 73 71 6c  .  iBase = ((sql
56f0: 69 74 65 33 5f 69 6e 74 36 34 29 69 4c 61 6e 67  ite3_int64)iLang
5700: 69 64 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 20 2b  id * p->nIndex +
5710: 20 69 49 6e 64 65 78 29 20 2a 20 46 54 53 33 5f   iIndex) * FTS3_
5720: 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 3b  SEGDIR_MAXLEVEL;
5730: 0a 20 20 72 65 74 75 72 6e 20 69 42 61 73 65 20  .  return iBase 
5740: 2b 20 69 4c 65 76 65 6c 3b 0a 7d 0a 0a 2f 2a 0a  + iLevel;.}../*.
5750: 2a 2a 20 53 65 74 20 2a 70 70 53 74 6d 74 20 74  ** Set *ppStmt t
5760: 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  o a statement ha
5770: 6e 64 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  ndle that may be
5780: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5790: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
57a0: 72 6f 77 73 20 69 6e 20 74 68 65 20 25 5f 73 65  rows in the %_se
57b0: 67 64 69 72 20 74 61 62 6c 65 2c 20 66 72 6f 6d  gdir table, from
57c0: 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73   oldest to newes
57d0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
57e0: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
57f0: 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72  TE_OK. If an err
5800: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
5810: 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74  preparing the st
5820: 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a 20 72 65 74  atement, .** ret
5830: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
5840: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
5850: 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  There is only ev
5860: 65 72 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  er one instance 
5870: 6f 66 20 74 68 69 73 20 53 51 4c 20 73 74 61 74  of this SQL stat
5880: 65 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 64 20 66  ement compiled f
5890: 6f 72 0a 2a 2a 20 65 61 63 68 20 46 54 53 33 20  or.** each FTS3 
58a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
58b0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
58c0: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
58d0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
58e0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
58f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 69 64 78  :.**.**   0: idx
5900: 0a 2a 2a 20 20 20 31 3a 20 73 74 61 72 74 5f 62  .**   1: start_b
5910: 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a 20 6c 65 61  lock.**   2: lea
5920: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a  ves_end_block.**
5930: 20 20 20 33 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a     3: end_block.
5940: 2a 2a 20 20 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a  **   4: root.*/.
5950: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 41  int sqlite3Fts3A
5960: 6c 6c 53 65 67 64 69 72 73 28 0a 20 20 46 74 73  llSegdirs(.  Fts
5970: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5990: 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20  FTS3 table */.  
59a0: 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59c0: 2f 2a 20 4c 61 6e 67 75 61 67 65 20 62 65 69 6e  /* Language bein
59d0: 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 69  g queried */.  i
59e0: 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a00: 2a 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61  * Index for p->a
5a10: 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Index[] */.  int
5a20: 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a40: 4c 65 76 65 6c 20 74 6f 20 73 65 6c 65 63 74 20  Level to select 
5a50: 28 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 29  (relative level)
5a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
5a70: 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
5a80: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f        /* OUT: Co
5a90: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
5aa0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
5ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5ac0: 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 61  *pStmt = 0;..  a
5ad0: 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46  ssert( iLevel==F
5ae0: 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
5af0: 4c 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30 20 29  L || iLevel>=0 )
5b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ;.  assert( iLev
5b10: 65 6c 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  el<FTS3_SEGDIR_M
5b20: 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73  AXLEVEL );.  ass
5b30: 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
5b40: 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
5b50: 65 78 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65  ex );..  if( iLe
5b60: 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  vel<0 ){.    /* 
5b70: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25  "SELECT * FROM %
5b80: 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65  _segdir WHERE le
5b90: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
5ba0: 44 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e  D ? ORDER BY ...
5bb0: 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  " */.    rc = ft
5bc0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
5bd0: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41  _SELECT_LEVEL_RA
5be0: 4e 47 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  NGE, &pStmt, 0);
5bf0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5c00: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
5c10: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
5c20: 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65  t64(pStmt, 1, ge
5c30: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
5c40: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
5c50: 78 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 73 71  x, 0));.      sq
5c60: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
5c70: 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20  (pStmt, 2, .    
5c80: 20 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74        getAbsolut
5c90: 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
5ca0: 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f  d, iIndex, FTS3_
5cb0: 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d  SEGDIR_MAXLEVEL-
5cc0: 31 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  1).      );.    
5cd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
5ce0: 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  * "SELECT * FROM
5cf0: 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
5d00: 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44 45 52 20  level = ? ORDER 
5d10: 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72  BY ..." */.    r
5d20: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
5d30: 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45  p, SQL_SELECT_LE
5d40: 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
5d50: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5d60: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
5d70: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
5d80: 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65  t64(pStmt, 1, ge
5d90: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
5da0: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
5db0: 78 2c 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20  x,iLevel));.    
5dc0: 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 6d 74 20  }.  }.  *ppStmt 
5dd0: 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72  = pStmt;.  retur
5de0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
5df0: 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20  Append a single 
5e00: 76 61 72 69 6e 74 20 74 6f 20 61 20 50 65 6e 64  varint to a Pend
5e10: 69 6e 67 4c 69 73 74 20 62 75 66 66 65 72 2e 20  ingList buffer. 
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5e30: 75 72 6e 65 64 0a 2a 2a 20 69 66 20 73 75 63 63  urned.** if succ
5e40: 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
5e50: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
5e60: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
5e70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
5e80: 6c 73 6f 20 73 65 72 76 65 73 20 74 6f 20 61 6c  lso serves to al
5e90: 6c 6f 63 61 74 65 20 74 68 65 20 50 65 6e 64 69  locate the Pendi
5ea0: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65  ngList structure
5eb0: 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 46 6f 72 20   itself..** For 
5ec0: 65 78 61 6d 70 6c 65 2c 20 74 6f 20 63 72 65 61  example, to crea
5ed0: 74 65 20 61 20 6e 65 77 20 50 65 6e 64 69 6e 67  te a new Pending
5ee0: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 63  List structure c
5ef0: 6f 6e 74 61 69 6e 69 6e 67 20 74 77 6f 0a 2a 2a  ontaining two.**
5f00: 20 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20   varints:.**.** 
5f10: 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70    PendingList *p
5f20: 20 3d 20 30 3b 0a 2a 2a 20 20 20 66 74 73 33 50   = 0;.**   fts3P
5f30: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
5f40: 56 61 72 69 6e 74 28 26 70 2c 20 31 29 3b 0a 2a  Varint(&p, 1);.*
5f50: 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  *   fts3PendingL
5f60: 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28  istAppendVarint(
5f70: 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73 74 61 74 69  &p, 2);.*/.stati
5f80: 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e  c int fts3Pendin
5f90: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
5fa0: 74 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  t(.  PendingList
5fb0: 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
5fc0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
5fd0: 50 6f 69 6e 74 65 72 20 74 6f 20 50 65 6e 64 69  Pointer to Pendi
5fe0: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 20 2a 2f  ngList struct */
5ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6000: 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20   i              
6010: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61     /* Value to a
6020: 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
6030: 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73  .){.  PendingLis
6040: 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 0a 20 20 2f  t *p = *pp;..  /
6050: 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 67 72  * Allocate or gr
6060: 6f 77 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69  ow the PendingLi
6070: 73 74 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  st as required. 
6080: 2a 2f 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  */.  if( !p ){. 
6090: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d     p = sqlite3_m
60a0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 29  alloc(sizeof(*p)
60b0: 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66 28   + 100);.    if(
60c0: 20 21 70 20 29 7b 0a 20 20 20 20 20 20 72 65 74   !p ){.      ret
60d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
60e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
60f0: 53 70 61 63 65 20 3d 20 31 30 30 3b 0a 20 20 20  Space = 100;.   
6100: 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61   p->aData = (cha
6110: 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70  r *)&p[1];.    p
6120: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ->nData = 0;.  }
6130: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e  .  else if( p->n
6140: 44 61 74 61 2b 46 54 53 33 5f 56 41 52 49 4e 54  Data+FTS3_VARINT
6150: 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53 70 61 63 65  _MAX+1>p->nSpace
6160: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   ){.    int nNew
6170: 20 3d 20 70 2d 3e 6e 53 70 61 63 65 20 2a 20 32   = p->nSpace * 2
6180: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
6190: 33 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  3_realloc(p, siz
61a0: 65 6f 66 28 2a 70 29 20 2b 20 6e 4e 65 77 29 3b  eof(*p) + nNew);
61b0: 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20  .    if( !p ){. 
61c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
61d0: 65 28 2a 70 70 29 3b 0a 20 20 20 20 20 20 2a 70  e(*pp);.      *p
61e0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  p = 0;.      ret
61f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
6200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
6210: 53 70 61 63 65 20 3d 20 6e 4e 65 77 3b 0a 20 20  Space = nNew;.  
6220: 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68    p->aData = (ch
6230: 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 7d 0a  ar *)&p[1];.  }.
6240: 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
6250: 20 6e 65 77 20 73 65 72 69 61 6c 69 7a 65 64 20   new serialized 
6260: 76 61 72 69 6e 74 20 74 6f 20 74 68 65 20 65 6e  varint to the en
6270: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 20 2a  d of the list. *
6280: 2f 0a 20 20 70 2d 3e 6e 44 61 74 61 20 2b 3d 20  /.  p->nData += 
6290: 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
62a0: 72 69 6e 74 28 26 70 2d 3e 61 44 61 74 61 5b 70  rint(&p->aData[p
62b0: 2d 3e 6e 44 61 74 61 5d 2c 20 69 29 3b 0a 20 20  ->nData], i);.  
62c0: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
62d0: 61 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 2a 70 70  a] = '\0';.  *pp
62e0: 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   = p;.  return S
62f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6300: 2a 2a 20 41 64 64 20 61 20 64 6f 63 69 64 2f 63  ** Add a docid/c
6310: 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69 6f 6e 20 65  olumn/position e
6320: 6e 74 72 79 20 74 6f 20 61 20 50 65 6e 64 69 6e  ntry to a Pendin
6330: 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  gList structure.
6340: 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20   Non-zero.** is 
6350: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
6360: 73 74 72 75 63 74 75 72 65 20 69 73 20 73 71 6c  structure is sql
6370: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 65 64 20 61  ite3_realloced a
6380: 73 20 70 61 72 74 20 6f 66 20 61 64 64 69 6e 67  s part of adding
6390: 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 2e 20 4f  .** the entry. O
63a0: 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e 0a  therwise, zero..
63b0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
63c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
63d0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
63e0: 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65  ITE_NOMEM before
63f0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 5a   returning..** Z
6400: 65 72 6f 20 69 73 20 61 6c 77 61 79 73 20 72 65  ero is always re
6410: 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
6420: 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
6430: 69 66 20 6e 6f 20 4f 4f 4d 20 65 72 72 6f 72 20  if no OOM error 
6440: 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
6450: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
6460: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6470: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6480: 41 70 70 65 6e 64 28 0a 20 20 50 65 6e 64 69 6e  Append(.  Pendin
6490: 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20  gList **pp,     
64a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
64b0: 4f 55 54 3a 20 50 65 6e 64 69 6e 67 4c 69 73 74  OUT: PendingList
64c0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
64d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
64e0: 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ocid,           
64f0: 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20 65 6e 74  /* Docid for ent
6500: 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 73  ry to add */.  s
6510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 6f  qlite3_int64 iCo
6520: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
6530: 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 65 6e 74  * Column for ent
6540: 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 73  ry to add */.  s
6550: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f  qlite3_int64 iPo
6560: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
6570: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 65  * Position of te
6580: 72 6d 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  rm for entry to 
6590: 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  add */.  int *pR
65a0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
65b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
65c0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
65d0: 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  ){.  PendingList
65e0: 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 6e 74   *p = *pp;.  int
65f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6600: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 20 7c  ..  assert( !p |
6610: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 3c  | p->iLastDocid<
6620: 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20 69 66  =iDocid );..  if
6630: 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74  ( !p || p->iLast
6640: 44 6f 63 69 64 21 3d 69 44 6f 63 69 64 20 29 7b  Docid!=iDocid ){
6650: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
6660: 36 34 20 69 44 65 6c 74 61 20 3d 20 69 44 6f 63  64 iDelta = iDoc
6670: 69 64 20 2d 20 28 70 20 3f 20 70 2d 3e 69 4c 61  id - (p ? p->iLa
6680: 73 74 44 6f 63 69 64 20 3a 20 30 29 3b 0a 20 20  stDocid : 0);.  
6690: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
66a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 44 61 74   assert( p->nDat
66b0: 61 3c 70 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20  a<p->nSpace );. 
66c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
66d0: 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 3d  aData[p->nData]=
66e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 );.      p->n
66f0: 44 61 74 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Data++;.    }.  
6700: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6710: 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69  =(rc = fts3Pendi
6720: 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
6730: 6e 74 28 26 70 2c 20 69 44 65 6c 74 61 29 29 20  nt(&p, iDelta)) 
6740: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65  ){.      goto pe
6750: 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f  ndinglistappend_
6760: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
6770: 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 2d 31 3b  ->iLastCol = -1;
6780: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73  .    p->iLastPos
6790: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 69 4c 61   = 0;.    p->iLa
67a0: 73 74 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64  stDocid = iDocid
67b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
67c0: 3e 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 43 6f  >0 && p->iLastCo
67d0: 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 69  l!=iCol ){.    i
67e0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
67f0: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  c = fts3PendingL
6800: 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28  istAppendVarint(
6810: 26 70 2c 20 31 29 29 0a 20 20 20 20 20 7c 7c 20  &p, 1)).     || 
6820: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6830: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6840: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6850: 20 69 43 6f 6c 29 29 0a 20 20 20 20 29 7b 0a 20   iCol)).    ){. 
6860: 20 20 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e       goto pendin
6870: 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b  glistappend_out;
6880: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c  .    }.    p->iL
6890: 61 73 74 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  astCol = iCol;. 
68a0: 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73 20 3d     p->iLastPos =
68b0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43   0;.  }.  if( iC
68c0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ol>=0 ){.    ass
68d0: 65 72 74 28 20 69 50 6f 73 3e 70 2d 3e 69 4c 61  ert( iPos>p->iLa
68e0: 73 74 50 6f 73 20 7c 7c 20 28 69 50 6f 73 3d 3d  stPos || (iPos==
68f0: 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 50 6f 73  0 && p->iLastPos
6900: 3d 3d 30 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ==0) );.    rc =
6910: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6920: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6930: 20 32 2b 69 50 6f 73 2d 70 2d 3e 69 4c 61 73 74   2+iPos-p->iLast
6940: 50 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pos);.    if( rc
6950: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6960: 20 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73       p->iLastPos
6970: 20 3d 20 69 50 6f 73 3b 0a 20 20 20 20 7d 0a 20   = iPos;.    }. 
6980: 20 7d 0a 0a 20 70 65 6e 64 69 6e 67 6c 69 73 74   }.. pendinglist
6990: 61 70 70 65 6e 64 5f 6f 75 74 3a 0a 20 20 2a 70  append_out:.  *p
69a0: 52 63 20 3d 20 72 63 3b 0a 20 20 69 66 28 20 70  Rc = rc;.  if( p
69b0: 21 3d 2a 70 70 20 29 7b 0a 20 20 20 20 2a 70 70  !=*pp ){.    *pp
69c0: 20 3d 20 70 3b 0a 20 20 20 20 72 65 74 75 72 6e   = p;.    return
69d0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
69e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   0;.}../*.** Fre
69f0: 65 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  e a PendingList 
6a00: 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
6a10: 20 62 79 20 66 74 73 33 50 65 6e 64 69 6e 67 4c   by fts3PendingL
6a20: 69 73 74 41 70 70 65 6e 64 28 29 2e 0a 2a 2f 0a  istAppend()..*/.
6a30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
6a40: 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74  PendingListDelet
6a50: 65 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70  e(PendingList *p
6a60: 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  List){.  sqlite3
6a70: 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  _free(pList);.}.
6a80: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
6a90: 74 72 79 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  try to one of th
6aa0: 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  e pending-terms 
6ab0: 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  hash tables..*/.
6ac0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
6ad0: 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e  endingTermsAddOn
6ae0: 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
6af0: 70 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 0a 20  p,.  int iCol,. 
6b00: 20 69 6e 74 20 69 50 6f 73 2c 0a 20 20 46 74 73   int iPos,.  Fts
6b10: 33 48 61 73 68 20 2a 70 48 61 73 68 2c 20 20 20  3Hash *pHash,   
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b30: 50 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 68 61  Pending terms ha
6b40: 73 68 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  sh table to add 
6b50: 65 6e 74 72 79 20 74 6f 20 2a 2f 0a 20 20 63 6f  entry to */.  co
6b60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6b70: 2c 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 0a 29  ,.  int nToken.)
6b80: 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  {.  PendingList 
6b90: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 63  *pList;.  int rc
6ba0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
6bb0: 20 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e   pList = (Pendin
6bc0: 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68  gList *)fts3Hash
6bd0: 46 69 6e 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b  Find(pHash, zTok
6be0: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69  en, nToken);.  i
6bf0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
6c00: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
6c10: 2d 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61  -= (pList->nData
6c20: 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65   + nToken + size
6c30: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29  of(Fts3HashElem)
6c40: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 74 73  );.  }.  if( fts
6c50: 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
6c60: 6e 64 28 26 70 4c 69 73 74 2c 20 70 2d 3e 69 50  nd(&pList, p->iP
6c70: 72 65 76 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20  revDocid, iCol, 
6c80: 69 50 6f 73 2c 20 26 72 63 29 20 29 7b 0a 20 20  iPos, &rc) ){.  
6c90: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 66 74 73    if( pList==fts
6ca0: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
6cb0: 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  h, zToken, nToke
6cc0: 6e 2c 20 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  n, pList) ){.   
6cd0: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69     /* Malloc fai
6ce0: 6c 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  led while insert
6cf0: 69 6e 67 20 74 68 65 20 6e 65 77 20 65 6e 74 72  ing the new entr
6d00: 79 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  y. This can only
6d10: 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65   .      ** happe
6d20: 6e 20 69 66 20 74 68 65 72 65 20 77 61 73 20 6e  n if there was n
6d30: 6f 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  o previous entry
6d40: 20 66 6f 72 20 74 68 69 73 20 74 6f 6b 65 6e 2e   for this token.
6d50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6d60: 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 33 48  assert( 0==fts3H
6d70: 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c 20 7a  ashFind(pHash, z
6d80: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29  Token, nToken) )
6d90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6da0: 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  free(pList);.   
6db0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6dc0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
6dd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6de0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50  _OK ){.    p->nP
6df0: 65 6e 64 69 6e 67 44 61 74 61 20 2b 3d 20 28 70  endingData += (p
6e00: 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54  List->nData + nT
6e10: 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74  oken + sizeof(Ft
6e20: 73 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20  s3HashElem));.  
6e30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6e40: 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65  ../*.** Tokenize
6e50: 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
6e60: 74 65 64 20 73 74 72 69 6e 67 20 7a 54 65 78 74  ted string zText
6e70: 20 61 6e 64 20 61 64 64 20 61 6c 6c 20 74 6f 6b   and add all tok
6e80: 65 6e 73 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65  ens to the.** pe
6e90: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
6ea0: 2d 74 61 62 6c 65 2e 20 54 68 65 20 64 6f 63 69  -table. The doci
6eb0: 64 20 75 73 65 64 20 69 73 20 74 68 61 74 20 63  d used is that c
6ec0: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
6ed0: 69 6e 0a 2a 2a 20 70 2d 3e 69 50 72 65 76 44 6f  in.** p->iPrevDo
6ee0: 63 69 64 2c 20 61 6e 64 20 74 68 65 20 63 6f 6c  cid, and the col
6ef0: 75 6d 6e 20 69 73 20 73 70 65 63 69 66 69 65 64  umn is specified
6f00: 20 62 79 20 61 72 67 75 6d 65 6e 74 20 69 43 6f   by argument iCo
6f10: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  l..**.** If succ
6f20: 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
6f30: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
6f40: 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
6f50: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
6f60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
6f70: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
6f80: 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  d(.  Fts3Table *
6f90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6fa0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e       /* Table in
6fb0: 74 6f 20 77 68 69 63 68 20 74 65 78 74 20 77 69  to which text wi
6fc0: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  ll be inserted *
6fd0: 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
7000: 69 64 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 63  id to use */.  c
7010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
7020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7030: 2a 20 54 65 78 74 20 6f 66 20 64 6f 63 75 6d 65  * Text of docume
7040: 6e 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  nt to be inserte
7050: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  d */.  int iCol,
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
7080: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78 74   into which text
7090: 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
70a0: 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 57  ed */.  u32 *pnW
70b0: 6f 72 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ord             
70c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
70d0: 54 3a 20 49 6e 63 72 2e 20 62 79 20 6e 75 6d 62  T: Incr. by numb
70e0: 65 72 20 74 6f 6b 65 6e 73 20 69 6e 73 65 72 74  er tokens insert
70f0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
7100: 63 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  c;.  int iStart 
7110: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  = 0;.  int iEnd 
7120: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 50 6f 73 20  = 0;.  int iPos 
7130: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 64  = 0;.  int nWord
7140: 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f   = 0;..  char co
7150: 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69  nst *zToken;.  i
7160: 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 0a  nt nToken = 0;..
7170: 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
7180: 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20  zer *pTokenizer 
7190: 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b  = p->pTokenizer;
71a0: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
71b0: 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73  izer_module cons
71c0: 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 6f  t *pModule = pTo
71d0: 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65  kenizer->pModule
71e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ;.  sqlite3_toke
71f0: 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43  nizer_cursor *pC
7200: 73 72 3b 0a 20 20 69 6e 74 20 28 2a 78 4e 65 78  sr;.  int (*xNex
7210: 74 29 28 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  t)(sqlite3_token
7220: 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 75  izer_cursor *pCu
7230: 72 73 6f 72 2c 0a 20 20 20 20 20 20 63 6f 6e 73  rsor,.      cons
7240: 74 20 63 68 61 72 2a 2a 2c 69 6e 74 2a 2c 69 6e  t char**,int*,in
7250: 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29 3b 0a 0a  t*,int*,int*);..
7260: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
7270: 69 7a 65 72 20 26 26 20 70 4d 6f 64 75 6c 65 20  izer && pModule 
7280: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
7290: 75 73 65 72 20 68 61 73 20 69 6e 73 65 72 74 65  user has inserte
72a0: 64 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  d a NULL value, 
72b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
72c0: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  y be called with
72d0: 0a 20 20 2a 2a 20 7a 54 65 78 74 3d 3d 30 2e 20  .  ** zText==0. 
72e0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 64  In this case, ad
72f0: 64 20 7a 65 72 6f 20 74 6f 6b 65 6e 20 65 6e 74  d zero token ent
7300: 72 69 65 73 20 74 6f 20 74 68 65 20 68 61 73 68  ries to the hash
7310: 20 74 61 62 6c 65 20 61 6e 64 20 0a 20 20 2a 2a   table and .  **
7320: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
7330: 2f 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30  /.  if( zText==0
7340: 20 29 7b 0a 20 20 20 20 2a 70 6e 57 6f 72 64 20   ){.    *pnWord 
7350: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
7360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
7370: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
7380: 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28  s3OpenTokenizer(
7390: 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c 61 6e  pTokenizer, iLan
73a0: 67 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  gid, zText, -1, 
73b0: 26 70 43 73 72 29 3b 0a 20 20 69 66 28 20 72 63  &pCsr);.  if( rc
73c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
73d0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
73e0: 7d 0a 0a 20 20 78 4e 65 78 74 20 3d 20 70 4d 6f  }..  xNext = pMo
73f0: 64 75 6c 65 2d 3e 78 4e 65 78 74 3b 0a 20 20 77  dule->xNext;.  w
7400: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  hile( SQLITE_OK=
7410: 3d 72 63 0a 20 20 20 20 20 20 26 26 20 53 51 4c  =rc.      && SQL
7420: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e  ITE_OK==(rc = xN
7430: 65 78 74 28 70 43 73 72 2c 20 26 7a 54 6f 6b 65  ext(pCsr, &zToke
7440: 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 53 74  n, &nToken, &iSt
7450: 61 72 74 2c 20 26 69 45 6e 64 2c 20 26 69 50 6f  art, &iEnd, &iPo
7460: 73 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  s)).  ){.    int
7470: 20 69 3b 0a 20 20 20 20 69 66 28 20 69 50 6f 73   i;.    if( iPos
7480: 3e 3d 6e 57 6f 72 64 20 29 20 6e 57 6f 72 64 20  >=nWord ) nWord 
7490: 3d 20 69 50 6f 73 2b 31 3b 0a 0a 20 20 20 20 2f  = iPos+1;..    /
74a0: 2a 20 50 6f 73 69 74 69 6f 6e 73 20 63 61 6e 6e  * Positions cann
74b0: 6f 74 20 62 65 20 6e 65 67 61 74 69 76 65 3b 20  ot be negative; 
74c0: 77 65 20 75 73 65 20 2d 31 20 61 73 20 61 20 74  we use -1 as a t
74d0: 65 72 6d 69 6e 61 74 6f 72 20 69 6e 74 65 72 6e  erminator intern
74e0: 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 54 6f 6b  ally..    ** Tok
74f0: 65 6e 73 20 6d 75 73 74 20 68 61 76 65 20 61 20  ens must have a 
7500: 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67 74 68 2e  non-zero length.
7510: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7520: 69 50 6f 73 3c 30 20 7c 7c 20 21 7a 54 6f 6b 65  iPos<0 || !zToke
7530: 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d 30 20 29  n || nToken<=0 )
7540: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
7550: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
7560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7570: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65     /* Add the te
7580: 72 6d 20 74 6f 20 74 68 65 20 74 65 72 6d 73 20  rm to the terms 
7590: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 72 63 20  index */.    rc 
75a0: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
75b0: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20  msAddOne(.      
75c0: 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c    p, iCol, iPos,
75d0: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 30 5d 2e 68   &p->aIndex[0].h
75e0: 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c  Pending, zToken,
75f0: 20 6e 54 6f 6b 65 6e 0a 20 20 20 20 29 3b 0a 20   nToken.    );. 
7600: 20 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74     .    /* Add t
7610: 68 65 20 74 65 72 6d 20 74 6f 20 65 61 63 68 20  he term to each 
7620: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 69 6e  of the prefix in
7630: 64 65 78 65 73 20 74 68 61 74 20 69 74 20 69 73  dexes that it is
7640: 20 6e 6f 74 20 74 6f 6f 20 0a 20 20 20 20 2a 2a   not too .    **
7650: 20 73 68 6f 72 74 20 66 6f 72 2e 20 2a 2f 0a 20   short for. */. 
7660: 20 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d     for(i=1; rc==
7670: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
7680: 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a  ->nIndex; i++){.
7690: 20 20 20 20 20 20 73 74 72 75 63 74 20 46 74 73        struct Fts
76a0: 33 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d  3Index *pIndex =
76b0: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 3b 0a   &p->aIndex[i];.
76c0: 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e        if( nToken
76d0: 3c 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78  <pIndex->nPrefix
76e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
76f0: 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
7700: 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a  ingTermsAddOne(.
7710: 20 20 20 20 20 20 20 20 20 20 70 2c 20 69 43 6f            p, iCo
7720: 6c 2c 20 69 50 6f 73 2c 20 26 70 49 6e 64 65 78  l, iPos, &pIndex
7730: 2d 3e 68 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b  ->hPending, zTok
7740: 65 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 50 72 65  en, pIndex->nPre
7750: 66 69 78 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  fix.      );.   
7760: 20 7d 0a 20 20 7d 0a 0a 20 20 70 4d 6f 64 75 6c   }.  }..  pModul
7770: 65 2d 3e 78 43 6c 6f 73 65 28 70 43 73 72 29 3b  e->xClose(pCsr);
7780: 0a 20 20 2a 70 6e 57 6f 72 64 20 2b 3d 20 6e 57  .  *pnWord += nW
7790: 6f 72 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  ord;.  return (r
77a0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
77b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
77c0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c  ;.}../* .** Call
77d0: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
77e0: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  n indicates that
77f0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
7800: 73 20 74 6f 20 0a 2a 2a 20 66 74 73 33 50 65 6e  s to .** fts3Pen
7810: 64 69 6e 67 54 65 72 6d 73 41 64 64 28 29 20 61  dingTermsAdd() a
7820: 72 65 20 74 6f 20 61 64 64 20 74 65 72 6d 2f 70  re to add term/p
7830: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 70 61 69  osition-list pai
7840: 72 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f  rs for the.** co
7850: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 6f  ntents of the do
7860: 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69  cument with doci
7870: 64 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a 73 74 61  d iDocid..*/.sta
7880: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
7890: 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 0a 20  ingTermsDocid(. 
78a0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61   /* Full-text ta
78d0: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
78e0: 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 20 20 20  int bDelete,    
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
7910: 6f 70 20 69 73 20 61 20 64 65 6c 65 74 65 20 2a  op is a delete *
7920: 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
7950: 69 64 20 6f 66 20 72 6f 77 20 62 65 69 6e 67 20  id of row being 
7960: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c  written */.  sql
7970: 69 74 65 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  ite_int64 iDocid
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7990: 44 6f 63 69 64 20 6f 66 20 72 6f 77 20 62 65 69  Docid of row bei
79a0: 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  ng written */.){
79b0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 6e 67  .  assert( iLang
79c0: 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id>=0 );.  asser
79d0: 74 28 20 62 44 65 6c 65 74 65 3d 3d 31 20 7c 7c  t( bDelete==1 ||
79e0: 20 62 44 65 6c 65 74 65 3d 3d 30 20 29 3b 0a 0a   bDelete==0 );..
79f0: 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29    /* TODO(shess)
7a00: 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72   Explore whether
7a10: 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68   partially flush
7a20: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f  ing the buffer o
7a30: 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c  n.  ** forced-fl
7a40: 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64  ush would provid
7a50: 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d  e better perform
7a60: 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74  ance.  I suspect
7a70: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65   that if.  ** we
7a80: 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63   ordered the doc
7a90: 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e  lists by size an
7aa0: 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61  d flushed the la
7ab0: 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a  rgest until the.
7ac0: 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20    ** buffer was 
7ad0: 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74  half empty, that
7ae0: 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c   would let the l
7af0: 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72  ess frequent ter
7b00: 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  ms.  ** generate
7b10: 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73   longer doclists
7b20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f  ..  */.  if( iDo
7b30: 63 69 64 3c 70 2d 3e 69 50 72 65 76 44 6f 63 69  cid<p->iPrevDoci
7b40: 64 20 0a 20 20 20 7c 7c 20 28 69 44 6f 63 69 64  d .   || (iDocid
7b50: 3d 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20  ==p->iPrevDocid 
7b60: 26 26 20 70 2d 3e 62 50 72 65 76 44 65 6c 65 74  && p->bPrevDelet
7b70: 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 70 2d 3e 69  e==0).   || p->i
7b80: 50 72 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e  PrevLangid!=iLan
7b90: 67 69 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65  gid.   || p->nPe
7ba0: 6e 64 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61  ndingData>p->nMa
7bb0: 78 50 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20  xPendingData .  
7bc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
7bd0: 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
7be0: 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b  ngTermsFlush(p);
7bf0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7c00: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7c10: 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72  rc;.  }.  p->iPr
7c20: 65 76 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64  evDocid = iDocid
7c30: 3b 0a 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67  ;.  p->iPrevLang
7c40: 69 64 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20  id = iLangid;.  
7c50: 70 2d 3e 62 50 72 65 76 44 65 6c 65 74 65 20 3d  p->bPrevDelete =
7c60: 20 62 44 65 6c 65 74 65 3b 0a 20 20 72 65 74 75   bDelete;.  retu
7c70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7c80: 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74  ./*.** Discard t
7c90: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
7ca0: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
7cb0: 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 0a 2a   hash tables. .*
7cc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
7cd0: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c  s3PendingTermsCl
7ce0: 65 61 72 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ear(Fts3Table *p
7cf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
7d00: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e 64  r(i=0; i<p->nInd
7d10: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  ex; i++){.    Ft
7d20: 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65  s3HashElem *pEle
7d30: 6d 3b 0a 20 20 20 20 46 74 73 33 48 61 73 68 20  m;.    Fts3Hash 
7d40: 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e  *pHash = &p->aIn
7d50: 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e 67 3b  dex[i].hPending;
7d60: 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 66  .    for(pElem=f
7d70: 74 73 33 48 61 73 68 46 69 72 73 74 28 70 48 61  ts3HashFirst(pHa
7d80: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
7d90: 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28 70  m=fts3HashNext(p
7da0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 50 65  Elem)){.      Pe
7db0: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
7dc0: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
7dd0: 2a 29 66 74 73 33 48 61 73 68 44 61 74 61 28 70  *)fts3HashData(p
7de0: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66 74 73  Elem);.      fts
7df0: 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65  3PendingListDele
7e00: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  te(pList);.    }
7e10: 0a 20 20 20 20 66 74 73 33 48 61 73 68 43 6c 65  .    fts3HashCle
7e20: 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d 0a 20  ar(pHash);.  }. 
7e30: 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
7e40: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
7e50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7e60: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55  called by the xU
7e70: 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 20 61  pdate() method a
7e80: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53  s part of an INS
7e90: 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ERT.** operation
7ea0: 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72 69 65  . It adds entrie
7eb0: 73 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  s for each term 
7ec0: 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  in the new recor
7ed0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e 64  d to the.** pend
7ee0: 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61  ingTerms hash ta
7ef0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ble..**.** Argum
7f00: 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74 68 65  ent apVal is the
7f10: 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 69 6d   same as the sim
7f20: 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61 72 67  ilarly named arg
7f30: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 0a  ument passed to.
7f40: 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44 61 74  ** fts3InsertDat
7f50: 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69  a(). Parameter i
7f60: 44 6f 63 69 64 20 69 73 20 74 68 65 20 64 6f 63  Docid is the doc
7f70: 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f  id of the new ro
7f80: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
7f90: 20 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73   fts3InsertTerms
7fa0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
7fb0: 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  , .  int iLangid
7fc0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
7fd0: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20 20 75  ue **apVal, .  u
7fe0: 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20 69 6e 74  32 *aSz.){.  int
7ff0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8010: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
8020: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32 3b 20  e */.  for(i=2; 
8030: 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b 20  i<p->nColumn+2; 
8040: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
8050: 6f 6c 20 3d 20 69 2d 32 3b 0a 20 20 20 20 69 66  ol = i-2;.    if
8060: 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65  ( p->abNotindexe
8070: 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20  d[iCol]==0 ){.  
8080: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8090: 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
80a0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
80b0: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69  lue_text(apVal[i
80c0: 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ]);.      int rc
80d0: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
80e0: 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69  rmsAdd(p, iLangi
80f0: 64 2c 20 7a 54 65 78 74 2c 20 69 43 6f 6c 2c 20  d, zText, iCol, 
8100: 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  &aSz[iCol]);.   
8110: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8120: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8130: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
8140: 20 7d 0a 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e   }.      aSz[p->
8150: 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69  nColumn] += sqli
8160: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
8170: 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d  apVal[i]);.    }
8180: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8190: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
81a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
81b0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
81c0: 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f   xUpdate() metho
81d0: 64 20 66 6f 72 20 61 6e 20 49 4e 53 45 52 54 20  d for an INSERT 
81e0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  operation..** Th
81f0: 65 20 61 70 56 61 6c 20 70 61 72 61 6d 65 74 65  e apVal paramete
8200: 72 20 69 73 20 70 61 73 73 65 64 20 61 20 63 6f  r is passed a co
8210: 70 79 20 6f 66 20 74 68 65 20 61 70 56 61 6c 20  py of the apVal 
8220: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
8230: 62 79 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  by.** SQLite to 
8240: 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65  the xUpdate() me
8250: 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a 0a 2a 2a  thod. i.e:.**.**
8260: 20 20 20 61 70 56 61 6c 5b 30 5d 20 20 20 20 20     apVal[0]     
8270: 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74 20 75             Not u
8280: 73 65 64 20 66 6f 72 20 49 4e 53 45 52 54 2e 0a  sed for INSERT..
8290: 2a 2a 20 20 20 61 70 56 61 6c 5b 31 5d 20 20 20  **   apVal[1]   
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77               row
82b0: 69 64 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 32 5d  id.**   apVal[2]
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 4c 65 66 74 2d 6d 6f 73 74 20 75 73 65 72 2d 64  Left-most user-d
82e0: 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a  efined column.**
82f0: 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61 70 56 61     ....**   apVa
8300: 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 20  l[p->nColumn+1] 
8310: 20 20 20 20 52 69 67 68 74 2d 6d 6f 73 74 20 75      Right-most u
8320: 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75  ser-defined colu
8330: 6d 6e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d  mn.**   apVal[p-
8340: 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20 20 20 20  >nColumn+2]     
8350: 48 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 77 69  Hidden column wi
8360: 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
8370: 74 61 62 6c 65 0a 2a 2a 20 20 20 61 70 56 61 6c  table.**   apVal
8380: 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 20 20  [p->nColumn+3]  
8390: 20 20 20 48 69 64 64 65 6e 20 22 64 6f 63 69 64     Hidden "docid
83a0: 22 20 63 6f 6c 75 6d 6e 20 28 61 6c 69 61 73 20  " column (alias 
83b0: 66 6f 72 20 72 6f 77 69 64 29 0a 2a 2a 20 20 20  for rowid).**   
83c0: 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e  apVal[p->nColumn
83d0: 2b 34 5d 20 20 20 20 20 48 69 64 64 65 6e 20 6c  +4]     Hidden l
83e0: 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e  anguageid column
83f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
8400: 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 0a 20  ts3InsertData(. 
8410: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61   /* Full-text ta
8440: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
8450: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20  _value **apVal, 
8460: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
8470: 79 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 69  y of values to i
8480: 6e 73 65 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74  nsert */.  sqlit
8490: 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63 69  e3_int64 *piDoci
84a0: 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  d          /* OU
84b0: 54 3a 20 44 6f 63 69 64 20 66 6f 72 20 72 6f 77  T: Docid for row
84c0: 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 2a   just inserted *
84d0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
8500: 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
8510: 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e 74 65 6e  e3_stmt *pConten
8520: 74 49 6e 73 65 72 74 3b 20 20 20 2f 2a 20 49 4e  tInsert;   /* IN
8530: 53 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74  SERT INTO %_cont
8540: 65 6e 74 20 56 41 4c 55 45 53 28 2e 2e 2e 29 20  ent VALUES(...) 
8550: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f  */..  if( p->zCo
8560: 6e 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20  ntentTbl ){.    
8570: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
8580: 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 70 2d  Rowid = apVal[p-
8590: 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 3b 0a 20 20 20  >nColumn+3];.   
85a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
85b0: 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64 29 3d  ue_type(pRowid)=
85c0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
85d0: 20 20 20 20 20 20 70 52 6f 77 69 64 20 3d 20 61        pRowid = a
85e0: 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d 0a 20  pVal[1];.    }. 
85f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
8600: 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64  alue_type(pRowid
8610: 29 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  )!=SQLITE_INTEGE
8620: 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R ){.      retur
8630: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
8640: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  INT;.    }.    *
8650: 70 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65  piDocid = sqlite
8660: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 52  3_value_int64(pR
8670: 6f 77 69 64 29 3b 0a 20 20 20 20 72 65 74 75 72  owid);.    retur
8680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8690: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
86a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  e statement hand
86b0: 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72  le used to inser
86c0: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
86d0: 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 74  %_content.  ** t
86e0: 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20 66 6f  able. The SQL fo
86f0: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
8700: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
8710: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63   INSERT INTO %_c
8720: 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 3f 2c  ontent VALUES(?,
8730: 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20 2a 2a   ?, ?, ...).  **
8740: 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65 6d  .  ** The statem
8750: 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e 20 27  ent features N '
8760: 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20 77 68  ?' variables, wh
8770: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
8780: 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20 2a 2a  ber of user.  **
8790: 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
87a0: 20 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62   in the FTS3 tab
87b0: 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66 6f 72  le, plus one for
87c0: 20 74 68 65 20 64 6f 63 69 64 20 66 69 65 6c 64   the docid field
87d0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ..  */.  rc = ft
87e0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
87f0: 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 2c  _CONTENT_INSERT,
8800: 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74   &pContentInsert
8810: 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  , &apVal[1]);.  
8820: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8830: 4b 20 26 26 20 70 2d 3e 7a 4c 61 6e 67 75 61 67  K && p->zLanguag
8840: 65 69 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eid ){.    rc = 
8850: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
8860: 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 74 65  (.        pConte
8870: 6e 74 49 6e 73 65 72 74 2c 20 70 2d 3e 6e 43 6f  ntInsert, p->nCo
8880: 6c 75 6d 6e 2b 32 2c 20 0a 20 20 20 20 20 20 20  lumn+2, .       
8890: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
88a0: 6e 74 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c  nt(apVal[p->nCol
88b0: 75 6d 6e 2b 34 5d 29 0a 20 20 20 20 29 3b 0a 20  umn+4]).    );. 
88c0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
88d0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
88e0: 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20  rc;..  /* There 
88f0: 69 73 20 61 20 71 75 69 72 6b 20 68 65 72 65 2e  is a quirk here.
8900: 20 54 68 65 20 75 73 65 72 73 20 49 4e 53 45 52   The users INSER
8910: 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  T statement may 
8920: 68 61 76 65 20 73 70 65 63 69 66 69 65 64 0a 20  have specified. 
8930: 20 2a 2a 20 61 20 76 61 6c 75 65 20 66 6f 72 20   ** a value for 
8940: 74 68 65 20 22 72 6f 77 69 64 22 20 66 69 65 6c  the "rowid" fiel
8950: 64 2c 20 66 6f 72 20 74 68 65 20 22 64 6f 63 69  d, for the "doci
8960: 64 22 20 66 69 65 6c 64 2c 20 6f 72 20 66 6f 72  d" field, or for
8970: 20 62 6f 74 68 2e 0a 20 20 2a 2a 20 57 68 69 63   both..  ** Whic
8980: 68 20 69 73 20 61 20 70 72 6f 62 6c 65 6d 2c 20  h is a problem, 
8990: 73 69 6e 63 65 20 22 72 6f 77 69 64 22 20 61 6e  since "rowid" an
89a0: 64 20 22 64 6f 63 69 64 22 20 61 72 65 20 61 6c  d "docid" are al
89b0: 69 61 73 65 73 20 66 6f 72 20 74 68 65 0a 20 20  iases for the.  
89c0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 46  ** same value. F
89d0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
89e0: 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
89f0: 4e 54 4f 20 66 74 73 33 74 62 6c 28 72 6f 77 69  NTO fts3tbl(rowi
8a00: 64 2c 20 64 6f 63 69 64 29 20 56 41 4c 55 45 53  d, docid) VALUES
8a10: 28 31 2c 20 32 29 3b 0a 20 20 2a 2a 0a 20 20 2a  (1, 2);.  **.  *
8a20: 2a 20 49 6e 20 46 54 53 33 2c 20 74 68 69 73 20  * In FTS3, this 
8a30: 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 74 20  is an error. It 
8a40: 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 73  is an error to s
8a50: 70 65 63 69 66 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  pecify non-NULL 
8a60: 76 61 6c 75 65 73 0a 20 20 2a 2a 20 66 6f 72 20  values.  ** for 
8a70: 62 6f 74 68 20 64 6f 63 69 64 20 61 6e 64 20 73  both docid and s
8a80: 6f 6d 65 20 6f 74 68 65 72 20 72 6f 77 69 64 20  ome other rowid 
8a90: 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  alias..  */.  if
8aa0: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  ( SQLITE_NULL!=s
8ab0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8ac0: 65 28 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f  e(apVal[3+p->nCo
8ad0: 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20 20 20 69 66  lumn]) ){.    if
8ae0: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  ( SQLITE_NULL==s
8af0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8b00: 65 28 61 70 56 61 6c 5b 30 5d 29 0a 20 20 20 20  e(apVal[0]).    
8b10: 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   && SQLITE_NULL!
8b20: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
8b30: 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 0a 20 20  ype(apVal[1]).  
8b40: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20    ){.      /* A 
8b50: 72 6f 77 69 64 2f 64 6f 63 69 64 20 63 6f 6e 66  rowid/docid conf
8b60: 6c 69 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lict. */.      r
8b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
8b80: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
8b90: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
8ba0: 76 61 6c 75 65 28 70 43 6f 6e 74 65 6e 74 49 6e  value(pContentIn
8bb0: 73 65 72 74 2c 20 31 2c 20 61 70 56 61 6c 5b 33  sert, 1, apVal[3
8bc0: 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  +p->nColumn]);. 
8bd0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8be0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8bf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 65 63  ;.  }..  /* Exec
8c00: 75 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ute the statemen
8c10: 74 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  t to insert the 
8c20: 72 65 63 6f 72 64 2e 20 53 65 74 20 2a 70 69 44  record. Set *piD
8c30: 6f 63 69 64 20 74 6f 20 74 68 65 20 0a 20 20 2a  ocid to the .  *
8c40: 2a 20 6e 65 77 20 64 6f 63 69 64 20 76 61 6c 75  * new docid valu
8c50: 65 2e 20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  e. .  */.  sqlit
8c60: 65 33 5f 73 74 65 70 28 70 43 6f 6e 74 65 6e 74  e3_step(pContent
8c70: 49 6e 73 65 72 74 29 3b 0a 20 20 72 63 20 3d 20  Insert);.  rc = 
8c80: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
8c90: 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 0a  ontentInsert);..
8ca0: 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 71 6c    *piDocid = sql
8cb0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
8cc0: 5f 72 6f 77 69 64 28 70 2d 3e 64 62 29 3b 0a 20  _rowid(p->db);. 
8cd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
8ce0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
8cf0: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
8d00: 46 54 53 33 20 74 61 62 6c 65 2e 20 43 6c 65 61  FTS3 table. Clea
8d10: 72 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  r the hash table
8d20: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 70   containing.** p
8d30: 65 6e 64 69 6e 67 20 74 65 72 6d 73 2e 0a 2a 2f  ending terms..*/
8d40: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
8d50: 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 33 54 61  DeleteAll(Fts3Ta
8d60: 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6e  ble *p, int bCon
8d70: 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  tent){.  int rc 
8d80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8da0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
8db0: 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
8dc0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
8dd0: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
8de0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
8df0: 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
8e00: 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20  rmsClear(p);..  
8e10: 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 74  /* Delete everyt
8e20: 68 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 73 68  hing from the sh
8e30: 61 64 6f 77 20 74 61 62 6c 65 73 2e 20 45 78 63  adow tables. Exc
8e40: 65 70 74 2c 20 6c 65 61 76 65 20 25 5f 63 6f 6e  ept, leave %_con
8e50: 74 65 6e 74 20 61 73 0a 20 20 2a 2a 20 69 73 20  tent as.  ** is 
8e60: 69 66 20 62 43 6f 6e 74 65 6e 74 20 69 73 20 66  if bContent is f
8e70: 61 6c 73 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alse.  */.  asse
8e80: 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  rt( p->zContentT
8e90: 62 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e 74 65 6e  bl==0 || bConten
8ea0: 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  t==0 );.  if( bC
8eb0: 6f 6e 74 65 6e 74 20 29 20 66 74 73 33 53 71 6c  ontent ) fts3Sql
8ec0: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
8ed0: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
8ee0: 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73 33 53  ENT, 0);.  fts3S
8ef0: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
8f00: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45  QL_DELETE_ALL_SE
8f10: 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20 66 74  GMENTS, 0);.  ft
8f20: 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
8f30: 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  , SQL_DELETE_ALL
8f40: 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20 69  _SEGDIR, 0);.  i
8f50: 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
8f60: 65 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c  e ){.    fts3Sql
8f70: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
8f80: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43 53  _DELETE_ALL_DOCS
8f90: 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  IZE, 0);.  }.  i
8fa0: 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29  f( p->bHasStat )
8fb0: 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45 78 65  {.    fts3SqlExe
8fc0: 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
8fd0: 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 2c 20 30  LETE_ALL_STAT, 0
8fe0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8ff0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  rc;.}../*.**.*/.
9000: 73 74 61 74 69 63 20 69 6e 74 20 6c 61 6e 67 69  static int langi
9010: 64 46 72 6f 6d 53 65 6c 65 63 74 28 46 74 73 33  dFromSelect(Fts3
9020: 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
9030: 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 29  3_stmt *pSelect)
9040: 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20  {.  int iLangid 
9050: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4c  = 0;.  if( p->zL
9060: 61 6e 67 75 61 67 65 69 64 20 29 20 69 4c 61 6e  anguageid ) iLan
9070: 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gid = sqlite3_co
9080: 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65 63 74  lumn_int(pSelect
9090: 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b  , p->nColumn+1);
90a0: 0a 20 20 72 65 74 75 72 6e 20 69 4c 61 6e 67 69  .  return iLangi
90b0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  d;.}../*.** The 
90c0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69 6e  first element in
90d0: 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72 72   the apVal[] arr
90e0: 61 79 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ay is assumed to
90f0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 64 6f 63   contain the doc
9100: 69 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65 67 65  id.** (an intege
9110: 72 29 20 6f 66 20 61 20 72 6f 77 20 61 62 6f 75  r) of a row abou
9120: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
9130: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d   Remove all term
9140: 73 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 75  s from the.** fu
9150: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 2a  ll-text index..*
9160: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
9170: 73 33 44 65 6c 65 74 65 54 65 72 6d 73 28 20 0a  s3DeleteTerms( .
9180: 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
9190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
91a0: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ult code */.  Ft
91b0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
91c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53        /* The FTS
91d0: 20 74 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65   table to delete
91e0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74   from */.  sqlit
91f0: 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64  e3_value *pRowid
9200: 2c 20 20 2f 2a 20 54 68 65 20 64 6f 63 69 64 20  ,  /* The docid 
9210: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
9220: 0a 20 20 75 33 32 20 2a 61 53 7a 2c 20 20 20 20  .  u32 *aSz,    
9230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9240: 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64 20 64  zes of deleted d
9250: 6f 63 75 6d 65 6e 74 20 77 72 69 74 74 65 6e 20  ocument written 
9260: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  here */.  int *p
9270: 62 46 6f 75 6e 64 20 20 20 20 20 20 20 20 20 20  bFound          
9280: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
9290: 20 74 72 75 65 20 69 66 20 72 6f 77 20 72 65 61   true if row rea
92a0: 6c 6c 79 20 64 6f 65 73 20 65 78 69 73 74 20 2a  lly does exist *
92b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
92c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
92d0: 53 65 6c 65 63 74 3b 0a 0a 20 20 61 73 73 65 72  Select;..  asser
92e0: 74 28 20 2a 70 62 46 6f 75 6e 64 3d 3d 30 20 29  t( *pbFound==0 )
92f0: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
9300: 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74  eturn;.  rc = ft
9310: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
9320: 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f  _SELECT_CONTENT_
9330: 42 59 5f 52 4f 57 49 44 2c 20 26 70 53 65 6c 65  BY_ROWID, &pSele
9340: 63 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20  ct, &pRowid);.  
9350: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9360: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  K ){.    if( SQL
9370: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
9380: 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29  _step(pSelect) )
9390: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
93a0: 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64       int iLangid
93b0: 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c   = langidFromSel
93c0: 65 63 74 28 70 2c 20 70 53 65 6c 65 63 74 29 3b  ect(p, pSelect);
93d0: 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69  .      i64 iDoci
93e0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
93f0: 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74  mn_int64(pSelect
9400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
9410: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
9420: 73 44 6f 63 69 64 28 70 2c 20 31 2c 20 69 4c 61  sDocid(p, 1, iLa
9430: 6e 67 69 64 2c 20 69 44 6f 63 69 64 29 3b 0a 20  ngid, iDocid);. 
9440: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 72 63       for(i=1; rc
9450: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
9460: 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  <=p->nColumn; i+
9470: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
9480: 69 43 6f 6c 20 3d 20 69 2d 31 3b 0a 20 20 20 20  iCol = i-1;.    
9490: 20 20 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74      if( p->abNot
94a0: 69 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30  indexed[iCol]==0
94b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
94c0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
94d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
94e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
94f0: 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 3b  ext(pSelect, i);
9500: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
9510: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
9520: 41 64 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  Add(p, iLangid, 
9530: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 61 53 7a 5b  zText, -1, &aSz[
9540: 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  iCol]);.        
9550: 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e    aSz[p->nColumn
9560: 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ] += sqlite3_col
9570: 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63  umn_bytes(pSelec
9580: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, i);.        }
9590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
95a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
95b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
95c0: 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63  te3_reset(pSelec
95d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 43  t);.        *pRC
95e0: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72   = rc;.        r
95f0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
9600: 20 20 20 20 20 2a 70 62 46 6f 75 6e 64 20 3d 20       *pbFound = 
9610: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
9620: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
9630: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73  pSelect);.  }els
9640: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
9650: 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  eset(pSelect);. 
9660: 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a   }.  *pRC = rc;.
9670: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
9680: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f 20   declaration to 
9690: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
96a0: 63 69 72 63 75 6c 61 72 20 64 65 70 65 6e 64 65  circular depende
96b0: 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a 20 66  ncy between.** f
96c0: 75 6e 63 74 69 6f 6e 73 20 66 74 73 33 53 65 67  unctions fts3Seg
96d0: 6d 65 6e 74 4d 65 72 67 65 28 29 20 61 6e 64 20  mentMerge() and 
96e0: 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
96f0: 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74 61 74  irIdx()..*/.stat
9700: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65  ic int fts3Segme
9710: 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c  ntMerge(Fts3Tabl
9720: 65 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69  e *, int, int, i
9730: 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  nt);../* .** Thi
9740: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
9750: 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65 6c  ates a new level
9760: 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69 6e   iLevel index in
9770: 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62 6c   the segdir tabl
9780: 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 69  e..** Usually, i
9790: 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63  ndexes are alloc
97a0: 61 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c 65  ated within a le
97b0: 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c 79  vel sequentially
97c0: 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74   starting.** wit
97d0: 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c 6f  h 0, so the allo
97e0: 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20 6f  cated index is o
97f0: 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ne greater than 
9800: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
9810: 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a 20  ed.** by:.**.** 
9820: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64 78    SELECT max(idx
9830: 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20  ) FROM %_segdir 
9840: 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69  WHERE level = :i
9850: 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  Level.**.** Howe
9860: 76 65 72 2c 20 69 66 20 74 68 65 72 65 20 61 72  ver, if there ar
9870: 65 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f 4d  e already FTS3_M
9880: 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65 78  ERGE_COUNT index
9890: 65 73 20 61 74 20 74 68 65 20 72 65 71 75 65 73  es at the reques
98a0: 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74 68  ted.** level, th
98b0: 65 79 20 61 72 65 20 6d 65 72 67 65 64 20 69 6e  ey are merged in
98c0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  to a single leve
98d0: 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65 67  l (iLevel+1) seg
98e0: 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a  ment and the .**
98f0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   allocated index
9900: 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   is 0..**.** If 
9910: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 49  successful, *piI
9920: 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
9930: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   allocated index
9940: 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54 45   slot and SQLITE
9950: 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  _OK.** returned.
9960: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
9970: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9980: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9990: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
99a0: 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64  AllocateSegdirId
99b0: 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  x(.  Fts3Table *
99c0: 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  p, .  int iLangi
99d0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
99e0: 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
99f0: 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  e id */.  int iI
9a00: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
9a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9a20: 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78  ex for p->aIndex
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
9a40: 2c 20 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 0a  , .  int *piIdx.
9a50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
9a80: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
9a90: 5f 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b  _stmt *pNextIdx;
9aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
9ab0: 79 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61  y for next idx a
9ac0: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a  t level iLevel *
9ad0: 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20  /.  int iNext = 
9ae0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9af0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
9b00: 20 71 75 65 72 79 20 70 4e 65 78 74 49 64 78 20   query pNextIdx 
9b10: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
9b20: 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73  angid>=0 );.  as
9b30: 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e  sert( p->nIndex>
9b40: 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  =1 );..  /* Set 
9b50: 76 61 72 69 61 62 6c 65 20 69 4e 65 78 74 20 74  variable iNext t
9b60: 6f 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c  o the next avail
9b70: 61 62 6c 65 20 73 65 67 64 69 72 20 69 6e 64 65  able segdir inde
9b80: 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  x at level iLeve
9b90: 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  l. */.  rc = fts
9ba0: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
9bb0: 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44  NEXT_SEGMENT_IND
9bc0: 45 58 2c 20 26 70 4e 65 78 74 49 64 78 2c 20 30  EX, &pNextIdx, 0
9bd0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
9be0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
9bf0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
9c00: 28 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 49  (.        pNextI
9c10: 64 78 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75  dx, 1, getAbsolu
9c20: 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
9c30: 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
9c40: 65 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  el).    );.    i
9c50: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
9c60: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4e 65 78  qlite3_step(pNex
9c70: 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69  tIdx) ){.      i
9c80: 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Next = sqlite3_c
9c90: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74 49  olumn_int(pNextI
9ca0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  dx, 0);.    }.  
9cb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
9cc0: 65 73 65 74 28 70 4e 65 78 74 49 64 78 29 3b 0a  eset(pNextIdx);.
9cd0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
9ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9cf0: 2f 2a 20 49 66 20 69 4e 65 78 74 20 69 73 20 46  /* If iNext is F
9d00: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c  TS3_MERGE_COUNT,
9d10: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
9d20: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 73   level iLevel is
9d30: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
9d40: 66 75 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c 20  full, merge all 
9d50: 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76 65  segments in leve
9d60: 6c 20 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61 20  l iLevel into a 
9d70: 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31 0a  single iLevel+1.
9d80: 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 61      ** segment a
9d90: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65 77  nd allocate (new
9da0: 6c 79 20 66 72 65 65 64 29 20 69 6e 64 65 78 20  ly freed) index 
9db0: 30 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  0 at level iLeve
9dc0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
9dd0: 20 20 2a 2a 20 69 66 20 69 4e 65 78 74 20 69 73    ** if iNext is
9de0: 20 6c 65 73 73 20 74 68 61 6e 20 46 54 53 33 5f   less than FTS3_
9df0: 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c 6c  MERGE_COUNT, all
9e00: 6f 63 61 74 65 20 69 6e 64 65 78 20 69 4e 65 78  ocate index iNex
9e10: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
9e20: 28 20 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d 45  ( iNext>=FTS3_ME
9e30: 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20  RGE_COUNT ){.   
9e40: 20 20 20 66 74 73 33 4c 6f 67 4d 65 72 67 65 28     fts3LogMerge(
9e50: 31 36 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c  16, getAbsoluteL
9e60: 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
9e70: 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29   iIndex, iLevel)
9e80: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
9e90: 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70  s3SegmentMerge(p
9ea0: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
9eb0: 78 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  x, iLevel);.    
9ec0: 20 20 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20 20    *piIdx = 0;.  
9ed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
9ee0: 70 69 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a 20  piIdx = iNext;. 
9ef0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
9f00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9f10: 54 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  The %_segments t
9f20: 61 62 6c 65 20 69 73 20 64 65 63 6c 61 72 65 64  able is declared
9f30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
9f40: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
9f50: 45 20 25 5f 73 65 67 6d 65 6e 74 73 28 62 6c 6f  E %_segments(blo
9f60: 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ckid INTEGER PRI
9f70: 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
9f80: 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  BLOB).**.** This
9f90: 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
9fa0: 64 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67  data from a sing
9fb0: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 25 5f  le row of the %_
9fc0: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20  segments table. 
9fd0: 54 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  The.** specific 
9fe0: 72 6f 77 20 69 73 20 69 64 65 6e 74 69 66 69 65  row is identifie
9ff0: 64 20 62 79 20 74 68 65 20 69 42 6c 6f 63 6b 69  d by the iBlocki
a000: 64 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20  d parameter. If 
a010: 70 61 42 6c 6f 62 20 69 73 20 6e 6f 74 0a 2a 2a  paBlob is not.**
a020: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 62 75   NULL, then a bu
a030: 66 66 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ffer is allocate
a040: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
a050: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 70  malloc() and pop
a060: 75 6c 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ulated.** with t
a070: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
a080: 68 65 20 62 6c 6f 62 20 73 74 6f 72 65 64 20 69  he blob stored i
a090: 6e 20 74 68 65 20 22 62 6c 6f 63 6b 22 20 63 6f  n the "block" co
a0a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  lumn of the .** 
a0b0: 69 64 65 6e 74 69 66 69 65 64 20 74 61 62 6c 65  identified table
a0c0: 20 72 6f 77 20 69 73 2e 20 57 68 65 74 68 65 72   row is. Whether
a0d0: 20 6f 72 20 6e 6f 74 20 70 61 42 6c 6f 62 20 69   or not paBlob i
a0e0: 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42 6c 6f 62 20  s NULL, *pnBlob 
a0f0: 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65  is set.** to the
a100: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
a110: 62 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72  b in bytes befor
a120: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
a130: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
a140: 63 63 75 72 73 2c 20 6f 72 20 74 68 65 20 74 61  ccurs, or the ta
a150: 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ble does not con
a160: 74 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  tain the specifi
a170: 65 64 20 72 6f 77 2c 0a 2a 2a 20 61 6e 20 53 51  ed row,.** an SQ
a180: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
a190: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
a1a0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
a1b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
a1c0: 66 0a 2a 2a 20 70 61 42 6c 6f 62 20 69 73 20 6e  f.** paBlob is n
a1d0: 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
a1e0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
a1f0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
a200: 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e 74  ller to.** event
a210: 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72  ually free the r
a220: 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 2e 0a  eturned buffer..
a230: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
a240: 69 6f 6e 20 6d 61 79 20 6c 65 61 76 65 20 61 6e  ion may leave an
a250: 20 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 62 6c   open sqlite3_bl
a260: 6f 62 2a 20 68 61 6e 64 6c 65 20 69 6e 20 74 68  ob* handle in th
a270: 65 0a 2a 2a 20 46 74 73 33 54 61 62 6c 65 2e 70  e.** Fts3Table.p
a280: 53 65 67 6d 65 6e 74 73 20 76 61 72 69 61 62 6c  Segments variabl
a290: 65 2e 20 54 68 69 73 20 68 61 6e 64 6c 65 20 69  e. This handle i
a2a0: 73 20 72 65 75 73 65 64 20 62 79 20 73 75 62 73  s reused by subs
a2b0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 0a 2a 2a 20  equent calls.** 
a2c0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
a2d0: 2e 20 54 68 65 20 68 61 6e 64 6c 65 20 6d 61 79  . The handle may
a2e0: 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 63 61   be closed by ca
a2f0: 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  lling the.** sql
a300: 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
a310: 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
a320: 2e 20 52 65 75 73 69 6e 67 20 61 20 62 6c 6f 62  . Reusing a blob
a330: 20 68 61 6e 64 6c 65 20 69 73 20 61 20 68 61 6e   handle is a han
a340: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
a350: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2c 20 62  e improvement, b
a360: 75 74 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  ut the blob hand
a370: 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  le should always
a380: 20 62 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 65   be closed.** be
a390: 66 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20  fore control is 
a3a0: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
a3b0: 75 73 65 72 20 28 74 6f 20 70 72 65 76 65 6e 74  user (to prevent
a3c0: 20 61 20 6c 6f 63 6b 20 62 65 69 6e 67 20 68 65   a lock being he
a3d0: 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  ld.** on the dat
a3e0: 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6c  abase file for l
a3f0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 65 63 65 73  onger than neces
a400: 73 61 72 79 29 2e 20 54 68 75 73 2c 20 61 6e 79  sary). Thus, any
a410: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a   virtual table.*
a420: 2a 20 6d 65 74 68 6f 64 20 28 78 46 69 6c 74 65  * method (xFilte
a430: 72 20 65 74 63 2e 29 20 74 68 61 74 20 6d 61 79  r etc.) that may
a440: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
a450: 69 72 65 63 74 6c 79 20 63 61 6c 6c 20 74 68 69  irectly call thi
a460: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
a470: 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 46  st call sqlite3F
a480: 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65  ts3SegmentsClose
a490: 28 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  () before return
a4a0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
a4b0: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
a4c0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
a4d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a4e0: 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
a4f0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
a500: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
a510: 63 6b 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a  ckid,         /*
a520: 20 41 63 63 65 73 73 20 74 68 65 20 72 6f 77 20   Access the row 
a530: 77 69 74 68 20 62 6c 6f 63 6b 69 64 3d 24 69 42  with blockid=$iB
a540: 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20 63 68 61 72  lockid */.  char
a550: 20 2a 2a 70 61 42 6c 6f 62 2c 20 20 20 20 20 20   **paBlob,      
a560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a570: 55 54 3a 20 42 6c 6f 62 20 64 61 74 61 20 69 6e  UT: Blob data in
a580: 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72   malloc'd buffer
a590: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 6c 6f   */.  int *pnBlo
a5a0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
a5b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
a5c0: 7a 65 20 6f 66 20 62 6c 6f 62 20 64 61 74 61 20  ze of blob data 
a5d0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 61 64  */.  int *pnLoad
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 79 74       /* OUT: Byt
a600: 65 73 20 61 63 74 75 61 6c 6c 79 20 6c 6f 61 64  es actually load
a610: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
a620: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
a630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a640: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
a650: 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75 73 74 20 62  /* pnBlob must b
a660: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 70 61 42 6c  e non-NULL. paBl
a670: 6f 62 20 6d 61 79 20 62 65 20 4e 55 4c 4c 20 6f  ob may be NULL o
a680: 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 2a 2f 0a 20  r non-NULL. */. 
a690: 20 61 73 73 65 72 74 28 20 70 6e 42 6c 6f 62 20   assert( pnBlob 
a6a0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53 65  );..  if( p->pSe
a6b0: 67 6d 65 6e 74 73 20 29 7b 0a 20 20 20 20 72 63  gments ){.    rc
a6c0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
a6d0: 72 65 6f 70 65 6e 28 70 2d 3e 70 53 65 67 6d 65  reopen(p->pSegme
a6e0: 6e 74 73 2c 20 69 42 6c 6f 63 6b 69 64 29 3b 0a  nts, iBlockid);.
a6f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
a700: 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e 74 73   0==p->zSegments
a710: 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tbl ){.      p->
a720: 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 3d 20 73  zSegmentsTbl = s
a730: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
a740: 25 73 5f 73 65 67 6d 65 6e 74 73 22 2c 20 70 2d  %s_segments", p-
a750: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
a760: 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e  f( 0==p->zSegmen
a770: 74 73 54 62 6c 20 29 20 72 65 74 75 72 6e 20 53  tsTbl ) return S
a780: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a790: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a7a0: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0a 20  te3_blob_open(. 
a7b0: 20 20 20 20 20 20 70 2d 3e 64 62 2c 20 70 2d 3e        p->db, p->
a7c0: 7a 44 62 2c 20 70 2d 3e 7a 53 65 67 6d 65 6e 74  zDb, p->zSegment
a7d0: 73 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69  sTbl, "block", i
a7e0: 42 6c 6f 63 6b 69 64 2c 20 30 2c 20 26 70 2d 3e  Blockid, 0, &p->
a7f0: 70 53 65 67 6d 65 6e 74 73 0a 20 20 20 20 29 3b  pSegments.    );
a800: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
a810: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a820: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
a830: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
a840: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20  p->pSegments);. 
a850: 20 20 20 2a 70 6e 42 6c 6f 62 20 3d 20 6e 42 79     *pnBlob = nBy
a860: 74 65 3b 0a 20 20 20 20 69 66 28 20 70 61 42 6c  te;.    if( paBl
a870: 6f 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ob ){.      char
a880: 20 2a 61 42 79 74 65 20 3d 20 73 71 6c 69 74 65   *aByte = sqlite
a890: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 20 2b  3_malloc(nByte +
a8a0: 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49   FTS3_NODE_PADDI
a8b0: 4e 47 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  NG);.      if( !
a8c0: 61 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  aByte ){.       
a8d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a8e0: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
a8f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4c  .        if( pnL
a900: 6f 61 64 20 26 26 20 6e 42 79 74 65 3e 28 46 54  oad && nByte>(FT
a910: 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48  S3_NODE_CHUNK_TH
a920: 52 45 53 48 4f 4c 44 29 20 29 7b 0a 20 20 20 20  RESHOLD) ){.    
a930: 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 46 54        nByte = FT
a940: 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49 5a  S3_NODE_CHUNKSIZ
a950: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  E;.          *pn
a960: 4c 6f 61 64 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Load = nByte;.  
a970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a980: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
a990: 62 5f 72 65 61 64 28 70 2d 3e 70 53 65 67 6d 65  b_read(p->pSegme
a9a0: 6e 74 73 2c 20 61 42 79 74 65 2c 20 6e 42 79 74  nts, aByte, nByt
a9b0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6d  e, 0);.        m
a9c0: 65 6d 73 65 74 28 26 61 42 79 74 65 5b 6e 42 79  emset(&aByte[nBy
a9d0: 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  te], 0, FTS3_NOD
a9e0: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
a9f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
aa00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
aa10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
aa20: 61 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  aByte);.        
aa30: 20 20 61 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    aByte = 0;.   
aa40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
aa50: 20 20 20 20 20 2a 70 61 42 6c 6f 62 20 3d 20 61       *paBlob = a
aa60: 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Byte;.    }.  }.
aa70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aa80: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
aa90: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 61 74 20   blob handle at 
aaa0: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69 66  p->pSegments, if
aab0: 20 69 74 20 69 73 20 6f 70 65 6e 2e 20 53 65 65   it is open. See
aac0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 0a   comments above.
aad0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 46 74  ** the sqlite3Ft
aae0: 73 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66 75  s3ReadBlock() fu
aaf0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  nction for detai
ab00: 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ls..*/.void sqli
ab10: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
ab20: 6c 6f 73 65 28 46 74 73 33 54 61 62 6c 65 20 2a  lose(Fts3Table *
ab30: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  p){.  sqlite3_bl
ab40: 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 53 65 67  ob_close(p->pSeg
ab50: 6d 65 6e 74 73 29 3b 0a 20 20 70 2d 3e 70 53 65  ments);.  p->pSe
ab60: 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 7d 0a 20 20  gments = 0;.}.  
ab70: 20 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74    .static int ft
ab80: 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52  s3SegReaderIncrR
ab90: 65 61 64 28 46 74 73 33 53 65 67 52 65 61 64 65  ead(Fts3SegReade
aba0: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69  r *pReader){.  i
abb0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
abe0: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
abf0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac10: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ac20: 0a 0a 20 20 6e 52 65 61 64 20 3d 20 4d 49 4e 28  ..  nRead = MIN(
ac30: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 2d  pReader->nNode -
ac40: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
ac50: 61 74 65 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 43  ate, FTS3_NODE_C
ac60: 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 20 72 63 20  HUNKSIZE);.  rc 
ac70: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
ac80: 65 61 64 28 0a 20 20 20 20 20 20 70 52 65 61 64  ead(.      pRead
ac90: 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a 20 20 20 20  er->pBlob, .    
aca0: 20 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64    &pReader->aNod
acb0: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  e[pReader->nPopu
acc0: 6c 61 74 65 5d 2c 0a 20 20 20 20 20 20 6e 52 65  late],.      nRe
acd0: 61 64 2c 0a 20 20 20 20 20 20 70 52 65 61 64 65  ad,.      pReade
ace0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20 20 29  r->nPopulate.  )
acf0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
ad00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52  ITE_OK ){.    pR
ad10: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
ad20: 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 20 20 6d   += nRead;.    m
ad30: 65 6d 73 65 74 28 26 70 52 65 61 64 65 72 2d 3e  emset(&pReader->
ad40: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
ad50: 50 6f 70 75 6c 61 74 65 5d 2c 20 30 2c 20 46 54  Populate], 0, FT
ad60: 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29  S3_NODE_PADDING)
ad70: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65  ;.    if( pReade
ad80: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 70 52  r->nPopulate==pR
ad90: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a  eader->nNode ){.
ada0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
adb0: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
adc0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  ->pBlob);.      
add0: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d  pReader->pBlob =
ade0: 20 30 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65   0;.      pReade
adf0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3d 20 30  r->nPopulate = 0
ae00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ae10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
ae20: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
ae30: 61 64 65 72 52 65 71 75 69 72 65 28 46 74 73 33  aderRequire(Fts3
ae40: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
ae50: 65 72 2c 20 63 68 61 72 20 2a 70 46 72 6f 6d 2c  er, char *pFrom,
ae60: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
ae70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ae80: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52  K;.  assert( !pR
ae90: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 0a 20 20  eader->pBlob .  
aea0: 20 20 20 20 20 7c 7c 20 28 70 46 72 6f 6d 3e 3d       || (pFrom>=
aeb0: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 26  pReader->aNode &
aec0: 26 20 70 46 72 6f 6d 3c 26 70 52 65 61 64 65 72  & pFrom<&pReader
aed0: 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d  ->aNode[pReader-
aee0: 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29 3b 0a 20 20  >nNode]).  );.  
aef0: 77 68 69 6c 65 28 20 70 52 65 61 64 65 72 2d 3e  while( pReader->
af00: 70 42 6c 6f 62 20 26 26 20 72 63 3d 3d 53 51 4c  pBlob && rc==SQL
af10: 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20  ITE_OK .     && 
af20: 20 28 70 46 72 6f 6d 20 2d 20 70 52 65 61 64 65   (pFrom - pReade
af30: 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e 42 79 74 65  r->aNode + nByte
af40: 29 3e 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  )>pReader->nPopu
af50: 6c 61 74 65 0a 20 20 29 7b 0a 20 20 20 20 72 63  late.  ){.    rc
af60: 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
af70: 49 6e 63 72 52 65 61 64 28 70 52 65 61 64 65 72  IncrRead(pReader
af80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
af90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
afa0: 20 61 6e 20 46 74 73 33 53 65 67 52 65 61 64 65   an Fts3SegReade
afb0: 72 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  r cursor to poin
afc0: 74 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 73 74 61  t at EOF..*/.sta
afd0: 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67  tic void fts3Seg
afe0: 52 65 61 64 65 72 53 65 74 45 6f 66 28 46 74 73  ReaderSetEof(Fts
aff0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
b000: 29 7b 0a 20 20 69 66 28 20 21 66 74 73 33 53 65  ){.  if( !fts3Se
b010: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c  gReaderIsRootOnl
b020: 79 28 70 53 65 67 29 20 29 7b 0a 20 20 20 20 73  y(pSeg) ){.    s
b030: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 67  qlite3_free(pSeg
b040: 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71  ->aNode);.    sq
b050: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
b060: 28 70 53 65 67 2d 3e 70 42 6c 6f 62 29 3b 0a 20  (pSeg->pBlob);. 
b070: 20 20 20 70 53 65 67 2d 3e 70 42 6c 6f 62 20 3d     pSeg->pBlob =
b080: 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 67 2d 3e   0;.  }.  pSeg->
b090: 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aNode = 0;.}../*
b0a0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
b0b0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
b0c0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
b0d0: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74  nt to the next t
b0e0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 73 65  erm in the.** se
b0f0: 67 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73  gment. If succes
b100: 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
b110: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
b120: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
b130: 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c 49 54 45   term,.** SQLITE
b140: 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 77 69 73 65  _DONE. Otherwise
b150: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
b160: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
b170: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
b180: 64 65 72 4e 65 78 74 28 0a 20 20 46 74 73 33 54  derNext(.  Fts3T
b190: 61 62 6c 65 20 2a 70 2c 20 0a 20 20 46 74 73 33  able *p, .  Fts3
b1a0: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
b1b0: 65 72 2c 0a 20 20 69 6e 74 20 62 49 6e 63 72 0a  er,.  int bIncr.
b1c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1e0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
b1f0: 6f 64 65 20 6f 66 20 76 61 72 69 6f 75 73 20 73  ode of various s
b200: 75 62 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  ub-routines */. 
b210: 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 20 20 20   char *pNext;   
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 2f 2a 20 43 75 72 73 6f 72 20 76 61 72 69 61   /* Cursor varia
b240: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ble */.  int nPr
b250: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
b260: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b270: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
b280: 65 72 6d 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  erm prefix */.  
b290: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
b2c0: 65 73 20 69 6e 20 74 65 72 6d 20 73 75 66 66 69  es in term suffi
b2d0: 78 20 2a 2f 0a 0a 20 20 69 66 28 20 21 70 52 65  x */..  if( !pRe
b2e0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29  ader->aDoclist )
b2f0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52  {.    pNext = pR
b300: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20  eader->aNode;.  
b310: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 78 74  }else{.    pNext
b320: 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f   = &pReader->aDo
b330: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
b340: 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20  Doclist];.  }.. 
b350: 20 69 66 28 20 21 70 4e 65 78 74 20 7c 7c 20 70   if( !pNext || p
b360: 4e 65 78 74 3e 3d 26 70 52 65 61 64 65 72 2d 3e  Next>=&pReader->
b370: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
b380: 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20 20 20 69 66  Node] ){..    if
b390: 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  ( fts3SegReaderI
b3a0: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
b3b0: 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 48  ) ){.      Fts3H
b3c0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d  ashElem *pElem =
b3d0: 20 2a 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65   *(pReader->ppNe
b3e0: 78 74 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73  xtElem);.      s
b3f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 61  qlite3_free(pRea
b400: 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20  der->aNode);.   
b410: 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64     pReader->aNod
b420: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
b430: 20 70 45 6c 65 6d 20 29 7b 0a 20 20 20 20 20 20   pElem ){.      
b440: 20 20 63 68 61 72 20 2a 61 43 6f 70 79 3b 0a 20    char *aCopy;. 
b450: 20 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c 69         PendingLi
b460: 73 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e  st *pList = (Pen
b470: 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48  dingList *)fts3H
b480: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
b490: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70          int nCop
b4a0: 79 20 3d 20 70 4c 69 73 74 2d 3e 6e 44 61 74 61  y = pList->nData
b4b0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61  +1;.        pRea
b4c0: 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68  der->zTerm = (ch
b4d0: 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79  ar *)fts3HashKey
b4e0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20  (pElem);.       
b4f0: 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20   pReader->nTerm 
b500: 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a  = fts3HashKeysiz
b510: 65 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  e(pElem);.      
b520: 20 20 61 43 6f 70 79 20 3d 20 28 63 68 61 72 2a    aCopy = (char*
b530: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
b540: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
b550: 69 66 28 20 21 61 43 6f 70 79 20 29 20 72 65 74  if( !aCopy ) ret
b560: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b570: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
b580: 28 61 43 6f 70 79 2c 20 70 4c 69 73 74 2d 3e 61  (aCopy, pList->a
b590: 44 61 74 61 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Data, nCopy);.  
b5a0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e        pReader->n
b5b0: 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e  Node = pReader->
b5c0: 6e 44 6f 63 6c 69 73 74 20 3d 20 6e 43 6f 70 79  nDoclist = nCopy
b5d0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
b5e0: 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52 65 61 64  r->aNode = pRead
b5f0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61  er->aDoclist = a
b600: 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 70 52  Copy;.        pR
b610: 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65  eader->ppNextEle
b620: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  m++;.        ass
b630: 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61 4e  ert( pReader->aN
b640: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ode );.      }. 
b650: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b660: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
b670: 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
b680: 65 74 45 6f 66 28 70 52 65 61 64 65 72 29 3b 0a  etEof(pReader);.
b690: 0a 20 20 20 20 2f 2a 20 49 66 20 69 43 75 72 72  .    /* If iCurr
b6a0: 65 6e 74 42 6c 6f 63 6b 3e 3d 69 4c 65 61 66 45  entBlock>=iLeafE
b6b0: 6e 64 42 6c 6f 63 6b 2c 20 74 68 69 73 20 69 73  ndBlock, this is
b6c0: 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74 69 6f   an EOF conditio
b6d0: 6e 2e 20 41 6c 6c 20 6c 65 61 66 20 0a 20 20 20  n. All leaf .   
b6e0: 20 2a 2a 20 62 6c 6f 63 6b 73 20 68 61 76 65 20   ** blocks have 
b6f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 61  already been tra
b700: 76 65 72 73 65 64 2e 20 20 2a 2f 0a 20 20 20 20  versed.  */.    
b710: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
b720: 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3c 3d  >iCurrentBlock<=
b730: 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e  pReader->iLeafEn
b740: 64 42 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  dBlock );.    if
b750: 28 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ( pReader->iCurr
b760: 65 6e 74 42 6c 6f 63 6b 3e 3d 70 52 65 61 64 65  entBlock>=pReade
b770: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
b780: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b790: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b7a0: 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  }..    rc = sqli
b7b0: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
b7c0: 28 0a 20 20 20 20 20 20 20 20 70 2c 20 2b 2b 70  (.        p, ++p
b7d0: 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74  Reader->iCurrent
b7e0: 42 6c 6f 63 6b 2c 20 26 70 52 65 61 64 65 72 2d  Block, &pReader-
b7f0: 3e 61 4e 6f 64 65 2c 20 26 70 52 65 61 64 65 72  >aNode, &pReader
b800: 2d 3e 6e 4e 6f 64 65 2c 20 0a 20 20 20 20 20 20  ->nNode, .      
b810: 20 20 28 62 49 6e 63 72 20 3f 20 26 70 52 65 61    (bIncr ? &pRea
b820: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3a  der->nPopulate :
b830: 20 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   0).    );.    i
b840: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b850: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b860: 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65    assert( pReade
b870: 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 29 3b 0a 20  r->pBlob==0 );. 
b880: 20 20 20 69 66 28 20 62 49 6e 63 72 20 26 26 20     if( bIncr && 
b890: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
b8a0: 74 65 3c 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  te<pReader->nNod
b8b0: 65 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64  e ){.      pRead
b8c0: 65 72 2d 3e 70 42 6c 6f 62 20 3d 20 70 2d 3e 70  er->pBlob = p->p
b8d0: 53 65 67 6d 65 6e 74 73 3b 0a 20 20 20 20 20 20  Segments;.      
b8e0: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30  p->pSegments = 0
b8f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 78  ;.    }.    pNex
b900: 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  t = pReader->aNo
b910: 64 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  de;.  }..  asser
b920: 74 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  t( !fts3SegReade
b930: 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64  rIsPending(pRead
b940: 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 66  er) );..  rc = f
b950: 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75  ts3SegReaderRequ
b960: 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65  ire(pReader, pNe
b970: 78 74 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  xt, FTS3_VARINT_
b980: 4d 41 58 2a 32 29 3b 0a 20 20 69 66 28 20 72 63  MAX*2);.  if( rc
b990: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
b9a0: 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 2f 2a  turn rc;.  .  /*
b9b0: 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
b9c0: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
b9d0: 47 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  G bytes of paddi
b9e0: 6e 67 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ng, the followin
b9f0: 67 20 69 73 20 0a 20 20 2a 2a 20 73 61 66 65 20  g is .  ** safe 
ba00: 28 6e 6f 20 72 69 73 6b 20 6f 66 20 6f 76 65 72  (no risk of over
ba10: 72 65 61 64 29 20 65 76 65 6e 20 69 66 20 74 68  read) even if th
ba20: 65 20 6e 6f 64 65 20 64 61 74 61 20 69 73 20 63  e node data is c
ba30: 6f 72 72 75 70 74 65 64 2e 20 2a 2f 0a 20 20 70  orrupted. */.  p
ba40: 4e 65 78 74 20 2b 3d 20 66 74 73 33 47 65 74 56  Next += fts3GetV
ba50: 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26  arint32(pNext, &
ba60: 6e 50 72 65 66 69 78 29 3b 0a 20 20 70 4e 65 78  nPrefix);.  pNex
ba70: 74 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  t += fts3GetVari
ba80: 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 53 75  nt32(pNext, &nSu
ba90: 66 66 69 78 29 3b 0a 20 20 69 66 28 20 6e 50 72  ffix);.  if( nPr
baa0: 65 66 69 78 3c 30 20 7c 7c 20 6e 53 75 66 66 69  efix<0 || nSuffi
bab0: 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 26 70 4e 65  x<=0 .   || &pNe
bac0: 78 74 5b 6e 53 75 66 66 69 78 5d 3e 26 70 52 65  xt[nSuffix]>&pRe
bad0: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
bae0: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 29  der->nNode] .  )
baf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53  {.    return FTS
bb00: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
bb10: 20 7d 0a 0a 20 20 69 66 28 20 6e 50 72 65 66 69   }..  if( nPrefi
bb20: 78 2b 6e 53 75 66 66 69 78 3e 70 52 65 61 64 65  x+nSuffix>pReade
bb30: 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 29 7b  r->nTermAlloc ){
bb40: 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
bb50: 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78  (nPrefix+nSuffix
bb60: 29 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )*2;.    char *z
bb70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
bb80: 61 6c 6c 6f 63 28 70 52 65 61 64 65 72 2d 3e 7a  alloc(pReader->z
bb90: 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  Term, nNew);.   
bba0: 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
bbb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bbc0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
bbd0: 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72     pReader->zTer
bbe0: 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70 52  m = zNew;.    pR
bbf0: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f  eader->nTermAllo
bc00: 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20  c = nNew;.  }.. 
bc10: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
bc20: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
bc30: 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66 66  er, pNext, nSuff
bc40: 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  ix+FTS3_VARINT_M
bc50: 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  AX);.  if( rc!=S
bc60: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
bc70: 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  n rc;..  memcpy(
bc80: 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 5b  &pReader->zTerm[
bc90: 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78 74 2c  nPrefix], pNext,
bca0: 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 52 65   nSuffix);.  pRe
bcb0: 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 50  ader->nTerm = nP
bcc0: 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20  refix+nSuffix;. 
bcd0: 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66 69   pNext += nSuffi
bce0: 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66 74  x;.  pNext += ft
bcf0: 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e  s3GetVarint32(pN
bd00: 65 78 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e  ext, &pReader->n
bd10: 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 52 65 61  Doclist);.  pRea
bd20: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20  der->aDoclist = 
bd30: 70 4e 65 78 74 3b 0a 20 20 70 52 65 61 64 65 72  pNext;.  pReader
bd40: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
bd50: 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  0;..  /* Check t
bd60: 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73 74 20  hat the doclist 
bd70: 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
bd80: 74 6f 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  to extend past t
bd90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
bda0: 2a 2a 20 62 2d 74 72 65 65 20 6e 6f 64 65 2e 20  ** b-tree node. 
bdb0: 41 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 6e  And that the fin
bdc0: 61 6c 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  al byte of the d
bdd0: 6f 63 6c 69 73 74 20 69 73 20 30 78 30 30 2e 20  oclist is 0x00. 
bde0: 49 66 20 65 69 74 68 65 72 20 0a 20 20 2a 2a 20  If either .  ** 
bdf0: 6f 66 20 74 68 65 73 65 20 73 74 61 74 65 6d 65  of these stateme
be00: 6e 74 73 20 69 73 20 75 6e 74 72 75 65 2c 20 74  nts is untrue, t
be10: 68 65 6e 20 74 68 65 20 64 61 74 61 20 73 74 72  hen the data str
be20: 75 63 74 75 72 65 20 69 73 20 63 6f 72 72 75 70  ucture is corrup
be30: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 26 70  t..  */.  if( &p
be40: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
be50: 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69  [pReader->nDocli
be60: 73 74 5d 3e 26 70 52 65 61 64 65 72 2d 3e 61 4e  st]>&pReader->aN
be70: 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f  ode[pReader->nNo
be80: 64 65 5d 20 0a 20 20 20 7c 7c 20 28 70 52 65 61  de] .   || (pRea
be90: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d  der->nPopulate==
bea0: 30 20 26 26 20 70 52 65 61 64 65 72 2d 3e 61 44  0 && pReader->aD
beb0: 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e  oclist[pReader->
bec0: 6e 44 6f 63 6c 69 73 74 2d 31 5d 29 0a 20 20 29  nDoclist-1]).  )
bed0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53  {.    return FTS
bee0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
bef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
bf00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bf10: 53 65 74 20 74 68 65 20 53 65 67 52 65 61 64 65  Set the SegReade
bf20: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
bf30: 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 69 6e  e first docid in
bf40: 20 74 68 65 20 64 6f 63 6c 69 73 74 20 61 73 73   the doclist ass
bf50: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
bf60: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
bf70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf80: 66 74 73 33 53 65 67 52 65 61 64 65 72 46 69 72  fts3SegReaderFir
bf90: 73 74 44 6f 63 69 64 28 46 74 73 33 54 61 62 6c  stDocid(Fts3Tabl
bfa0: 65 20 2a 70 54 61 62 2c 20 46 74 73 33 53 65 67  e *pTab, Fts3Seg
bfb0: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29  Reader *pReader)
bfc0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bfd0: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
bfe0: 28 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c  ( pReader->aDocl
bff0: 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
c000: 20 21 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73   !pReader->pOffs
c010: 65 74 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  etList );.  if( 
c020: 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26  pTab->bDescIdx &
c030: 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  & fts3SegReaderI
c040: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
c050: 29 20 29 7b 0a 20 20 20 20 75 38 20 62 45 6f 66  ) ){.    u8 bEof
c060: 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65   = 0;.    pReade
c070: 72 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20  r->iDocid = 0;. 
c080: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66     pReader->nOff
c090: 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  setList = 0;.   
c0a0: 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c   sqlite3Fts3Docl
c0b0: 69 73 74 50 72 65 76 28 30 2c 0a 20 20 20 20 20  istPrev(0,.     
c0c0: 20 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63     pReader->aDoc
c0d0: 6c 69 73 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e  list, pReader->n
c0e0: 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64 65  Doclist, &pReade
c0f0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 2c 20  r->pOffsetList, 
c100: 0a 20 20 20 20 20 20 20 20 26 70 52 65 61 64 65  .        &pReade
c110: 72 2d 3e 69 44 6f 63 69 64 2c 20 26 70 52 65 61  r->iDocid, &pRea
c120: 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  der->nOffsetList
c130: 2c 20 26 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20  , &bEof.    );. 
c140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
c150: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65   fts3SegReaderRe
c160: 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70  quire(pReader, p
c170: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
c180: 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  , FTS3_VARINT_MA
c190: 58 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  X);.    if( rc==
c1a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c1b0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
c1c0: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
c1d0: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
c1e0: 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f  t, &pReader->iDo
c1f0: 63 69 64 29 3b 0a 20 20 20 20 20 20 70 52 65 61  cid);.      pRea
c200: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
c210: 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f   = &pReader->aDo
c220: 63 6c 69 73 74 5b 6e 5d 3b 0a 20 20 20 20 7d 0a  clist[n];.    }.
c230: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
c250: 65 20 74 68 65 20 53 65 67 52 65 61 64 65 72 20  e the SegReader 
c260: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
c270: 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 20 74 68  next docid in th
c280: 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 61 73 73  e doclist.** ass
c290: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
c2a0: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a   current term..*
c2b0: 2a 20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  * .** If argumen
c2c0: 74 73 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20  ts ppOffsetList 
c2d0: 61 6e 64 20 70 6e 4f 66 66 73 65 74 4c 69 73 74  and pnOffsetList
c2e0: 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74   are not NULL, t
c2f0: 68 65 6e 20 0a 2a 2a 20 2a 70 70 4f 66 66 73 65  hen .** *ppOffse
c300: 74 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20  tList is set to 
c310: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
c320: 73 74 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74  st column-offset
c330: 20 6c 69 73 74 0a 2a 2a 20 69 6e 20 74 68 65 20   list.** in the 
c340: 64 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 28 69  doclist entry (i
c350: 2e 65 2e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .e. immediately 
c360: 70 61 73 74 20 74 68 65 20 64 6f 63 69 64 20 76  past the docid v
c370: 61 72 69 6e 74 29 2e 0a 2a 2a 20 2a 70 6e 4f 66  arint)..** *pnOf
c380: 66 73 65 74 4c 69 73 74 20 69 73 20 73 65 74 20  fsetList is set 
c390: 74 6f 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  to the length of
c3a0: 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
c3b0: 6d 6e 2d 6f 66 66 73 65 74 0a 2a 2a 20 6c 69 73  mn-offset.** lis
c3c0: 74 73 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  ts, not includin
c3d0: 67 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  g the nul-termin
c3e0: 61 74 6f 72 20 62 79 74 65 2e 20 46 6f 72 20 65  ator byte. For e
c3f0: 78 61 6d 70 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  xample:.*/.stati
c400: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
c410: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 0a 20 20  derNextDocid(.  
c420: 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c  Fts3Table *pTab,
c430: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
c440: 20 2a 70 52 65 61 64 65 72 2c 20 20 20 20 20 20   *pReader,      
c450: 20 20 20 2f 2a 20 52 65 61 64 65 72 20 74 6f 20     /* Reader to 
c460: 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20  advance to next 
c470: 64 6f 63 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  docid */.  char 
c480: 2a 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 2c 20  **ppOffsetList, 
c490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
c4a0: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  T: Pointer to cu
c4b0: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 2d 6c  rrent position-l
c4c0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ist */.  int *pn
c4d0: 4f 66 66 73 65 74 4c 69 73 74 20 20 20 20 20 20  OffsetList      
c4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
c4f0: 20 4c 65 6e 67 74 68 20 6f 66 20 2a 70 70 4f 66   Length of *ppOf
c500: 66 73 65 74 4c 69 73 74 20 69 6e 20 62 79 74 65  fsetList in byte
c510: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
c520: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c530: 63 68 61 72 20 2a 70 20 3d 20 70 52 65 61 64 65  char *p = pReade
c540: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a  r->pOffsetList;.
c550: 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20    char c = 0;.. 
c560: 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 0a 20   assert( p );.. 
c570: 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63   if( pTab->bDesc
c580: 49 64 78 20 26 26 20 66 74 73 33 53 65 67 52 65  Idx && fts3SegRe
c590: 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52  aderIsPending(pR
c5a0: 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  eader) ){.    /*
c5b0: 20 41 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73   A pending-terms
c5c0: 20 73 65 67 2d 72 65 61 64 65 72 20 66 6f 72 20   seg-reader for 
c5d0: 61 6e 20 46 54 53 34 20 74 61 62 6c 65 20 74 68  an FTS4 table th
c5e0: 61 74 20 75 73 65 73 20 6f 72 64 65 72 3d 64 65  at uses order=de
c5f0: 73 63 2e 0a 20 20 20 20 2a 2a 20 50 65 6e 64 69  sc..    ** Pendi
c600: 6e 67 2d 74 65 72 6d 73 20 64 6f 63 6c 69 73 74  ng-terms doclist
c610: 73 20 61 72 65 20 61 6c 77 61 79 73 20 62 75 69  s are always bui
c620: 6c 74 20 75 70 20 69 6e 20 61 73 63 65 6e 64 69  lt up in ascendi
c630: 6e 67 20 6f 72 64 65 72 2c 20 73 6f 0a 20 20 20  ng order, so.   
c640: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 69   ** we have to i
c650: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
c660: 68 65 6d 20 62 61 63 6b 77 61 72 64 73 20 68 65  hem backwards he
c670: 72 65 2e 20 2a 2f 0a 20 20 20 20 75 38 20 62 45  re. */.    u8 bE
c680: 6f 66 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  of = 0;.    if( 
c690: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a  ppOffsetList ){.
c6a0: 20 20 20 20 20 20 2a 70 70 4f 66 66 73 65 74 4c        *ppOffsetL
c6b0: 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 70  ist = pReader->p
c6c0: 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20 20  OffsetList;.    
c6d0: 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20    *pnOffsetList 
c6e0: 3d 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73  = pReader->nOffs
c6f0: 65 74 4c 69 73 74 20 2d 20 31 3b 0a 20 20 20 20  etList - 1;.    
c700: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
c710: 33 44 6f 63 6c 69 73 74 50 72 65 76 28 30 2c 0a  3DoclistPrev(0,.
c720: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
c730: 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 65 61 64  >aDoclist, pRead
c740: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20 26 70  er->nDoclist, &p
c750: 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63  , &pReader->iDoc
c760: 69 64 2c 0a 20 20 20 20 20 20 20 20 26 70 52 65  id,.        &pRe
c770: 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73  ader->nOffsetLis
c780: 74 2c 20 26 62 45 6f 66 0a 20 20 20 20 29 3b 0a  t, &bEof.    );.
c790: 20 20 20 20 69 66 28 20 62 45 6f 66 20 29 7b 0a      if( bEof ){.
c7a0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
c7b0: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a  OffsetList = 0;.
c7c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c7d0: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
c7e0: 74 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  tList = p;.    }
c7f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
c800: 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 52 65 61  ar *pEnd = &pRea
c810: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52  der->aDoclist[pR
c820: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d  eader->nDoclist]
c830: 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;..    /* Pointe
c840: 72 20 70 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  r p currently po
c850: 69 6e 74 73 20 61 74 20 74 68 65 20 66 69 72 73  ints at the firs
c860: 74 20 62 79 74 65 20 6f 66 20 61 6e 20 6f 66 66  t byte of an off
c870: 73 65 74 20 6c 69 73 74 2e 20 54 68 65 0a 20 20  set list. The.  
c880: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 62    ** following b
c890: 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73 20 69 74  lock advances it
c8a0: 20 74 6f 20 70 6f 69 6e 74 20 6f 6e 65 20 62 79   to point one by
c8b0: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
c8c0: 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  of.    ** the sa
c8d0: 6d 65 20 6f 66 66 73 65 74 20 6c 69 73 74 2e 20  me offset list. 
c8e0: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  */.    while( 1 
c8f0: 29 7b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54  ){.  .      /* T
c900: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e  he following lin
c910: 65 20 6f 66 20 63 6f 64 65 20 28 61 6e 64 20 74  e of code (and t
c920: 68 65 20 22 70 2b 2b 22 20 62 65 6c 6f 77 20 74  he "p++" below t
c930: 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 29  he while() loop)
c940: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72   is.      ** nor
c950: 6d 61 6c 6c 79 20 61 6c 6c 20 74 68 61 74 20 69  mally all that i
c960: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6d 6f  s required to mo
c970: 76 65 20 70 6f 69 6e 74 65 72 20 70 20 74 6f 20  ve pointer p to 
c980: 74 68 65 20 64 65 73 69 72 65 64 20 0a 20 20 20  the desired .   
c990: 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2e 20     ** position. 
c9a0: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
c9b0: 20 69 66 20 74 68 69 73 20 6e 6f 64 65 20 69 73   if this node is
c9c0: 20 62 65 69 6e 67 20 6c 6f 61 64 65 64 20 66 72   being loaded fr
c9d0: 6f 6d 20 64 69 73 6b 0a 20 20 20 20 20 20 2a 2a  om disk.      **
c9e0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 61   incrementally a
c9f0: 6e 64 20 70 6f 69 6e 74 65 72 20 22 70 22 20 6e  nd pointer "p" n
ca00: 6f 77 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ow points to the
ca10: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
ca20: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f  .      ** the po
ca30: 70 75 6c 61 74 65 64 20 70 61 72 74 20 6f 66 20  pulated part of 
ca40: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 5d  pReader->aNode[]
ca50: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ca60: 20 77 68 69 6c 65 28 20 2a 70 20 7c 20 63 20 29   while( *p | c )
ca70: 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30   c = *p++ & 0x80
ca80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ca90: 2a 70 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  *p==0 );.  .    
caa0: 20 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e 70    if( pReader->p
cab0: 42 6c 6f 62 3d 3d 30 20 7c 7c 20 70 3c 26 70 52  Blob==0 || p<&pR
cac0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
cad0: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d  ader->nPopulate]
cae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
caf0: 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
cb00: 65 72 49 6e 63 72 52 65 61 64 28 70 52 65 61 64  erIncrRead(pRead
cb10: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
cb20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
cb30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
cb40: 20 20 20 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 20      p++;.  .    
cb50: 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
cb60: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74  populate the out
cb70: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 77 69  put variables wi
cb80: 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  th a pointer to 
cb90: 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  and the.    ** s
cba0: 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 76 69  ize of the previ
cbb0: 6f 75 73 20 6f 66 66 73 65 74 2d 6c 69 73 74 2e  ous offset-list.
cbc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
cbd0: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a  ppOffsetList ){.
cbe0: 20 20 20 20 20 20 2a 70 70 4f 66 66 73 65 74 4c        *ppOffsetL
cbf0: 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 70  ist = pReader->p
cc00: 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20 20  OffsetList;.    
cc10: 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20    *pnOffsetList 
cc20: 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 52 65 61  = (int)(p - pRea
cc30: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
cc40: 20 2d 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   - 1);.    }..  
cc50: 20 20 2f 2a 20 4c 69 73 74 20 6d 61 79 20 68 61    /* List may ha
cc60: 76 65 20 62 65 65 6e 20 65 64 69 74 65 64 20 69  ve been edited i
cc70: 6e 20 70 6c 61 63 65 20 62 79 20 66 74 73 33 45  n place by fts3E
cc80: 76 61 6c 4e 65 61 72 54 72 69 6d 28 29 20 2a 2f  valNearTrim() */
cc90: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70 45  .    while( p<pE
cca0: 6e 64 20 26 26 20 2a 70 3d 3d 30 20 29 20 70 2b  nd && *p==0 ) p+
ccb0: 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  +;.  .    /* If 
ccc0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
ccd0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
cce0: 20 64 6f 63 6c 69 73 74 2c 20 73 65 74 20 70 4f   doclist, set pO
ccf0: 66 66 73 65 74 4c 69 73 74 20 74 6f 0a 20 20 20  ffsetList to.   
cd00: 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77   ** NULL. Otherw
cd10: 69 73 65 2c 20 73 65 74 20 46 74 73 33 53 65 67  ise, set Fts3Seg
cd20: 52 65 61 64 65 72 2e 69 44 6f 63 69 64 20 74 6f  Reader.iDocid to
cd30: 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20   the next docid 
cd40: 61 6e 64 0a 20 20 20 20 2a 2a 20 46 74 73 33 53  and.    ** Fts3S
cd50: 65 67 52 65 61 64 65 72 2e 70 4f 66 66 73 65 74  egReader.pOffset
cd60: 4c 69 73 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  List to point to
cd70: 20 74 68 65 20 6e 65 78 74 20 6f 66 66 73 65 74   the next offset
cd80: 20 6c 69 73 74 20 62 65 66 6f 72 65 0a 20 20 20   list before.   
cd90: 20 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20   ** returning.. 
cda0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 3e     */.    if( p>
cdb0: 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70  =pEnd ){.      p
cdc0: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
cdd0: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ist = 0;.    }el
cde0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
cdf0: 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75  ts3SegReaderRequ
ce00: 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 2c 20  ire(pReader, p, 
ce10: 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29  FTS3_VARINT_MAX)
ce20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
ce30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ce40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
ce50: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
ce60: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66     pReader->pOff
ce70: 73 65 74 4c 69 73 74 20 3d 20 70 20 2b 20 73 71  setList = p + sq
ce80: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
ce90: 6e 74 28 70 2c 20 26 69 44 65 6c 74 61 29 3b 0a  nt(p, &iDelta);.
cea0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
ceb0: 2d 3e 62 44 65 73 63 49 64 78 20 29 7b 0a 20 20  ->bDescIdx ){.  
cec0: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
ced0: 3e 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74  >iDocid -= iDelt
cee0: 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  a;.        }else
cef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 61  {.          pRea
cf00: 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b 3d 20 69  der->iDocid += i
cf10: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d  Delta;.        }
cf20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cf30: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
cf40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69 6e 74 20  ITE_OK;.}...int 
cf50: 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f 76  sqlite3Fts3MsrOv
cf60: 66 6c 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  fl(.  Fts3Cursor
cf70: 20 2a 70 43 73 72 2c 20 0a 20 20 46 74 73 33 4d   *pCsr, .  Fts3M
cf80: 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
cf90: 4d 73 72 2c 0a 20 20 69 6e 74 20 2a 70 6e 4f 76  Msr,.  int *pnOv
cfa0: 66 6c 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  fl.){.  Fts3Tabl
cfb0: 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
cfc0: 65 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  e*)pCsr->base.pV
cfd0: 74 61 62 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c  tab;.  int nOvfl
cfe0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a   = 0;.  int ii;.
cff0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d000: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 70 67 73 7a  E_OK;.  int pgsz
d010: 20 3d 20 70 2d 3e 6e 50 67 73 7a 3b 0a 0a 20 20   = p->nPgsz;..  
d020: 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73 34  assert( p->bFts4
d030: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
d040: 73 7a 3e 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69  sz>0 );..  for(i
d050: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
d060: 4f 4b 20 26 26 20 69 69 3c 70 4d 73 72 2d 3e 6e  OK && ii<pMsr->n
d070: 53 65 67 6d 65 6e 74 3b 20 69 69 2b 2b 29 7b 0a  Segment; ii++){.
d080: 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
d090: 72 20 2a 70 52 65 61 64 65 72 20 3d 20 70 4d 73  r *pReader = pMs
d0a0: 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 69 5d  r->apSegment[ii]
d0b0: 3b 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53  ;.    if( !fts3S
d0c0: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
d0d0: 67 28 70 52 65 61 64 65 72 29 20 0a 20 20 20 20  g(pReader) .    
d0e0: 20 26 26 20 21 66 74 73 33 53 65 67 52 65 61 64   && !fts3SegRead
d0f0: 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65  erIsRootOnly(pRe
d100: 61 64 65 72 29 20 0a 20 20 20 20 29 7b 0a 20 20  ader) .    ){.  
d110: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
d120: 34 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  4 jj;.      for(
d130: 6a 6a 3d 70 52 65 61 64 65 72 2d 3e 69 53 74 61  jj=pReader->iSta
d140: 72 74 42 6c 6f 63 6b 3b 20 6a 6a 3c 3d 70 52 65  rtBlock; jj<=pRe
d150: 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c  ader->iLeafEndBl
d160: 6f 63 6b 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  ock; jj++){.    
d170: 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20      int nBlob;. 
d180: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d190: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
d1a0: 28 70 2c 20 6a 6a 2c 20 30 2c 20 26 6e 42 6c 6f  (p, jj, 0, &nBlo
d1b0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
d1c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d1d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d1e0: 20 20 69 66 28 20 28 6e 42 6c 6f 62 2b 33 35 29    if( (nBlob+35)
d1f0: 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  >pgsz ){.       
d200: 20 20 20 6e 4f 76 66 6c 20 2b 3d 20 28 6e 42 6c     nOvfl += (nBl
d210: 6f 62 20 2b 20 33 34 29 2f 70 67 73 7a 3b 0a 20  ob + 34)/pgsz;. 
d220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e  .    }.  }.  *pn
d240: 4f 76 66 6c 20 3d 20 6e 4f 76 66 6c 3b 0a 20 20  Ovfl = nOvfl;.  
d250: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d260: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c  .** Free all all
d270: 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
d280: 74 65 64 20 77 69 74 68 20 74 68 65 20 69 74 65  ted with the ite
d290: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
d2a0: 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61  the .** second a
d2b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
d2c0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
d2d0: 65 61 64 65 72 46 72 65 65 28 46 74 73 33 53 65  eaderFree(Fts3Se
d2e0: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
d2f0: 29 7b 0a 20 20 69 66 28 20 70 52 65 61 64 65 72  ){.  if( pReader
d300: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 66 74 73   ){.    if( !fts
d310: 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64  3SegReaderIsPend
d320: 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a  ing(pReader) ){.
d330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
d340: 65 65 28 70 52 65 61 64 65 72 2d 3e 7a 54 65 72  ee(pReader->zTer
d350: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  m);.    }.    if
d360: 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72  ( !fts3SegReader
d370: 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65 61 64  IsRootOnly(pRead
d380: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  er) ){.      sql
d390: 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65  ite3_free(pReade
d3a0: 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 7d  r->aNode);.    }
d3b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
d3c0: 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 2d  b_close(pReader-
d3d0: 3e 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 20 20 73  >pBlob);.  }.  s
d3e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 61  qlite3_free(pRea
d3f0: 64 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  der);.}../*.** A
d400: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
d410: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 2e 0a  gReader object..
d420: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
d430: 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 0a  s3SegReaderNew(.
d440: 20 20 69 6e 74 20 69 41 67 65 2c 20 20 20 20 20    int iAge,     
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 22 61 67    /* Segment "ag
d470: 65 22 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 6f  e". */.  int bLo
d480: 6f 6b 75 70 2c 20 20 20 20 20 20 20 20 20 20 20  okup,           
d490: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
d4a0: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
d4b0: 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ly */.  sqlite3_
d4c0: 69 6e 74 36 34 20 69 53 74 61 72 74 4c 65 61 66  int64 iStartLeaf
d4d0: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
d4e0: 20 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73   leaf to travers
d4f0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
d500: 6e 74 36 34 20 69 45 6e 64 4c 65 61 66 2c 20 20  nt64 iEndLeaf,  
d510: 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20         /* Final 
d520: 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65  leaf to traverse
d530: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
d540: 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20  t64 iEndBlock,  
d550: 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 62        /* Final b
d560: 6c 6f 63 6b 20 6f 66 20 73 65 67 6d 65 6e 74 20  lock of segment 
d570: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
d580: 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  *zRoot,         
d590: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
d5a0: 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e  ontaining root n
d5b0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ode */.  int nRo
d5c0: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
d5d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
d5e0: 20 6f 66 20 62 75 66 66 65 72 20 63 6f 6e 74 61   of buffer conta
d5f0: 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
d600: 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
d610: 65 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20  er **ppReader   
d620: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c       /* OUT: All
d630: 6f 63 61 74 65 64 20 46 74 73 33 53 65 67 52 65  ocated Fts3SegRe
d640: 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ader */.){.  Fts
d650: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
d660: 64 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  der;         /* 
d670: 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
d680: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
d690: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
d6a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d6b0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
d6c0: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65 67 6d 65  o allocate segme
d6d0: 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  nt root node */.
d6e0: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
d6f0: 74 4c 65 61 66 3c 3d 69 45 6e 64 4c 65 61 66 20  tLeaf<=iEndLeaf 
d700: 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 4c  );.  if( iStartL
d710: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 45  eaf==0 ){.    nE
d720: 78 74 72 61 20 3d 20 6e 52 6f 6f 74 20 2b 20 46  xtra = nRoot + F
d730: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
d740: 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 61 64 65 72  ;.  }..  pReader
d750: 20 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65   = (Fts3SegReade
d760: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
d770: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 53 65  oc(sizeof(Fts3Se
d780: 67 52 65 61 64 65 72 29 20 2b 20 6e 45 78 74 72  gReader) + nExtr
d790: 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 61 64  a);.  if( !pRead
d7a0: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
d7b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d7c0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52 65 61   }.  memset(pRea
d7d0: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  der, 0, sizeof(F
d7e0: 74 73 33 53 65 67 52 65 61 64 65 72 29 29 3b 0a  ts3SegReader));.
d7f0: 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78 20    pReader->iIdx 
d800: 3d 20 69 41 67 65 3b 0a 20 20 70 52 65 61 64 65  = iAge;.  pReade
d810: 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d 20 62 4c 6f  r->bLookup = bLo
d820: 6f 6b 75 70 21 3d 30 3b 0a 20 20 70 52 65 61 64  okup!=0;.  pRead
d830: 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20  er->iStartBlock 
d840: 3d 20 69 53 74 61 72 74 4c 65 61 66 3b 0a 20 20  = iStartLeaf;.  
d850: 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e  pReader->iLeafEn
d860: 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64 4c 65 61  dBlock = iEndLea
d870: 66 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 45  f;.  pReader->iE
d880: 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64 42 6c  ndBlock = iEndBl
d890: 6f 63 6b 3b 0a 0a 20 20 69 66 28 20 6e 45 78 74  ock;..  if( nExt
d8a0: 72 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ra ){.    /* The
d8b0: 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 20   entire segment 
d8c0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
d8d0: 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20   root node. */. 
d8e0: 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64     pReader->aNod
d8f0: 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 65  e = (char *)&pRe
d900: 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20 70 52 65  ader[1];.    pRe
d910: 61 64 65 72 2d 3e 72 6f 6f 74 4f 6e 6c 79 20 3d  ader->rootOnly =
d920: 20 31 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d   1;.    pReader-
d930: 3e 6e 4e 6f 64 65 20 3d 20 6e 52 6f 6f 74 3b 0a  >nNode = nRoot;.
d940: 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65 61 64      memcpy(pRead
d950: 65 72 2d 3e 61 4e 6f 64 65 2c 20 7a 52 6f 6f 74  er->aNode, zRoot
d960: 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 6d 65  , nRoot);.    me
d970: 6d 73 65 74 28 26 70 52 65 61 64 65 72 2d 3e 61  mset(&pReader->a
d980: 4e 6f 64 65 5b 6e 52 6f 6f 74 5d 2c 20 30 2c 20  Node[nRoot], 0, 
d990: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
d9a0: 47 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  G);.  }else{.   
d9b0: 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65   pReader->iCurre
d9c0: 6e 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72 74  ntBlock = iStart
d9d0: 4c 65 61 66 2d 31 3b 0a 20 20 7d 0a 20 20 2a 70  Leaf-1;.  }.  *p
d9e0: 70 52 65 61 64 65 72 20 3d 20 70 52 65 61 64 65  pReader = pReade
d9f0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
da00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
da10: 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 61 72  This is a compar
da20: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73  ison function us
da30: 65 64 20 61 73 20 61 20 71 73 6f 72 74 28 29 20  ed as a qsort() 
da40: 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 73 6f  callback when so
da50: 72 74 69 6e 67 0a 2a 2a 20 61 6e 20 61 72 72 61  rting.** an arra
da60: 79 20 6f 66 20 70 65 6e 64 69 6e 67 20 74 65 72  y of pending ter
da70: 6d 73 20 62 79 20 74 65 72 6d 2e 20 54 68 69 73  ms by term. This
da80: 20 6f 63 63 75 72 73 20 61 73 20 70 61 72 74 20   occurs as part 
da90: 6f 66 20 66 6c 75 73 68 69 6e 67 0a 2a 2a 20 74  of flushing.** t
daa0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
dab0: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
dac0: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 74   hash table to t
dad0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
dae0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
daf0: 45 5f 43 44 45 43 4c 20 66 74 73 33 43 6f 6d 70  E_CDECL fts3Comp
db00: 61 72 65 45 6c 65 6d 42 79 54 65 72 6d 28 0a 20  areElemByTerm(. 
db10: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 6c 68 73   const void *lhs
db20: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
db30: 72 68 73 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  rhs.){.  char *z
db40: 31 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 28  1 = fts3HashKey(
db50: 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  *(Fts3HashElem *
db60: 2a 29 6c 68 73 29 3b 0a 20 20 63 68 61 72 20 2a  *)lhs);.  char *
db70: 7a 32 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79  z2 = fts3HashKey
db80: 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20  (*(Fts3HashElem 
db90: 2a 2a 29 72 68 73 29 3b 0a 20 20 69 6e 74 20 6e  **)rhs);.  int n
dba0: 31 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73  1 = fts3HashKeys
dbb0: 69 7a 65 28 2a 28 46 74 73 33 48 61 73 68 45 6c  ize(*(Fts3HashEl
dbc0: 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 69 6e  em **)lhs);.  in
dbd0: 74 20 6e 32 20 3d 20 66 74 73 33 48 61 73 68 4b  t n2 = fts3HashK
dbe0: 65 79 73 69 7a 65 28 2a 28 46 74 73 33 48 61 73  eysize(*(Fts3Has
dbf0: 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 0a  hElem **)rhs);..
dc00: 20 20 69 6e 74 20 6e 20 3d 20 28 6e 31 3c 6e 32    int n = (n1<n2
dc10: 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69   ? n1 : n2);.  i
dc20: 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 7a 31  nt c = memcmp(z1
dc30: 2c 20 7a 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  , z2, n);.  if( 
dc40: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  c==0 ){.    c = 
dc50: 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72  n1 - n2;.  }.  r
dc60: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
dc70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
dc80: 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
dc90: 61 74 65 20 61 6e 20 46 74 73 33 53 65 67 52 65  ate an Fts3SegRe
dca0: 61 64 65 72 20 74 68 61 74 20 69 74 65 72 61 74  ader that iterat
dcb0: 65 73 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 20  es through.** a 
dcc0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 74 65  subset of the te
dcd0: 72 6d 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  rms stored in th
dce0: 65 20 46 74 73 33 54 61 62 6c 65 2e 70 65 6e 64  e Fts3Table.pend
dcf0: 69 6e 67 54 65 72 6d 73 20 61 72 72 61 79 2e 0a  ingTerms array..
dd00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 50  **.** If the isP
dd10: 72 65 66 69 78 49 74 65 72 20 70 61 72 61 6d 65  refixIter parame
dd20: 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ter is zero, the
dd30: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 53  n the returned S
dd40: 65 67 52 65 61 64 65 72 20 69 74 65 72 61 74 65  egReader iterate
dd50: 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 65 61 63  s.** through eac
dd60: 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 70 65  h term in the pe
dd70: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c  nding-terms tabl
dd80: 65 2e 20 4f 72 2c 20 69 66 20 69 73 50 72 65 66  e. Or, if isPref
dd90: 69 78 49 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 6e  ixIter is.** non
dda0: 2d 7a 65 72 6f 2c 20 69 74 20 69 74 65 72 61 74  -zero, it iterat
ddb0: 65 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  es through each 
ddc0: 74 65 72 6d 20 61 6e 64 20 69 74 73 20 70 72 65  term and its pre
ddd0: 66 69 78 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  fixes. For examp
dde0: 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 70 65  le, if.** the pe
ddf0: 6e 64 69 6e 67 20 74 65 72 6d 73 20 68 61 73 68  nding terms hash
de00: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
de10: 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c 69 74  the terms "sqlit
de20: 65 22 2c 20 22 6d 79 73 71 6c 22 20 61 6e 64 0a  e", "mysql" and.
de30: 2a 2a 20 22 66 69 72 65 62 69 72 64 22 2c 20 74  ** "firebird", t
de40: 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72  hen the iterator
de50: 20 76 69 73 69 74 73 20 74 68 65 20 66 6f 6c 6c   visits the foll
de60: 6f 77 69 6e 67 20 27 74 65 72 6d 73 27 20 28 69  owing 'terms' (i
de70: 6e 20 74 68 65 20 6f 72 64 65 72 0a 2a 2a 20 73  n the order.** s
de80: 68 6f 77 6e 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 66  hown):.**.**   f
de90: 20 66 69 20 66 69 72 20 66 69 72 65 20 66 69 72   fi fir fire fir
dea0: 65 62 20 66 69 72 65 62 69 20 66 69 72 65 62 69  eb firebi firebi
deb0: 72 20 66 69 72 65 62 69 72 64 0a 2a 2a 20 20 20  r firebird.**   
dec0: 6d 20 6d 79 20 6d 79 73 20 6d 79 73 71 20 6d 79  m my mys mysq my
ded0: 73 71 6c 0a 2a 2a 20 20 20 73 20 73 71 20 73 71  sql.**   s sq sq
dee0: 6c 20 73 71 6c 69 20 73 71 6c 69 74 20 73 71 6c  l sqli sqlit sql
def0: 69 74 65 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 61  ite.**.** Wherea
df00: 73 20 69 66 20 69 73 50 72 65 66 69 78 49 74 65  s if isPrefixIte
df10: 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 74  r is zero, the t
df20: 65 72 6d 73 20 76 69 73 69 74 65 64 20 61 72 65  erms visited are
df30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 69 72 65 62 69  :.**.**   firebi
df40: 72 64 20 6d 79 73 71 6c 20 73 71 6c 69 74 65 0a  rd mysql sqlite.
df50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
df60: 73 33 53 65 67 52 65 61 64 65 72 50 65 6e 64 69  s3SegReaderPendi
df70: 6e 67 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ng(.  Fts3Table 
df80: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
df90: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
dfa0: 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
dfb0: 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20  .  int iIndex,  
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
dfe0: 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20 63  p->aIndex */.  c
dff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
e000: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e010: 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68  * Term to search
e020: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54   for */.  int nT
e030: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
e040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
e050: 65 20 6f 66 20 62 75 66 66 65 72 20 7a 54 65 72  e of buffer zTer
e060: 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 66  m */.  int bPref
e070: 69 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ix,             
e080: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
e090: 6f 72 20 61 20 70 72 65 66 69 78 20 69 74 65 72  or a prefix iter
e0a0: 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 33 53 65  ator */.  Fts3Se
e0b0: 67 52 65 61 64 65 72 20 2a 2a 70 70 52 65 61 64  gReader **ppRead
e0c0: 65 72 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  er        /* OUT
e0d0: 3a 20 53 65 67 52 65 61 64 65 72 20 66 6f 72 20  : SegReader for 
e0e0: 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 2a 2f  pending-terms */
e0f0: 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65 61  .){.  Fts3SegRea
e100: 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20 30  der *pReader = 0
e110: 3b 20 20 20 20 20 2f 2a 20 46 74 73 33 53 65 67  ;     /* Fts3Seg
e120: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f  Reader object to
e130: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73   return */.  Fts
e140: 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 3b 20 20  3HashElem *pE;  
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e160: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
e170: 65 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45  e */.  Fts3HashE
e180: 6c 65 6d 20 2a 2a 61 45 6c 65 6d 20 3d 20 30 3b  lem **aElem = 0;
e190: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
e1a0: 6f 66 20 74 65 72 6d 20 68 61 73 68 20 65 6e 74  of term hash ent
e1b0: 72 69 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  ries to scan */.
e1c0: 20 20 69 6e 74 20 6e 45 6c 65 6d 20 3d 20 30 3b    int nElem = 0;
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
e1f0: 61 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 20  ay at aElem */. 
e200: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e210: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e220: 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
e230: 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70  */.  Fts3Hash *p
e240: 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d  Hash;..  pHash =
e250: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 49 6e 64   &p->aIndex[iInd
e260: 65 78 5d 2e 68 50 65 6e 64 69 6e 67 3b 0a 20 20  ex].hPending;.  
e270: 69 66 28 20 62 50 72 65 66 69 78 20 29 7b 0a 20  if( bPrefix ){. 
e280: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
e290: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e2a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f   /* Size of allo
e2b0: 63 61 74 65 64 20 61 72 72 61 79 20 61 74 20 61  cated array at a
e2c0: 45 6c 65 6d 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  Elem */..    for
e2d0: 28 70 45 3d 66 74 73 33 48 61 73 68 46 69 72 73  (pE=fts3HashFirs
e2e0: 74 28 70 48 61 73 68 29 3b 20 70 45 3b 20 70 45  t(pHash); pE; pE
e2f0: 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28 70 45  =fts3HashNext(pE
e300: 29 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  )){.      char *
e310: 7a 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 66  zKey = (char *)f
e320: 74 73 33 48 61 73 68 4b 65 79 28 70 45 29 3b 0a  ts3HashKey(pE);.
e330: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d        int nKey =
e340: 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65   fts3HashKeysize
e350: 28 70 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  (pE);.      if( 
e360: 6e 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 6e 4b 65  nTerm==0 || (nKe
e370: 79 3e 3d 6e 54 65 72 6d 20 26 26 20 30 3d 3d 6d  y>=nTerm && 0==m
e380: 65 6d 63 6d 70 28 7a 4b 65 79 2c 20 7a 54 65 72  emcmp(zKey, zTer
e390: 6d 2c 20 6e 54 65 72 6d 29 29 20 29 7b 0a 20 20  m, nTerm)) ){.  
e3a0: 20 20 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3d        if( nElem=
e3b0: 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
e3c0: 20 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65       Fts3HashEle
e3d0: 6d 20 2a 2a 61 45 6c 65 6d 32 3b 0a 20 20 20 20  m **aElem2;.    
e3e0: 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20        nAlloc += 
e3f0: 31 36 3b 0a 20 20 20 20 20 20 20 20 20 20 61 45  16;.          aE
e400: 6c 65 6d 32 20 3d 20 28 46 74 73 33 48 61 73 68  lem2 = (Fts3Hash
e410: 45 6c 65 6d 20 2a 2a 29 73 71 6c 69 74 65 33 5f  Elem **)sqlite3_
e420: 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
e430: 20 20 20 20 20 20 20 61 45 6c 65 6d 2c 20 6e 41         aElem, nA
e440: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 46 74 73 33  lloc*sizeof(Fts3
e450: 48 61 73 68 45 6c 65 6d 20 2a 29 0a 20 20 20 20  HashElem *).    
e460: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
e470: 20 20 20 69 66 28 20 21 61 45 6c 65 6d 32 20 29     if( !aElem2 )
e480: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
e490: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e4a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 6c  .            nEl
e4b0: 65 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  em = 0;.        
e4c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e4d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e4e0: 20 61 45 6c 65 6d 20 3d 20 61 45 6c 65 6d 32 3b   aElem = aElem2;
e4f0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
e500: 20 20 20 20 61 45 6c 65 6d 5b 6e 45 6c 65 6d 2b      aElem[nElem+
e510: 2b 5d 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 7d  +] = pE;.      }
e520: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
e530: 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  f more than one 
e540: 74 65 72 6d 20 6d 61 74 63 68 65 73 20 74 68 65  term matches the
e550: 20 70 72 65 66 69 78 2c 20 73 6f 72 74 20 74 68   prefix, sort th
e560: 65 20 46 74 73 33 48 61 73 68 45 6c 65 6d 0a 20  e Fts3HashElem. 
e570: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e     ** objects in
e580: 20 74 65 72 6d 20 6f 72 64 65 72 20 75 73 69 6e   term order usin
e590: 67 20 71 73 6f 72 74 28 29 2e 20 54 68 69 73 20  g qsort(). This 
e5a0: 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  uses the same co
e5b0: 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2a 20  mparison.    ** 
e5c0: 63 61 6c 6c 62 61 63 6b 20 61 73 20 69 73 20 75  callback as is u
e5d0: 73 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e  sed when flushin
e5e0: 67 20 74 65 72 6d 73 20 74 6f 20 64 69 73 6b 2e  g terms to disk.
e5f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e600: 6e 45 6c 65 6d 3e 31 20 29 7b 0a 20 20 20 20 20  nElem>1 ){.     
e610: 20 71 73 6f 72 74 28 61 45 6c 65 6d 2c 20 6e 45   qsort(aElem, nE
e620: 6c 65 6d 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  lem, sizeof(Fts3
e630: 48 61 73 68 45 6c 65 6d 20 2a 29 2c 20 66 74 73  HashElem *), fts
e640: 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42 79 54 65  3CompareElemByTe
e650: 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  rm);.    }..  }e
e660: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
e670: 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
e680: 65 20 74 65 72 6d 20 6c 6f 6f 6b 75 70 20 74 68  e term lookup th
e690: 61 74 20 6d 61 74 63 68 65 73 20 61 74 20 6d 6f  at matches at mo
e6a0: 73 74 20 6f 6e 65 20 74 65 72 6d 20 69 6e 0a 20  st one term in. 
e6b0: 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e     ** the index.
e6c0: 20 41 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   All that is req
e6d0: 75 69 72 65 64 20 69 73 20 61 20 73 74 72 61 69  uired is a strai
e6e0: 67 68 74 20 68 61 73 68 2d 6c 6f 6f 6b 75 70 2e  ght hash-lookup.
e6f0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
e700: 42 65 63 61 75 73 65 20 74 68 65 20 73 74 61 63  Because the stac
e710: 6b 20 61 64 64 72 65 73 73 20 6f 66 20 70 45 20  k address of pE 
e720: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
e730: 76 69 61 20 74 68 65 20 61 45 6c 65 6d 20 70 6f  via the aElem po
e740: 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 62 65 6c  inter.    ** bel
e750: 6f 77 2c 20 74 68 65 20 22 46 74 73 33 48 61 73  ow, the "Fts3Has
e760: 68 45 6c 65 6d 20 2a 70 45 22 20 6d 75 73 74 20  hElem *pE" must 
e770: 62 65 20 64 65 63 6c 61 72 65 64 20 73 6f 20 74  be declared so t
e780: 68 61 74 20 69 74 20 69 73 20 76 61 6c 69 64 0a  hat it is valid.
e790: 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
e7a0: 69 73 20 65 6e 74 69 72 65 20 66 75 6e 63 74 69  is entire functi
e7b0: 6f 6e 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 69  on, not just thi
e7c0: 73 20 22 65 6c 73 65 7b 2e 2e 2e 7d 22 20 62 6c  s "else{...}" bl
e7d0: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
e7e0: 70 45 20 3d 20 66 74 73 33 48 61 73 68 46 69 6e  pE = fts3HashFin
e7f0: 64 45 6c 65 6d 28 70 48 61 73 68 2c 20 7a 54 65  dElem(pHash, zTe
e800: 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
e810: 69 66 28 20 70 45 20 29 7b 0a 20 20 20 20 20 20  if( pE ){.      
e820: 61 45 6c 65 6d 20 3d 20 26 70 45 3b 0a 20 20 20  aElem = &pE;.   
e830: 20 20 20 6e 45 6c 65 6d 20 3d 20 31 3b 0a 20 20     nElem = 1;.  
e840: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
e850: 45 6c 65 6d 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Elem>0 ){.    in
e860: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
e870: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 29 20  (Fts3SegReader) 
e880: 2b 20 28 6e 45 6c 65 6d 2b 31 29 2a 73 69 7a 65  + (nElem+1)*size
e890: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20  of(Fts3HashElem 
e8a0: 2a 29 3b 0a 20 20 20 20 70 52 65 61 64 65 72 20  *);.    pReader 
e8b0: 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65 72  = (Fts3SegReader
e8c0: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
e8d0: 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  c(nByte);.    if
e8e0: 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20 20  ( !pReader ){.  
e8f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e900: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
e910: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
e920: 52 65 61 64 65 72 2c 20 30 2c 20 6e 42 79 74 65  Reader, 0, nByte
e930: 29 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  );.      pReader
e940: 2d 3e 69 49 64 78 20 3d 20 30 78 37 46 46 46 46  ->iIdx = 0x7FFFF
e950: 46 46 46 3b 0a 20 20 20 20 20 20 70 52 65 61 64  FFF;.      pRead
e960: 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 20 3d  er->ppNextElem =
e970: 20 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a   (Fts3HashElem *
e980: 2a 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20  *)&pReader[1];. 
e990: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65 61       memcpy(pRea
e9a0: 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 2c  der->ppNextElem,
e9b0: 20 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2a 73 69   aElem, nElem*si
e9c0: 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65  zeof(Fts3HashEle
e9d0: 6d 20 2a 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  m *));.    }.  }
e9e0: 0a 0a 20 20 69 66 28 20 62 50 72 65 66 69 78 20  ..  if( bPrefix 
e9f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
ea00: 72 65 65 28 61 45 6c 65 6d 29 3b 0a 20 20 7d 0a  ree(aElem);.  }.
ea10: 20 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52    *ppReader = pR
ea20: 65 61 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  eader;.  return 
ea30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
ea40: 70 61 72 65 20 74 68 65 20 65 6e 74 72 69 65 73  pare the entries
ea50: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
ea60: 77 6f 20 46 74 73 33 53 65 67 52 65 61 64 65 72  wo Fts3SegReader
ea70: 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 2a 2a   structures. .**
ea80: 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61   Comparison is a
ea90: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
eaa0: 20 20 20 31 29 20 45 4f 46 20 69 73 20 67 72 65     1) EOF is gre
eab0: 61 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f  ater than not EO
eac0: 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 54 68  F..**.**   2) Th
ead0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 73 20  e current terms 
eae0: 28 69 66 20 61 6e 79 29 20 61 72 65 20 63 6f 6d  (if any) are com
eaf0: 70 61 72 65 64 20 75 73 69 6e 67 20 6d 65 6d 63  pared using memc
eb00: 6d 70 28 29 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20  mp(). If one.** 
eb10: 20 20 20 20 20 74 65 72 6d 20 69 73 20 61 20 70       term is a p
eb20: 72 65 66 69 78 20 6f 66 20 61 6e 6f 74 68 65 72  refix of another
eb30: 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 74 65 72  , the longer ter
eb40: 6d 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  m is considered 
eb50: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 72 67  the.**      larg
eb60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42  er..**.**   3) B
eb70: 79 20 73 65 67 6d 65 6e 74 20 61 67 65 2e 20 41  y segment age. A
eb80: 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74 20  n older segment 
eb90: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 61  is considered la
eba0: 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rger..*/.static 
ebb0: 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65  int fts3SegReade
ebc0: 72 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64  rCmp(Fts3SegRead
ebd0: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65  er *pLhs, Fts3Se
ebe0: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a  gReader *pRhs){.
ebf0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
ec00: 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70  pLhs->aNode && p
ec10: 52 68 73 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20  Rhs->aNode ){.  
ec20: 20 20 69 6e 74 20 72 63 32 20 3d 20 70 4c 68 73    int rc2 = pLhs
ec30: 2d 3e 6e 54 65 72 6d 20 2d 20 70 52 68 73 2d 3e  ->nTerm - pRhs->
ec40: 6e 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 72  nTerm;.    if( r
ec50: 63 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c2<0 ){.      rc
ec60: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e   = memcmp(pLhs->
ec70: 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65  zTerm, pRhs->zTe
ec80: 72 6d 2c 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 29  rm, pLhs->nTerm)
ec90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eca0: 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70     rc = memcmp(p
ecb0: 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73  Lhs->zTerm, pRhs
ecc0: 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 6e  ->zTerm, pRhs->n
ecd0: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Term);.    }.   
ece0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
ecf0: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
ed00: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
ed10: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 61 4e 6f   rc = (pLhs->aNo
ed20: 64 65 3d 3d 30 29 20 2d 20 28 70 52 68 73 2d 3e  de==0) - (pRhs->
ed30: 61 4e 6f 64 65 3d 3d 30 29 3b 0a 20 20 7d 0a 20  aNode==0);.  }. 
ed40: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
ed50: 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64    rc = pRhs->iId
ed60: 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a  x - pLhs->iIdx;.
ed70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
ed80: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
ed90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 64  rc;.}../*.** A d
eda0: 69 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 69  ifferent compari
edb0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  son function for
edc0: 20 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63   SegReader struc
edd0: 74 75 72 65 73 2e 20 49 6e 20 74 68 69 73 0a 2a  tures. In this.*
ede0: 2a 20 76 65 72 73 69 6f 6e 2c 20 69 74 20 69 73  * version, it is
edf0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 65 61   assumed that ea
ee00: 63 68 20 53 65 67 52 65 61 64 65 72 20 70 6f 69  ch SegReader poi
ee10: 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
ee20: 69 6e 0a 2a 2a 20 61 20 64 6f 63 6c 69 73 74 20  in.** a doclist 
ee30: 66 6f 72 20 69 64 65 6e 74 69 63 61 6c 20 74 65  for identical te
ee40: 72 6d 73 2e 20 43 6f 6d 70 61 72 69 73 6f 6e 20  rms. Comparison 
ee50: 69 73 20 6d 61 64 65 20 61 73 20 66 6f 6c 6c 6f  is made as follo
ee60: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45  ws:.**.**   1) E
ee70: 4f 46 20 28 65 6e 64 20 6f 66 20 64 6f 63 6c 69  OF (end of docli
ee80: 73 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 29  st in this case)
ee90: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
eea0: 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20   not EOF..**.** 
eeb0: 20 20 32 29 20 42 79 20 63 75 72 72 65 6e 74 20    2) By current 
eec0: 64 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  docid..**.**   3
eed0: 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65  ) By segment age
eee0: 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65  . An older segme
eef0: 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  nt is considered
ef00: 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74   larger..*/.stat
ef10: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
ef20: 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 28 46  aderDoclistCmp(F
ef30: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c  ts3SegReader *pL
ef40: 68 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65  hs, Fts3SegReade
ef50: 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20  r *pRhs){.  int 
ef60: 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66  rc = (pLhs->pOff
ef70: 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68  setList==0)-(pRh
ef80: 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d  s->pOffsetList==
ef90: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  0);.  if( rc==0 
efa0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d  ){.    if( pLhs-
efb0: 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69  >iDocid==pRhs->i
efc0: 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 72  Docid ){.      r
efd0: 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d  c = pRhs->iIdx -
efe0: 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20   pLhs->iIdx;.   
eff0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
f000: 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64   = (pLhs->iDocid
f010: 20 3e 20 70 52 68 73 2d 3e 69 44 6f 63 69 64 29   > pRhs->iDocid)
f020: 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d   ? 1 : -1;.    }
f030: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
f040: 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52  Lhs->aNode && pR
f050: 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72  hs->aNode );.  r
f060: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
f070: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
f080: 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65  aderDoclistCmpRe
f090: 76 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  v(Fts3SegReader 
f0a0: 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65  *pLhs, Fts3SegRe
f0b0: 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69  ader *pRhs){.  i
f0c0: 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70  nt rc = (pLhs->p
f0d0: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28  OffsetList==0)-(
f0e0: 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pRhs->pOffsetLis
f0f0: 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t==0);.  if( rc=
f100: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  =0 ){.    if( pL
f110: 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73  hs->iDocid==pRhs
f120: 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20  ->iDocid ){.    
f130: 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64    rc = pRhs->iId
f140: 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a  x - pLhs->iIdx;.
f150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f160: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f   rc = (pLhs->iDo
f170: 63 69 64 20 3c 20 70 52 68 73 2d 3e 69 44 6f 63  cid < pRhs->iDoc
f180: 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20  id) ? 1 : -1;.  
f190: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
f1a0: 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26  ( pLhs->aNode &&
f1b0: 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a   pRhs->aNode );.
f1c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f1d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
f1e0: 65 20 74 65 72 6d 20 74 68 61 74 20 74 68 65 20  e term that the 
f1f0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62  Fts3SegReader ob
f200: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
f210: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
f220: 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 77  t.** points to w
f230: 69 74 68 20 74 68 65 20 74 65 72 6d 20 73 70 65  ith the term spe
f240: 63 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65  cified by argume
f250: 6e 74 73 20 7a 54 65 72 6d 20 61 6e 64 20 6e 54  nts zTerm and nT
f260: 65 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  erm. .**.** If t
f270: 68 65 20 70 53 65 67 20 69 74 65 72 61 74 6f 72  he pSeg iterator
f280: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45   is already at E
f290: 4f 46 2c 20 72 65 74 75 72 6e 20 30 2e 20 4f 74  OF, return 0. Ot
f2a0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a  herwise, return.
f2b0: 2a 2a 20 2d 76 65 20 69 66 20 74 68 65 20 70 53  ** -ve if the pS
f2c0: 65 67 20 74 65 72 6d 20 69 73 20 6c 65 73 73 20  eg term is less 
f2d0: 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  than zTerm/nTerm
f2e0: 2c 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 74  , 0 if the two t
f2f0: 65 72 6d 73 20 61 72 65 0a 2a 2a 20 65 71 75 61  erms are.** equa
f300: 6c 2c 20 6f 72 20 2b 76 65 20 69 66 20 74 68 65  l, or +ve if the
f310: 20 70 53 65 67 20 74 65 72 6d 20 69 73 20 67 72   pSeg term is gr
f320: 65 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d  eater than zTerm
f330: 2f 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  /nTerm..*/.stati
f340: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
f350: 64 65 72 54 65 72 6d 43 6d 70 28 0a 20 20 46 74  derTermCmp(.  Ft
f360: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
f370: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g,            /*
f380: 20 53 65 67 6d 65 6e 74 20 72 65 61 64 65 72 20   Segment reader 
f390: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
f3a0: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  t char *zTerm,  
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f3c0: 65 72 6d 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  erm to compare t
f3d0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  o */.  int nTerm
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f400: 66 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20  f term zTerm in 
f410: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
f420: 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  t res = 0;.  if(
f430: 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20 29 7b 0a   pSeg->aNode ){.
f440: 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 54      if( pSeg->nT
f450: 65 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20  erm>nTerm ){.   
f460: 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
f470: 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  pSeg->zTerm, zTe
f480: 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
f490: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
f4a0: 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e   = memcmp(pSeg->
f4b0: 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 70 53  zTerm, zTerm, pS
f4c0: 65 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  eg->nTerm);.    
f4d0: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  }.    if( res==0
f4e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
f4f0: 70 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e 54 65 72  pSeg->nTerm-nTer
f500: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  m;.    }.  }.  r
f510: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
f520: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 53  .** Argument apS
f530: 65 67 6d 65 6e 74 20 69 73 20 61 6e 20 61 72 72  egment is an arr
f540: 61 79 20 6f 66 20 6e 53 65 67 6d 65 6e 74 20 65  ay of nSegment e
f550: 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 6b  lements. It is k
f560: 6e 6f 77 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65  nown that.** the
f570: 20 66 69 6e 61 6c 20 28 6e 53 65 67 6d 65 6e 74   final (nSegment
f580: 2d 6e 53 75 73 70 65 63 74 29 20 6d 65 6d 62 65  -nSuspect) membe
f590: 72 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  rs are already i
f5a0: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 2a  n sorted order.*
f5b0: 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  * (according to 
f5c0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
f5d0: 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64  unction provided
f5e0: 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
f5f0: 20 73 68 75 66 66 6c 65 73 0a 2a 2a 20 74 68 65   shuffles.** the
f600: 20 61 72 72 61 79 20 61 72 6f 75 6e 64 20 75 6e   array around un
f610: 74 69 6c 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  til all entries 
f620: 61 72 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  are in sorted or
f630: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
f640: 6f 69 64 20 66 74 73 33 53 65 67 52 65 61 64 65  oid fts3SegReade
f650: 72 53 6f 72 74 28 0a 20 20 46 74 73 33 53 65 67  rSort(.  Fts3Seg
f660: 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65  Reader **apSegme
f670: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
f680: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
f690: 20 74 6f 20 73 6f 72 74 20 65 6e 74 72 69 65 73   to sort entries
f6a0: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65   of */.  int nSe
f6b0: 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6e0: 6f 66 20 61 70 53 65 67 6d 65 6e 74 20 61 72 72  of apSegment arr
f6f0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 73  ay */.  int nSus
f700: 70 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  pect,           
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
f730: 65 64 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a  ed entry count *
f740: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  /.  int (*xCmp)(
f750: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c  Fts3SegReader *,
f760: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f770: 29 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  )  /* Comparison
f780: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
f790: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
f7c0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  riable */..  ass
f7d0: 65 72 74 28 20 6e 53 75 73 70 65 63 74 3c 3d 6e  ert( nSuspect<=n
f7e0: 53 65 67 6d 65 6e 74 20 29 3b 0a 0a 20 20 69 66  Segment );..  if
f7f0: 28 20 6e 53 75 73 70 65 63 74 3d 3d 6e 53 65 67  ( nSuspect==nSeg
f800: 6d 65 6e 74 20 29 20 6e 53 75 73 70 65 63 74 2d  ment ) nSuspect-
f810: 2d 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 75 73 70  -;.  for(i=nSusp
f820: 65 63 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ect-1; i>=0; i--
f830: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
f840: 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 28 6e 53    for(j=i; j<(nS
f850: 65 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b 2b 29 7b  egment-1); j++){
f860: 0a 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65  .      Fts3SegRe
f870: 61 64 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  ader *pTmp;.    
f880: 20 20 69 66 28 20 78 43 6d 70 28 61 70 53 65 67    if( xCmp(apSeg
f890: 6d 65 6e 74 5b 6a 5d 2c 20 61 70 53 65 67 6d 65  ment[j], apSegme
f8a0: 6e 74 5b 6a 2b 31 5d 29 3c 30 20 29 20 62 72 65  nt[j+1])<0 ) bre
f8b0: 61 6b 3b 0a 20 20 20 20 20 20 70 54 6d 70 20 3d  ak;.      pTmp =
f8c0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 3b   apSegment[j+1];
f8d0: 0a 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74  .      apSegment
f8e0: 5b 6a 2b 31 5d 20 3d 20 61 70 53 65 67 6d 65 6e  [j+1] = apSegmen
f8f0: 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 70 53 65  t[j];.      apSe
f900: 67 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54 6d 70 3b  gment[j] = pTmp;
f910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
f920: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
f930: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
f940: 69 73 74 20 72 65 61 6c 6c 79 20 69 73 20 73 6f  ist really is so
f950: 72 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a 20 20 66  rted now. */.  f
f960: 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 53 75 73 70  or(i=0; i<(nSusp
f970: 65 63 74 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20  ect-1); i++){.  
f980: 20 20 61 73 73 65 72 74 28 20 78 43 6d 70 28 61    assert( xCmp(a
f990: 70 53 65 67 6d 65 6e 74 5b 69 5d 2c 20 61 70 53  pSegment[i], apS
f9a0: 65 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c 30 20 29  egment[i+1])<0 )
f9b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
f9c0: 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  /* .** Insert a 
f9d0: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
f9e0: 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65  %_segments table
f9f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fa00: 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74  fts3WriteSegment
fa10: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
fa20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fa30: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
fa40: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
fa50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
fa60: 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  Block,          
fa70: 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 66 6f 72   /* Block id for
fa80: 20 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20   new block */.  
fa90: 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20  char *z,        
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
fac0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
fad0: 62 6c 6f 63 6b 20 64 61 74 61 20 2a 2f 0a 20 20  block data */.  
fae0: 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20  int n           
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
fb10: 72 20 7a 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  r z in bytes */.
fb20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
fb30: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
fb40: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
fb50: 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53  (p, SQL_INSERT_S
fb60: 45 47 4d 45 4e 54 53 2c 20 26 70 53 74 6d 74 2c  EGMENTS, &pStmt,
fb70: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
fb80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fb90: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
fba0: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 42 6c  64(pStmt, 1, iBl
fbb0: 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ock);.    sqlite
fbc0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
fbd0: 74 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53 51 4c 49  t, 2, z, n, SQLI
fbe0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
fbf0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
fc00: 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  mt);.    rc = sq
fc10: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
fc20: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
fc30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
fc40: 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  nd the largest r
fc50: 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 20 6e 75  elative level nu
fc60: 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
fc70: 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
fc80: 2c 20 73 65 74 0a 2a 2a 20 2a 70 6e 4d 61 78 20  , set.** *pnMax 
fc90: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  to this value an
fca0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
fcb0: 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  OK. Otherwise, i
fcc0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
fcd0: 73 2c 0a 2a 2a 20 73 65 74 20 2a 70 6e 4d 61 78  s,.** set *pnMax
fce0: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   to zero and ret
fcf0: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
fd00: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
fd10: 20 73 71 6c 69 74 65 33 46 74 73 33 4d 61 78 4c   sqlite3Fts3MaxL
fd20: 65 76 65 6c 28 46 74 73 33 54 61 62 6c 65 20 2a  evel(Fts3Table *
fd30: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 29 7b 0a  p, int *pnMax){.
fd40: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
fd50: 6d 78 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 73  mxLevel = 0;.  s
fd60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
fd70: 6d 74 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  mt = 0;..  rc = 
fd80: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
fd90: 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45 56 45  QL_SELECT_MXLEVE
fda0: 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  L, &pStmt, 0);. 
fdb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fdc0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  OK ){.    if( SQ
fdd0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
fde0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
fdf0: 0a 20 20 20 20 20 20 6d 78 4c 65 76 65 6c 20 3d  .      mxLevel =
fe00: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
fe10: 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
fe20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
fe30: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
fe40: 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 6e 4d 61 78  t);.  }.  *pnMax
fe50: 20 3d 20 6d 78 4c 65 76 65 6c 3b 0a 20 20 72 65   = mxLevel;.  re
fe60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
fe70: 2a 2a 20 49 6e 73 65 72 74 20 61 20 72 65 63 6f  ** Insert a reco
fe80: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65  rd into the %_se
fe90: 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  gdir table..*/.s
fea0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72  tatic int fts3Wr
feb0: 69 74 65 53 65 67 64 69 72 28 0a 20 20 46 74 73  iteSegdir(.  Fts
fec0: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fee0: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
fef0: 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
ff00: 33 5f 69 6e 74 36 34 20 69 4c 65 76 65 6c 2c 20  3_int64 iLevel, 
ff10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
ff20: 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 66  ue for "level" f
ff30: 69 65 6c 64 20 28 61 62 73 6f 6c 75 74 65 20 6c  ield (absolute l
ff40: 65 76 65 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 69  evel) */.  int i
ff50: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
ff60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
ff70: 6c 75 65 20 66 6f 72 20 22 69 64 78 22 20 66 69  lue for "idx" fi
ff80: 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
ff90: 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f  _int64 iStartBlo
ffa0: 63 6b 2c 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ck,      /* Valu
ffb0: 65 20 66 6f 72 20 22 73 74 61 72 74 5f 62 6c 6f  e for "start_blo
ffc0: 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  ck" field */.  s
ffd0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
ffe0: 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 2f  afEndBlock,    /
fff0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 61  * Value for "lea
10000 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  ves_end_block" f
10010 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ield */.  sqlite
10020 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63  3_int64 iEndBloc
10030 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  k,        /* Val
10040 75 65 20 66 6f 72 20 22 65 6e 64 5f 62 6c 6f 63  ue for "end_bloc
10050 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71  k" field */.  sq
10060 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 65 61  lite3_int64 nLea
10070 66 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  fData,        /*
10080 20 42 79 74 65 73 20 6f 66 20 6c 65 61 66 20 64   Bytes of leaf d
10090 61 74 61 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ata in segment *
100a0 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c  /.  char *zRoot,
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 20 20 2f 2a 20 42 6c 6f 62 20 76 61 6c 75      /* Blob valu
100d0 65 20 66 6f 72 20 22 72 6f 6f 74 22 20 66 69 65  e for "root" fie
100e0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f  ld */.  int nRoo
100f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10100 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10110 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75  r of bytes in bu
10120 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 29 7b  ffer zRoot */.){
10130 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10140 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
10150 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
10160 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47  , SQL_INSERT_SEG
10170 44 49 52 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  DIR, &pStmt, 0);
10180 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
101a0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
101b0 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76 65 6c 29  Stmt, 1, iLevel)
101c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
101d0 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c  nd_int(pStmt, 2,
101e0 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69   iIdx);.    sqli
101f0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
10200 53 74 6d 74 2c 20 33 2c 20 69 53 74 61 72 74 42  Stmt, 3, iStartB
10210 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  lock);.    sqlit
10220 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
10230 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66 45 6e 64  tmt, 4, iLeafEnd
10240 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  Block);.    if( 
10250 6e 4c 65 61 66 44 61 74 61 3d 3d 30 20 29 7b 0a  nLeafData==0 ){.
10260 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
10270 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
10280 35 2c 20 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20  5, iEndBlock);. 
10290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102a0 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 73 71 6c  char *zEnd = sql
102b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 6c  ite3_mprintf("%l
102c0 6c 64 20 25 6c 6c 64 22 2c 20 69 45 6e 64 42 6c  ld %lld", iEndBl
102d0 6f 63 6b 2c 20 6e 4c 65 61 66 44 61 74 61 29 3b  ock, nLeafData);
102e0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 45 6e 64  .      if( !zEnd
102f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10300 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 73 71  _NOMEM;.      sq
10310 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
10320 70 53 74 6d 74 2c 20 35 2c 20 7a 45 6e 64 2c 20  pStmt, 5, zEnd, 
10330 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
10340 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10350 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
10360 53 74 6d 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c 20  Stmt, 6, zRoot, 
10370 6e 52 6f 6f 74 2c 20 53 51 4c 49 54 45 5f 53 54  nRoot, SQLITE_ST
10380 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
10390 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
103a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
103b0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
103c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
103d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
103e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
103f0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69  common prefix (i
10400 66 20 61 6e 79 29 20 73 68 61 72 65 64 20 62 79  f any) shared by
10410 20 7a 50 72 65 76 20 61 6e 64 0a 2a 2a 20 7a 4e   zPrev and.** zN
10420 65 78 74 2c 20 69 6e 20 62 79 74 65 73 2e 20 46  ext, in bytes. F
10430 6f 72 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a 0a  or example, .**.
10440 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43  **   fts3PrefixC
10450 6f 6d 70 72 65 73 73 28 22 61 62 63 22 2c 20 33  ompress("abc", 3
10460 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29 20 20  , "abcdef", 6)  
10470 20 2f 2f 20 72 65 74 75 72 6e 73 20 33 0a 2a 2a   // returns 3.**
10480 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d     fts3PrefixCom
10490 70 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20  press("abX", 3, 
104a0 22 61 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f  "abcdef", 6)   /
104b0 2f 20 72 65 74 75 72 6e 73 20 32 0a 2a 2a 20 20  / returns 2.**  
104c0 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
104d0 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22 58  ess("abX", 3, "X
104e0 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20  bcdef", 6)   // 
104f0 72 65 74 75 72 6e 73 20 30 0a 2a 2f 0a 73 74 61  returns 0.*/.sta
10500 74 69 63 20 69 6e 74 20 66 74 73 33 50 72 65 66  tic int fts3Pref
10510 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 63 6f  ixCompress(.  co
10520 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76 2c  nst char *zPrev,
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10540 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
10550 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ng previous term
10560 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 76 2c   */.  int nPrev,
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10580 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10590 20 62 75 66 66 65 72 20 7a 50 72 65 76 20 69 6e   buffer zPrev in
105a0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73   bytes */.  cons
105b0 74 20 63 68 61 72 20 2a 7a 4e 65 78 74 2c 20 20  t char *zNext,  
105c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
105d0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
105e0 20 6e 65 78 74 20 74 65 72 6d 20 2a 2f 0a 20 20   next term */.  
105f0 69 6e 74 20 6e 4e 65 78 74 20 20 20 20 20 20 20  int nNext       
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
10620 72 20 7a 4e 65 78 74 20 69 6e 20 62 79 74 65 73  r zNext in bytes
10630 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
10640 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10650 45 52 28 6e 4e 65 78 74 29 3b 0a 20 20 66 6f 72  ER(nNext);.  for
10660 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26 26  (n=0; n<nPrev &&
10670 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78 74   zPrev[n]==zNext
10680 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65 74  [n]; n++);.  ret
10690 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
106a0 41 64 64 20 74 65 72 6d 20 7a 54 65 72 6d 20 74  Add term zTerm t
106b0 6f 20 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f 64  o the SegmentNod
106c0 65 2e 20 49 74 20 69 73 20 67 75 61 72 61 6e 74  e. It is guarant
106d0 65 65 64 20 74 68 61 74 20 7a 54 65 72 6d 20 69  eed that zTerm i
106e0 73 20 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63 63  s larger.** (acc
106f0 6f 72 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d 70  ording to memcmp
10700 29 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69  ) than the previ
10710 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  ous term..*/.sta
10720 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65  tic int fts3Node
10730 41 64 64 54 65 72 6d 28 0a 20 20 46 74 73 33 54  AddTerm(.  Fts3T
10740 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
10750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
10760 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
10770 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  le */.  SegmentN
10780 6f 64 65 20 2a 2a 70 70 54 72 65 65 2c 20 20 20  ode **ppTree,   
10790 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
107a0 54 3a 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68  T: SegmentNode h
107b0 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20  andle */ .  int 
107c0 69 73 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20  isCopyTerm,     
107d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
107e0 72 75 65 20 69 66 20 7a 54 65 72 6d 2f 6e 54 65  rue if zTerm/nTe
107f0 72 6d 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20  rm is transient 
10800 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10810 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
10820 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
10830 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
10840 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69  ning term */.  i
10850 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20  nt nTerm        
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10870 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69  * Size of term i
10880 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
10890 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72  SegmentNode *pTr
108a0 65 65 20 3d 20 2a 70 70 54 72 65 65 3b 0a 20 20  ee = *ppTree;.  
108b0 69 6e 74 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e  int rc;.  Segmen
108c0 74 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a 0a 20 20  tNode *pNew;..  
108d0 2f 2a 20 46 69 72 73 74 20 74 72 79 20 74 6f 20  /* First try to 
108e0 61 70 70 65 6e 64 20 74 68 65 20 74 65 72 6d 20  append the term 
108f0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  to the current n
10900 6f 64 65 2e 20 52 65 74 75 72 6e 20 65 61 72 6c  ode. Return earl
10910 79 20 69 66 20 0a 20 20 2a 2a 20 74 68 69 73 20  y if .  ** this 
10920 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  is possible..  *
10930 2f 0a 20 20 69 66 28 20 70 54 72 65 65 20 29 7b  /.  if( pTree ){
10940 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d  .    int nData =
10950 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 3b 20 20   pTree->nData;  
10960 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
10970 7a 65 20 6f 66 20 6e 6f 64 65 20 69 6e 20 62 79  ze of node in by
10980 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  tes */.    int n
10990 52 65 71 20 3d 20 6e 44 61 74 61 3b 20 20 20 20  Req = nData;    
109a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
109b0 69 72 65 64 20 73 70 61 63 65 20 61 66 74 65 72  ired space after
109c0 20 61 64 64 69 6e 67 20 7a 54 65 72 6d 20 2a 2f   adding zTerm */
109d0 0a 20 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78  .    int nPrefix
109e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
109f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10a00 62 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20  bytes of prefix 
10a10 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  compression */. 
10a20 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20     int nSuffix; 
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 2f 2a 20 53 75 66 66 69 78 20 6c 65 6e 67 74   /* Suffix lengt
10a50 68 20 2a 2f 0a 0a 20 20 20 20 6e 50 72 65 66 69  h */..    nPrefi
10a60 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f  x = fts3PrefixCo
10a70 6d 70 72 65 73 73 28 70 54 72 65 65 2d 3e 7a 54  mpress(pTree->zT
10a80 65 72 6d 2c 20 70 54 72 65 65 2d 3e 6e 54 65 72  erm, pTree->nTer
10a90 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
10aa0 3b 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20  ;.    nSuffix = 
10ab0 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a  nTerm-nPrefix;..
10ac0 20 20 20 20 6e 52 65 71 20 2b 3d 20 73 71 6c 69      nReq += sqli
10ad0 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
10ae0 28 6e 50 72 65 66 69 78 29 2b 73 71 6c 69 74 65  (nPrefix)+sqlite
10af0 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
10b00 53 75 66 66 69 78 29 2b 6e 53 75 66 66 69 78 3b  Suffix)+nSuffix;
10b10 0a 20 20 20 20 69 66 28 20 6e 52 65 71 3c 3d 70  .    if( nReq<=p
10b20 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 7c 7c 20 21  ->nNodeSize || !
10b30 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a  pTree->zTerm ){.
10b40 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 71 3e  .      if( nReq>
10b50 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a  p->nNodeSize ){.
10b60 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
10b70 75 73 75 61 6c 20 63 61 73 65 3a 20 74 68 69 73  usual case: this
10b80 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
10b90 72 6d 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  rm to be added t
10ba0 6f 20 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 20  o the node.     
10bb0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 73 74     ** and the st
10bc0 61 74 69 63 20 6e 6f 64 65 20 62 75 66 66 65 72  atic node buffer
10bd0 20 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62   (p->nNodeSize b
10be0 79 74 65 73 29 20 69 73 20 6e 6f 74 20 6c 61 72  ytes) is not lar
10bf0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  ge.        ** en
10c00 6f 75 67 68 2e 20 55 73 65 20 61 20 73 65 70 61  ough. Use a sepa
10c10 72 61 74 65 6c 79 20 6d 61 6c 6c 6f 63 65 64 20  rately malloced 
10c20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 54  buffer instead T
10c30 68 69 73 20 77 61 73 74 65 73 0a 20 20 20 20 20  his wastes.     
10c40 20 20 20 2a 2a 20 70 2d 3e 6e 4e 6f 64 65 53 69     ** p->nNodeSi
10c50 7a 65 20 62 79 74 65 73 2c 20 62 75 74 20 73 69  ze bytes, but si
10c60 6e 63 65 20 74 68 69 73 20 73 63 65 6e 61 72 69  nce this scenari
10c70 6f 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 61 62 6f  o only comes abo
10c80 75 74 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  ut when.        
10c90 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
10ca0 63 6f 6e 74 61 69 6e 20 74 77 6f 20 74 65 72 6d  contain two term
10cb0 73 20 74 68 61 74 20 73 68 61 72 65 20 61 20 70  s that share a p
10cc0 72 65 66 69 78 20 6f 66 20 61 6c 6d 6f 73 74 20  refix of almost 
10cd0 32 4b 42 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  2KB, .        **
10ce0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 65 78 70   this is not exp
10cf0 65 63 74 65 64 20 74 6f 20 62 65 20 61 20 73 65  ected to be a se
10d00 72 69 6f 75 73 20 70 72 6f 62 6c 65 6d 2e 20 0a  rious problem. .
10d10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10d20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 65 65     assert( pTree
10d30 2d 3e 61 44 61 74 61 3d 3d 28 63 68 61 72 20 2a  ->aData==(char *
10d40 29 26 70 54 72 65 65 5b 31 5d 20 29 3b 0a 20 20  )&pTree[1] );.  
10d50 20 20 20 20 20 20 70 54 72 65 65 2d 3e 61 44 61        pTree->aDa
10d60 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ta = (char *)sql
10d70 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71  ite3_malloc(nReq
10d80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
10d90 70 54 72 65 65 2d 3e 61 44 61 74 61 20 29 7b 0a  pTree->aData ){.
10da0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10db0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10dd0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 65  ..      if( pTre
10de0 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20  e->zTerm ){.    
10df0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
10e00 6e 6f 20 70 72 65 66 69 78 2d 6c 65 6e 67 74 68  no prefix-length
10e10 20 66 69 65 6c 64 20 66 6f 72 20 66 69 72 73 74   field for first
10e20 20 74 65 72 6d 20 69 6e 20 61 20 6e 6f 64 65 20   term in a node 
10e30 2a 2f 0a 20 20 20 20 20 20 20 20 6e 44 61 74 61  */.        nData
10e40 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
10e50 75 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d  utVarint(&pTree-
10e60 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e  >aData[nData], n
10e70 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7d  Prefix);.      }
10e80 0a 0a 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d  ..      nData +=
10e90 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
10ea0 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44  arint(&pTree->aD
10eb0 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66  ata[nData], nSuf
10ec0 66 69 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fix);.      memc
10ed0 70 79 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61  py(&pTree->aData
10ee0 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b  [nData], &zTerm[
10ef0 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69  nPrefix], nSuffi
10f00 78 29 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d  x);.      pTree-
10f10 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61 20 2b  >nData = nData +
10f20 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20   nSuffix;.      
10f30 70 54 72 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b  pTree->nEntry++;
10f40 0a 0a 20 20 20 20 20 20 69 66 28 20 69 73 43 6f  ..      if( isCo
10f50 70 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  pyTerm ){.      
10f60 20 20 69 66 28 20 70 54 72 65 65 2d 3e 6e 4d 61    if( pTree->nMa
10f70 6c 6c 6f 63 3c 6e 54 65 72 6d 20 29 7b 0a 20 20  lloc<nTerm ){.  
10f80 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
10f90 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
10fa0 6c 6c 6f 63 28 70 54 72 65 65 2d 3e 7a 4d 61 6c  lloc(pTree->zMal
10fb0 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20  loc, nTerm*2);. 
10fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 4e           if( !zN
10fd0 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
10fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ff0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
11000 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 72   }.          pTr
11010 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54  ee->nMalloc = nT
11020 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20 20 20 20  erm*2;.         
11030 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20   pTree->zMalloc 
11040 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = zNew;.        
11050 7d 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d  }.        pTree-
11060 3e 7a 54 65 72 6d 20 3d 20 70 54 72 65 65 2d 3e  >zTerm = pTree->
11070 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20  zMalloc;.       
11080 20 6d 65 6d 63 70 79 28 70 54 72 65 65 2d 3e 7a   memcpy(pTree->z
11090 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
110a0 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72  rm);.        pTr
110b0 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72  ee->nTerm = nTer
110c0 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
110d0 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a          pTree->z
110e0 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a  Term = (char *)z
110f0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
11100 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65  ree->nTerm = nTe
11110 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
11120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11130 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
11140 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
11150 6c 6f 77 73 20 74 6f 20 68 65 72 65 2c 20 69 74  lows to here, it
11160 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
11170 65 20 74 6f 20 61 70 70 65 6e 64 20 7a 54 65 72  e to append zTer
11180 6d 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 63 75  m to the.  ** cu
11190 72 72 65 6e 74 20 6e 6f 64 65 2e 20 43 72 65 61  rrent node. Crea
111a0 74 65 20 61 20 6e 65 77 20 6e 6f 64 65 20 28 61  te a new node (a
111b0 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
111c0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  f the current no
111d0 64 65 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69  de)..  ** If thi
111e0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6e  s is the first n
111f0 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 2c  ode in the tree,
11200 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 64 64   the term is add
11210 65 64 20 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20  ed to it..  **. 
11220 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74   ** Otherwise, t
11230 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61  he term is not a
11240 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 20  dded to the new 
11250 6e 6f 64 65 2c 20 69 74 20 69 73 20 6c 65 66 74  node, it is left
11260 20 65 6d 70 74 79 20 66 6f 72 0a 20 20 2a 2a 20   empty for.  ** 
11270 6e 6f 77 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  now. Instead, th
11280 65 20 74 65 72 6d 20 69 73 20 69 6e 73 65 72 74  e term is insert
11290 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ed into the pare
112a0 6e 74 20 6f 66 20 70 54 72 65 65 2e 20 49 66 20  nt of pTree. If 
112b0 70 54 72 65 65 20 0a 20 20 2a 2a 20 68 61 73 20  pTree .  ** has 
112c0 6e 6f 20 70 61 72 65 6e 74 2c 20 6f 6e 65 20 69  no parent, one i
112d0 73 20 63 72 65 61 74 65 64 20 68 65 72 65 2e 0a  s created here..
112e0 20 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 28 53    */.  pNew = (S
112f0 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 29 73 71 6c  egmentNode *)sql
11300 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
11310 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 20  of(SegmentNode) 
11320 2b 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b  + p->nNodeSize);
11330 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a  .  if( !pNew ){.
11340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11350 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
11360 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
11370 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64  izeof(SegmentNod
11380 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44 61  e));.  pNew->nDa
11390 74 61 20 3d 20 31 20 2b 20 46 54 53 33 5f 56 41  ta = 1 + FTS3_VA
113a0 52 49 4e 54 5f 4d 41 58 3b 0a 20 20 70 4e 65 77  RINT_MAX;.  pNew
113b0 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20  ->aData = (char 
113c0 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69  *)&pNew[1];..  i
113d0 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20  f( pTree ){.    
113e0 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61  SegmentNode *pPa
113f0 72 65 6e 74 20 3d 20 70 54 72 65 65 2d 3e 70 50  rent = pTree->pP
11400 61 72 65 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20  arent;.    rc = 
11410 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28  fts3NodeAddTerm(
11420 70 2c 20 26 70 50 61 72 65 6e 74 2c 20 69 73 43  p, &pParent, isC
11430 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  opyTerm, zTerm, 
11440 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
11450 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pTree->pParent==
11460 30 20 29 7b 0a 20 20 20 20 20 20 70 54 72 65 65  0 ){.      pTree
11470 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
11480 65 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ent;.    }.    p
11490 54 72 65 65 2d 3e 70 52 69 67 68 74 20 3d 20 70  Tree->pRight = p
114a0 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  New;.    pNew->p
114b0 4c 65 66 74 6d 6f 73 74 20 3d 20 70 54 72 65 65  Leftmost = pTree
114c0 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20  ->pLeftmost;.   
114d0 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d   pNew->pParent =
114e0 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e   pParent;.    pN
114f0 65 77 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54  ew->zMalloc = pT
11500 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20  ree->zMalloc;.  
11510 20 20 70 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20    pNew->nMalloc 
11520 3d 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63  = pTree->nMalloc
11530 3b 0a 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61  ;.    pTree->zMa
11540 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lloc = 0;.  }els
11550 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65  e{.    pNew->pLe
11560 66 74 6d 6f 73 74 20 3d 20 70 4e 65 77 3b 0a 20  ftmost = pNew;. 
11570 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65     rc = fts3Node
11580 41 64 64 54 65 72 6d 28 70 2c 20 26 70 4e 65 77  AddTerm(p, &pNew
11590 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54  , isCopyTerm, zT
115a0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 20 0a 20 20  erm, nTerm); .  
115b0 7d 0a 0a 20 20 2a 70 70 54 72 65 65 20 3d 20 70  }..  *ppTree = p
115c0 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  New;.  return rc
115d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  ;.}../*.** Helpe
115e0 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66  r function for f
115f0 74 73 33 4e 6f 64 65 57 72 69 74 65 28 29 2e 0a  ts3NodeWrite()..
11600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
11610 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65  s3TreeFinishNode
11620 28 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  (.  SegmentNode 
11630 2a 70 54 72 65 65 2c 20 0a 20 20 69 6e 74 20 69  *pTree, .  int i
11640 48 65 69 67 68 74 2c 20 0a 20 20 73 71 6c 69 74  Height, .  sqlit
11650 65 33 5f 69 6e 74 36 34 20 69 4c 65 66 74 43 68  e3_int64 iLeftCh
11660 69 6c 64 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74  ild.){.  int nSt
11670 61 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  art;.  assert( i
11680 48 65 69 67 68 74 3e 3d 31 20 26 26 20 69 48 65  Height>=1 && iHe
11690 69 67 68 74 3c 31 32 38 20 29 3b 0a 20 20 6e 53  ight<128 );.  nS
116a0 74 61 72 74 20 3d 20 46 54 53 33 5f 56 41 52 49  tart = FTS3_VARI
116b0 4e 54 5f 4d 41 58 20 2d 20 73 71 6c 69 74 65 33  NT_MAX - sqlite3
116c0 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 4c  Fts3VarintLen(iL
116d0 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 70 54 72  eftChild);.  pTr
116e0 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74  ee->aData[nStart
116f0 5d 20 3d 20 28 63 68 61 72 29 69 48 65 69 67 68  ] = (char)iHeigh
11700 74 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  t;.  sqlite3Fts3
11710 50 75 74 56 61 72 69 6e 74 28 26 70 54 72 65 65  PutVarint(&pTree
11720 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 2b 31  ->aData[nStart+1
11730 5d 2c 20 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a  ], iLeftChild);.
11740 20 20 72 65 74 75 72 6e 20 6e 53 74 61 72 74 3b    return nStart;
11750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
11760 74 68 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  the buffer for t
11770 68 65 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20  he segment node 
11780 70 54 72 65 65 20 61 6e 64 20 61 6c 6c 20 6f 66  pTree and all of
11790 20 69 74 73 20 70 65 65 72 73 20 74 6f 20 74 68   its peers to th
117a0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54  e.** database. T
117b0 68 65 6e 20 63 61 6c 6c 20 74 68 69 73 20 66 75  hen call this fu
117c0 6e 63 74 69 6f 6e 20 72 65 63 75 72 73 69 76 65  nction recursive
117d0 6c 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ly to write the 
117e0 70 61 72 65 6e 74 20 6f 66 20 0a 2a 2a 20 70 54  parent of .** pT
117f0 72 65 65 20 61 6e 64 20 69 74 73 20 70 65 65 72  ree and its peer
11800 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
11810 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
11820 2c 20 69 66 20 70 54 72 65 65 20 69 73 20 61 20  , if pTree is a 
11830 72 6f 6f 74 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f  root node, do no
11840 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
11850 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 73 74  e database. Inst
11860 65 61 64 2c 0a 2a 2a 20 73 65 74 20 6f 75 74 70  ead,.** set outp
11870 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 70 61  ut variables *pa
11880 52 6f 6f 74 20 61 6e 64 20 2a 70 6e 52 6f 6f 74  Root and *pnRoot
11890 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
118a0 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  root node..**.**
118b0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
118c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
118d0 75 72 6e 65 64 20 61 6e 64 20 6f 75 74 70 75 74  urned and output
118e0 20 76 61 72 69 61 62 6c 65 20 2a 70 69 4c 61 73   variable *piLas
118f0 74 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74  t is.** set to t
11900 68 65 20 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b  he largest block
11910 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  id written to th
11920 65 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 7a  e database (or z
11930 65 72 6f 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f  ero if no.** blo
11940 63 6b 73 20 77 65 72 65 20 77 72 69 74 74 65 6e  cks were written
11950 20 74 6f 20 74 68 65 20 64 62 29 2e 20 4f 74 68   to the db). Oth
11960 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
11970 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
11980 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
11990 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
119a0 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 46 74 73  NodeWrite(.  Fts
119b0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
119d0 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
119e0 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ndle */.  Segmen
119f0 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20 20 20  tNode *pTree,   
11a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
11a10 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20  mentNode handle 
11a20 2a 2f 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  */.  int iHeight
11a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11a40 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f       /* Height o
11a50 66 20 74 68 69 73 20 6e 6f 64 65 20 69 6e 20 74  f this node in t
11a60 72 65 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ree */.  sqlite3
11a70 5f 69 6e 74 36 34 20 69 4c 65 61 66 2c 20 20 20  _int64 iLeaf,   
11a80 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
11a90 6b 20 69 64 20 6f 66 20 66 69 72 73 74 20 6c 65  k id of first le
11aa0 61 66 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  af node */.  sql
11ab0 69 74 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65  ite3_int64 iFree
11ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11ad0 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6e 65 78 74  Block id of next
11ae0 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f   free slot in %_
11af0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71  segments */.  sq
11b00 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c  lite3_int64 *piL
11b10 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ast,          /*
11b20 20 4f 55 54 3a 20 42 6c 6f 63 6b 20 69 64 20 6f   OUT: Block id o
11b30 66 20 6c 61 73 74 20 65 6e 74 72 79 20 77 72 69  f last entry wri
11b40 74 74 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tten */.  char *
11b50 2a 70 61 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  *paRoot,        
11b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
11b70 3a 20 44 61 74 61 20 66 6f 72 20 72 6f 6f 74 20  : Data for root 
11b80 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  node */.  int *p
11b90 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  nRoot           
11ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
11bb0 3a 20 53 69 7a 65 20 6f 66 20 72 6f 6f 74 20 6e  : Size of root n
11bc0 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ode in bytes */.
11bd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11be0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
11bf0 21 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20  !pTree->pParent 
11c00 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e  ){.    /* Root n
11c10 6f 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 2e  ode of the tree.
11c20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61   */.    int nSta
11c30 72 74 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e  rt = fts3TreeFin
11c40 69 73 68 4e 6f 64 65 28 70 54 72 65 65 2c 20 69  ishNode(pTree, i
11c50 48 65 69 67 68 74 2c 20 69 4c 65 61 66 29 3b 0a  Height, iLeaf);.
11c60 20 20 20 20 2a 70 69 4c 61 73 74 20 3d 20 69 46      *piLast = iF
11c70 72 65 65 2d 31 3b 0a 20 20 20 20 2a 70 6e 52 6f  ree-1;.    *pnRo
11c80 6f 74 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74  ot = pTree->nDat
11c90 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20 20 20  a - nStart;.    
11ca0 2a 70 61 52 6f 6f 74 20 3d 20 26 70 54 72 65 65  *paRoot = &pTree
11cb0 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 3b  ->aData[nStart];
11cc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 65  .  }else{.    Se
11cd0 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 49 74 65 72  gmentNode *pIter
11ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
11cf0 74 36 34 20 69 4e 65 78 74 46 72 65 65 20 3d 20  t64 iNextFree = 
11d00 69 46 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74  iFree;.    sqlit
11d10 65 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 4c 65  e3_int64 iNextLe
11d20 61 66 20 3d 20 69 4c 65 61 66 3b 0a 20 20 20 20  af = iLeaf;.    
11d30 66 6f 72 28 70 49 74 65 72 3d 70 54 72 65 65 2d  for(pIter=pTree-
11d40 3e 70 4c 65 66 74 6d 6f 73 74 3b 20 70 49 74 65  >pLeftmost; pIte
11d50 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
11d60 4f 4b 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  OK; pIter=pIter-
11d70 3e 70 52 69 67 68 74 29 7b 0a 20 20 20 20 20 20  >pRight){.      
11d80 69 6e 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73  int nStart = fts
11d90 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28  3TreeFinishNode(
11da0 70 49 74 65 72 2c 20 69 48 65 69 67 68 74 2c 20  pIter, iHeight, 
11db0 69 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20  iNextLeaf);.    
11dc0 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 70    int nWrite = p
11dd0 49 74 65 72 2d 3e 6e 44 61 74 61 20 2d 20 6e 53  Iter->nData - nS
11de0 74 61 72 74 3b 0a 20 20 0a 20 20 20 20 20 20 72  tart;.  .      r
11df0 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
11e00 6d 65 6e 74 28 70 2c 20 69 4e 65 78 74 46 72 65  ment(p, iNextFre
11e10 65 2c 20 26 70 49 74 65 72 2d 3e 61 44 61 74 61  e, &pIter->aData
11e20 5b 6e 53 74 61 72 74 5d 2c 20 6e 57 72 69 74 65  [nStart], nWrite
11e30 29 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 46 72  );.      iNextFr
11e40 65 65 2b 2b 3b 0a 20 20 20 20 20 20 69 4e 65 78  ee++;.      iNex
11e50 74 4c 65 61 66 20 2b 3d 20 28 70 49 74 65 72 2d  tLeaf += (pIter-
11e60 3e 6e 45 6e 74 72 79 2b 31 29 3b 0a 20 20 20 20  >nEntry+1);.    
11e70 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
11e80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11e90 20 61 73 73 65 72 74 28 20 69 4e 65 78 74 4c 65   assert( iNextLe
11ea0 61 66 3d 3d 69 46 72 65 65 20 29 3b 0a 20 20 20  af==iFree );.   
11eb0 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65     rc = fts3Node
11ec0 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20  Write(.         
11ed0 20 70 2c 20 70 54 72 65 65 2d 3e 70 50 61 72 65   p, pTree->pPare
11ee0 6e 74 2c 20 69 48 65 69 67 68 74 2b 31 2c 20 69  nt, iHeight+1, i
11ef0 46 72 65 65 2c 20 69 4e 65 78 74 46 72 65 65 2c  Free, iNextFree,
11f00 20 70 69 4c 61 73 74 2c 20 70 61 52 6f 6f 74 2c   piLast, paRoot,
11f10 20 70 6e 52 6f 6f 74 0a 20 20 20 20 20 20 29 3b   pnRoot.      );
11f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
11f30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11f40 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
11f50 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
11f60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
11f70 65 20 74 72 65 65 20 70 54 72 65 65 2e 0a 2a 2f  e tree pTree..*/
11f80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
11f90 33 4e 6f 64 65 46 72 65 65 28 53 65 67 6d 65 6e  3NodeFree(Segmen
11fa0 74 4e 6f 64 65 20 2a 70 54 72 65 65 29 7b 0a 20  tNode *pTree){. 
11fb0 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20   if( pTree ){.  
11fc0 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
11fd0 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d   = pTree->pLeftm
11fe0 6f 73 74 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64  ost;.    fts3Nod
11ff0 65 46 72 65 65 28 70 2d 3e 70 50 61 72 65 6e 74  eFree(p->pParent
12000 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  );.    while( p 
12010 29 7b 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74  ){.      Segment
12020 4e 6f 64 65 20 2a 70 52 69 67 68 74 20 3d 20 70  Node *pRight = p
12030 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
12040 69 66 28 20 70 2d 3e 61 44 61 74 61 21 3d 28 63  if( p->aData!=(c
12050 68 61 72 20 2a 29 26 70 5b 31 5d 20 29 7b 0a 20  har *)&p[1] ){. 
12060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12070 72 65 65 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20  ree(p->aData);. 
12080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
12090 65 72 74 28 20 70 52 69 67 68 74 3d 3d 30 20 7c  ert( pRight==0 |
120a0 7c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  | p->zMalloc==0 
120b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
120c0 5f 66 72 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63  _free(p->zMalloc
120d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
120e0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
120f0 70 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  p = pRight;.    
12100 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
12110 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  dd a term to the
12120 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 63   segment being c
12130 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
12140 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  e SegmentWriter 
12150 6f 62 6a 65 63 74 0a 2a 2a 20 2a 70 70 57 72 69  object.** *ppWri
12160 74 65 72 2e 20 57 68 65 6e 20 61 64 64 69 6e 67  ter. When adding
12170 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
12180 74 6f 20 61 20 73 65 67 6d 65 6e 74 2c 20 2a 70  to a segment, *p
12190 70 57 72 69 74 65 72 20 73 68 6f 75 6c 64 0a 2a  pWriter should.*
121a0 2a 20 62 65 20 70 61 73 73 65 64 20 4e 55 4c 4c  * be passed NULL
121b0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
121c0 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 20  will allocate a 
121d0 6e 65 77 20 53 65 67 6d 65 6e 74 57 72 69 74 65  new SegmentWrite
121e0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  r object.** and 
121f0 72 65 74 75 72 6e 20 69 74 20 76 69 61 20 74 68  return it via th
12200 65 20 69 6e 70 75 74 2f 6f 75 74 70 75 74 20 76  e input/output v
12210 61 72 69 61 62 6c 65 20 2a 70 70 57 72 69 74 65  ariable *ppWrite
12220 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  r in this case..
12230 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
12240 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
12250 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
12260 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
12270 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
12280 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
12290 65 67 57 72 69 74 65 72 41 64 64 28 0a 20 20 46  egWriterAdd(.  F
122a0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
122c0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
122d0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d  handle */.  Segm
122e0 65 6e 74 57 72 69 74 65 72 20 2a 2a 70 70 57 72  entWriter **ppWr
122f0 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 49  iter,       /* I
12300 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74 57 72  N/OUT: SegmentWr
12310 69 74 65 72 20 68 61 6e 64 6c 65 20 2a 2f 20 0a  iter handle */ .
12320 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d    int isCopyTerm
12330 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12340 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 75 66    /* True if buf
12350 66 65 72 20 7a 54 65 72 6d 20 6d 75 73 74 20 62  fer zTerm must b
12360 65 20 63 6f 70 69 65 64 20 2a 2f 0a 20 20 63 6f  e copied */.  co
12370 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12390 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
123a0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65  er containing te
123b0 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  rm */.  int nTer
123c0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
123d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
123e0 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73  of term in bytes
123f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
12400 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20 20   *aDoclist,     
12410 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12420 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
12430 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74 20 2a 2f  ining doclist */
12440 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20  .  int nDoclist 
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f     /* Size of do
12470 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  clist in bytes *
12480 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66  /.){.  int nPref
12490 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
124a0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
124b0 66 20 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e  f term prefix in
124c0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
124d0 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20  nSuffix;        
124e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
124f0 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66  ize of term suff
12500 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ix in bytes */. 
12510 20 69 6e 74 20 6e 52 65 71 3b 20 20 20 20 20 20   int nReq;      
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
12540 74 65 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  tes required on 
12550 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69  leaf page */.  i
12560 6e 74 20 6e 44 61 74 61 3b 0a 20 20 53 65 67 6d  nt nData;.  Segm
12570 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74  entWriter *pWrit
12580 65 72 20 3d 20 2a 70 70 57 72 69 74 65 72 3b 0a  er = *ppWriter;.
12590 0a 20 20 69 66 28 20 21 70 57 72 69 74 65 72 20  .  if( !pWriter 
125a0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
125b0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
125c0 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20  *pStmt;..    /* 
125d0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 53 65 67  Allocate the Seg
125e0 6d 65 6e 74 57 72 69 74 65 72 20 73 74 72 75 63  mentWriter struc
125f0 74 75 72 65 20 2a 2f 0a 20 20 20 20 70 57 72 69  ture */.    pWri
12600 74 65 72 20 3d 20 28 53 65 67 6d 65 6e 74 57 72  ter = (SegmentWr
12610 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  iter *)sqlite3_m
12620 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67  alloc(sizeof(Seg
12630 6d 65 6e 74 57 72 69 74 65 72 29 29 3b 0a 20 20  mentWriter));.  
12640 20 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29    if( !pWriter )
12650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12660 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  OMEM;.    memset
12670 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (pWriter, 0, siz
12680 65 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65  eof(SegmentWrite
12690 72 29 29 3b 0a 20 20 20 20 2a 70 70 57 72 69 74  r));.    *ppWrit
126a0 65 72 20 3d 20 70 57 72 69 74 65 72 3b 0a 0a 20  er = pWriter;.. 
126b0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
126c0 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   buffer in which
126d0 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64   to accumulate d
126e0 61 74 61 20 2a 2f 0a 20 20 20 20 70 57 72 69 74  ata */.    pWrit
126f0 65 72 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61  er->aData = (cha
12700 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
12710 6f 63 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29  oc(p->nNodeSize)
12720 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72 69 74  ;.    if( !pWrit
12730 65 72 2d 3e 61 44 61 74 61 20 29 20 72 65 74 75  er->aData ) retu
12740 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12750 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53  .    pWriter->nS
12760 69 7a 65 20 3d 20 70 2d 3e 6e 4e 6f 64 65 53 69  ize = p->nNodeSi
12770 7a 65 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  ze;..    /* Find
12780 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 20 62   the next free b
12790 6c 6f 63 6b 69 64 20 69 6e 20 74 68 65 20 25 5f  lockid in the %_
127a0 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a  segments table *
127b0 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  /.    rc = fts3S
127c0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45  qlStmt(p, SQL_NE
127d0 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20  XT_SEGMENTS_ID, 
127e0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
127f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12800 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
12810 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
12820 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
12830 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
12840 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 20 3d  pWriter->iFree =
12850 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
12860 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b  int64(pStmt, 0);
12870 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
12880 69 46 69 72 73 74 20 3d 20 70 57 72 69 74 65 72  iFirst = pWriter
12890 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  ->iFree;.    }. 
128a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
128b0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
128c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
128d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
128e0 0a 20 20 7d 0a 20 20 6e 44 61 74 61 20 3d 20 70  .  }.  nData = p
128f0 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 0a  Writer->nData;..
12900 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33    nPrefix = fts3
12910 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
12920 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70  Writer->zTerm, p
12930 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 2c 20 7a  Writer->nTerm, z
12940 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
12950 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d  nSuffix = nTerm-
12960 6e 50 72 65 66 69 78 3b 0a 0a 20 20 2f 2a 20 46  nPrefix;..  /* F
12970 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
12980 6e 79 20 62 79 74 65 73 20 61 72 65 20 72 65 71  ny bytes are req
12990 75 69 72 65 64 20 62 79 20 74 68 69 73 20 6e 65  uired by this ne
129a0 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6e 52 65  w entry */.  nRe
129b0 71 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56  q = sqlite3Fts3V
129c0 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78  arintLen(nPrefix
129d0 29 20 2b 20 20 20 20 2f 2a 20 76 61 72 69 6e 74  ) +    /* varint
129e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66   containing pref
129f0 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  ix size */.    s
12a00 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
12a10 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 2b 20 20  Len(nSuffix) +  
12a20 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74         /* varint
12a30 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66   containing suff
12a40 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6e  ix size */.    n
12a50 53 75 66 66 69 78 20 2b 20 20 20 20 20 20 20 20  Suffix +        
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a70 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73         /* Term s
12a80 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 73 71 6c  uffix */.    sql
12a90 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
12aa0 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20 20  n(nDoclist) +   
12ab0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
12ac0 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6e  doclist */.    n
12ad0 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73         /* Doclis
12b00 74 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 66 28  t data */..  if(
12b10 20 6e 44 61 74 61 3e 30 20 26 26 20 6e 44 61 74   nData>0 && nDat
12b20 61 2b 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53  a+nReq>p->nNodeS
12b30 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
12b40 63 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  c;..    /* The c
12b50 75 72 72 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65  urrent leaf node
12b60 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20   is full. Write 
12b70 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  it out to the da
12b80 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72  tabase. */.    r
12b90 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
12ba0 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d  ment(p, pWriter-
12bb0 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65  >iFree++, pWrite
12bc0 72 2d 3e 61 44 61 74 61 2c 20 6e 44 61 74 61 29  r->aData, nData)
12bd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12be0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12bf0 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 4c 65 61   rc;.    p->nLea
12c00 66 41 64 64 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  fAdd++;..    /* 
12c10 41 64 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  Add the current 
12c20 74 65 72 6d 20 74 6f 20 74 68 65 20 69 6e 74 65  term to the inte
12c30 72 69 6f 72 20 6e 6f 64 65 20 74 72 65 65 2e 20  rior node tree. 
12c40 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20 74  The term added t
12c50 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 74  o.    ** the int
12c60 65 72 69 6f 72 20 74 72 65 65 20 6d 75 73 74 3a  erior tree must:
12c70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
12c80 20 61 29 20 62 65 20 67 72 65 61 74 65 72 20 74   a) be greater t
12c90 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
12ca0 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66  term on the leaf
12cb0 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
12cc0 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  en.    **      t
12cd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
12ce0 73 74 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  still available 
12cf0 69 6e 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  in pWriter->zTer
12d00 6d 29 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 0a 20  m), and.    **. 
12d10 20 20 20 2a 2a 20 20 20 62 29 20 62 65 20 6c 65     **   b) be le
12d20 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
12d30 20 74 6f 20 74 68 65 20 74 65 72 6d 20 61 62 6f   to the term abo
12d40 75 74 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ut to be added t
12d50 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
12d60 20 20 20 20 20 20 6c 65 61 66 20 6e 6f 64 65 20        leaf node 
12d70 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20  (zTerm/nTerm).. 
12d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
12d90 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
12da0 6d 75 73 74 20 62 65 20 74 68 65 20 70 72 65 66  must be the pref
12db0 69 78 20 6f 66 20 7a 54 65 72 6d 20 31 20 62 79  ix of zTerm 1 by
12dc0 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20  te longer than. 
12dd0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e     ** the common
12de0 20 70 72 65 66 69 78 20 28 69 66 20 61 6e 79 29   prefix (if any)
12df0 20 6f 66 20 7a 54 65 72 6d 20 61 6e 64 20 70 57   of zTerm and pW
12e00 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20  riter->zTerm..  
12e10 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
12e20 20 6e 50 72 65 66 69 78 3c 6e 54 65 72 6d 20 29   nPrefix<nTerm )
12e30 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e  ;.    rc = fts3N
12e40 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70  odeAddTerm(p, &p
12e50 57 72 69 74 65 72 2d 3e 70 54 72 65 65 2c 20 69  Writer->pTree, i
12e60 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d  sCopyTerm, zTerm
12e70 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a 20 20  , nPrefix+1);.  
12e80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12e90 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
12ea0 0a 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ..    nData = 0;
12eb0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 54  .    pWriter->nT
12ec0 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 50  erm = 0;..    nP
12ed0 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 6e  refix = 0;.    n
12ee0 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a  Suffix = nTerm;.
12ef0 20 20 20 20 6e 52 65 71 20 3d 20 31 20 2b 20 20      nReq = 1 +  
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
12f20 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  arint containing
12f30 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a   prefix size */.
12f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
12f50 33 56 61 72 69 6e 74 4c 65 6e 28 6e 54 65 72 6d  3VarintLen(nTerm
12f60 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76  ) +         /* v
12f70 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  arint containing
12f80 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a   suffix size */.
12f90 20 20 20 20 20 20 6e 54 65 72 6d 20 2b 20 20 20        nTerm +   
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12fc0 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20  erm suffix */.  
12fd0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56      sqlite3Fts3V
12fe0 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73  arintLen(nDoclis
12ff0 74 29 20 2b 20 20 20 20 20 20 2f 2a 20 53 69 7a  t) +      /* Siz
13000 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  e of doclist */.
13010 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20        nDoclist; 
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
13040 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20  oclist data */. 
13050 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73   }..  /* Increas
13060 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
13070 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
13080 74 65 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ten to account f
13090 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
130a0 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  . */.  pWriter->
130b0 6e 4c 65 61 66 44 61 74 61 20 2b 3d 20 6e 52 65  nLeafData += nRe
130c0 71 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  q;..  /* If the 
130d0 62 75 66 66 65 72 20 63 75 72 72 65 6e 74 6c 79  buffer currently
130e0 20 61 6c 6c 6f 63 61 74 65 64 20 69 73 20 74 6f   allocated is to
130f0 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 69 73  o small for this
13100 20 65 6e 74 72 79 2c 20 72 65 61 6c 6c 6f 63 0a   entry, realloc.
13110 20 20 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20    ** the buffer 
13120 74 6f 20 6d 61 6b 65 20 69 74 20 6c 61 72 67 65  to make it large
13130 20 65 6e 6f 75 67 68 2e 0a 20 20 2a 2f 0a 20 20   enough..  */.  
13140 69 66 28 20 6e 52 65 71 3e 70 57 72 69 74 65 72  if( nReq>pWriter
13150 2d 3e 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 63  ->nSize ){.    c
13160 68 61 72 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69  har *aNew = sqli
13170 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69  te3_realloc(pWri
13180 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 52 65 71  ter->aData, nReq
13190 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77  );.    if( !aNew
131a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
131b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69  _NOMEM;.    pWri
131c0 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 4e 65  ter->aData = aNe
131d0 77 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  w;.    pWriter->
131e0 6e 53 69 7a 65 20 3d 20 6e 52 65 71 3b 0a 20 20  nSize = nReq;.  
131f0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74  }.  assert( nDat
13200 61 2b 6e 52 65 71 3c 3d 70 57 72 69 74 65 72 2d  a+nReq<=pWriter-
13210 3e 6e 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20  >nSize );..  /* 
13220 41 70 70 65 6e 64 20 74 68 65 20 70 72 65 66 69  Append the prefi
13230 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 74 65 72  x-compressed ter
13240 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 20 74 6f  m and doclist to
13250 20 74 68 65 20 62 75 66 66 65 72 2e 20 2a 2f 0a   the buffer. */.
13260 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74    nData += sqlit
13270 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
13280 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b  &pWriter->aData[
13290 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66 69 78 29  nData], nPrefix)
132a0 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c  ;.  nData += sql
132b0 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
132c0 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74  t(&pWriter->aDat
132d0 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69  a[nData], nSuffi
132e0 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 57  x);.  memcpy(&pW
132f0 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61  riter->aData[nDa
13300 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65  ta], &zTerm[nPre
13310 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  fix], nSuffix);.
13320 20 20 6e 44 61 74 61 20 2b 3d 20 6e 53 75 66 66    nData += nSuff
13330 69 78 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73  ix;.  nData += s
13340 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
13350 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44  int(&pWriter->aD
13360 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 44 6f 63  ata[nData], nDoc
13370 6c 69 73 74 29 3b 0a 20 20 6d 65 6d 63 70 79 28  list);.  memcpy(
13380 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b  &pWriter->aData[
13390 6e 44 61 74 61 5d 2c 20 61 44 6f 63 6c 69 73 74  nData], aDoclist
133a0 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70  , nDoclist);.  p
133b0 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20  Writer->nData = 
133c0 6e 44 61 74 61 20 2b 20 6e 44 6f 63 6c 69 73 74  nData + nDoclist
133d0 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  ;..  /* Save the
133e0 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 73 6f   current term so
133f0 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
13400 75 73 65 64 20 74 6f 20 70 72 65 66 69 78 2d 63  used to prefix-c
13410 6f 6d 70 72 65 73 73 20 74 68 65 20 6e 65 78 74  ompress the next
13420 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  ..  ** If the is
13430 43 6f 70 79 54 65 72 6d 20 70 61 72 61 6d 65 74  CopyTerm paramet
13440 65 72 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  er is true, then
13450 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
13460 74 65 64 20 74 6f 20 62 79 0a 20 20 2a 2a 20 7a  ted to by.  ** z
13470 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69 65 6e  Term is transien
13480 74 2c 20 73 6f 20 74 61 6b 65 20 61 20 63 6f 70  t, so take a cop
13490 79 20 6f 66 20 74 68 65 20 74 65 72 6d 20 64 61  y of the term da
134a0 74 61 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6a  ta. Otherwise, j
134b0 75 73 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 61  ust.  ** store a
134c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69   copy of the poi
134d0 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nter..  */.  if(
134e0 20 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20   isCopyTerm ){. 
134f0 20 20 20 69 66 28 20 6e 54 65 72 6d 3e 70 57 72     if( nTerm>pWr
13500 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 29 7b  iter->nMalloc ){
13510 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  .      char *zNe
13520 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
13530 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61  loc(pWriter->zMa
13540 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a  lloc, nTerm*2);.
13550 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20        if( !zNew 
13560 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13570 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
13590 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d  riter->nMalloc =
135a0 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20   nTerm*2;.      
135b0 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63  pWriter->zMalloc
135c0 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 70   = zNew;.      p
135d0 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20  Writer->zTerm = 
135e0 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zNew;.    }.    
135f0 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
13600 3e 7a 54 65 72 6d 3d 3d 70 57 72 69 74 65 72 2d  >zTerm==pWriter-
13610 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20 20  >zMalloc );.    
13620 6d 65 6d 63 70 79 28 70 57 72 69 74 65 72 2d 3e  memcpy(pWriter->
13630 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  zTerm, zTerm, nT
13640 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
13650 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72     pWriter->zTer
13660 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72  m = (char *)zTer
13670 6d 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72  m;.  }.  pWriter
13680 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b  ->nTerm = nTerm;
13690 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
136a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
136b0 6c 75 73 68 20 61 6c 6c 20 64 61 74 61 20 61 73  lush all data as
136c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
136d0 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  e SegmentWriter 
136e0 6f 62 6a 65 63 74 20 70 57 72 69 74 65 72 20 74  object pWriter t
136f0 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
13700 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
13710 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
13720 61 66 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20  after all terms 
13730 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 0a  have been added.
13740 2a 2a 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  ** to the segmen
13750 74 20 75 73 69 6e 67 20 66 74 73 33 53 65 67 57  t using fts3SegW
13760 72 69 74 65 72 41 64 64 28 29 2e 20 49 66 20 73  riterAdd(). If s
13770 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
13780 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
13790 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
137a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
137b0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
137c0 69 6e 74 20 66 74 73 33 53 65 67 57 72 69 74 65  int fts3SegWrite
137d0 72 46 6c 75 73 68 28 0a 20 20 46 74 73 33 54 61  rFlush(.  Fts3Ta
137e0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
137f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
13800 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
13810 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72  e */.  SegmentWr
13820 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
13830 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
13840 74 57 72 69 74 65 72 20 74 6f 20 66 6c 75 73 68  tWriter to flush
13850 20 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20 20   to the db */.  
13860 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
13870 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
13880 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 27 6c 65  /* Value for 'le
13890 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25  vel' column of %
138a0 5f 73 65 67 64 69 72 20 2a 2f 0a 20 20 69 6e 74  _segdir */.  int
138b0 20 69 49 64 78 20 20 20 20 20 20 20 20 20 20 20   iIdx           
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138d0 56 61 6c 75 65 20 66 6f 72 20 27 69 64 78 27 20  Value for 'idx' 
138e0 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64  column of %_segd
138f0 69 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ir */.){.  int r
13900 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
13910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13920 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
13930 66 28 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65  f( pWriter->pTre
13940 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13950 5f 69 6e 74 36 34 20 69 4c 61 73 74 20 3d 20 30  _int64 iLast = 0
13960 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73  ;      /* Larges
13970 74 20 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74  t block id writt
13980 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 2a  en to database *
13990 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
139a0 74 36 34 20 69 4c 61 73 74 4c 65 61 66 3b 20 20  t64 iLastLeaf;  
139b0 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 6c      /* Largest l
139c0 65 61 66 20 62 6c 6f 63 6b 20 69 64 20 77 72 69  eaf block id wri
139d0 74 74 65 6e 20 74 6f 20 64 62 20 2a 2f 0a 20 20  tten to db */.  
139e0 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20    char *zRoot = 
139f0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
13a00 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
13a10 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
13a20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20  root node */.   
13a30 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b 20   int nRoot = 0; 
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a50 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
13a60 20 7a 52 6f 6f 74 20 2a 2f 0a 0a 20 20 20 20 69   zRoot */..    i
13a70 4c 61 73 74 4c 65 61 66 20 3d 20 70 57 72 69 74  LastLeaf = pWrit
13a80 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20 72  er->iFree;.    r
13a90 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
13aa0 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d  ment(p, pWriter-
13ab0 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65  >iFree++, pWrite
13ac0 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74 65  r->aData, pWrite
13ad0 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20 69  r->nData);.    i
13ae0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13af0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
13b00 74 73 33 4e 6f 64 65 57 72 69 74 65 28 70 2c 20  ts3NodeWrite(p, 
13b10 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 2c 20  pWriter->pTree, 
13b20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 70 57 72  1,.          pWr
13b30 69 74 65 72 2d 3e 69 46 69 72 73 74 2c 20 70 57  iter->iFirst, pW
13b40 72 69 74 65 72 2d 3e 69 46 72 65 65 2c 20 26 69  riter->iFree, &i
13b50 4c 61 73 74 2c 20 26 7a 52 6f 6f 74 2c 20 26 6e  Last, &zRoot, &n
13b60 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Root);.    }.   
13b70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
13b90 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72   fts3WriteSegdir
13ba0 28 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78  (p, iLevel, iIdx
13bb0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 57 72  , .          pWr
13bc0 69 74 65 72 2d 3e 69 46 69 72 73 74 2c 20 69 4c  iter->iFirst, iL
13bd0 61 73 74 4c 65 61 66 2c 20 69 4c 61 73 74 2c 20  astLeaf, iLast, 
13be0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
13bf0 74 61 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74  ta, zRoot, nRoot
13c00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
13c10 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74  {.    /* The ent
13c20 69 72 65 20 74 72 65 65 20 66 69 74 73 20 6f 6e  ire tree fits on
13c30 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
13c40 57 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  Write it to the 
13c50 73 65 67 64 69 72 20 74 61 62 6c 65 2e 20 2a 2f  segdir table. */
13c60 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
13c70 69 74 65 53 65 67 64 69 72 28 70 2c 20 69 4c 65  iteSegdir(p, iLe
13c80 76 65 6c 2c 20 69 49 64 78 2c 20 0a 20 20 20 20  vel, iIdx, .    
13c90 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 70 57 72      0, 0, 0, pWr
13ca0 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 2c  iter->nLeafData,
13cb0 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c   pWriter->aData,
13cc0 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 29   pWriter->nData)
13cd0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 65 61 66  ;.  }.  p->nLeaf
13ce0 41 64 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Add++;.  return 
13cf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
13d00 65 61 73 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  ease all memory 
13d10 68 65 6c 64 20 62 79 20 74 68 65 20 53 65 67 6d  held by the Segm
13d20 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
13d30 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
13d40 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
13d50 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
13d60 64 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46  d fts3SegWriterF
13d70 72 65 65 28 53 65 67 6d 65 6e 74 57 72 69 74 65  ree(SegmentWrite
13d80 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69  r *pWriter){.  i
13d90 66 28 20 70 57 72 69 74 65 72 20 29 7b 0a 20 20  f( pWriter ){.  
13da0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13db0 57 72 69 74 65 72 2d 3e 61 44 61 74 61 29 3b 0a  Writer->aData);.
13dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13dd0 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f  (pWriter->zMallo
13de0 63 29 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65  c);.    fts3Node
13df0 46 72 65 65 28 70 57 72 69 74 65 72 2d 3e 70 54  Free(pWriter->pT
13e00 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
13e10 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 29 3b  3_free(pWriter);
13e20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
13e30 65 20 66 69 72 73 74 20 76 61 6c 75 65 20 69 6e  e first value in
13e40 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72 72   the apVal[] arr
13e50 61 79 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ay is assumed to
13e60 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
13e70 67 65 72 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ger..** This fun
13e80 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
13e90 68 65 72 65 20 65 78 69 73 74 20 61 6e 79 20 64  here exist any d
13ea0 6f 63 75 6d 65 6e 74 73 20 77 69 74 68 20 64 6f  ocuments with do
13eb0 63 69 64 20 76 61 6c 75 65 73 20 74 68 61 74 0a  cid values that.
13ec0 2a 2a 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ** are different
13ed0 20 66 72 6f 6d 20 74 68 61 74 20 69 6e 74 65 67   from that integ
13ee0 65 72 2e 20 69 2e 65 2e 20 69 66 20 64 65 6c 65  er. i.e. if dele
13ef0 74 69 6e 67 20 74 68 65 20 64 6f 63 75 6d 65 6e  ting the documen
13f00 74 20 77 69 74 68 20 64 6f 63 69 64 0a 2a 2a 20  t with docid.** 
13f10 70 52 6f 77 69 64 20 77 6f 75 6c 64 20 6d 65 61  pRowid would mea
13f20 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  n the FTS3 table
13f30 20 77 65 72 65 20 65 6d 70 74 79 2e 0a 2a 2a 0a   were empty..**.
13f40 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
13f50 2c 20 2a 70 69 73 45 6d 70 74 79 20 69 73 20 73  , *pisEmpty is s
13f60 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  et to true if th
13f70 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
13f80 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 64   except for.** d
13f90 6f 63 75 6d 65 6e 74 20 70 52 6f 77 69 64 2c 20  ocument pRowid, 
13fa0 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
13fb0 73 65 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  se, and SQLITE_O
13fc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
13fd0 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  f an.** error oc
13fe0 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
13ff0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
14000 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
14010 63 20 69 6e 74 20 66 74 73 33 49 73 45 6d 70 74  c int fts3IsEmpt
14020 79 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  y(Fts3Table *p, 
14030 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
14040 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69 73 45  Rowid, int *pisE
14050 6d 70 74 79 29 7b 0a 20 20 73 71 6c 69 74 65 33  mpty){.  sqlite3
14060 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
14070 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 2d  int rc;.  if( p-
14080 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 29 7b 0a  >zContentTbl ){.
14090 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20      /* If using 
140a0 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20  the content=xxx 
140b0 6f 70 74 69 6f 6e 2c 20 61 73 73 75 6d 65 20 74  option, assume t
140c0 68 65 20 74 61 62 6c 65 20 69 73 20 6e 65 76 65  he table is neve
140d0 72 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 2a  r empty */.    *
140e0 70 69 73 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20  pisEmpty = 0;.  
140f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
14110 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
14120 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59 2c  p, SQL_IS_EMPTY,
14130 20 26 70 53 74 6d 74 2c 20 26 70 52 6f 77 69 64   &pStmt, &pRowid
14140 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14160 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
14170 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
14180 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stmt) ){.       
14190 20 2a 70 69 73 45 6d 70 74 79 20 3d 20 73 71 6c   *pisEmpty = sql
141a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
141b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
141c0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
141d0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
141e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
141f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14200 0a 2a 2a 20 53 65 74 20 2a 70 6e 4d 61 78 20 74  .** Set *pnMax t
14210 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 73 65  o the largest se
14220 67 6d 65 6e 74 20 6c 65 76 65 6c 20 69 6e 20 74  gment level in t
14230 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
14240 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69 49 6e  the index.** iIn
14250 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65 67 6d 65  dex..**.** Segme
14260 6e 74 20 6c 65 76 65 6c 73 20 61 72 65 20 73 74  nt levels are st
14270 6f 72 65 64 20 69 6e 20 74 68 65 20 27 6c 65 76  ored in the 'lev
14280 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  el' column of th
14290 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
142a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
142b0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
142c0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
142d0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
142e0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
142f0 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e  c int fts3Segmen
14300 74 4d 61 78 4c 65 76 65 6c 28 0a 20 20 46 74 73  tMaxLevel(.  Fts
14310 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69 6e  3Table *p, .  in
14320 74 20 69 4c 61 6e 67 69 64 2c 0a 20 20 69 6e 74  t iLangid,.  int
14330 20 69 49 6e 64 65 78 2c 20 0a 20 20 73 71 6c 69   iIndex, .  sqli
14340 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 4d 61 78  te3_int64 *pnMax
14350 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
14360 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
14370 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
14380 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
14390 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
143a0 0a 20 20 2f 2a 20 53 65 74 20 70 53 74 6d 74 20  .  /* Set pStmt 
143b0 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  to the compiled 
143c0 76 65 72 73 69 6f 6e 20 6f 66 3a 0a 20 20 2a 2a  version of:.  **
143d0 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d  .  **   SELECT m
143e0 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25  ax(level) FROM %
143f0 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
14400 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
14410 4e 20 3f 20 41 4e 44 20 3f 0a 20 20 2a 2a 0a 20  N ? AND ?.  **. 
14420 20 2a 2a 20 28 31 30 32 34 20 69 73 20 61 63 74   ** (1024 is act
14430 75 61 6c 6c 79 20 74 68 65 20 76 61 6c 75 65 20  ually the value 
14440 6f 66 20 6d 61 63 72 6f 20 46 54 53 33 5f 53 45  of macro FTS3_SE
14450 47 44 49 52 5f 50 52 45 46 49 58 4c 45 56 45 4c  GDIR_PREFIXLEVEL
14460 5f 53 54 52 29 2e 0a 20 20 2a 2f 0a 20 20 72 63  _STR)..  */.  rc
14470 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
14480 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47  , SQL_SELECT_SEG
14490 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 2c 20 26  DIR_MAX_LEVEL, &
144a0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
144b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
144c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 73 71   return rc;.  sq
144d0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
144e0 28 70 53 74 6d 74 2c 20 31 2c 20 67 65 74 41 62  (pStmt, 1, getAb
144f0 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
14500 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
14510 30 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  0));.  sqlite3_b
14520 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
14530 20 32 2c 20 0a 20 20 20 20 20 20 67 65 74 41 62   2, .      getAb
14540 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
14550 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
14560 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
14570 45 56 45 4c 2d 31 29 0a 20 20 29 3b 0a 20 20 69  EVEL-1).  );.  i
14580 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
14590 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
145a0 74 29 20 29 7b 0a 20 20 20 20 2a 70 6e 4d 61 78  t) ){.    *pnMax
145b0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
145c0 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30  n_int64(pStmt, 0
145d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
145e0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
145f0 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 69  tmt);.}../*.** i
14600 41 62 73 4c 65 76 65 6c 20 69 73 20 61 6e 20 61  AbsLevel is an a
14610 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 68  bsolute level th
14620 61 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  at may be assume
14630 64 20 74 6f 20 65 78 69 73 74 20 77 69 74 68 69  d to exist withi
14640 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
14650 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
14660 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
14670 20 74 68 65 20 6c 61 72 67 65 73 74 20 6c 65 76   the largest lev
14680 65 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 77 69 74  el number.** wit
14690 68 69 6e 20 69 74 73 20 69 6e 64 65 78 2e 20 41  hin its index. A
146a0 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
146b0 20 6f 63 63 75 72 73 2c 20 2a 70 62 4d 61 78 20   occurs, *pbMax 
146c0 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 0a 2a  is set to 1 if.*
146d0 2a 20 69 41 62 73 4c 65 76 65 6c 20 69 73 20 69  * iAbsLevel is i
146e0 6e 64 65 65 64 20 74 68 65 20 6c 61 72 67 65 73  ndeed the larges
146f0 74 20 6c 65 76 65 6c 2c 20 6f 72 20 30 20 6f 74  t level, or 0 ot
14700 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53 51 4c  herwise, and SQL
14710 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
14720 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
14730 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
14740 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
14750 72 6e 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rned and the.** 
14760 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a  final value of *
14770 70 62 4d 61 78 20 69 73 20 75 6e 64 65 66 69 6e  pbMax is undefin
14780 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14790 74 20 66 74 73 33 53 65 67 6d 65 6e 74 49 73 4d  t fts3SegmentIsM
147a0 61 78 4c 65 76 65 6c 28 46 74 73 33 54 61 62 6c  axLevel(Fts3Tabl
147b0 65 20 2a 70 2c 20 69 36 34 20 69 41 62 73 4c 65  e *p, i64 iAbsLe
147c0 76 65 6c 2c 20 69 6e 74 20 2a 70 62 4d 61 78 29  vel, int *pbMax)
147d0 7b 0a 0a 20 20 2f 2a 20 53 65 74 20 70 53 74 6d  {..  /* Set pStm
147e0 74 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65  t to the compile
147f0 64 20 76 65 72 73 69 6f 6e 20 6f 66 3a 0a 20 20  d version of:.  
14800 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  **.  **   SELECT
14810 20 6d 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d   max(level) FROM
14820 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20   %Q.'%q_segdir' 
14830 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57  WHERE level BETW
14840 45 45 4e 20 3f 20 41 4e 44 20 3f 0a 20 20 2a 2a  EEN ? AND ?.  **
14850 0a 20 20 2a 2a 20 28 31 30 32 34 20 69 73 20 61  .  ** (1024 is a
14860 63 74 75 61 6c 6c 79 20 74 68 65 20 76 61 6c 75  ctually the valu
14870 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 33 5f  e of macro FTS3_
14880 53 45 47 44 49 52 5f 50 52 45 46 49 58 4c 45 56  SEGDIR_PREFIXLEV
14890 45 4c 5f 53 54 52 29 2e 0a 20 20 2a 2f 0a 20 20  EL_STR)..  */.  
148a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
148b0 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  tmt;.  int rc = 
148c0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
148d0 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
148e0 5f 4d 41 58 5f 4c 45 56 45 4c 2c 20 26 70 53 74  _MAX_LEVEL, &pSt
148f0 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
14900 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
14910 74 75 72 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74  turn rc;.  sqlit
14920 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
14930 74 6d 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  tmt, 1, iAbsLeve
14940 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  l+1);.  sqlite3_
14950 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
14960 2c 20 32 2c 20 0a 20 20 20 20 20 20 28 28 69 41  , 2, .      ((iA
14970 62 73 4c 65 76 65 6c 2f 46 54 53 33 5f 53 45 47  bsLevel/FTS3_SEG
14980 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 2b 31 29  DIR_MAXLEVEL)+1)
14990 20 2a 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d   * FTS3_SEGDIR_M
149a0 41 58 4c 45 56 45 4c 0a 20 20 29 3b 0a 0a 20 20  AXLEVEL.  );..  
149b0 2a 70 62 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  *pbMax = 0;.  if
149c0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
149d0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
149e0 29 20 29 7b 0a 20 20 20 20 2a 70 62 4d 61 78 20  ) ){.    *pbMax 
149f0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
14a00 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 3d  _type(pStmt, 0)=
14a10 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20  =SQLITE_NULL;.  
14a20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
14a30 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
14a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
14a50 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20   all entries in 
14a60 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
14a70 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
14a80 77 69 74 68 20 74 68 65 20 73 65 67 6d 65 6e 74  with the segment
14a90 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 74 68 20  .** opened with 
14aa0 73 65 67 2d 72 65 61 64 65 72 20 70 53 65 67 2e  seg-reader pSeg.
14ab0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
14ac0 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74  oes not affect t
14ad0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
14ae0 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  f the %_segdir t
14af0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
14b00 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 53 65  int fts3DeleteSe
14b10 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62  gment(.  Fts3Tab
14b20 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
14b30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
14b40 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
14b50 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
14b60 2a 70 53 65 67 20 20 20 20 20 20 20 20 20 20 20  *pSeg           
14b70 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
14b80 64 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  delete */.){.  i
14b90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14ba0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
14bb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14bc0 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69 53 74  .  if( pSeg->iSt
14bd0 61 72 74 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  artBlock ){.    
14be0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
14bf0 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  elete;        /*
14c00 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
14c10 6f 20 64 65 6c 65 74 65 20 72 6f 77 73 20 2a 2f  o delete rows */
14c20 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
14c30 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c  lStmt(p, SQL_DEL
14c40 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e  ETE_SEGMENTS_RAN
14c50 47 45 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29  GE, &pDelete, 0)
14c60 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14c70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14c80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
14c90 74 36 34 28 70 44 65 6c 65 74 65 2c 20 31 2c 20  t64(pDelete, 1, 
14ca0 70 53 65 67 2d 3e 69 53 74 61 72 74 42 6c 6f 63  pSeg->iStartBloc
14cb0 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
14cc0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65  3_bind_int64(pDe
14cd0 6c 65 74 65 2c 20 32 2c 20 70 53 65 67 2d 3e 69  lete, 2, pSeg->i
14ce0 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  EndBlock);.     
14cf0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44   sqlite3_step(pD
14d00 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 72 63  elete);.      rc
14d10 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
14d20 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 7d  (pDelete);.    }
14d30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14d40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
14d50 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
14d60 20 61 66 74 65 72 20 6d 65 72 67 69 6e 67 20 6d   after merging m
14d70 75 6c 74 69 70 6c 65 20 73 65 67 6d 65 6e 74 73  ultiple segments
14d80 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c   into a single l
14d90 61 72 67 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20  arge.** segment 
14da0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c  to delete the ol
14db0 64 2c 20 6e 6f 77 20 72 65 64 75 6e 64 61 6e 74  d, now redundant
14dc0 2c 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  , segment b-tree
14dd0 73 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  s. Specifically,
14de0 0a 2a 2a 20 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20  .** it:.** .**  
14df0 20 31 29 20 44 65 6c 65 74 65 73 20 61 6c 6c 20   1) Deletes all 
14e00 25 5f 73 65 67 6d 65 6e 74 73 20 65 6e 74 72 69  %_segments entri
14e10 65 73 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65  es for the segme
14e20 6e 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  nts associated w
14e30 69 74 68 20 0a 2a 2a 20 20 20 20 20 20 65 61 63  ith .**      eac
14e40 68 20 6f 66 20 74 68 65 20 53 65 67 52 65 61 64  h of the SegRead
14e50 65 72 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  er objects in th
14e60 65 20 61 72 72 61 79 20 70 61 73 73 65 64 20 61  e array passed a
14e70 73 20 74 68 65 20 74 68 69 72 64 20 0a 2a 2a 20  s the third .** 
14e80 20 20 20 20 20 61 72 67 75 6d 65 6e 74 2c 20 61       argument, a
14e90 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 64 65  nd.**.**   2) de
14ea0 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 64  letes all %_segd
14eb0 69 72 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ir entries with 
14ec0 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2c 20 6f 72  level iLevel, or
14ed0 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 0a 2a 2a   all %_segdir.**
14ee0 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 72 65        entries re
14ef0 67 61 72 64 6c 65 73 73 20 6f 66 20 6c 65 76 65  gardless of leve
14f00 6c 20 69 66 20 28 69 4c 65 76 65 6c 3c 30 29 2e  l if (iLevel<0).
14f10 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
14f20 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
14f30 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 74 68 65  successful, othe
14f40 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
14f50 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
14f60 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65  tatic int fts3De
14f70 6c 65 74 65 53 65 67 64 69 72 28 0a 20 20 46 74  leteSegdir(.  Ft
14f80 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
14f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14fa0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
14fb0 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
14fc0 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
14fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
14fe0 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69  nguage id */.  i
14ff0 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15010 2a 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61  * Index for p->a
15020 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
15030 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
15040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
15050 76 65 6c 20 6f 66 20 25 5f 73 65 67 64 69 72 20  vel of %_segdir 
15060 65 6e 74 72 69 65 73 20 74 6f 20 64 65 6c 65 74  entries to delet
15070 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65  e */.  Fts3SegRe
15080 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74  ader **apSegment
15090 2c 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ,      /* Array 
150a0 6f 66 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  of SegReader obj
150b0 65 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ects */.  int nR
150c0 65 61 64 65 72 20 20 20 20 20 20 20 20 20 20 20  eader           
150d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
150e0 65 20 6f 66 20 61 72 72 61 79 20 61 70 53 65 67  e of array apSeg
150f0 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
15100 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15120 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
15130 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
15160 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  iable */.  sqlit
15170 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65  e3_stmt *pDelete
15180 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 51   = 0;      /* SQ
15190 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64  L statement to d
151a0 65 6c 65 74 65 20 72 6f 77 73 20 2a 2f 0a 0a 20  elete rows */.. 
151b0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
151c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 52 65  LITE_OK && i<nRe
151d0 61 64 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ader; i++){.    
151e0 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 53  rc = fts3DeleteS
151f0 65 67 6d 65 6e 74 28 70 2c 20 61 70 53 65 67 6d  egment(p, apSegm
15200 65 6e 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  ent[i]);.  }.  i
15210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15220 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
15230 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
15240 28 20 69 4c 65 76 65 6c 3e 3d 30 20 7c 7c 20 69  ( iLevel>=0 || i
15250 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
15260 55 52 53 4f 52 5f 41 4c 4c 20 29 3b 0a 20 20 69  URSOR_ALL );.  i
15270 66 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f  f( iLevel==FTS3_
15280 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 29 7b  SEGCURSOR_ALL ){
15290 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
152a0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c  lStmt(p, SQL_DEL
152b0 45 54 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45  ETE_SEGDIR_RANGE
152c0 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a  , &pDelete, 0);.
152d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
152e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
152f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15300 34 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 67 65  4(pDelete, 1, ge
15310 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
15320 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
15330 78 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 73 71  x, 0));.      sq
15340 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
15350 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 0a 20 20  (pDelete, 2, .  
15360 20 20 20 20 20 20 20 20 67 65 74 41 62 73 6f 6c          getAbsol
15370 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
15380 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53  gid, iIndex, FTS
15390 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
153a0 4c 2d 31 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  L-1).      );.  
153b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
153c0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
153d0 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  t(p, SQL_DELETE_
153e0 53 45 47 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70  SEGDIR_LEVEL, &p
153f0 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20  Delete, 0);.    
15400 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15410 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
15420 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20  e3_bind_int64(. 
15430 20 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65           pDelete
15440 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  , 1, getAbsolute
15450 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
15460 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
15470 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
15480 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
15490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
154a0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44   sqlite3_step(pD
154b0 65 6c 65 74 65 29 3b 0a 20 20 20 20 72 63 20 3d  elete);.    rc =
154c0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
154d0 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20  Delete);.  }..  
154e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
154f0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
15500 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15510 2c 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74  , buffer *ppList
15520 20 28 73 69 7a 65 20 2a 70 6e 4c 69 73 74 20 62   (size *pnList b
15530 79 74 65 73 29 20 63 6f 6e 74 61 69 6e 73 20 0a  ytes) contains .
15540 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69  ** a position li
15550 73 74 20 74 68 61 74 20 6d 61 79 20 28 6f 72 20  st that may (or 
15560 6d 61 79 20 6e 6f 74 29 20 66 65 61 74 75 72 65  may not) feature
15570 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e   multiple column
15580 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  s. This.** funct
15590 69 6f 6e 20 61 64 6a 75 73 74 73 20 74 68 65 20  ion adjusts the 
155a0 70 6f 69 6e 74 65 72 20 2a 70 70 4c 69 73 74 20  pointer *ppList 
155b0 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 20 2a  and the length *
155c0 70 6e 4c 69 73 74 20 73 6f 20 74 68 61 74 20 74  pnList so that t
155d0 68 65 79 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20  hey.** identify 
155e0 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 68  the subset of th
155f0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
15600 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
15610 20 74 6f 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e   to column iCol.
15620 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
15630 61 72 65 20 6e 6f 20 65 6e 74 72 69 65 73 20 69  are no entries i
15640 6e 20 74 68 65 20 69 6e 70 75 74 20 70 6f 73 69  n the input posi
15650 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 63 6f  tion list for co
15660 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 0a  lumn iCol, then.
15670 2a 2a 20 2a 70 6e 4c 69 73 74 20 69 73 20 73 65  ** *pnList is se
15680 74 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72 65  t to zero before
15690 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
156a0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 62  * If parameter b
156b0 5a 65 72 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Zero is non-zero
156c0 2c 20 74 68 65 6e 20 61 6e 79 20 70 61 72 74 20  , then any part 
156d0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73  of the input lis
156e0 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
156f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
15700 74 70 75 74 20 6c 69 73 74 20 69 73 20 7a 65 72  tput list is zer
15710 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  oed before retur
15720 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
15730 76 6f 69 64 20 66 74 73 33 43 6f 6c 75 6d 6e 46  void fts3ColumnF
15740 69 6c 74 65 72 28 0a 20 20 69 6e 74 20 69 43 6f  ilter(.  int iCo
15750 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
15760 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
15770 6d 6e 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20  mn to filter on 
15780 2a 2f 0a 20 20 69 6e 74 20 62 5a 65 72 6f 2c 20  */.  int bZero, 
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 75 74       /* Zero out
157b0 20 61 6e 79 74 68 69 6e 67 20 66 6f 6c 6c 6f 77   anything follow
157c0 69 6e 67 20 2a 70 70 4c 69 73 74 20 2a 2f 0a 20  ing *ppList */. 
157d0 20 63 68 61 72 20 2a 2a 70 70 4c 69 73 74 2c 20   char **ppList, 
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e   /* IN/OUT: Poin
15800 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  ter to position 
15810 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  list */.  int *p
15820 6e 4c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  nList           
15830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
15840 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66  OUT: Size of buf
15850 66 65 72 20 2a 70 70 4c 69 73 74 20 69 6e 20 62  fer *ppList in b
15860 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ytes */.){.  cha
15870 72 20 2a 70 4c 69 73 74 20 3d 20 2a 70 70 4c 69  r *pList = *ppLi
15880 73 74 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20  st;.  int nList 
15890 3d 20 2a 70 6e 4c 69 73 74 3b 0a 20 20 63 68 61  = *pnList;.  cha
158a0 72 20 2a 70 45 6e 64 20 3d 20 26 70 4c 69 73 74  r *pEnd = &pList
158b0 5b 6e 4c 69 73 74 5d 3b 0a 20 20 69 6e 74 20 69  [nList];.  int i
158c0 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  Current = 0;.  c
158d0 68 61 72 20 2a 70 20 3d 20 70 4c 69 73 74 3b 0a  har *p = pList;.
158e0 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
158f0 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  =0 );.  while( 1
15900 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d   ){.    char c =
15910 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   0;.    while( p
15920 3c 70 45 6e 64 20 26 26 20 28 63 20 7c 20 2a 70  <pEnd && (c | *p
15930 29 26 30 78 46 45 20 29 20 63 20 3d 20 2a 70 2b  )&0xFE ) c = *p+
15940 2b 20 26 20 30 78 38 30 3b 0a 20 20 0a 20 20 20  + & 0x80;.  .   
15950 20 69 66 28 20 69 43 6f 6c 3d 3d 69 43 75 72 72   if( iCol==iCurr
15960 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ent ){.      nLi
15970 73 74 20 3d 20 28 69 6e 74 29 28 70 20 2d 20 70  st = (int)(p - p
15980 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  List);.      bre
15990 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ak;.    }..    n
159a0 4c 69 73 74 20 2d 3d 20 28 69 6e 74 29 28 70 20  List -= (int)(p 
159b0 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  - pList);.    pL
159c0 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 69 66 28  ist = p;.    if(
159d0 20 6e 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   nList==0 ){.   
159e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
159f0 20 20 20 20 70 20 3d 20 26 70 4c 69 73 74 5b 31      p = &pList[1
15a00 5d 3b 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 33  ];.    p += fts3
15a10 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 26  GetVarint32(p, &
15a20 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a  iCurrent);.  }..
15a30 20 20 69 66 28 20 62 5a 65 72 6f 20 26 26 20 26    if( bZero && &
15a40 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 21 3d 70 45  pList[nList]!=pE
15a50 6e 64 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  nd ){.    memset
15a60 28 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 2c 20  (&pList[nList], 
15a70 30 2c 20 70 45 6e 64 20 2d 20 26 70 4c 69 73 74  0, pEnd - &pList
15a80 5b 6e 4c 69 73 74 5d 29 3b 0a 20 20 7d 0a 20 20  [nList]);.  }.  
15a90 2a 70 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  *ppList = pList;
15aa0 0a 20 20 2a 70 6e 4c 69 73 74 20 3d 20 6e 4c 69  .  *pnList = nLi
15ab0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 63  st;.}../*.** Cac
15ac0 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 46  he data in the F
15ad0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
15ae0 72 2e 61 42 75 66 66 65 72 5b 5d 20 62 75 66 66  r.aBuffer[] buff
15af0 65 72 20 28 6f 76 65 72 77 72 69 74 69 6e 67 20  er (overwriting 
15b00 61 6e 79 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20  any.** existing 
15b10 64 61 74 61 29 2e 20 47 72 6f 77 20 74 68 65 20  data). Grow the 
15b20 62 75 66 66 65 72 20 69 66 20 72 65 71 75 69 72  buffer if requir
15b30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
15b40 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
15b50 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
15b60 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20  wise, if an OOM 
15b70 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
15b80 65 72 65 64 0a 2a 2a 20 74 72 79 69 6e 67 20 74  ered.** trying t
15b90 6f 20 72 65 73 69 7a 65 20 74 68 65 20 62 75 66  o resize the buf
15ba0 66 65 72 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  fer, return SQLI
15bb0 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
15bc0 74 69 63 20 69 6e 74 20 66 74 73 33 4d 73 72 42  tic int fts3MsrB
15bd0 75 66 66 65 72 44 61 74 61 28 0a 20 20 46 74 73  ufferData(.  Fts
15be0 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
15bf0 2a 70 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a 20  *pMsr,       /* 
15c00 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65  Multi-segment-re
15c10 61 64 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ader handle */. 
15c20 20 63 68 61 72 20 2a 70 4c 69 73 74 2c 0a 20 20   char *pList,.  
15c30 69 6e 74 20 6e 4c 69 73 74 0a 29 7b 0a 20 20 69  int nList.){.  i
15c40 66 28 20 6e 4c 69 73 74 3e 70 4d 73 72 2d 3e 6e  f( nList>pMsr->n
15c50 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 63 68  Buffer ){.    ch
15c60 61 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4d  ar *pNew;.    pM
15c70 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 6e 4c  sr->nBuffer = nL
15c80 69 73 74 2a 32 3b 0a 20 20 20 20 70 4e 65 77 20  ist*2;.    pNew 
15c90 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
15ca0 33 5f 72 65 61 6c 6c 6f 63 28 70 4d 73 72 2d 3e  3_realloc(pMsr->
15cb0 61 42 75 66 66 65 72 2c 20 70 4d 73 72 2d 3e 6e  aBuffer, pMsr->n
15cc0 42 75 66 66 65 72 29 3b 0a 20 20 20 20 69 66 28  Buffer);.    if(
15cd0 20 21 70 4e 65 77 20 29 20 72 65 74 75 72 6e 20   !pNew ) return 
15ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15cf0 20 20 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 20    pMsr->aBuffer 
15d00 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 6d  = pNew;.  }..  m
15d10 65 6d 63 70 79 28 70 4d 73 72 2d 3e 61 42 75 66  emcpy(pMsr->aBuf
15d20 66 65 72 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73  fer, pList, nLis
15d30 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
15d40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
15d50 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
15d60 72 4e 65 78 74 28 0a 20 20 46 74 73 33 54 61 62  rNext(.  Fts3Tab
15d70 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
15d80 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
15d90 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
15da0 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
15db0 65 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 20  egReader *pMsr, 
15dc0 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73        /* Multi-s
15dd0 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 20 68 61  egment-reader ha
15de0 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
15df0 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64  3_int64 *piDocid
15e00 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
15e10 3a 20 44 6f 63 69 64 20 76 61 6c 75 65 20 2a 2f  : Docid value */
15e20 0a 20 20 63 68 61 72 20 2a 2a 70 61 50 6f 73 6c  .  char **paPosl
15e30 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
15e40 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
15e50 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  er to position l
15e60 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ist */.  int *pn
15e70 50 6f 73 6c 69 73 74 20 20 20 20 20 20 20 20 20  Poslist         
15e80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15e90 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74 69 6f   Size of positio
15ea0 6e 20 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  n list in bytes 
15eb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 65 72  */.){.  int nMer
15ec0 67 65 20 3d 20 70 4d 73 72 2d 3e 6e 41 64 76 61  ge = pMsr->nAdva
15ed0 6e 63 65 3b 0a 20 20 46 74 73 33 53 65 67 52 65  nce;.  Fts3SegRe
15ee0 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74  ader **apSegment
15ef0 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65   = pMsr->apSegme
15f00 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70  nt;.  int (*xCmp
15f10 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  )(Fts3SegReader 
15f20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  *, Fts3SegReader
15f30 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62   *) = (.    p->b
15f40 44 65 73 63 49 64 78 20 3f 20 66 74 73 33 53 65  DescIdx ? fts3Se
15f50 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
15f60 70 52 65 76 20 3a 20 66 74 73 33 53 65 67 52 65  pRev : fts3SegRe
15f70 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20  aderDoclistCmp. 
15f80 20 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 65 72 67   );..  if( nMerg
15f90 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 61 50  e==0 ){.    *paP
15fa0 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  oslist = 0;.    
15fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15fc0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
15fd0 31 20 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67  1 ){.    Fts3Seg
15fe0 52 65 61 64 65 72 20 2a 70 53 65 67 3b 0a 20 20  Reader *pSeg;.  
15ff0 20 20 70 53 65 67 20 3d 20 70 4d 73 72 2d 3e 61    pSeg = pMsr->a
16000 70 53 65 67 6d 65 6e 74 5b 30 5d 3b 0a 0a 20 20  pSegment[0];..  
16010 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4f 66 66    if( pSeg->pOff
16020 73 65 74 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  setList==0 ){.  
16030 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d      *paPoslist =
16040 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
16050 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16060 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
16070 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20  char *pList;.   
16080 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20     int nList;.  
16090 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
160a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
160b0 44 6f 63 69 64 20 3d 20 61 70 53 65 67 6d 65 6e  Docid = apSegmen
160c0 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 0a 20  t[0]->iDocid;.. 
160d0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
160e0 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64  gReaderNextDocid
160f0 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  (p, apSegment[0]
16100 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
16110 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a  );.      j = 1;.
16120 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
16130 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
16140 20 20 20 20 26 26 20 6a 3c 6e 4d 65 72 67 65 0a      && j<nMerge.
16150 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67          && apSeg
16160 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74  ment[j]->pOffset
16170 4c 69 73 74 0a 20 20 20 20 20 20 20 20 26 26 20  List.        && 
16180 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44  apSegment[j]->iD
16190 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20 20 20  ocid==iDocid.   
161a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63     ){.        rc
161b0 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
161c0 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53  NextDocid(p, apS
161d0 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29  egment[j], 0, 0)
161e0 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
161f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16210 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16220 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
16230 6f 72 74 28 70 4d 73 72 2d 3e 61 70 53 65 67 6d  ort(pMsr->apSegm
16240 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c 20  ent, nMerge, j, 
16250 78 43 6d 70 29 3b 0a 0a 20 20 20 20 20 20 69 66  xCmp);..      if
16260 28 20 6e 4c 69 73 74 3e 30 20 26 26 20 66 74 73  ( nList>0 && fts
16270 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64  3SegReaderIsPend
16280 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d  ing(apSegment[0]
16290 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
162a0 3d 20 66 74 73 33 4d 73 72 42 75 66 66 65 72 44  = fts3MsrBufferD
162b0 61 74 61 28 70 4d 73 72 2c 20 70 4c 69 73 74 2c  ata(pMsr, pList,
162c0 20 6e 4c 69 73 74 2b 31 29 3b 0a 20 20 20 20 20   nList+1);.     
162d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
162e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
162f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16300 28 20 28 70 4d 73 72 2d 3e 61 42 75 66 66 65 72  ( (pMsr->aBuffer
16310 5b 6e 4c 69 73 74 5d 20 26 20 30 78 46 45 29 3d  [nList] & 0xFE)=
16320 3d 30 78 30 30 20 29 3b 0a 20 20 20 20 20 20 20  =0x00 );.       
16330 20 70 4c 69 73 74 20 3d 20 70 4d 73 72 2d 3e 61   pList = pMsr->a
16340 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 7d 0a  Buffer;.      }.
16350 0a 20 20 20 20 20 20 69 66 28 20 70 4d 73 72 2d  .      if( pMsr-
16360 3e 69 43 6f 6c 46 69 6c 74 65 72 3e 3d 30 20 29  >iColFilter>=0 )
16370 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 43 6f  {.        fts3Co
16380 6c 75 6d 6e 46 69 6c 74 65 72 28 70 4d 73 72 2d  lumnFilter(pMsr-
16390 3e 69 43 6f 6c 46 69 6c 74 65 72 2c 20 31 2c 20  >iColFilter, 1, 
163a0 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
163b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
163c0 69 66 28 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 20  if( nList>0 ){. 
163d0 20 20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73         *paPoslis
163e0 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
163f0 20 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 69 44     *piDocid = iD
16400 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 2a 70  ocid;.        *p
16410 6e 50 6f 73 6c 69 73 74 20 3d 20 6e 4c 69 73 74  nPoslist = nList
16420 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
16430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16440 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
16450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
16460 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
16470 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73 33  derStart(.  Fts3
16480 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
16490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
164a0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
164b0 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
164c0 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
164d0 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r,       /* Curs
164e0 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  or object */.  c
164f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
16500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16510 2a 20 54 65 72 6d 20 73 65 61 72 63 68 65 64 20  * Term searched 
16520 66 6f 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  for (or NULL) */
16530 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  .  int nTerm    
16540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16550 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
16560 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
16570 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
16580 69 6e 74 20 6e 53 65 67 20 3d 20 70 43 73 72 2d  int nSeg = pCsr-
16590 3e 6e 53 65 67 6d 65 6e 74 3b 0a 0a 20 20 2f 2a  >nSegment;..  /*
165a0 20 49 66 20 74 68 65 20 46 74 73 33 53 65 67 46   If the Fts3SegF
165b0 69 6c 74 65 72 20 64 65 66 69 6e 65 73 20 61 20  ilter defines a 
165c0 73 70 65 63 69 66 69 63 20 74 65 72 6d 20 28 6f  specific term (o
165d0 72 20 74 65 72 6d 20 70 72 65 66 69 78 29 20 74  r term prefix) t
165e0 6f 20 73 65 61 72 63 68 20 0a 20 20 2a 2a 20 66  o search .  ** f
165f0 6f 72 2c 20 74 68 65 6e 20 61 64 76 61 6e 63 65  or, then advance
16600 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 74   each segment it
16610 65 72 61 74 6f 72 20 75 6e 74 69 6c 20 69 74 20  erator until it 
16620 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 65 72 6d  points to a term
16630 20 6f 66 0a 20 20 2a 2a 20 65 71 75 61 6c 20 6f   of.  ** equal o
16640 72 20 67 72 65 61 74 65 72 20 76 61 6c 75 65 20  r greater value 
16650 74 68 61 6e 20 74 68 65 20 73 70 65 63 69 66 69  than the specifi
16660 65 64 20 74 65 72 6d 2e 20 54 68 69 73 20 70 72  ed term. This pr
16670 65 76 65 6e 74 73 20 6d 61 6e 79 0a 20 20 2a 2a  events many.  **
16680 20 75 6e 6e 65 63 65 73 73 61 72 79 20 6d 65 72   unnecessary mer
16690 67 65 2f 73 6f 72 74 20 6f 70 65 72 61 74 69 6f  ge/sort operatio
166a0 6e 73 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ns for the case 
166b0 77 68 65 72 65 20 73 69 6e 67 6c 65 20 73 65 67  where single seg
166c0 6d 65 6e 74 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ment.  ** b-tree
166d0 20 6c 65 61 66 20 6e 6f 64 65 73 20 63 6f 6e 74   leaf nodes cont
166e0 61 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ain more than on
166f0 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 66  e term..  */.  f
16700 6f 72 28 69 3d 30 3b 20 70 43 73 72 2d 3e 62 52  or(i=0; pCsr->bR
16710 65 73 74 61 72 74 3d 3d 30 20 26 26 20 69 3c 70  estart==0 && i<p
16720 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69  Csr->nSegment; i
16730 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  ++){.    int res
16740 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 33 53 65   = 0;.    Fts3Se
16750 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20  gReader *pSeg = 
16760 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pCsr->apSegment[
16770 69 5d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  i];.    do {.   
16780 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33     int rc = fts3
16790 53 65 67 52 65 61 64 65 72 4e 65 78 74 28 70 2c  SegReaderNext(p,
167a0 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20   pSeg, 0);.     
167b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
167c0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
167d0 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 54 65 72      }while( zTer
167e0 6d 20 26 26 20 28 72 65 73 20 3d 20 66 74 73 33  m && (res = fts3
167f0 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70  SegReaderTermCmp
16800 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e 54  (pSeg, zTerm, nT
16810 65 72 6d 29 29 3c 30 20 29 3b 0a 0a 20 20 20 20  erm))<0 );..    
16820 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f 6f 6b 75  if( pSeg->bLooku
16830 70 20 26 26 20 72 65 73 21 3d 30 20 29 7b 0a 20  p && res!=0 ){. 
16840 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
16850 65 72 53 65 74 45 6f 66 28 70 53 65 67 29 3b 0a  erSetEof(pSeg);.
16860 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 33      }.  }.  fts3
16870 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70 43  SegReaderSort(pC
16880 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 6e  sr->apSegment, n
16890 53 65 67 2c 20 6e 53 65 67 2c 20 66 74 73 33 53  Seg, nSeg, fts3S
168a0 65 67 52 65 61 64 65 72 43 6d 70 29 3b 0a 0a 20  egReaderCmp);.. 
168b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
168c0 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  K;.}..int sqlite
168d0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
168e0 61 72 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  art(.  Fts3Table
168f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
16900 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
16910 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
16920 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
16930 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20  Reader *pCsr,   
16940 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62      /* Cursor ob
16950 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 33 53 65  ject */.  Fts3Se
16960 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65 72  gFilter *pFilter
16970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16980 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 72 61 6e  trictions on ran
16990 67 65 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 20  ge of iteration 
169a0 2a 2f 0a 29 7b 0a 20 20 70 43 73 72 2d 3e 70 46  */.){.  pCsr->pF
169b0 69 6c 74 65 72 20 3d 20 70 46 69 6c 74 65 72 3b  ilter = pFilter;
169c0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 65  .  return fts3Se
169d0 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20  gReaderStart(p, 
169e0 70 43 73 72 2c 20 70 46 69 6c 74 65 72 2d 3e 7a  pCsr, pFilter->z
169f0 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 6e  Term, pFilter->n
16a00 54 65 72 6d 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  Term);.}..int sq
16a10 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72  lite3Fts3MsrIncr
16a20 53 74 61 72 74 28 0a 20 20 46 74 73 33 54 61 62  Start(.  Fts3Tab
16a30 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
16a40 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
16a50 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
16a60 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
16a70 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20  egReader *pCsr, 
16a80 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
16a90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16aa0 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16ac0 6f 6c 75 6d 6e 20 74 6f 20 6d 61 74 63 68 20 6f  olumn to match o
16ad0 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  n. */.  const ch
16ae0 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
16af0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20          /* Term 
16b00 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
16b10 67 68 20 61 20 64 6f 63 6c 69 73 74 20 66 6f 72  gh a doclist for
16b20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20   */.  int nTerm 
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16b50 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72  of bytes in zTer
16b60 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  m */.){.  int i;
16b70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
16b80 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72   nSegment = pCsr
16b90 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e  ->nSegment;.  in
16ba0 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65  t (*xCmp)(Fts3Se
16bb0 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53  gReader *, Fts3S
16bc0 65 67 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a  egReader *) = (.
16bd0 20 20 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20      p->bDescIdx 
16be0 3f 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44  ? fts3SegReaderD
16bf0 6f 63 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66  oclistCmpRev : f
16c00 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
16c10 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 61  istCmp.  );..  a
16c20 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 46 69  ssert( pCsr->pFi
16c30 6c 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  lter==0 );.  ass
16c40 65 72 74 28 20 7a 54 65 72 6d 20 26 26 20 6e 54  ert( zTerm && nT
16c50 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  erm>0 );..  /* A
16c60 64 76 61 6e 63 65 20 65 61 63 68 20 73 65 67 6d  dvance each segm
16c70 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e 74  ent iterator unt
16c80 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
16c90 74 68 65 20 74 65 72 6d 20 7a 54 65 72 6d 2f 6e  the term zTerm/n
16ca0 54 65 72 6d 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  Term. */.  rc = 
16cb0 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  fts3SegReaderSta
16cc0 72 74 28 70 2c 20 70 43 73 72 2c 20 7a 54 65 72  rt(p, pCsr, zTer
16cd0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 69 66 28  m, nTerm);.  if(
16ce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
16d00 2a 20 44 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  * Determine how 
16d10 6d 61 6e 79 20 6f 66 20 74 68 65 20 73 65 67 6d  many of the segm
16d20 65 6e 74 73 20 61 63 74 75 61 6c 6c 79 20 70 6f  ents actually po
16d30 69 6e 74 20 74 6f 20 7a 54 65 72 6d 2f 6e 54 65  int to zTerm/nTe
16d40 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  rm. */.  for(i=0
16d50 3b 20 69 3c 6e 53 65 67 6d 65 6e 74 3b 20 69 2b  ; i<nSegment; i+
16d60 2b 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52  +){.    Fts3SegR
16d70 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 70 43  eader *pSeg = pC
16d80 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d  sr->apSegment[i]
16d90 3b 0a 20 20 20 20 69 66 28 20 21 70 53 65 67 2d  ;.    if( !pSeg-
16da0 3e 61 4e 6f 64 65 20 7c 7c 20 66 74 73 33 53 65  >aNode || fts3Se
16db0 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70 28 70  gReaderTermCmp(p
16dc0 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Seg, zTerm, nTer
16dd0 6d 29 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  m) ){.      brea
16de0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  k;.    }.  }.  p
16df0 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20  Csr->nAdvance = 
16e00 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  i;..  /* Advance
16e10 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 65 67   each of the seg
16e20 6d 65 6e 74 73 20 74 6f 20 70 6f 69 6e 74 20 74  ments to point t
16e30 6f 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69  o the first doci
16e40 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  d. */.  for(i=0;
16e50 20 69 3c 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63   i<pCsr->nAdvanc
16e60 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  e; i++){.    rc 
16e70 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46  = fts3SegReaderF
16e80 69 72 73 74 44 6f 63 69 64 28 70 2c 20 70 43 73  irstDocid(p, pCs
16e90 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29  r->apSegment[i])
16ea0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16eb0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16ec0 20 72 63 3b 0a 20 20 7d 0a 20 20 66 74 73 33 53   rc;.  }.  fts3S
16ed0 65 67 52 65 61 64 65 72 53 6f 72 74 28 70 43 73  egReaderSort(pCs
16ee0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 69 2c  r->apSegment, i,
16ef0 20 69 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 61 73   i, xCmp);..  as
16f00 73 65 72 74 28 20 69 43 6f 6c 3c 30 20 7c 7c 20  sert( iCol<0 || 
16f10 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  iCol<p->nColumn 
16f20 29 3b 0a 20 20 70 43 73 72 2d 3e 69 43 6f 6c 46  );.  pCsr->iColF
16f30 69 6c 74 65 72 20 3d 20 69 43 6f 6c 3b 0a 0a 20  ilter = iCol;.. 
16f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16f50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
16f60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
16f70 6c 65 64 20 6f 6e 20 61 20 4d 75 6c 74 69 53 65  led on a MultiSe
16f80 67 52 65 61 64 65 72 20 74 68 61 74 20 68 61 73  gReader that has
16f90 20 62 65 65 6e 20 73 74 61 72 74 65 64 20 75 73   been started us
16fa0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74  ing.** sqlite3Ft
16fb0 73 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28 29  s3MsrIncrStart()
16fc0 2e 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  . One or more ca
16fd0 6c 6c 73 20 74 6f 20 4d 73 72 49 6e 63 72 4e 65  lls to MsrIncrNe
16fe0 78 74 28 29 20 6d 61 79 20 61 6c 73 6f 0a 2a 2a  xt() may also.**
16ff0 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e   have been made.
17000 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   Calling this fu
17010 6e 63 74 69 6f 6e 20 70 75 74 73 20 74 68 65 20  nction puts the 
17020 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 69  MultiSegReader i
17030 6e 20 73 75 63 68 0a 2a 2a 20 61 20 73 74 61 74  n such.** a stat
17040 65 20 74 68 61 74 20 69 66 20 74 68 65 20 6e 65  e that if the ne
17050 78 74 20 74 77 6f 20 63 61 6c 6c 73 20 61 72 65  xt two calls are
17060 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  :.**.**   sqlite
17070 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
17080 61 72 74 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74  art().**   sqlit
17090 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
170a0 74 65 70 28 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  tep().**.** then
170b0 20 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c   the entire docl
170c0 69 73 74 20 66 6f 72 20 74 68 65 20 74 65 72 6d  ist for the term
170d0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
170e0 20 0a 2a 2a 20 4d 75 6c 74 69 53 65 67 52 65 61   .** MultiSegRea
170f0 64 65 72 2e 61 44 6f 63 6c 69 73 74 2f 6e 44 6f  der.aDoclist/nDo
17100 63 6c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  clist..*/.int sq
17110 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72  lite3Fts3MsrIncr
17120 52 65 73 74 61 72 74 28 46 74 73 33 4d 75 6c 74  Restart(Fts3Mult
17130 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72  iSegReader *pCsr
17140 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
17170 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
17180 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 73 20  segment-readers 
17190 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
171a0 73 72 2d 3e 7a 54 65 72 6d 3d 3d 30 20 29 3b 0a  sr->zTerm==0 );.
171b0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
171c0 6e 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  nTerm==0 );.  as
171d0 73 65 72 74 28 20 70 43 73 72 2d 3e 61 44 6f 63  sert( pCsr->aDoc
171e0 6c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  list==0 );.  ass
171f0 65 72 74 28 20 70 43 73 72 2d 3e 6e 44 6f 63 6c  ert( pCsr->nDocl
17200 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 73  ist==0 );..  pCs
17210 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30 3b  r->nAdvance = 0;
17220 0a 20 20 70 43 73 72 2d 3e 62 52 65 73 74 61 72  .  pCsr->bRestar
17230 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 1;.  for(i=0
17240 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65  ; i<pCsr->nSegme
17250 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  nt; i++){.    pC
17260 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d  sr->apSegment[i]
17270 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
17280 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53  0;.    pCsr->apS
17290 65 67 6d 65 6e 74 5b 69 5d 2d 3e 6e 4f 66 66 73  egment[i]->nOffs
172a0 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  etList = 0;.    
172b0 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pCsr->apSegment[
172c0 69 5d 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b 0a  i]->iDocid = 0;.
172d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
172e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69 6e 74  LITE_OK;.}...int
172f0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
17300 65 61 64 65 72 53 74 65 70 28 0a 20 20 46 74 73  eaderStep(.  Fts
17310 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17330 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
17340 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ndle */.  Fts3Mu
17350 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
17360 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr        /* Cur
17370 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  sor object */.){
17380 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17390 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74 20 69 73  TE_OK;..  int is
173a0 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 20 28  IgnoreEmpty =  (
173b0 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66  pCsr->pFilter->f
173c0 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d  lags & FTS3_SEGM
173d0 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59  ENT_IGNORE_EMPTY
173e0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 71 75 69  );.  int isRequi
173f0 72 65 50 6f 73 20 3d 20 20 20 28 70 43 73 72 2d  rePos =   (pCsr-
17400 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
17410 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52  & FTS3_SEGMENT_R
17420 45 51 55 49 52 45 5f 50 4f 53 29 3b 0a 20 20 69  EQUIRE_POS);.  i
17430 6e 74 20 69 73 43 6f 6c 46 69 6c 74 65 72 20 3d  nt isColFilter =
17440 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74      (pCsr->pFilt
17450 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33  er->flags & FTS3
17460 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e 5f  _SEGMENT_COLUMN_
17470 46 49 4c 54 45 52 29 3b 0a 20 20 69 6e 74 20 69  FILTER);.  int i
17480 73 50 72 65 66 69 78 20 3d 20 20 20 20 20 20 20  sPrefix =       
17490 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
174a0 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
174b0 4d 45 4e 54 5f 50 52 45 46 49 58 29 3b 0a 20 20  MENT_PREFIX);.  
174c0 69 6e 74 20 69 73 53 63 61 6e 20 3d 20 20 20 20  int isScan =    
174d0 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c       (pCsr->pFil
174e0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
174f0 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41 4e 29 3b  3_SEGMENT_SCAN);
17500 0a 20 20 69 6e 74 20 69 73 46 69 72 73 74 20 3d  .  int isFirst =
17510 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70          (pCsr->p
17520 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  Filter->flags & 
17530 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 46 49 52  FTS3_SEGMENT_FIR
17540 53 54 29 3b 0a 0a 20 20 46 74 73 33 53 65 67 52  ST);..  Fts3SegR
17550 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e  eader **apSegmen
17560 74 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d  t = pCsr->apSegm
17570 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ent;.  int nSegm
17580 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67  ent = pCsr->nSeg
17590 6d 65 6e 74 3b 0a 20 20 46 74 73 33 53 65 67 46  ment;.  Fts3SegF
175a0 69 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 20 3d  ilter *pFilter =
175b0 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 3b 0a   pCsr->pFilter;.
175c0 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74    int (*xCmp)(Ft
175d0 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46  s3SegReader *, F
175e0 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20  ts3SegReader *) 
175f0 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73 63  = (.    p->bDesc
17600 49 64 78 20 3f 20 66 74 73 33 53 65 67 52 65 61  Idx ? fts3SegRea
17610 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76  derDoclistCmpRev
17620 20 3a 20 66 74 73 33 53 65 67 52 65 61 64 65 72   : fts3SegReader
17630 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a  DoclistCmp.  );.
17640 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 6e 53 65  .  if( pCsr->nSe
17650 67 6d 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  gment==0 ) retur
17660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
17670 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 65  do {.    int nMe
17680 72 67 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  rge;.    int i;.
17690 20 20 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63    .    /* Advanc
176a0 65 20 74 68 65 20 66 69 72 73 74 20 70 43 73 72  e the first pCsr
176b0 2d 3e 6e 41 64 76 61 6e 63 65 20 65 6e 74 72 69  ->nAdvance entri
176c0 65 73 20 69 6e 20 74 68 65 20 61 70 53 65 67 6d  es in the apSegm
176d0 65 6e 74 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  ent[] array.    
176e0 2a 2a 20 66 6f 72 77 61 72 64 2e 20 54 68 65 6e  ** forward. Then
176f0 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20 69   sort the list i
17700 6e 20 6f 72 64 65 72 20 6f 66 20 63 75 72 72 65  n order of curre
17710 6e 74 20 74 65 72 6d 20 61 67 61 69 6e 2e 20 20  nt term again.  
17720 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
17730 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 41 64  i=0; i<pCsr->nAd
17740 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  vance; i++){.   
17750 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
17760 20 2a 70 53 65 67 20 3d 20 61 70 53 65 67 6d 65   *pSeg = apSegme
17770 6e 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  nt[i];.      if(
17780 20 70 53 65 67 2d 3e 62 4c 6f 6f 6b 75 70 20 29   pSeg->bLookup )
17790 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65  {.        fts3Se
177a0 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 53  gReaderSetEof(pS
177b0 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
177c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
177d0 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
177e0 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20  (p, pSeg, 0);.  
177f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17820 0a 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64  .    fts3SegRead
17830 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74  erSort(apSegment
17840 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 70 43 73 72  , nSegment, pCsr
17850 2d 3e 6e 41 64 76 61 6e 63 65 2c 20 66 74 73 33  ->nAdvance, fts3
17860 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b 0a 20  SegReaderCmp);. 
17870 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63     pCsr->nAdvanc
17880 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  e = 0;..    /* I
17890 66 20 61 6c 6c 20 74 68 65 20 73 65 67 2d 72 65  f all the seg-re
178a0 61 64 65 72 73 20 61 72 65 20 61 74 20 45 4f 46  aders are at EOF
178b0 2c 20 77 65 27 72 65 20 66 69 6e 69 73 68 65 64  , we're finished
178c0 2e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . return SQLITE_
178d0 4f 4b 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  OK. */.    asser
178e0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
178f0 20 29 3b 0a 20 20 20 20 69 66 28 20 61 70 53 65   );.    if( apSe
17900 67 6d 65 6e 74 5b 30 5d 2d 3e 61 4e 6f 64 65 3d  gment[0]->aNode=
17910 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
17920 20 70 43 73 72 2d 3e 6e 54 65 72 6d 20 3d 20 61   pCsr->nTerm = a
17930 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 54 65  pSegment[0]->nTe
17940 72 6d 3b 0a 20 20 20 20 70 43 73 72 2d 3e 7a 54  rm;.    pCsr->zT
17950 65 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  erm = apSegment[
17960 30 5d 2d 3e 7a 54 65 72 6d 3b 0a 0a 20 20 20 20  0]->zTerm;..    
17970 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
17980 70 72 65 66 69 78 2d 73 65 61 72 63 68 2c 20 61  prefix-search, a
17990 6e 64 20 69 66 20 74 68 65 20 74 65 72 6d 20 74  nd if the term t
179a0 68 61 74 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  hat apSegment[0]
179b0 20 70 6f 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74   points.    ** t
179c0 6f 20 64 6f 65 73 20 6e 6f 74 20 73 68 61 72 65  o does not share
179d0 20 61 20 73 75 66 66 69 78 20 77 69 74 68 20 70   a suffix with p
179e0 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2f 6e 54  Filter->zTerm/nT
179f0 65 72 6d 2c 20 74 68 65 6e 20 61 6c 6c 20 0a 20  erm, then all . 
17a00 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 63     ** required c
17a10 61 6c 6c 62 61 63 6b 73 20 68 61 76 65 20 62 65  allbacks have be
17a20 65 6e 20 6d 61 64 65 2e 20 49 6e 20 74 68 69 73  en made. In this
17a30 20 63 61 73 65 20 65 78 69 74 20 65 61 72 6c 79   case exit early
17a40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17a50 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68  Similarly, if th
17a60 69 73 20 69 73 20 61 20 73 65 61 72 63 68 20 66  is is a search f
17a70 6f 72 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  or an exact matc
17a80 68 2c 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  h, and the first
17a90 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 6f 66 20   term.    ** of 
17aa0 73 65 67 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e  segment apSegmen
17ab0 74 5b 30 5d 20 69 73 20 6e 6f 74 20 61 20 6d 61  t[0] is not a ma
17ac0 74 63 68 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  tch, exit early.
17ad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17ae0 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 20 26  pFilter->zTerm &
17af0 26 20 21 69 73 53 63 61 6e 20 29 7b 0a 20 20 20  & !isScan ){.   
17b00 20 20 20 69 66 28 20 70 43 73 72 2d 3e 6e 54 65     if( pCsr->nTe
17b10 72 6d 3c 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72  rm<pFilter->nTer
17b20 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21 69  m .       || (!i
17b30 73 50 72 65 66 69 78 20 26 26 20 70 43 73 72 2d  sPrefix && pCsr-
17b40 3e 6e 54 65 72 6d 3e 70 46 69 6c 74 65 72 2d 3e  >nTerm>pFilter->
17b50 6e 54 65 72 6d 29 0a 20 20 20 20 20 20 20 7c 7c  nTerm).       ||
17b60 20 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a 54   memcmp(pCsr->zT
17b70 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 7a 54  erm, pFilter->zT
17b80 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 6e 54  erm, pFilter->nT
17b90 65 72 6d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  erm) .      ){. 
17ba0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17bb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
17bc0 20 6e 4d 65 72 67 65 20 3d 20 31 3b 0a 20 20 20   nMerge = 1;.   
17bd0 20 77 68 69 6c 65 28 20 6e 4d 65 72 67 65 3c 6e   while( nMerge<n
17be0 53 65 67 6d 65 6e 74 20 0a 20 20 20 20 20 20 20  Segment .       
17bf0 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d   && apSegment[nM
17c00 65 72 67 65 5d 2d 3e 61 4e 6f 64 65 0a 20 20 20  erge]->aNode.   
17c10 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e       && apSegmen
17c20 74 5b 6e 4d 65 72 67 65 5d 2d 3e 6e 54 65 72 6d  t[nMerge]->nTerm
17c30 3d 3d 70 43 73 72 2d 3e 6e 54 65 72 6d 20 0a 20  ==pCsr->nTerm . 
17c40 20 20 20 20 20 20 20 26 26 20 30 3d 3d 6d 65 6d         && 0==mem
17c50 63 6d 70 28 70 43 73 72 2d 3e 7a 54 65 72 6d 2c  cmp(pCsr->zTerm,
17c60 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67   apSegment[nMerg
17c70 65 5d 2d 3e 7a 54 65 72 6d 2c 20 70 43 73 72 2d  e]->zTerm, pCsr-
17c80 3e 6e 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20  >nTerm).    ){. 
17c90 20 20 20 20 20 6e 4d 65 72 67 65 2b 2b 3b 0a 20       nMerge++;. 
17ca0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
17cb0 28 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20  ( isIgnoreEmpty 
17cc0 7c 7c 20 28 69 73 52 65 71 75 69 72 65 50 6f 73  || (isRequirePos
17cd0 20 26 26 20 21 69 73 43 6f 6c 46 69 6c 74 65 72   && !isColFilter
17ce0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d 65  ) );.    if( nMe
17cf0 72 67 65 3d 3d 31 20 0a 20 20 20 20 20 26 26 20  rge==1 .     && 
17d00 21 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 0a  !isIgnoreEmpty .
17d10 20 20 20 20 20 26 26 20 21 69 73 46 69 72 73 74       && !isFirst
17d20 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 62 44   .     && (p->bD
17d30 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20 66 74 73  escIdx==0 || fts
17d40 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64  3SegReaderIsPend
17d50 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d  ing(apSegment[0]
17d60 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
17d70 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73     pCsr->nDoclis
17d80 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  t = apSegment[0]
17d90 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  ->nDoclist;.    
17da0 20 20 69 66 28 20 66 74 73 33 53 65 67 52 65 61    if( fts3SegRea
17db0 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70 53  derIsPending(apS
17dc0 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20  egment[0]) ){.  
17dd0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4d        rc = fts3M
17de0 73 72 42 75 66 66 65 72 44 61 74 61 28 70 43 73  srBufferData(pCs
17df0 72 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d  r, apSegment[0]-
17e00 3e 61 44 6f 63 6c 69 73 74 2c 20 70 43 73 72 2d  >aDoclist, pCsr-
17e10 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  >nDoclist);.    
17e20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69      pCsr->aDocli
17e30 73 74 20 3d 20 70 43 73 72 2d 3e 61 42 75 66 66  st = pCsr->aBuff
17e40 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  er;.      }else{
17e50 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61  .        pCsr->a
17e60 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67 6d  Doclist = apSegm
17e70 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73 74  ent[0]->aDoclist
17e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17e90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17ea0 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
17eb0 52 4f 57 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROW;.    }else{.
17ec0 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69        int nDocli
17ed0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
17ee0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
17ef0 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  list */.      sq
17f00 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65  lite3_int64 iPre
17f10 76 20 3d 20 30 3b 20 20 20 20 2f 2a 20 50 72 65  v = 0;    /* Pre
17f20 76 69 6f 75 73 20 64 6f 63 69 64 20 73 74 6f 72  vious docid stor
17f30 65 64 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f  ed in doclist */
17f40 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ..      /* The c
17f50 75 72 72 65 6e 74 20 74 65 72 6d 20 6f 66 20 74  urrent term of t
17f60 68 65 20 66 69 72 73 74 20 6e 4d 65 72 67 65 20  he first nMerge 
17f70 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 61  entries in the a
17f80 72 72 61 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  rray.      ** of
17f90 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
17fa0 62 6a 65 63 74 73 20 69 73 20 74 68 65 20 73 61  bjects is the sa
17fb0 6d 65 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 73  me. The doclists
17fc0 20 6d 75 73 74 20 62 65 20 6d 65 72 67 65 64 0a   must be merged.
17fd0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 20 73        ** and a s
17fe0 69 6e 67 6c 65 20 74 65 72 6d 20 72 65 74 75 72  ingle term retur
17ff0 6e 65 64 20 77 69 74 68 20 74 68 65 20 6d 65 72  ned with the mer
18000 67 65 64 20 64 6f 63 6c 69 73 74 2e 0a 20 20 20  ged doclist..   
18010 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
18020 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 3b 20 69  i=0; i<nMerge; i
18030 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ++){.        fts
18040 33 53 65 67 52 65 61 64 65 72 46 69 72 73 74 44  3SegReaderFirstD
18050 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e  ocid(p, apSegmen
18060 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t[i]);.      }. 
18070 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
18080 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74  erSort(apSegment
18090 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 65 72 67 65  , nMerge, nMerge
180a0 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20 20 20 77  , xCmp);.      w
180b0 68 69 6c 65 28 20 61 70 53 65 67 6d 65 6e 74 5b  hile( apSegment[
180c0 30 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  0]->pOffsetList 
180d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
180e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
180f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18100 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20  f segments that 
18110 73 68 61 72 65 20 61 20 64 6f 63 69 64 20 2a 2f  share a docid */
18120 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
18130 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
18140 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b    int nList = 0;
18150 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
18160 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
18170 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
18180 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d   = apSegment[0]-
18190 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20  >iDocid;.       
181a0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
181b0 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67  xtDocid(p, apSeg
181c0 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c  ment[0], &pList,
181d0 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
181e0 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 20    j = 1;.       
181f0 20 77 68 69 6c 65 28 20 6a 3c 6e 4d 65 72 67 65   while( j<nMerge
18200 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
18210 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f  apSegment[j]->pO
18220 66 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20  ffsetList.      
18230 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
18240 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69  nt[j]->iDocid==i
18250 44 6f 63 69 64 0a 20 20 20 20 20 20 20 20 29 7b  Docid.        ){
18260 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 53  .          fts3S
18270 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69  egReaderNextDoci
18280 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a  d(p, apSegment[j
18290 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
182a0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
182b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
182c0 69 73 43 6f 6c 46 69 6c 74 65 72 20 29 7b 0a 20  isColFilter ){. 
182d0 20 20 20 20 20 20 20 20 20 66 74 73 33 43 6f 6c           fts3Col
182e0 75 6d 6e 46 69 6c 74 65 72 28 70 46 69 6c 74 65  umnFilter(pFilte
182f0 72 2d 3e 69 43 6f 6c 2c 20 30 2c 20 26 70 4c 69  r->iCol, 0, &pLi
18300 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
18310 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18320 69 66 28 20 21 69 73 49 67 6e 6f 72 65 45 6d 70  if( !isIgnoreEmp
18330 74 79 20 7c 7c 20 6e 4c 69 73 74 3e 30 20 29 7b  ty || nList>0 ){
18340 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ..          /* C
18350 61 6c 63 75 6c 61 74 65 20 74 68 65 20 27 64 6f  alculate the 'do
18360 63 69 64 27 20 64 65 6c 74 61 20 76 61 6c 75 65  cid' delta value
18370 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
18380 68 65 20 6d 65 72 67 65 64 20 0a 20 20 20 20 20  he merged .     
18390 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e       ** doclist.
183a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
183b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
183c0 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ta;.          if
183d0 28 20 70 2d 3e 62 44 65 73 63 49 64 78 20 26 26  ( p->bDescIdx &&
183e0 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20   nDoclist>0 ){. 
183f0 20 20 20 20 20 20 20 20 20 20 20 69 44 65 6c 74             iDelt
18400 61 20 3d 20 69 50 72 65 76 20 2d 20 69 44 6f 63  a = iPrev - iDoc
18410 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  id;.          }e
18420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
18430 20 69 44 65 6c 74 61 20 3d 20 69 44 6f 63 69 64   iDelta = iDocid
18440 20 2d 20 69 50 72 65 76 3b 0a 20 20 20 20 20 20   - iPrev;.      
18450 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18460 61 73 73 65 72 74 28 20 69 44 65 6c 74 61 3e 30  assert( iDelta>0
18470 20 7c 7c 20 28 6e 44 6f 63 6c 69 73 74 3d 3d 30   || (nDoclist==0
18480 20 26 26 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63   && iDelta==iDoc
18490 69 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  id) );.         
184a0 20 61 73 73 65 72 74 28 20 6e 44 6f 63 6c 69 73   assert( nDoclis
184b0 74 3e 30 20 7c 7c 20 69 44 65 6c 74 61 3d 3d 69  t>0 || iDelta==i
184c0 44 6f 63 69 64 20 29 3b 0a 0a 20 20 20 20 20 20  Docid );..      
184d0 20 20 20 20 6e 42 79 74 65 20 3d 20 73 71 6c 69      nByte = sqli
184e0 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
184f0 28 69 44 65 6c 74 61 29 20 2b 20 28 69 73 52 65  (iDelta) + (isRe
18500 71 75 69 72 65 50 6f 73 3f 6e 4c 69 73 74 2b 31  quirePos?nList+1
18510 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  :0);.          i
18520 66 28 20 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74  f( nDoclist+nByt
18530 65 3e 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 20  e>pCsr->nBuffer 
18540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
18550 68 61 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20  har *aNew;.     
18560 20 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 42 75         pCsr->nBu
18570 66 66 65 72 20 3d 20 28 6e 44 6f 63 6c 69 73 74  ffer = (nDoclist
18580 2b 6e 42 79 74 65 29 2a 32 3b 0a 20 20 20 20 20  +nByte)*2;.     
18590 20 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71         aNew = sq
185a0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 43  lite3_realloc(pC
185b0 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 43 73  sr->aBuffer, pCs
185c0 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20 20  r->nBuffer);.   
185d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61 4e           if( !aN
185e0 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
185f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18600 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
18610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18620 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72     pCsr->aBuffer
18630 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
18640 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
18650 69 66 28 20 69 73 46 69 72 73 74 20 29 7b 0a 20  if( isFirst ){. 
18660 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
18670 2a 61 20 3d 20 26 70 43 73 72 2d 3e 61 42 75 66  *a = &pCsr->aBuf
18680 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20  fer[nDoclist];. 
18690 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
186a0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 20  Write;.         
186b0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e    .            n
186c0 57 72 69 74 65 20 3d 20 73 71 6c 69 74 65 33 46  Write = sqlite3F
186d0 74 73 33 46 69 72 73 74 46 69 6c 74 65 72 28 69  ts3FirstFilter(i
186e0 44 65 6c 74 61 2c 20 70 4c 69 73 74 2c 20 6e 4c  Delta, pList, nL
186f0 69 73 74 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  ist, a);.       
18700 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 20       if( nWrite 
18710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
18720 20 69 50 72 65 76 20 3d 20 69 44 6f 63 69 64 3b   iPrev = iDocid;
18730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
18740 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 57 72 69 74  Doclist += nWrit
18750 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
18760 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
18770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 44  {.            nD
18780 6f 63 6c 69 73 74 20 2b 3d 20 73 71 6c 69 74 65  oclist += sqlite
18790 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
187a0 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44  pCsr->aBuffer[nD
187b0 6f 63 6c 69 73 74 5d 2c 20 69 44 65 6c 74 61 29  oclist], iDelta)
187c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 50  ;.            iP
187d0 72 65 76 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20  rev = iDocid;.  
187e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
187f0 52 65 71 75 69 72 65 50 6f 73 20 29 7b 0a 20 20  RequirePos ){.  
18800 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
18810 70 79 28 26 70 43 73 72 2d 3e 61 42 75 66 66 65  py(&pCsr->aBuffe
18820 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 70 4c 69  r[nDoclist], pLi
18830 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 20 20  st, nList);.    
18840 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69            nDocli
18850 73 74 20 2b 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  st += nList;.   
18860 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d             pCsr-
18870 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73  >aBuffer[nDoclis
18880 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
18890 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
188a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
188b0 0a 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65  ..        fts3Se
188c0 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65  gReaderSort(apSe
188d0 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a  gment, nMerge, j
188e0 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20 20 20 7d  , xCmp);.      }
188f0 0a 20 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c  .      if( nDocl
18900 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ist>0 ){.       
18910 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20   pCsr->aDoclist 
18920 3d 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 3b  = pCsr->aBuffer;
18930 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 6e  .        pCsr->n
18940 44 6f 63 6c 69 73 74 20 3d 20 6e 44 6f 63 6c 69  Doclist = nDocli
18950 73 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  st;.        rc =
18960 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20   SQLITE_ROW;.   
18970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
18980 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20  Csr->nAdvance = 
18990 6e 4d 65 72 67 65 3b 0a 20 20 7d 77 68 69 6c 65  nMerge;.  }while
189a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
189b0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
189c0 0a 7d 0a 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  .}...void sqlite
189d0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69  3Fts3SegReaderFi
189e0 6e 69 73 68 28 0a 20 20 46 74 73 33 4d 75 6c 74  nish(.  Fts3Mult
189f0 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72  iSegReader *pCsr
18a00 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
18a10 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
18a20 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20  if( pCsr ){.    
18a30 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
18a40 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67  =0; i<pCsr->nSeg
18a50 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ment; i++){.    
18a60 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
18a70 52 65 61 64 65 72 46 72 65 65 28 70 43 73 72 2d  ReaderFree(pCsr-
18a80 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a  >apSegment[i]);.
18a90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18aa0 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 70 53  3_free(pCsr->apS
18ab0 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  egment);.    sql
18ac0 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
18ad0 61 42 75 66 66 65 72 29 3b 0a 0a 20 20 20 20 70  aBuffer);..    p
18ae0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20  Csr->nSegment = 
18af0 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53  0;.    pCsr->apS
18b00 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  egment = 0;.    
18b10 70 43 73 72 2d 3e 61 42 75 66 66 65 72 20 3d 20  pCsr->aBuffer = 
18b20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
18b30 44 65 63 6f 64 65 20 74 68 65 20 22 65 6e 64 5f  Decode the "end_
18b40 62 6c 6f 63 6b 22 20 66 69 65 6c 64 2c 20 73 65  block" field, se
18b50 6c 65 63 74 65 64 20 62 79 20 63 6f 6c 75 6d 6e  lected by column
18b60 20 69 43 6f 6c 20 6f 66 20 74 68 65 20 53 45 4c   iCol of the SEL
18b70 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ECT .** statemen
18b80 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
18b90 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
18ba0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 65 6e 64 5f  .**.** The "end_
18bb0 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 6d 61 79  block" field may
18bc0 20 63 6f 6e 74 61 69 6e 20 65 69 74 68 65 72 20   contain either 
18bd0 61 6e 20 69 6e 74 65 67 65 72 2c 20 6f 72 20 61  an integer, or a
18be0 20 74 65 78 74 20 66 69 65 6c 64 0a 2a 2a 20 63   text field.** c
18bf0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
18c00 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
18c10 6e 20 6f 66 20 74 77 6f 20 6e 6f 6e 2d 6e 65 67  n of two non-neg
18c20 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 73  ative integers s
18c30 65 70 61 72 61 74 65 64 20 0a 2a 2a 20 62 79 20  eparated .** by 
18c40 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 70 61 63  one or more spac
18c50 65 20 28 30 78 32 30 29 20 63 68 61 72 61 63 74  e (0x20) charact
18c60 65 72 73 2e 20 49 6e 20 74 68 65 20 66 69 72 73  ers. In the firs
18c70 74 20 63 61 73 65 2c 20 73 65 74 20 2a 70 69 45  t case, set *piE
18c80 6e 64 42 6c 6f 63 6b 20 0a 2a 2a 20 74 6f 20 74  ndBlock .** to t
18c90 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
18ca0 20 61 6e 64 20 2a 70 6e 42 79 74 65 20 74 6f 20   and *pnByte to 
18cb0 7a 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75  zero before retu
18cc0 72 6e 69 6e 67 2e 20 49 6e 20 74 68 65 20 73 65  rning. In the se
18cd0 63 6f 6e 64 2c 20 0a 2a 2a 20 73 65 74 20 2a 70  cond, .** set *p
18ce0 69 45 6e 64 42 6c 6f 63 6b 20 74 6f 20 74 68 65  iEndBlock to the
18cf0 20 66 69 72 73 74 20 76 61 6c 75 65 20 61 6e 64   first value and
18d00 20 2a 70 6e 42 79 74 65 20 74 6f 20 74 68 65 20   *pnByte to the 
18d10 73 65 63 6f 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  second..*/.stati
18d20 63 20 76 6f 69 64 20 66 74 73 33 52 65 61 64 45  c void fts3ReadE
18d30 6e 64 42 6c 6f 63 6b 46 69 65 6c 64 28 0a 20 20  ndBlockField(.  
18d40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18d50 74 6d 74 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c  tmt, .  int iCol
18d60 2c 20 0a 20 20 69 36 34 20 2a 70 69 45 6e 64 42  , .  i64 *piEndB
18d70 6c 6f 63 6b 2c 0a 20 20 69 36 34 20 2a 70 6e 42  lock,.  i64 *pnB
18d80 79 74 65 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  yte.){.  const u
18d90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 54  nsigned char *zT
18da0 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ext = sqlite3_co
18db0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
18dc0 20 69 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 54   iCol);.  if( zT
18dd0 65 78 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ext ){.    int i
18de0 3b 0a 20 20 20 20 69 6e 74 20 69 4d 75 6c 20 3d  ;.    int iMul =
18df0 20 31 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c   1;.    i64 iVal
18e00 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
18e10 30 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d 27 30 27  0; zText[i]>='0'
18e20 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c 3d 27 39   && zText[i]<='9
18e30 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  '; i++){.      i
18e40 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30 20 2b 20  Val = iVal*10 + 
18e50 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27 30 27 29  (zText[i] - '0')
18e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 69 45  ;.    }.    *piE
18e70 6e 64 42 6c 6f 63 6b 20 3d 20 69 56 61 6c 3b 0a  ndBlock = iVal;.
18e80 20 20 20 20 77 68 69 6c 65 28 20 7a 54 65 78 74      while( zText
18e90 5b 69 5d 3d 3d 27 20 27 20 29 20 69 2b 2b 3b 0a  [i]==' ' ) i++;.
18ea0 20 20 20 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20      iVal = 0;.  
18eb0 20 20 69 66 28 20 7a 54 65 78 74 5b 69 5d 3d 3d    if( zText[i]==
18ec0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  '-' ){.      i++
18ed0 3b 0a 20 20 20 20 20 20 69 4d 75 6c 20 3d 20 2d  ;.      iMul = -
18ee0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  1;.    }.    for
18ef0 28 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 7a 54  (/* no-op */; zT
18f00 65 78 74 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a  ext[i]>='0' && z
18f10 54 65 78 74 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b  Text[i]<='9'; i+
18f20 2b 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d  +){.      iVal =
18f30 20 69 56 61 6c 2a 31 30 20 2b 20 28 7a 54 65 78   iVal*10 + (zTex
18f40 74 5b 69 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20  t[i] - '0');.   
18f50 20 7d 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 3d   }.    *pnByte =
18f60 20 28 69 56 61 6c 20 2a 20 28 69 36 34 29 69 4d   (iVal * (i64)iM
18f70 75 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ul);.  }.}.../*.
18f80 2a 2a 20 41 20 73 65 67 6d 65 6e 74 20 6f 66 20  ** A segment of 
18f90 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73  size nByte bytes
18fa0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77   has just been w
18fb0 72 69 74 74 65 6e 20 74 6f 20 61 62 73 6f 6c 75  ritten to absolu
18fc0 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41 62 73  te level.** iAbs
18fd0 4c 65 76 65 6c 2e 20 50 72 6f 6d 6f 74 65 20 61  Level. Promote a
18fe0 6e 79 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  ny segments that
18ff0 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f   should be promo
19000 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 2e  ted as a result.
19010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
19020 74 73 33 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e  ts3PromoteSegmen
19030 74 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ts(.  Fts3Table 
19040 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19050 20 20 20 20 20 20 2f 2a 20 46 54 53 20 74 61 62        /* FTS tab
19060 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
19070 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62  qlite3_int64 iAb
19080 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f  sLevel,        /
19090 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  * Absolute level
190a0 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 2a 2f   just updated */
190b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
190c0 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
190d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
190e0 77 20 73 65 67 6d 65 6e 74 20 61 74 20 69 41 62  w segment at iAb
190f0 73 4c 65 76 65 6c 20 2a 2f 0a 29 7b 0a 20 20 69  sLevel */.){.  i
19100 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19110 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  K;.  sqlite3_stm
19120 74 20 2a 70 52 61 6e 67 65 3b 0a 0a 20 20 72 63  t *pRange;..  rc
19130 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
19140 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56  , SQL_SELECT_LEV
19150 45 4c 5f 52 41 4e 47 45 32 2c 20 26 70 52 61 6e  EL_RANGE2, &pRan
19160 67 65 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72  ge, 0);..  if( r
19170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19180 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b      int bOk = 0;
19190 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 20 3d  .    i64 iLast =
191a0 20 28 69 41 62 73 4c 65 76 65 6c 2f 46 54 53 33   (iAbsLevel/FTS3
191b0 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c  _SEGDIR_MAXLEVEL
191c0 20 2b 20 31 29 20 2a 20 46 54 53 33 5f 53 45 47   + 1) * FTS3_SEG
191d0 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 2d 20 31  DIR_MAXLEVEL - 1
191e0 3b 0a 20 20 20 20 69 36 34 20 6e 4c 69 6d 69 74  ;.    i64 nLimit
191f0 20 3d 20 28 6e 42 79 74 65 2a 33 29 2f 32 3b 0a   = (nByte*3)/2;.
19200 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
19210 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73  ough all entries
19220 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   in the %_segdir
19230 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e   table correspon
19240 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ding to .    ** 
19250 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  segments in this
19260 20 69 6e 64 65 78 20 6f 6e 20 6c 65 76 65 6c 73   index on levels
19270 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 41   greater than iA
19280 62 73 4c 65 76 65 6c 2e 20 49 66 20 74 68 65 72  bsLevel. If ther
19290 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 6c  e is.    ** at l
192a0 65 61 73 74 20 6f 6e 65 20 73 75 63 68 20 73 65  east one such se
192b0 67 6d 65 6e 74 2c 20 61 6e 64 20 69 74 20 69 73  gment, and it is
192c0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74   possible to det
192d0 65 72 6d 69 6e 65 20 74 68 61 74 20 61 6c 6c 20  ermine that all 
192e0 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73 65 67  .    ** such seg
192f0 6d 65 6e 74 73 20 61 72 65 20 73 6d 61 6c 6c 65  ments are smalle
19300 72 20 74 68 61 6e 20 6e 4c 69 6d 69 74 20 62 79  r than nLimit by
19310 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
19320 79 20 77 69 6c 6c 20 62 65 20 0a 20 20 20 20 2a  y will be .    *
19330 2a 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 6c 65  * promoted to le
19340 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20 20  vel iAbsLevel.  
19350 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  */.    sqlite3_b
19360 69 6e 64 5f 69 6e 74 36 34 28 70 52 61 6e 67 65  ind_int64(pRange
19370 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31  , 1, iAbsLevel+1
19380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
19390 69 6e 64 5f 69 6e 74 36 34 28 70 52 61 6e 67 65  ind_int64(pRange
193a0 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20 20  , 2, iLast);.   
193b0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
193c0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
193d0 28 70 52 61 6e 67 65 29 20 29 7b 0a 20 20 20 20  (pRange) ){.    
193e0 20 20 69 36 34 20 6e 53 69 7a 65 20 3d 20 30 2c    i64 nSize = 0,
193f0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 66 74   dummy;.      ft
19400 73 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69  s3ReadEndBlockFi
19410 65 6c 64 28 70 52 61 6e 67 65 2c 20 32 2c 20 26  eld(pRange, 2, &
19420 64 75 6d 6d 79 2c 20 26 6e 53 69 7a 65 29 3b 0a  dummy, &nSize);.
19430 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c        if( nSize<
19440 3d 30 20 7c 7c 20 6e 53 69 7a 65 3e 6e 4c 69 6d  =0 || nSize>nLim
19450 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  it ){.        /*
19460 20 49 66 20 6e 53 69 7a 65 3d 3d 30 2c 20 74 68   If nSize==0, th
19470 65 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 2e  en the %_segdir.
19480 65 6e 64 5f 62 6c 6f 63 6b 20 66 69 65 6c 64 20  end_block field 
19490 64 6f 65 73 20 6e 6f 74 20 6e 6f 74 20 0a 20 20  does not not .  
194a0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
194b0 20 61 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 54   a size value. T
194c0 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 69  his happens if i
194d0 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 79  t was written by
194e0 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   an.        ** o
194f0 6c 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 46 54  ld version of FT
19500 53 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  S. In this case 
19510 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
19520 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  le to determine.
19530 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
19540 69 7a 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65  ize of the segme
19550 6e 74 2c 20 61 6e 64 20 73 6f 20 73 65 67 6d 65  nt, and so segme
19560 6e 74 20 70 72 6f 6d 6f 74 69 6f 6e 20 64 6f 65  nt promotion doe
19570 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
19580 20 74 61 6b 65 20 70 6c 61 63 65 2e 20 20 2a 2f   take place.  */
19590 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30  .        bOk = 0
195a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
195b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
195c0 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  Ok = 1;.    }.  
195d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
195e0 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a 0a 20  eset(pRange);.. 
195f0 20 20 20 69 66 28 20 62 4f 6b 20 29 7b 0a 20 20     if( bOk ){.  
19600 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30      int iIdx = 0
19610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
19620 73 74 6d 74 20 2a 70 55 70 64 61 74 65 31 20 3d  stmt *pUpdate1 =
19630 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
19640 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65 32  3_stmt *pUpdate2
19650 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
19660 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19670 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
19680 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
19690 4c 5f 55 50 44 41 54 45 5f 4c 45 56 45 4c 5f 49  L_UPDATE_LEVEL_I
196a0 44 58 2c 20 26 70 55 70 64 61 74 65 31 2c 20 30  DX, &pUpdate1, 0
196b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
196c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
196d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
196e0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
196f0 2c 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c 45 56  , SQL_UPDATE_LEV
19700 45 4c 2c 20 26 70 55 70 64 61 74 65 32 2c 20 30  EL, &pUpdate2, 0
19710 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
19720 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19730 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  _OK ){..        
19740 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
19750 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65 6e 74  all %_segdir ent
19760 72 69 65 73 20 66 6f 72 20 73 65 67 6d 65 6e 74  ries for segment
19770 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20  s in this index 
19780 77 69 74 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  with.        ** 
19790 6c 65 76 65 6c 73 20 65 71 75 61 6c 20 74 6f 20  levels equal to 
197a0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
197b0 69 41 62 73 4c 65 76 65 6c 2e 20 41 73 20 65 61  iAbsLevel. As ea
197c0 63 68 20 65 6e 74 72 79 20 69 73 20 76 69 73 69  ch entry is visi
197d0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ted,.        ** 
197e0 75 70 64 61 74 65 64 20 69 74 20 74 6f 20 73 65  updated it to se
197f0 74 20 28 6c 65 76 65 6c 20 3d 20 2d 31 29 20 61  t (level = -1) a
19800 6e 64 20 28 69 64 78 20 3d 20 4e 29 2c 20 77 68  nd (idx = N), wh
19810 65 72 65 20 4e 20 69 73 20 30 20 66 6f 72 20 74  ere N is 0 for t
19820 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6c  he.        ** ol
19830 64 65 73 74 20 73 65 67 6d 65 6e 74 20 69 6e 20  dest segment in 
19840 74 68 65 20 72 61 6e 67 65 2c 20 31 20 66 6f 72  the range, 1 for
19850 20 74 68 65 20 6e 65 78 74 20 6f 6c 64 65 73 74   the next oldest
19860 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20 20  , and so on..   
19870 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
19880 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
19890 73 2c 20 6d 6f 76 65 20 61 6c 6c 20 73 65 67 6d  s, move all segm
198a0 65 6e 74 73 20 62 65 69 6e 67 20 70 72 6f 6d 6f  ents being promo
198b0 74 65 64 20 74 6f 20 6c 65 76 65 6c 20 2d 31 2c  ted to level -1,
198c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74  .        ** sett
198d0 69 6e 67 20 74 68 65 20 22 69 64 78 22 20 66 69  ing the "idx" fi
198e0 65 6c 64 73 20 61 73 20 61 70 70 72 6f 70 72 69  elds as appropri
198f0 61 74 65 20 74 6f 20 6b 65 65 70 20 74 68 65 6d  ate to keep them
19900 20 69 6e 20 74 68 65 20 73 61 6d 65 0a 20 20 20   in the same.   
19910 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 2e 20 54       ** order. T
19920 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c  he contents of l
19930 65 76 65 6c 20 2d 31 20 28 77 68 69 63 68 20 69  evel -1 (which i
19940 73 20 6e 65 76 65 72 20 75 73 65 64 2c 20 65 78  s never used, ex
19950 63 65 70 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  cept.        ** 
19960 74 72 61 6e 73 69 65 6e 74 6c 79 20 68 65 72 65  transiently here
19970 29 2c 20 77 69 6c 6c 20 62 65 20 6d 6f 76 65 64  ), will be moved
19980 20 62 61 63 6b 20 74 6f 20 6c 65 76 65 6c 20 69   back to level i
19990 41 62 73 4c 65 76 65 6c 20 62 65 6c 6f 77 2e 20  AbsLevel below. 
199a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
199b0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
199c0 52 61 6e 67 65 2c 20 31 2c 20 69 41 62 73 4c 65  Range, 1, iAbsLe
199d0 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 77 68  vel);.        wh
199e0 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
199f0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52  =sqlite3_step(pR
19a00 61 6e 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  ange) ){.       
19a10 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
19a20 69 6e 74 28 70 55 70 64 61 74 65 31 2c 20 31 2c  int(pUpdate1, 1,
19a30 20 69 49 64 78 2b 2b 29 3b 0a 20 20 20 20 20 20   iIdx++);.      
19a40 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
19a50 5f 69 6e 74 28 70 55 70 64 61 74 65 31 2c 20 32  _int(pUpdate1, 2
19a60 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
19a70 5f 69 6e 74 28 70 52 61 6e 67 65 2c 20 30 29 29  _int(pRange, 0))
19a80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19a90 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70  te3_bind_int(pUp
19aa0 64 61 74 65 31 2c 20 33 2c 20 73 71 6c 69 74 65  date1, 3, sqlite
19ab0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 52 61  3_column_int(pRa
19ac0 6e 67 65 2c 20 31 29 29 3b 0a 20 20 20 20 20 20  nge, 1));.      
19ad0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
19ae0 28 70 55 70 64 61 74 65 31 29 3b 0a 20 20 20 20  (pUpdate1);.    
19af0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19b00 65 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65  e3_reset(pUpdate
19b10 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
19b20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
19b40 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 61  qlite3_reset(pRa
19b50 6e 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nge);.          
19b60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19b70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
19b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19b90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19ba0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
19bb0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 61  qlite3_reset(pRa
19bc0 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nge);.      }.. 
19bd0 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 6c 65 76       /* Move lev
19be0 65 6c 20 2d 31 20 74 6f 20 6c 65 76 65 6c 20 69  el -1 to level i
19bf0 41 62 73 4c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  AbsLevel */.    
19c00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19c10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
19c20 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
19c30 34 28 70 55 70 64 61 74 65 32 2c 20 31 2c 20 69  4(pUpdate2, 1, i
19c40 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  AbsLevel);.     
19c50 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
19c60 70 55 70 64 61 74 65 32 29 3b 0a 20 20 20 20 20  pUpdate2);.     
19c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
19c80 72 65 73 65 74 28 70 55 70 64 61 74 65 32 29 3b  reset(pUpdate2);
19c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19ca0 20 7d 0a 0a 0a 20 20 72 65 74 75 72 6e 20 72 63   }...  return rc
19cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
19cc0 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65 76 65   all level iLeve
19cd0 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
19ce0 65 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  e database into 
19cf0 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69 4c 65  a single .** iLe
19d00 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e 20 4f  vel+1 segment. O
19d10 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30 2c 20  r, if iLevel<0, 
19d20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
19d30 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ts into a.** sin
19d40 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68  gle segment with
19d50 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c 20 74   a level equal t
19d60 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  o the numericall
19d70 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 20  y largest level 
19d80 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 72  .** currently pr
19d90 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
19da0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
19db0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
19dc0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69 4c 65   called with iLe
19dd0 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65 72 65  vel<0, but there
19de0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20   is only one.** 
19df0 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64  segment in the d
19e00 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f  atabase, SQLITE_
19e10 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
19e20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 2a   immediately. .*
19e30 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
19e40 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
19e50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
19e60 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
19e70 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20 53 51  ccurs, .** an SQ
19e80 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
19e90 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
19ea0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
19eb0 65 67 6d 65 6e 74 4d 65 72 67 65 28 0a 20 20 46  egmentMerge(.  F
19ec0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
19ed0 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74  /* Language id t
19f00 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  o merge */.  int
19f10 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f30 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64  Index in p->aInd
19f40 65 78 5b 5d 20 74 6f 20 6d 65 72 67 65 20 2a 2f  ex[] to merge */
19f50 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20  .  int iLevel   
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f70 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 6d     /* Level to m
19f80 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  erge */.){.  int
19f90 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19fb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
19fc0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20   int iIdx = 0;  
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77   /* Index of new
19ff0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 71   segment */.  sq
1a000 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 77  lite3_int64 iNew
1a010 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  Level = 0;    /*
1a020 20 4c 65 76 65 6c 2f 69 6e 64 65 78 20 74 6f 20   Level/index to 
1a030 63 72 65 61 74 65 20 6e 65 77 20 73 65 67 6d 65  create new segme
1a040 6e 74 20 61 74 20 2a 2f 0a 20 20 53 65 67 6d 65  nt at */.  Segme
1a050 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  ntWriter *pWrite
1a060 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73  r = 0;     /* Us
1a070 65 64 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ed to write the 
1a080 6e 65 77 2c 20 6d 65 72 67 65 64 2c 20 73 65 67  new, merged, seg
1a090 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33 53 65  ment */.  Fts3Se
1a0a0 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 20  gFilter filter; 
1a0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
1a0c0 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74 65 72  ment term filter
1a0d0 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20   condition */.  
1a0e0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
1a0f0 65 72 20 63 73 72 3b 20 20 20 20 20 20 20 20 20  er csr;         
1a100 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 69 74 65  /* Cursor to ite
1a110 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
1a120 65 6c 28 73 29 20 2a 2f 0a 20 20 69 6e 74 20 62  el(s) */.  int b
1a130 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 30 3b  IgnoreEmpty = 0;
1a140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a150 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 65 6d 70  ue to ignore emp
1a160 74 79 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ty segments */. 
1a170 20 69 36 34 20 69 4d 61 78 4c 65 76 65 6c 20 3d   i64 iMaxLevel =
1a180 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a190 20 2f 2a 20 4d 61 78 20 6c 65 76 65 6c 20 6e 75   /* Max level nu
1a1a0 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  mber for this in
1a1b0 64 65 78 2f 6c 61 6e 67 69 64 20 2a 2f 0a 0a 20  dex/langid */.. 
1a1c0 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d   assert( iLevel=
1a1d0 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
1a1e0 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 69 4c  ALL.       || iL
1a1f0 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
1a200 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a 20 20 20  RSOR_PENDING.   
1a210 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30      || iLevel>=0
1a220 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
1a230 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 47 44  iLevel<FTS3_SEGD
1a240 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a 20  IR_MAXLEVEL );. 
1a250 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
1a260 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
1a270 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 72 63 20  nIndex );..  rc 
1a280 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
1a290 52 65 61 64 65 72 43 75 72 73 6f 72 28 70 2c 20  ReaderCursor(p, 
1a2a0 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
1a2b0 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30 2c 20 31   iLevel, 0, 0, 1
1a2c0 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20 20 69 66  , 0, &csr);.  if
1a2d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a2e0 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3d  || csr.nSegment=
1a2f0 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  =0 ) goto finish
1a300 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76 65  ed;..  if( iLeve
1a310 6c 21 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l!=FTS3_SEGCURSO
1a320 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20  R_PENDING ){.   
1a330 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e   rc = fts3Segmen
1a340 74 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69 4c 61  tMaxLevel(p, iLa
1a350 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 26 69  ngid, iIndex, &i
1a360 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69  MaxLevel);.    i
1a370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a380 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
1a390 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4c 65  ;.  }..  if( iLe
1a3a0 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52  vel==FTS3_SEGCUR
1a3b0 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 2f  SOR_ALL ){.    /
1a3c0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74  * This call is t
1a3d0 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  o merge all segm
1a3e0 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
1a3f0 62 61 73 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  base to a single
1a400 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 2e  .    ** segment.
1a410 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68   The level of th
1a420 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73  e new segment is
1a430 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75   equal to the nu
1a440 6d 65 72 69 63 61 6c 6c 79 0a 20 20 20 20 2a 2a  merically.    **
1a450 20 67 72 65 61 74 65 73 74 20 73 65 67 6d 65 6e   greatest segmen
1a460 74 20 6c 65 76 65 6c 20 63 75 72 72 65 6e 74 6c  t level currentl
1a470 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  y present in the
1a480 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 74 68   database for th
1a490 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e  is.    ** index.
1a4a0 20 54 68 65 20 69 64 78 20 6f 66 20 74 68 65 20   The idx of the 
1a4b0 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20 61  new segment is a
1a4c0 6c 77 61 79 73 20 30 2e 20 20 2a 2f 0a 20 20 20  lways 0.  */.   
1a4d0 20 69 66 28 20 63 73 72 2e 6e 53 65 67 6d 65 6e   if( csr.nSegmen
1a4e0 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  t==1 ){.      rc
1a4f0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1a500 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
1a510 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  hed;.    }.    i
1a520 4e 65 77 4c 65 76 65 6c 20 3d 20 69 4d 61 78 4c  NewLevel = iMaxL
1a530 65 76 65 6c 3b 0a 20 20 20 20 62 49 67 6e 6f 72  evel;.    bIgnor
1a540 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a 20 20 7d  eEmpty = 1;..  }
1a550 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
1a560 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72  s call is to mer
1a570 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  ge all segments 
1a580 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e  at level iLevel.
1a590 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 0a 20   find the next. 
1a5a0 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20     ** available 
1a5b0 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 61 74  segment index at
1a5c0 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 2e   level iLevel+1.
1a5d0 20 54 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20   The call to.   
1a5e0 20 2a 2a 20 66 74 73 33 41 6c 6c 6f 63 61 74 65   ** fts3Allocate
1a5f0 53 65 67 64 69 72 49 64 78 28 29 20 77 69 6c 6c  SegdirIdx() will
1a600 20 6d 65 72 67 65 20 74 68 65 20 73 65 67 6d 65   merge the segme
1a610 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65  nts at level iLe
1a620 76 65 6c 2b 31 20 74 6f 20 0a 20 20 20 20 2a 2a  vel+1 to .    **
1a630 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c   a single iLevel
1a640 2b 32 20 73 65 67 6d 65 6e 74 20 69 66 20 6e 65  +2 segment if ne
1a650 63 65 73 73 61 72 79 2e 20 20 2a 2f 0a 20 20 20  cessary.  */.   
1a660 20 61 73 73 65 72 74 28 20 46 54 53 33 5f 53 45   assert( FTS3_SE
1a670 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 3d  GCURSOR_PENDING=
1a680 3d 2d 31 20 29 3b 0a 20 20 20 20 69 4e 65 77 4c  =-1 );.    iNewL
1a690 65 76 65 6c 20 3d 20 67 65 74 41 62 73 6f 6c 75  evel = getAbsolu
1a6a0 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
1a6b0 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
1a6c0 65 6c 2b 31 29 3b 0a 20 20 20 20 72 63 20 3d 20  el+1);.    rc = 
1a6d0 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
1a6e0 69 72 49 64 78 28 70 2c 20 69 4c 61 6e 67 69 64  irIdx(p, iLangid
1a6f0 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
1a700 2b 31 2c 20 26 69 49 64 78 29 3b 0a 20 20 20 20  +1, &iIdx);.    
1a710 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 28  bIgnoreEmpty = (
1a720 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47  iLevel!=FTS3_SEG
1a730 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 29 20  CURSOR_PENDING) 
1a740 26 26 20 28 69 4e 65 77 4c 65 76 65 6c 3e 69 4d  && (iNewLevel>iM
1a750 61 78 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 20 20  axLevel);.  }.  
1a760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a770 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65  K ) goto finishe
1a780 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 73  d;..  assert( cs
1a790 72 2e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a  r.nSegment>0 );.
1a7a0 20 20 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65    assert( iNewLe
1a7b0 76 65 6c 3e 3d 67 65 74 41 62 73 6f 6c 75 74 65  vel>=getAbsolute
1a7c0 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
1a7d0 2c 20 69 49 6e 64 65 78 2c 20 30 29 20 29 3b 0a  , iIndex, 0) );.
1a7e0 20 20 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65    assert( iNewLe
1a7f0 76 65 6c 3c 67 65 74 41 62 73 6f 6c 75 74 65 4c  vel<getAbsoluteL
1a800 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
1a810 20 69 49 6e 64 65 78 2c 46 54 53 33 5f 53 45 47   iIndex,FTS3_SEG
1a820 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 20 29 3b  DIR_MAXLEVEL) );
1a830 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74  ..  memset(&filt
1a840 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
1a850 73 33 53 65 67 46 69 6c 74 65 72 29 29 3b 0a 20  s3SegFilter));. 
1a860 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20   filter.flags = 
1a870 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51  FTS3_SEGMENT_REQ
1a880 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66 69 6c 74  UIRE_POS;.  filt
1a890 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28 62 49 67  er.flags |= (bIg
1a8a0 6e 6f 72 65 45 6d 70 74 79 20 3f 20 46 54 53 33  noreEmpty ? FTS3
1a8b0 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f  _SEGMENT_IGNORE_
1a8c0 45 4d 50 54 59 20 3a 20 30 29 3b 0a 0a 20 20 72  EMPTY : 0);..  r
1a8d0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
1a8e0 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c  egReaderStart(p,
1a8f0 20 26 63 73 72 2c 20 26 66 69 6c 74 65 72 29 3b   &csr, &filter);
1a900 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
1a910 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20 72  _OK==rc ){.    r
1a920 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
1a930 65 67 52 65 61 64 65 72 53 74 65 70 28 70 2c 20  egReaderStep(p, 
1a940 26 63 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72  &csr);.    if( r
1a950 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c!=SQLITE_ROW ) 
1a960 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20  break;.    rc = 
1a970 66 74 73 33 53 65 67 57 72 69 74 65 72 41 64 64  fts3SegWriterAdd
1a980 28 70 2c 20 26 70 57 72 69 74 65 72 2c 20 31 2c  (p, &pWriter, 1,
1a990 20 0a 20 20 20 20 20 20 20 20 63 73 72 2e 7a 54   .        csr.zT
1a9a0 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20  erm, csr.nTerm, 
1a9b0 63 73 72 2e 61 44 6f 63 6c 69 73 74 2c 20 63 73  csr.aDoclist, cs
1a9c0 72 2e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d  r.nDoclist);.  }
1a9d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a9e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
1a9f0 73 68 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  shed;.  assert( 
1aa00 70 57 72 69 74 65 72 20 7c 7c 20 62 49 67 6e 6f  pWriter || bIgno
1aa10 72 65 45 6d 70 74 79 20 29 3b 0a 0a 20 20 69 66  reEmpty );..  if
1aa20 28 20 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53  ( iLevel!=FTS3_S
1aa30 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47  EGCURSOR_PENDING
1aa40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
1aa50 33 44 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20  3DeleteSegdir(. 
1aa60 20 20 20 20 20 20 20 70 2c 20 69 4c 61 6e 67 69         p, iLangi
1aa70 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65  d, iIndex, iLeve
1aa80 6c 2c 20 63 73 72 2e 61 70 53 65 67 6d 65 6e 74  l, csr.apSegment
1aa90 2c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 0a 20  , csr.nSegment. 
1aaa0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
1aab0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1aac0 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d  to finished;.  }
1aad0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 20 29  .  if( pWriter )
1aae0 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
1aaf0 65 67 57 72 69 74 65 72 46 6c 75 73 68 28 70 2c  egWriterFlush(p,
1ab00 20 70 57 72 69 74 65 72 2c 20 69 4e 65 77 4c 65   pWriter, iNewLe
1ab10 76 65 6c 2c 20 69 49 64 78 29 3b 0a 20 20 20 20  vel, iIdx);.    
1ab20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ab30 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1ab40 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
1ab50 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 7c 7c  URSOR_PENDING ||
1ab60 20 69 4e 65 77 4c 65 76 65 6c 3c 69 4d 61 78 4c   iNewLevel<iMaxL
1ab70 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  evel ){.        
1ab80 72 63 20 3d 20 66 74 73 33 50 72 6f 6d 6f 74 65  rc = fts3Promote
1ab90 53 65 67 6d 65 6e 74 73 28 70 2c 20 69 4e 65 77  Segments(p, iNew
1aba0 4c 65 76 65 6c 2c 20 70 57 72 69 74 65 72 2d 3e  Level, pWriter->
1abb0 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20  nLeafData);.    
1abc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1abd0 66 69 6e 69 73 68 65 64 3a 0a 20 20 66 74 73 33  finished:.  fts3
1abe0 53 65 67 57 72 69 74 65 72 46 72 65 65 28 70 57  SegWriterFree(pW
1abf0 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  riter);.  sqlite
1ac00 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69  3Fts3SegReaderFi
1ac10 6e 69 73 68 28 26 63 73 72 29 3b 0a 20 20 72 65  nish(&csr);.  re
1ac20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20  turn rc;.}.../* 
1ac30 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1ac40 6e 74 65 6e 74 73 20 6f 66 20 70 65 6e 64 69 6e  ntents of pendin
1ac50 67 54 65 72 6d 73 20 74 6f 20 6c 65 76 65 6c 20  gTerms to level 
1ac60 30 20 73 65 67 6d 65 6e 74 73 2e 20 0a 2a 2f 0a  0 segments. .*/.
1ac70 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 50  int sqlite3Fts3P
1ac80 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68  endingTermsFlush
1ac90 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a  (Fts3Table *p){.
1aca0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1acb0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
1acc0 20 20 20 20 20 20 20 0a 20 20 66 6f 72 28 69 3d         .  for(i=
1acd0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
1ace0 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b   && i<p->nIndex;
1acf0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
1ad00 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65  fts3SegmentMerge
1ad10 28 70 2c 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67  (p, p->iPrevLang
1ad20 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45 47 43  id, i, FTS3_SEGC
1ad30 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 29 3b 0a  URSOR_PENDING);.
1ad40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ad50 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
1ad60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1ad70 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
1ad80 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b  ngTermsClear(p);
1ad90 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
1ada0 20 74 68 65 20 61 75 74 6f 2d 69 6e 63 72 2d 6d   the auto-incr-m
1adb0 65 72 67 65 20 73 65 74 74 69 6e 67 20 69 66 20  erge setting if 
1adc0 75 6e 6b 6e 6f 77 6e 2e 20 20 49 66 20 65 6e 61  unknown.  If ena
1add0 62 6c 65 64 2c 0a 20 20 2a 2a 20 65 73 74 69 6d  bled,.  ** estim
1ade0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
1adf0 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 6f 66  f leaf blocks of
1ae00 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 77   content to be w
1ae10 72 69 74 74 65 6e 0a 20 20 2a 2f 0a 20 20 69 66  ritten.  */.  if
1ae20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ae30 26 26 20 70 2d 3e 62 48 61 73 53 74 61 74 0a 20  && p->bHasStat. 
1ae40 20 20 26 26 20 70 2d 3e 6e 41 75 74 6f 69 6e 63    && p->nAutoinc
1ae50 72 6d 65 72 67 65 3d 3d 30 78 66 66 20 26 26 20  rmerge==0xff && 
1ae60 70 2d 3e 6e 4c 65 61 66 41 64 64 3e 30 0a 20 20  p->nLeafAdd>0.  
1ae70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1ae80 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1ae90 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
1aea0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
1aeb0 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c  CT_STAT, &pStmt,
1aec0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
1aed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1aee0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1aef0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46  _int(pStmt, 1, F
1af00 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e 43 52  TS_STAT_AUTOINCR
1af10 4d 45 52 47 45 29 3b 0a 20 20 20 20 20 20 72 63  MERGE);.      rc
1af20 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1af30 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
1af40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
1af50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
1af60 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20  Autoincrmerge = 
1af70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1af80 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
1af90 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 75        if( p->nAu
1afa0 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 31 20 29  toincrmerge==1 )
1afb0 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
1afc0 67 65 20 3d 20 38 3b 0a 20 20 20 20 20 20 7d 65  ge = 8;.      }e
1afd0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1afe0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1aff0 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d     p->nAutoincrm
1b000 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  erge = 0;.      
1b010 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
1b020 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1b030 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1b040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b050 2a 2a 20 45 6e 63 6f 64 65 20 4e 20 69 6e 74 65  ** Encode N inte
1b060 67 65 72 73 20 61 73 20 76 61 72 69 6e 74 73 20  gers as varints 
1b070 69 6e 74 6f 20 61 20 62 6c 6f 62 2e 0a 2a 2f 0a  into a blob..*/.
1b080 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1b090 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79 28 0a  EncodeIntArray(.
1b0a0 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
1b0b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1b0c0 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  er of integers t
1b0d0 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 75 33  o encode */.  u3
1b0e0 32 20 2a 61 2c 20 20 20 20 20 20 20 20 20 20 20  2 *a,           
1b0f0 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
1b100 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72  values */.  char
1b110 20 2a 7a 42 75 66 2c 20 20 20 20 20 20 20 20 2f   *zBuf,        /
1b120 2a 20 57 72 69 74 65 20 74 68 65 20 42 4c 4f 42  * Write the BLOB
1b130 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
1b140 70 4e 42 75 66 20 20 20 20 20 20 20 20 20 2f 2a  pNBuf         /*
1b150 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66   Write number of
1b160 20 62 79 74 65 73 20 69 66 20 7a 42 75 66 5b 5d   bytes if zBuf[]
1b170 20 75 73 65 64 20 68 65 72 65 20 2a 2f 0a 29 7b   used here */.){
1b180 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66  .  int i, j;.  f
1b190 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69  or(i=j=0; i<N; i
1b1a0 2b 2b 29 7b 0a 20 20 20 20 6a 20 2b 3d 20 73 71  ++){.    j += sq
1b1b0 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1b1c0 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20 28 73 71  nt(&zBuf[j], (sq
1b1d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 69 5d  lite3_int64)a[i]
1b1e0 29 3b 0a 20 20 7d 0a 20 20 2a 70 4e 42 75 66 20  );.  }.  *pNBuf 
1b1f0 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  = j;.}../*.** De
1b200 63 6f 64 65 20 61 20 62 6c 6f 62 20 6f 66 20 76  code a blob of v
1b210 61 72 69 6e 74 73 20 69 6e 74 6f 20 4e 20 69 6e  arints into N in
1b220 74 65 67 65 72 73 0a 2a 2f 0a 73 74 61 74 69 63  tegers.*/.static
1b230 20 76 6f 69 64 20 66 74 73 33 44 65 63 6f 64 65   void fts3Decode
1b240 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20  IntArray(.  int 
1b250 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
1b260 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1b270 69 6e 74 65 67 65 72 73 20 74 6f 20 64 65 63 6f  integers to deco
1b280 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20  de */.  u32 *a, 
1b290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1b2a0 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  ite the integer 
1b2b0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 6f 6e 73  values */.  cons
1b2c0 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 20 2f  t char *zBuf,  /
1b2d0 2a 20 54 68 65 20 42 4c 4f 42 20 63 6f 6e 74 61  * The BLOB conta
1b2e0 69 6e 69 6e 67 20 74 68 65 20 76 61 72 69 6e 74  ining the varint
1b2f0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 20  s */.  int nBuf 
1b300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69 7a            /* siz
1b310 65 20 6f 66 20 74 68 65 20 42 4c 4f 42 20 2a 2f  e of the BLOB */
1b320 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
1b330 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b340 45 52 28 6e 42 75 66 29 3b 0a 20 20 66 6f 72 28  ER(nBuf);.  for(
1b350 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  i=j=0; i<N; i++)
1b360 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
1b370 74 36 34 20 78 3b 0a 20 20 20 20 6a 20 2b 3d 20  t64 x;.    j += 
1b380 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
1b390 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20 26  rint(&zBuf[j], &
1b3a0 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 6a  x);.    assert(j
1b3b0 3c 3d 6e 42 75 66 29 3b 0a 20 20 20 20 61 5b 69  <=nBuf);.    a[i
1b3c0 5d 20 3d 20 28 75 33 32 29 28 78 20 26 20 30 78  ] = (u32)(x & 0x
1b3d0 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 0a 7d  ffffffff);.  }.}
1b3e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74  ../*.** Insert t
1b3f0 68 65 20 73 69 7a 65 73 20 28 69 6e 20 74 6f 6b  he sizes (in tok
1b400 65 6e 73 29 20 66 6f 72 20 65 61 63 68 20 63 6f  ens) for each co
1b410 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 6f 63 75  lumn of the docu
1b420 6d 65 6e 74 0a 2a 2a 20 77 69 74 68 20 64 6f 63  ment.** with doc
1b430 69 64 20 65 71 75 61 6c 20 74 6f 20 70 2d 3e 69  id equal to p->i
1b440 50 72 65 76 44 6f 63 69 64 2e 20 20 54 68 65 20  PrevDocid.  The 
1b450 73 69 7a 65 73 20 61 72 65 20 65 6e 63 6f 64 65  sizes are encode
1b460 64 20 61 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 6f  d as.** a blob o
1b470 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74  f varints..*/.st
1b480 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 49 6e  atic void fts3In
1b490 73 65 72 74 44 6f 63 73 69 7a 65 28 0a 20 20 69  sertDocsize(.  i
1b4a0 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20  nt *pRC,        
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b4c0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1b4d0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e 74 6f     /* Table into
1b500 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74   which to insert
1b510 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 20 20   */.  u32 *aSz  
1b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b530 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
1b540 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 69  f each column, i
1b550 6e 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20  n tokens */.){. 
1b560 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20   char *pBlob;   
1b570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b580 20 42 4c 4f 42 20 65 6e 63 6f 64 69 6e 67 20 6f   BLOB encoding o
1b590 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73  f the document s
1b5a0 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c  ize */.  int nBl
1b5b0 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
1b5c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b5d0 79 74 65 73 20 69 6e 20 74 68 65 20 42 4c 4f 42  ytes in the BLOB
1b5e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1b5f0 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
1b600 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64  * Statement used
1b610 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 65   to insert the e
1b620 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
1b630 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1b640 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1b650 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
1b660 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  ctions */..  if(
1b670 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
1b680 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    pBlob = sqlite
1b690 33 5f 6d 61 6c 6c 6f 63 28 20 31 30 2a 70 2d 3e  3_malloc( 10*p->
1b6a0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
1b6b0 20 70 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20   pBlob==0 ){.   
1b6c0 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRC = SQLITE_N
1b6d0 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e  OMEM;.    return
1b6e0 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f  ;.  }.  fts3Enco
1b6f0 64 65 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e 43  deIntArray(p->nC
1b700 6f 6c 75 6d 6e 2c 20 61 53 7a 2c 20 70 42 6c 6f  olumn, aSz, pBlo
1b710 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63  b, &nBlob);.  rc
1b720 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1b730 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f  , SQL_REPLACE_DO
1b740 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30  CSIZE, &pStmt, 0
1b750 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1b760 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b770 70 42 6c 6f 62 29 3b 0a 20 20 20 20 2a 70 52 43  pBlob);.    *pRC
1b780 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
1b790 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
1b7a0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
1b7b0 74 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 44 6f  t, 1, p->iPrevDo
1b7c0 63 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  cid);.  sqlite3_
1b7d0 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
1b7e0 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62   2, pBlob, nBlob
1b7f0 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
1b800 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
1b810 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d  pStmt);.  *pRC =
1b820 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1b830 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
1b840 52 65 63 6f 72 64 20 30 20 6f 66 20 74 68 65 20  Record 0 of the 
1b850 25 5f 73 74 61 74 20 74 61 62 6c 65 20 63 6f 6e  %_stat table con
1b860 74 61 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e  tains a blob con
1b870 73 69 73 74 69 6e 67 20 6f 66 20 4e 20 76 61 72  sisting of N var
1b880 69 6e 74 73 2c 0a 2a 2a 20 77 68 65 72 65 20 4e  ints,.** where N
1b890 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1b8a0 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  f user defined c
1b8b0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 66 74  olumns in the ft
1b8c0 73 33 20 74 61 62 6c 65 20 70 6c 75 73 0a 2a 2a  s3 table plus.**
1b8d0 20 74 77 6f 2e 20 49 66 20 6e 43 6f 6c 20 69 73   two. If nCol is
1b8e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
1b8f0 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75  ser defined colu
1b900 6d 6e 73 2c 20 74 68 65 6e 20 76 61 6c 75 65 73  mns, then values
1b910 20 6f 66 20 74 68 65 20 0a 2a 2a 20 76 61 72 69   of the .** vari
1b920 6e 74 73 20 61 72 65 20 73 65 74 20 61 73 20 66  nts are set as f
1b930 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1b940 56 61 72 69 6e 74 20 30 3a 20 20 20 20 20 20 20  Varint 0:       
1b950 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1b960 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1b970 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e  e..**.**   Varin
1b980 74 20 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72 20 65  t 1..nCol: For e
1b990 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  ach column, the 
1b9a0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1b9b0 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e  tokens stored in
1b9c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b9d0 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e        the column
1b9e0 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66   for all rows of
1b9f0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
1ba00 2a 20 20 20 56 61 72 69 6e 74 20 31 2b 6e 43 6f  *   Varint 1+nCo
1ba10 6c 3a 20 20 54 68 65 20 74 6f 74 61 6c 20 73 69  l:  The total si
1ba20 7a 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 6f 66  ze, in bytes, of
1ba30 20 61 6c 6c 20 74 65 78 74 20 76 61 6c 75 65 73   all text values
1ba40 20 69 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20   in all.**      
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
1ba60 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73  umns of all rows
1ba70 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1ba80 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
1ba90 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f   fts3UpdateDocTo
1baa0 74 61 6c 73 28 0a 20 20 69 6e 74 20 2a 70 52 43  tals(.  int *pRC
1bab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bac0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1bad0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1bae0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75  /* Table being u
1bb10 70 64 61 74 65 64 20 2a 2f 0a 20 20 75 33 32 20  pdated */.  u32 
1bb20 2a 61 53 7a 49 6e 73 2c 20 20 20 20 20 20 20 20  *aSzIns,        
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1bb40 69 7a 65 20 69 6e 63 72 65 61 73 65 73 20 2a 2f  ize increases */
1bb50 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 2c 20  .  u32 *aSzDel, 
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 2f 2a 20 53 69 7a 65 20 64 65 63 72 65     /* Size decre
1bb80 61 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ases */.  int nC
1bb90 68 6e 67 20 20 20 20 20 20 20 20 20 20 20 20 20  hng             
1bba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
1bbb0 6e 67 65 20 69 6e 20 74 68 65 20 6e 75 6d 62 65  nge in the numbe
1bbc0 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a  r of documents *
1bbd0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c  /.){.  char *pBl
1bbe0 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
1bbf0 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72 20 42  /* Storage for B
1bc00 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  LOB written into
1bc10 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 69 6e 74   %_stat */.  int
1bc20 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1bc30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1bc40 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e   BLOB written in
1bc50 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 75  to %_stat */.  u
1bc60 33 32 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  32 *a;          
1bc70 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1bc80 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
1bc90 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 42 4c  t becomes the BL
1bca0 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  OB */.  sqlite3_
1bcb0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
1bcc0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f   /* Statement fo
1bcd0 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  r reading and wr
1bce0 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  iting */.  int i
1bcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd00 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1bd10 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd30 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1bd40 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
1bd50 6e 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 69  ns */..  const i
1bd60 6e 74 20 6e 53 74 61 74 20 3d 20 70 2d 3e 6e 43  nt nStat = p->nC
1bd70 6f 6c 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66 28 20  olumn+2;..  if( 
1bd80 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
1bd90 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   a = sqlite3_mal
1bda0 6c 6f 63 28 20 28 73 69 7a 65 6f 66 28 75 33 32  loc( (sizeof(u32
1bdb0 29 2b 31 30 29 2a 6e 53 74 61 74 20 29 3b 0a 20  )+10)*nStat );. 
1bdc0 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
1bdd0 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRC = SQLITE_N
1bde0 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e  OMEM;.    return
1bdf0 3b 0a 20 20 7d 0a 20 20 70 42 6c 6f 62 20 3d 20  ;.  }.  pBlob = 
1be00 28 63 68 61 72 2a 29 26 61 5b 6e 53 74 61 74 5d  (char*)&a[nStat]
1be10 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ;.  rc = fts3Sql
1be20 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
1be30 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c  CT_STAT, &pStmt,
1be40 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
1be50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1be60 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d  e(a);.    *pRC =
1be70 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
1be80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  .  }.  sqlite3_b
1be90 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  ind_int(pStmt, 1
1bea0 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f  , FTS_STAT_DOCTO
1beb0 54 41 4c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  TAL);.  if( sqli
1bec0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
1bed0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1bee0 20 20 20 66 74 73 33 44 65 63 6f 64 65 49 6e 74     fts3DecodeInt
1bef0 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61 2c 0a  Array(nStat, a,.
1bf00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1bf10 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
1bf20 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  mt, 0),.        
1bf30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1bf40 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 29  bytes(pStmt, 0))
1bf50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
1bf60 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65  emset(a, 0, size
1bf70 6f 66 28 75 33 32 29 2a 28 6e 53 74 61 74 29 20  of(u32)*(nStat) 
1bf80 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
1bf90 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
1bfa0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1bfb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
1bfc0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
1bfd0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
1bfe0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1bff0 20 69 66 28 20 6e 43 68 6e 67 3c 30 20 26 26 20   if( nChng<0 && 
1c000 61 5b 30 5d 3c 28 75 33 32 29 28 2d 6e 43 68 6e  a[0]<(u32)(-nChn
1c010 67 29 20 29 7b 0a 20 20 20 20 61 5b 30 5d 20 3d  g) ){.    a[0] =
1c020 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c030 20 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e 67 3b 0a   a[0] += nChng;.
1c040 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1c050 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b 20 69  <p->nColumn+1; i
1c060 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20 78 20 3d  ++){.    u32 x =
1c070 20 61 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28   a[i+1];.    if(
1c080 20 78 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c 20 61   x+aSzIns[i] < a
1c090 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  SzDel[i] ){.    
1c0a0 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    x = 0;.    }el
1c0b0 73 65 7b 0a 20 20 20 20 20 20 78 20 3d 20 78 20  se{.      x = x 
1c0c0 2b 20 61 53 7a 49 6e 73 5b 69 5d 20 2d 20 61 53  + aSzIns[i] - aS
1c0d0 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  zDel[i];.    }. 
1c0e0 20 20 20 61 5b 69 2b 31 5d 20 3d 20 78 3b 0a 20     a[i+1] = x;. 
1c0f0 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 65 49   }.  fts3EncodeI
1c100 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61  ntArray(nStat, a
1c110 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29  , pBlob, &nBlob)
1c120 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ;.  rc = fts3Sql
1c130 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c  Stmt(p, SQL_REPL
1c140 41 43 45 5f 53 54 41 54 2c 20 26 70 53 74 6d 74  ACE_STAT, &pStmt
1c150 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1c160 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1c170 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20  ee(a);.    *pRC 
1c180 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
1c190 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1c1a0 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
1c1b0 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43 54  1, FTS_STAT_DOCT
1c1c0 4f 54 41 4c 29 3b 0a 20 20 73 71 6c 69 74 65 33  OTAL);.  sqlite3
1c1d0 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
1c1e0 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  , 2, pBlob, nBlo
1c1f0 62 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  b, SQLITE_STATIC
1c200 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
1c210 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43  p(pStmt);.  *pRC
1c220 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
1c230 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74  (pStmt);.  sqlit
1c240 65 33 5f 66 72 65 65 28 61 29 3b 0a 7d 0a 0a 2f  e3_free(a);.}../
1c250 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 68 65 20 65  *.** Merge the e
1c260 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20 73  ntire database s
1c270 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
1c280 6f 6e 65 20 73 65 67 6d 65 6e 74 20 66 6f 72 20  one segment for 
1c290 65 61 63 68 20 0a 2a 2a 20 69 49 6e 64 65 78 2f  each .** iIndex/
1c2a0 69 4c 61 6e 67 69 64 20 63 6f 6d 62 69 6e 61 74  iLangid combinat
1c2b0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1c2c0 6e 74 20 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a  nt fts3DoOptimiz
1c2d0 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  e(Fts3Table *p, 
1c2e0 69 6e 74 20 62 52 65 74 75 72 6e 44 6f 6e 65 29  int bReturnDone)
1c2f0 7b 0a 20 20 69 6e 74 20 62 53 65 65 6e 44 6f 6e  {.  int bSeenDon
1c300 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  e = 0;.  int rc;
1c310 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1c320 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 30 3b  *pAllLangid = 0;
1c330 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
1c340 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
1c350 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26  CT_ALL_LANGID, &
1c360 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a  pAllLangid, 0);.
1c370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c380 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
1c390 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  c2;.    sqlite3_
1c3a0 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e  bind_int(pAllLan
1c3b0 67 69 64 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76  gid, 1, p->iPrev
1c3c0 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  Langid);.    sql
1c3d0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41  ite3_bind_int(pA
1c3e0 6c 6c 4c 61 6e 67 69 64 2c 20 32 2c 20 70 2d 3e  llLangid, 2, p->
1c3f0 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69  nIndex);.    whi
1c400 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
1c410 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51  (pAllLangid)==SQ
1c420 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1c430 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1c440 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c  nt iLangid = sql
1c450 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
1c460 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a  pAllLangid, 0);.
1c470 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
1c480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c490 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b  i<p->nIndex; i++
1c4a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c4b0 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65  fts3SegmentMerge
1c4c0 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20  (p, iLangid, i, 
1c4d0 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41  FTS3_SEGCURSOR_A
1c4e0 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  LL);.        if(
1c4f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 53   ){.          bS
1c510 65 65 6e 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  eenDone = 1;.   
1c520 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c530 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
1c540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c550 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1c560 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61 6e 67 69  _reset(pAllLangi
1c570 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1c580 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
1c590 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c   rc2;.  }..  sql
1c5a0 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
1c5b0 43 6c 6f 73 65 28 70 29 3b 0a 20 20 73 71 6c 69  Close(p);.  sqli
1c5c0 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
1c5d0 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20  rmsClear(p);..  
1c5e0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
1c5f0 54 45 5f 4f 4b 20 26 26 20 62 52 65 74 75 72 6e  TE_OK && bReturn
1c600 44 6f 6e 65 20 26 26 20 62 53 65 65 6e 44 6f 6e  Done && bSeenDon
1c610 65 29 20 3f 20 53 51 4c 49 54 45 5f 44 4f 4e 45  e) ? SQLITE_DONE
1c620 20 3a 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : rc;.}../*.** 
1c630 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c640 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
1c650 20 75 73 65 72 20 65 78 65 63 75 74 65 73 20 74   user executes t
1c660 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
1c670 74 65 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  tement:.**.**   
1c680 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74    INSERT INTO <t
1c690 62 6c 3e 28 3c 74 62 6c 3e 29 20 56 41 4c 55 45  bl>(<tbl>) VALUE
1c6a0 53 28 27 72 65 62 75 69 6c 64 27 29 3b 0a 2a 2a  S('rebuild');.**
1c6b0 0a 2a 2a 20 54 68 65 20 65 6e 74 69 72 65 20 46  .** The entire F
1c6c0 54 53 20 69 6e 64 65 78 20 69 73 20 64 69 73 63  TS index is disc
1c6d0 61 72 64 65 64 20 61 6e 64 20 72 65 62 75 69 6c  arded and rebuil
1c6e0 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
1c6f0 69 73 20 6f 6e 65 20 0a 2a 2a 20 63 72 65 61 74  is one .** creat
1c700 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6e  ed using the con
1c710 74 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c  tent=xxx option,
1c720 20 74 68 65 6e 20 74 68 65 20 6e 65 77 20 69 6e   then the new in
1c730 64 65 78 20 69 73 20 62 61 73 65 64 20 6f 6e 0a  dex is based on.
1c740 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
1c750 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 78  ontents of the x
1c760 78 78 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  xx table. Otherw
1c770 69 73 65 2c 20 69 74 20 69 73 20 72 65 62 75 69  ise, it is rebui
1c780 6c 74 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74  lt based.** on t
1c790 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1c7a0 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  he %_content tab
1c7b0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c7c0 74 20 66 74 73 33 44 6f 52 65 62 75 69 6c 64 28  t fts3DoRebuild(
1c7d0 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20  Fts3Table *p){. 
1c7e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1c810 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 44  */..  rc = fts3D
1c820 65 6c 65 74 65 41 6c 6c 28 70 2c 20 30 29 3b 0a  eleteAll(p, 0);.
1c830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c840 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 33 32 20 2a  _OK ){.    u32 *
1c850 61 53 7a 20 3d 20 30 3b 0a 20 20 20 20 75 33 32  aSz = 0;.    u32
1c860 20 2a 61 53 7a 49 6e 73 20 3d 20 30 3b 0a 20 20   *aSzIns = 0;.  
1c870 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 20 3d 20    u32 *aSzDel = 
1c880 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  0;.    sqlite3_s
1c890 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1c8a0 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d      int nEntry =
1c8b0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70   0;..    /* Comp
1c8c0 6f 73 65 20 61 6e 64 20 70 72 65 70 61 72 65 20  ose and prepare 
1c8d0 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
1c8e0 20 74 6f 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68   to loop through
1c8f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
1c900 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
1c910 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1c920 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 25  printf("SELECT %
1c930 73 22 20 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70  s" , p->zReadExp
1c940 72 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  rlist);.    if( 
1c950 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72  !zSql ){.      r
1c960 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c980 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1c990 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1c9a0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
1c9b0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mt, 0);.      sq
1c9c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1c9d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1c9e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c9f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
1ca00 65 20 3d 20 73 69 7a 65 6f 66 28 75 33 32 29 20  e = sizeof(u32) 
1ca10 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29  * (p->nColumn+1)
1ca20 2a 33 3b 0a 20 20 20 20 20 20 61 53 7a 20 3d 20  *3;.      aSz = 
1ca30 28 75 33 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d  (u32 *)sqlite3_m
1ca40 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
1ca50 20 20 20 20 69 66 28 20 61 53 7a 3d 3d 30 20 29      if( aSz==0 )
1ca60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ca70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ca80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca90 20 20 6d 65 6d 73 65 74 28 61 53 7a 2c 20 30 2c    memset(aSz, 0,
1caa0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
1cab0 20 61 53 7a 49 6e 73 20 3d 20 26 61 53 7a 5b 70   aSzIns = &aSz[p
1cac0 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20  ->nColumn+1];.  
1cad0 20 20 20 20 20 20 61 53 7a 44 65 6c 20 3d 20 26        aSzDel = &
1cae0 61 53 7a 49 6e 73 5b 70 2d 3e 6e 43 6f 6c 75 6d  aSzIns[p->nColum
1caf0 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n+1];.      }.  
1cb00 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20    }..    while( 
1cb10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1cb20 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
1cb30 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1cb40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
1cb50 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  ol;.      int iL
1cb60 61 6e 67 69 64 20 3d 20 6c 61 6e 67 69 64 46 72  angid = langidFr
1cb70 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 74 6d  omSelect(p, pStm
1cb80 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  t);.      rc = f
1cb90 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44  ts3PendingTermsD
1cba0 6f 63 69 64 28 70 2c 20 30 2c 20 69 4c 61 6e 67  ocid(p, 0, iLang
1cbb0 69 64 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id, sqlite3_colu
1cbc0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
1cbd0 30 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0));.      memse
1cbe0 74 28 61 53 7a 2c 20 30 2c 20 73 69 7a 65 6f 66  t(aSz, 0, sizeof
1cbf0 28 61 53 7a 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  (aSz[0]) * (p->n
1cc00 43 6f 6c 75 6d 6e 2b 31 29 29 3b 0a 20 20 20 20  Column+1));.    
1cc10 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 72 63    for(iCol=0; rc
1cc20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1cc30 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Col<p->nColumn; 
1cc40 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
1cc50 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64   if( p->abNotind
1cc60 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b  exed[iCol]==0 ){
1cc70 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
1cc80 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
1cc90 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
1cca0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
1ccb0 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20  tmt, iCol+1);.  
1ccc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
1ccd0 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64  3PendingTermsAdd
1cce0 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 7a 2c 20  (p, iLangid, z, 
1ccf0 69 43 6f 6c 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d  iCol, &aSz[iCol]
1cd00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a  );.          aSz
1cd10 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20  [p->nColumn] += 
1cd20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1cd30 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c  ytes(pStmt, iCol
1cd40 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +1);.        }. 
1cd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1cd60 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20   p->bHasDocsize 
1cd70 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 49  ){.        fts3I
1cd80 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63  nsertDocsize(&rc
1cd90 2c 20 70 2c 20 61 53 7a 29 3b 0a 20 20 20 20 20  , p, aSz);.     
1cda0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
1cdb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cdc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
1cdd0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1cde0 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30         pStmt = 0
1cdf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ce00 20 20 20 20 20 20 20 6e 45 6e 74 72 79 2b 2b 3b         nEntry++;
1ce10 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
1ce20 6c 3d 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43  l=0; iCol<=p->nC
1ce30 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  olumn; iCol++){.
1ce40 20 20 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73            aSzIns
1ce50 5b 69 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b 69 43  [iCol] += aSz[iC
1ce60 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ol];.        }. 
1ce70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ce80 20 69 66 28 20 70 2d 3e 62 46 74 73 34 20 29 7b   if( p->bFts4 ){
1ce90 0a 20 20 20 20 20 20 66 74 73 33 55 70 64 61 74  .      fts3Updat
1cea0 65 44 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c 20  eDocTotals(&rc, 
1ceb0 70 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65  p, aSzIns, aSzDe
1cec0 6c 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20  l, nEntry);.    
1ced0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
1cee0 65 65 28 61 53 7a 29 3b 0a 0a 20 20 20 20 69 66  ee(aSz);..    if
1cef0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ( pStmt ){.     
1cf00 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
1cf10 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1cf20 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1cf30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cf40 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
1cf50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cf60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1cf70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1cf80 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e 73 20 61  function opens a
1cf90 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
1cfa0 72 65 61 64 20 74 68 65 20 69 6e 70 75 74 20 64  read the input d
1cfb0 61 74 61 20 66 6f 72 20 61 6e 20 0a 2a 2a 20 69  ata for an .** i
1cfc0 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
1cfd0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 70 65 63   operation. Spec
1cfe0 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 6f 70 65  ifically, it ope
1cff0 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f 20 73  ns a cursor to s
1d000 63 61 6e 0a 2a 2a 20 74 68 65 20 6f 6c 64 65 73  can.** the oldes
1d010 74 20 6e 53 65 67 20 73 65 67 6d 65 6e 74 73 20  t nSeg segments 
1d020 28 69 64 78 3d 30 20 74 68 72 6f 75 67 68 20 69  (idx=0 through i
1d030 64 78 3d 28 6e 53 65 67 2d 31 29 29 20 69 6e 20  dx=(nSeg-1)) in 
1d040 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65 76  absolute .** lev
1d050 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2f  el iAbsLevel..*/
1d060 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1d070 49 6e 63 72 6d 65 72 67 65 43 73 72 28 0a 20 20  IncrmergeCsr(.  
1d080 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61  /* FTS3 table ha
1d0b0 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
1d0c0 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65  3_int64 iAbsLeve
1d0d0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73  l,        /* Abs
1d0e0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20 6f  olute level to o
1d0f0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  pen */.  int nSe
1d100 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1d110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d120 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
1d130 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73  o merge */.  Fts
1d140 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
1d150 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20  *pCsr        /* 
1d160 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f  Cursor object to
1d170 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
1d180 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1d1b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1d1c0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
1d1d0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
1d1e0 6e 74 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  nt used to read 
1d1f0 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20 2a  %_segdir entry *
1d200 2f 20 20 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  /  .  int nByte;
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61        /* Bytes a
1d230 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 43 73 72  llocated at pCsr
1d240 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 2a 2f  ->apSegment[] */
1d250 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1d260 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 46 74  space for the Ft
1d270 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
1d280 2e 61 43 73 72 5b 5d 20 61 72 72 61 79 20 2a 2f  .aCsr[] array */
1d290 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20  .  memset(pCsr, 
1d2a0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29  0, sizeof(*pCsr)
1d2b0 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  );.  nByte = siz
1d2c0 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65  eof(Fts3SegReade
1d2d0 72 20 2a 29 20 2a 20 6e 53 65 67 3b 0a 20 20 70  r *) * nSeg;.  p
1d2e0 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d  Csr->apSegment =
1d2f0 20 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20   (Fts3SegReader 
1d300 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  **)sqlite3_mallo
1d310 63 28 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28  c(nByte);..  if(
1d320 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
1d330 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1d340 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1d350 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
1d360 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  t(pCsr->apSegmen
1d370 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  t, 0, nByte);.  
1d380 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
1d390 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
1d3a0 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20  _LEVEL, &pStmt, 
1d3b0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1d3c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d3d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1d3e0 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  t rc2;.    sqlit
1d3f0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
1d400 74 6d 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  tmt, 1, iAbsLeve
1d410 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
1d420 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  pCsr->nSegment==
1d430 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 );.    for(i=0
1d440 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1d450 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
1d460 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
1d470 4f 57 20 26 26 20 69 3c 6e 53 65 67 3b 20 69 2b  OW && i<nSeg; i+
1d480 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  +){.      rc = s
1d490 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
1d4a0 64 65 72 4e 65 77 28 69 2c 20 30 2c 0a 20 20 20  derNew(i, 0,.   
1d4b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1d4c0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
1d4d0 74 2c 20 31 29 2c 20 20 20 20 20 20 20 20 2f 2a  t, 1),        /*
1d4e0 20 73 65 67 64 69 72 2e 73 74 61 72 74 5f 62 6c   segdir.start_bl
1d4f0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ock */.         
1d500 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d510 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 29 2c  int64(pStmt, 2),
1d520 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69          /* segdi
1d530 72 2e 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f  r.leaves_end_blo
1d540 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ck */.          
1d550 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1d560 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 29 2c 20  nt64(pStmt, 3), 
1d570 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72         /* segdir
1d580 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20  .end_block */.  
1d590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1d5a0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
1d5b0 74 2c 20 34 29 2c 20 20 20 20 20 20 20 20 20 2f  t, 4),         /
1d5c0 2a 20 73 65 67 64 69 72 2e 72 6f 6f 74 20 2a 2f  * segdir.root */
1d5d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d5e0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1d5f0 70 53 74 6d 74 2c 20 34 29 2c 20 20 20 20 20 20  pStmt, 4),      
1d600 20 20 2f 2a 20 73 65 67 64 69 72 2e 72 6f 6f 74    /* segdir.root
1d610 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 26 70   */.          &p
1d620 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69  Csr->apSegment[i
1d630 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ].      );.     
1d640 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2b   pCsr->nSegment+
1d650 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32  +;.    }.    rc2
1d660 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
1d670 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
1d680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d690 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a   rc = rc2;.  }..
1d6a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d6b0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
1d6c0 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 49  ncrmergeWriter I
1d6d0 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 3b 0a  ncrmergeWriter;.
1d6e0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4e  typedef struct N
1d6f0 6f 64 65 57 72 69 74 65 72 20 4e 6f 64 65 57 72  odeWriter NodeWr
1d700 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  iter;.typedef st
1d710 72 75 63 74 20 42 6c 6f 62 20 42 6c 6f 62 3b 0a  ruct Blob Blob;.
1d720 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4e  typedef struct N
1d730 6f 64 65 52 65 61 64 65 72 20 4e 6f 64 65 52 65  odeReader NodeRe
1d740 61 64 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ader;../*.** An 
1d750 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1d760 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1d770 75 72 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ure is used as a
1d780 20 64 79 6e 61 6d 69 63 20 62 75 66 66 65 72 0a   dynamic buffer.
1d790 2a 2a 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6e  ** to build up n
1d7a0 6f 64 65 73 20 6f 72 20 6f 74 68 65 72 20 62 6c  odes or other bl
1d7b0 6f 62 73 20 6f 66 20 64 61 74 61 20 69 6e 2e 0a  obs of data in..
1d7c0 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  **.** The functi
1d7d0 6f 6e 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65  on blobGrowBuffe
1d7e0 72 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 65  r() is used to e
1d7f0 78 74 65 6e 64 20 74 68 65 20 61 6c 6c 6f 63 61  xtend the alloca
1d800 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
1d810 42 6c 6f 62 20 7b 0a 20 20 63 68 61 72 20 2a 61  Blob {.  char *a
1d820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d830 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1d840 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61 74 69 6f  ter to allocatio
1d850 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  n */.  int n;   
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d880 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20   of valid bytes 
1d890 6f 66 20 64 61 74 61 20 69 6e 20 61 5b 5d 20 2a  of data in a[] *
1d8a0 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
1d8d0 20 73 69 7a 65 20 6f 66 20 61 5b 5d 20 28 6e 41   size of a[] (nA
1d8e0 6c 6c 6f 63 3e 3d 6e 29 20 2a 2f 0a 7d 3b 0a 0a  lloc>=n) */.};..
1d8f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63  /*.** This struc
1d900 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
1d910 62 75 69 6c 64 20 75 70 20 62 75 66 66 65 72 73  build up buffers
1d920 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d   containing segm
1d930 65 6e 74 20 62 2d 74 72 65 65 20 0a 2a 2a 20 6e  ent b-tree .** n
1d940 6f 64 65 73 20 28 62 6c 6f 63 6b 73 29 2e 0a 2a  odes (blocks)..*
1d950 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65 57 72 69  /.struct NodeWri
1d960 74 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter {.  sqlite3_
1d970 69 6e 74 36 34 20 69 42 6c 6f 63 6b 3b 20 20 20  int64 iBlock;   
1d980 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1d990 6e 74 20 62 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20  nt block id */. 
1d9a0 20 42 6c 6f 62 20 6b 65 79 3b 20 20 20 20 20 20   Blob key;      
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 2f 2a 20 4c 61 73 74 20 6b 65 79 20 77 72 69   /* Last key wri
1d9d0 74 74 65 6e 20 74 6f 20 74 68 65 20 63 75 72 72  tten to the curr
1d9e0 65 6e 74 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 42  ent block */.  B
1d9f0 6c 6f 62 20 62 6c 6f 63 6b 3b 20 20 20 20 20 20  lob block;      
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da10 2a 20 43 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20  * Current block 
1da20 69 6d 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  image */.};../*.
1da30 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20  ** An object of 
1da40 74 68 69 73 20 74 79 70 65 20 63 6f 6e 74 61 69  this type contai
1da50 6e 73 20 74 68 65 20 73 74 61 74 65 20 72 65 71  ns the state req
1da60 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
1da70 6f 72 20 61 70 70 65 6e 64 0a 2a 2a 20 74 6f 20  or append.** to 
1da80 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 62 2d  an appendable b-
1da90 74 72 65 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f  tree segment..*/
1daa0 0a 73 74 72 75 63 74 20 49 6e 63 72 6d 65 72 67  .struct Incrmerg
1dab0 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  eWriter {.  int 
1dac0 6e 4c 65 61 66 45 73 74 3b 20 20 20 20 20 20 20  nLeafEst;       
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1dae0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1daf0 6f 72 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 2a  or leaf blocks *
1db00 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20  /.  int nWork;  
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1db30 20 6c 65 61 66 20 70 61 67 65 73 20 66 6c 75 73   leaf pages flus
1db40 68 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  hed */.  sqlite3
1db50 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
1db60 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ;        /* Abso
1db70 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e  lute level of in
1db80 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
1db90 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 2a 6f    /* Index of *o
1dbc0 75 74 70 75 74 2a 20 73 65 67 6d 65 6e 74 20 69  utput* segment i
1dbd0 6e 20 69 41 62 73 4c 65 76 65 6c 2b 31 20 2a 2f  n iAbsLevel+1 */
1dbe0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1dbf0 20 69 53 74 61 72 74 3b 20 20 20 20 20 20 20 20   iStart;        
1dc00 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62     /* Block numb
1dc10 65 72 20 6f 66 20 66 69 72 73 74 20 61 6c 6c 6f  er of first allo
1dc20 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20  cated block */. 
1dc30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1dc40 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
1dc50 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72   /* Block number
1dc60 20 6f 66 20 6c 61 73 74 20 61 6c 6c 6f 63 61 74   of last allocat
1dc70 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71  ed block */.  sq
1dc80 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 65 61  lite3_int64 nLea
1dc90 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a  fData;        /*
1dca0 20 42 79 74 65 73 20 6f 66 20 6c 65 61 66 20 70   Bytes of leaf p
1dcb0 61 67 65 20 64 61 74 61 20 73 6f 20 66 61 72 20  age data so far 
1dcc0 2a 2f 0a 20 20 75 38 20 62 4e 6f 4c 65 61 66 44  */.  u8 bNoLeafD
1dcd0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1dce0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
1dcf0 20 73 74 6f 72 65 20 30 20 66 6f 72 20 73 65 67   store 0 for seg
1dd00 6d 65 6e 74 20 73 69 7a 65 20 2a 2f 0a 20 20 4e  ment size */.  N
1dd10 6f 64 65 57 72 69 74 65 72 20 61 4e 6f 64 65 57  odeWriter aNodeW
1dd20 72 69 74 65 72 5b 46 54 53 5f 4d 41 58 5f 41 50  riter[FTS_MAX_AP
1dd30 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 5d  PENDABLE_HEIGHT]
1dd40 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f  ;.};../*.** An o
1dd50 62 6a 65 63 74 20 6f 66 20 74 68 65 20 66 6f 6c  bject of the fol
1dd60 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20 75  lowing type is u
1dd70 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
1dd80 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 0a 2a   from a single.*
1dd90 2a 20 46 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f  * FTS segment no
1dda0 64 65 2e 20 53 65 65 20 74 68 65 20 66 6f 6c 6c  de. See the foll
1ddb0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
1ddc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52  .**.**     nodeR
1ddd0 65 61 64 65 72 49 6e 69 74 28 29 0a 2a 2a 20 20  eaderInit().**  
1dde0 20 20 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78     nodeReaderNex
1ddf0 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52  t().**     nodeR
1de00 65 61 64 65 72 52 65 6c 65 61 73 65 28 29 0a 2a  eaderRelease().*
1de10 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65 52 65 61  /.struct NodeRea
1de20 64 65 72 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  der {.  const ch
1de30 61 72 20 2a 61 4e 6f 64 65 3b 0a 20 20 69 6e 74  ar *aNode;.  int
1de40 20 6e 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 69 4f   nNode;.  int iO
1de50 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1de60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1de70 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68  rent offset with
1de80 69 6e 20 61 4e 6f 64 65 5b 5d 20 2a 2f 0a 0a 20  in aNode[] */.. 
1de90 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
1dea0 62 6c 65 73 2e 20 43 6f 6e 74 61 69 6e 69 6e 67  bles. Containing
1deb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
1dec0 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71  e entry. */.  sq
1ded0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 68 69  lite3_int64 iChi
1dee0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ld;           /*
1def0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68 69 6c   Pointer to chil
1df00 64 20 6e 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62  d node */.  Blob
1df10 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
1df20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1df30 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
1df40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f   const char *aDo
1df50 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
1df60 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
1df70 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
1df80 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
1df90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1dfa0 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  ize of doclist i
1dfb0 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  n bytes */.};../
1dfc0 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
1dfd0 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  not SQLITE_OK wh
1dfe0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1dff0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
1e000 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
1e010 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1e020 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 20 70 42  allocation at pB
1e030 6c 6f 62 2d 3e 61 20 69 73 20 6e 6f 74 20 61 6c  lob->a is not al
1e040 72 65 61 64 79 20 61 74 20 6c 65 61 73 74 20 6e  ready at least n
1e050 4d 69 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  Min.** bytes in 
1e060 73 69 7a 65 2c 20 65 78 74 65 6e 64 20 28 72 65  size, extend (re
1e070 61 6c 6c 6f 63 29 20 69 74 20 74 6f 20 62 65 20  alloc) it to be 
1e080 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  so..**.** If an 
1e090 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
1e0a0 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20 53 51  , set *pRc to SQ
1e0b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 6c  LITE_NOMEM and l
1e0c0 65 61 76 65 20 70 42 6c 6f 62 2d 3e 61 0a 2a 2a  eave pBlob->a.**
1e0d0 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 4f 74 68   unmodified. Oth
1e0e0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 61  erwise, if the a
1e0f0 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63 65 65  llocation succee
1e100 64 73 2c 20 75 70 64 61 74 65 20 70 42 6c 6f 62  ds, update pBlob
1e110 2d 3e 6e 41 6c 6c 6f 63 0a 2a 2a 20 74 6f 20 72  ->nAlloc.** to r
1e120 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73  eflect the new s
1e130 69 7a 65 20 6f 66 20 74 68 65 20 70 42 6c 6f 62  ize of the pBlob
1e140 2d 3e 61 5b 5d 20 62 75 66 66 65 72 2e 0a 2a 2f  ->a[] buffer..*/
1e150 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 6c 6f  .static void blo
1e160 62 47 72 6f 77 42 75 66 66 65 72 28 42 6c 6f 62  bGrowBuffer(Blob
1e170 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 4d 69   *pBlob, int nMi
1e180 6e 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  n, int *pRc){.  
1e190 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
1e1a0 5f 4f 4b 20 26 26 20 6e 4d 69 6e 3e 70 42 6c 6f  _OK && nMin>pBlo
1e1b0 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  b->nAlloc ){.   
1e1c0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d   int nAlloc = nM
1e1d0 69 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 61 20  in;.    char *a 
1e1e0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1e1f0 33 5f 72 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2d  3_realloc(pBlob-
1e200 3e 61 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20  >a, nAlloc);.   
1e210 20 69 66 28 20 61 20 29 7b 0a 20 20 20 20 20 20   if( a ){.      
1e220 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pBlob->nAlloc = 
1e230 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 70 42  nAlloc;.      pB
1e240 6c 6f 62 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20  lob->a = a;.    
1e250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
1e260 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1e270 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1e280 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1e290 61 64 76 61 6e 63 65 20 74 68 65 20 6e 6f 64 65  advance the node
1e2a0 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70  -reader object p
1e2b0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1e2c0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
1e2d0 2a 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  * the next entry
1e2e0 20 6f 6e 20 74 68 65 20 6e 6f 64 65 2e 20 0a 2a   on the node. .*
1e2f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
1e300 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
1e310 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 53 51  error occurs (SQ
1e320 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 70 6f  LITE_NOMEM is po
1e330 73 73 69 62 6c 65 29 2e 20 0a 2a 2a 20 4f 74 68  ssible). .** Oth
1e340 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 53 51  erwise return SQ
1e350 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1e360 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 65 6e 74  e is no next ent
1e370 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 0a 2a  ry on the node.*
1e380 2a 20 28 65 2e 67 2e 20 62 65 63 61 75 73 65 20  * (e.g. because 
1e390 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1e3a0 79 20 69 73 20 74 68 65 20 6c 61 73 74 29 20 73  y is the last) s
1e3b0 65 74 20 4e 6f 64 65 52 65 61 64 65 72 2d 3e 61  et NodeReader->a
1e3c0 4e 6f 64 65 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 20  Node to.** NULL 
1e3d0 74 6f 20 69 6e 64 69 63 61 74 65 20 45 4f 46 2e  to indicate EOF.
1e3e0 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
1e3f0 6c 61 74 65 20 74 68 65 20 4e 6f 64 65 52 65 61  late the NodeRea
1e400 64 65 72 20 73 74 72 75 63 74 75 72 65 20 6f 75  der structure ou
1e410 74 70 75 74 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tput .** variabl
1e420 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  es for the new e
1e430 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
1e440 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 4e 65  int nodeReaderNe
1e450 78 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70  xt(NodeReader *p
1e460 29 7b 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20  ){.  int bFirst 
1e470 3d 20 28 70 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 29  = (p->term.n==0)
1e480 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72  ;    /* True for
1e490 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
1e4a0 68 65 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  he node */.  int
1e4b0 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 20 20 20   nPrefix = 0;   
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e4d0 42 79 74 65 73 20 74 6f 20 63 6f 70 79 20 66 72  Bytes to copy fr
1e4e0 6f 6d 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  om previous term
1e4f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69   */.  int nSuffi
1e500 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
1e510 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
1e520 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20  o append to the 
1e530 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20  prefix */.  int 
1e540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e560 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1e570 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4e 6f 64   assert( p->aNod
1e580 65 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 43  e );.  if( p->iC
1e590 68 69 6c 64 20 26 26 20 62 46 69 72 73 74 3d 3d  hild && bFirst==
1e5a0 30 20 29 20 70 2d 3e 69 43 68 69 6c 64 2b 2b 3b  0 ) p->iChild++;
1e5b0 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 3e 3d  .  if( p->iOff>=
1e5c0 70 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20  p->nNode ){.    
1e5d0 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20 20 70 2d  /* EOF */.    p-
1e5e0 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65  >aNode = 0;.  }e
1e5f0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 46 69  lse{.    if( bFi
1e600 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
1e610 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 33 47  p->iOff += fts3G
1e620 65 74 56 61 72 69 6e 74 33 32 28 26 70 2d 3e 61  etVarint32(&p->a
1e630 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26  Node[p->iOff], &
1e640 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a  nPrefix);.    }.
1e650 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66      p->iOff += f
1e660 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts3GetVarint32(&
1e670 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1e680 5d 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a 0a 20  ], &nSuffix);.. 
1e690 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65     blobGrowBuffe
1e6a0 72 28 26 70 2d 3e 74 65 72 6d 2c 20 6e 50 72 65  r(&p->term, nPre
1e6b0 66 69 78 2b 6e 53 75 66 66 69 78 2c 20 26 72 63  fix+nSuffix, &rc
1e6c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e6d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e6e0 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 74 65 72    memcpy(&p->ter
1e6f0 6d 2e 61 5b 6e 50 72 65 66 69 78 5d 2c 20 26 70  m.a[nPrefix], &p
1e700 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d  ->aNode[p->iOff]
1e710 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
1e720 20 20 70 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50    p->term.n = nP
1e730 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20  refix+nSuffix;. 
1e740 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20       p->iOff += 
1e750 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 69  nSuffix;.      i
1e760 66 28 20 70 2d 3e 69 43 68 69 6c 64 3d 3d 30 20  f( p->iChild==0 
1e770 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  ){.        p->iO
1e780 66 66 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72  ff += fts3GetVar
1e790 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b  int32(&p->aNode[
1e7a0 70 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e 6e 44  p->iOff], &p->nD
1e7b0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
1e7c0 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 26   p->aDoclist = &
1e7d0 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1e7e0 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  ];.        p->iO
1e7f0 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63 6c 69 73  ff += p->nDoclis
1e800 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1e810 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e820 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e 6f 64  p->iOff<=p->nNod
1e830 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  e );..  return r
1e840 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
1e850 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69 63 20  ase all dynamic 
1e860 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64 20 62  resources held b
1e870 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62  y node-reader ob
1e880 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74 61 74  ject *p..*/.stat
1e890 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65 61 64  ic void nodeRead
1e8a0 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65 52 65  erRelease(NodeRe
1e8b0 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ader *p){.  sqli
1e8c0 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65 72 6d  te3_free(p->term
1e8d0 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .a);.}../*.** In
1e8e0 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64 65 2d  itialize a node-
1e8f0 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f  reader object to
1e900 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65 20 69   read the node i
1e910 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65 2f 6e  n buffer aNode/n
1e920 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  Node..**.** If s
1e930 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
1e940 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e950 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52 65 61   and the NodeRea
1e960 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74 20 74  der object set t
1e970 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  o .** point to t
1e980 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 6f  he first entry o
1e990 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66 20 61  n the node (if a
1e9a0 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ny). Otherwise, 
1e9b0 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
1e9c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1e9d0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1e9e0 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69  nt nodeReaderIni
1e9f0 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 2c  t(NodeReader *p,
1ea00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f   const char *aNo
1ea10 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29 7b 0a  de, int nNode){.
1ea20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1ea30 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64 65 72  izeof(NodeReader
1ea40 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65 20 3d  ));.  p->aNode =
1ea50 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e 4e 6f   aNode;.  p->nNo
1ea60 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20 20 2f  de = nNode;..  /
1ea70 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
1ea80 74 68 69 73 20 69 73 20 61 20 6c 65 61 66 20 6f  this is a leaf o
1ea90 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  r an internal no
1eaa0 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  de. */.  if( p->
1eab0 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20 20 20  aNode[0] ){.    
1eac0 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  /* An internal n
1ead0 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  ode. */.    p->i
1eae0 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  Off = 1 + sqlite
1eaf0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26  3Fts3GetVarint(&
1eb00 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26 70 2d  p->aNode[1], &p-
1eb10 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73  >iChild);.  }els
1eb20 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d  e{.    p->iOff =
1eb30 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
1eb40 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74  n nodeReaderNext
1eb50 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
1eb60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1eb70 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  alled while writ
1eb80 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67 6d 65  ing an FTS segme
1eb90 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61 20 6c  nt each time a l
1eba0 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20 69 73  eaf o.** node is
1ebb0 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 77 72   finished and wr
1ebc0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54  itten to disk. T
1ebd0 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f 6e 54  he key (zTerm/nT
1ebe0 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e 74 65  erm) is guarante
1ebf0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72 65 61  ed.** to be grea
1ec00 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
1ec10 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68 65 20  gest key on the 
1ec20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65  node just writte
1ec30 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72 0a 2a  n, but smaller.*
1ec40 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  * than or equal 
1ec50 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b 65 79  to the first key
1ec60 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 77 72   that will be wr
1ec70 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 65 78  itten to the nex
1ec80 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65 2e 0a  t leaf.** node..
1ec90 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63 6b 20  **.** The block 
1eca0 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e  id of the leaf n
1ecb0 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ode just written
1ecc0 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62 65 20   to disk may be 
1ecd0 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70 57 72  found in.** (pWr
1ece0 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
1ecf0 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77 68 65  r[0].iBlock) whe
1ed00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1ed10 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
1ed20 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
1ed30 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20 46 74  rmergePush(.  Ft
1ed40 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed60 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64   Fts3 table hand
1ed70 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67  le */.  Incrmerg
1ed80 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  eWriter *pWriter
1ed90 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
1eda0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
1edb0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1edd0 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65 20 74   Term to write t
1ede0 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  o internal node 
1edf0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20  */.  int nTerm  
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 74       /* Bytes at
1ee20 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 73   zTerm */.){.  s
1ee30 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 74  qlite3_int64 iPt
1ee40 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f  r = pWriter->aNo
1ee50 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f  deWriter[0].iBlo
1ee60 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79 65 72  ck;.  int iLayer
1ee70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  ;..  assert( nTe
1ee80 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28 69 4c  rm>0 );.  for(iL
1ee90 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53 28 69  ayer=1; ALWAYS(i
1eea0 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f 41 50  Layer<FTS_MAX_AP
1eeb0 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 29  PENDABLE_HEIGHT)
1eec0 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20 20 20  ; iLayer++){.   
1eed0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1eee0 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20 20 20  NextPtr = 0;.   
1eef0 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f   NodeWriter *pNo
1ef00 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  de = &pWriter->a
1ef10 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61 79 65  NodeWriter[iLaye
1ef20 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  r];.    int rc =
1ef30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ef40 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20 20 20  int nPrefix;.   
1ef50 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a 20 20   int nSuffix;.  
1ef60 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 0a 20    int nSpace;.. 
1ef70 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
1ef80 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1ef90 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63 6f 6e  the key will con
1efa0 73 75 6d 65 20 69 66 20 69 74 20 69 73 20 77 72  sume if it is wr
1efb0 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
1efc0 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
1efd0 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72   of layer iLayer
1efe0 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70 72 65  . Due to the pre
1eff0 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 2c  fix compression,
1f000 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 70 61   .    ** the spa
1f010 63 65 20 72 65 71 75 69 72 65 64 20 63 68 61 6e  ce required chan
1f020 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ges depending on
1f030 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68 65 20   which node the 
1f040 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20 2a 2a  key is to.    **
1f050 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20 20 2a   be added to.  *
1f060 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  /.    nPrefix = 
1f070 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
1f080 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c  ss(pNode->key.a,
1f090 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c 20 7a   pNode->key.n, z
1f0a0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
1f0b0 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72    nSuffix = nTer
1f0c0 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20 20  m - nPrefix;.   
1f0d0 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c 69 74   nSpace  = sqlit
1f0e0 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
1f0f0 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 6e 53  nPrefix);.    nS
1f100 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
1f110 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
1f120 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b  ffix) + nSuffix;
1f130 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d  ..    if( pNode-
1f140 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28 70 4e  >key.n==0 || (pN
1f150 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e  ode->block.n + n
1f160 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f 64 65  Space)<=p->nNode
1f170 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20 20 2f  Size ){ .      /
1f180 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1f190 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69   node of layer i
1f1a0 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73 20 7a  Layer contains z
1f1b0 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69 66 20  ero keys, or if 
1f1c0 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  adding.      ** 
1f1d0 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20 77 69  the key to it wi
1f1e0 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69 74 20  ll not cause it 
1f1f0 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72 67 65  to grow to large
1f200 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69 7a 65  r than nNodeSize
1f210 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73   .      ** bytes
1f220 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74 65 20   in size, write 
1f230 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20 20 2a  the key here.  *
1f240 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20 2a 70  /..      Blob *p
1f250 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e 62 6c  Blk = &pNode->bl
1f260 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ock;.      if( p
1f270 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  Blk->n==0 ){.   
1f280 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66       blobGrowBuf
1f290 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e 4e 6f  fer(pBlk, p->nNo
1f2a0 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a 20 20  deSize, &rc);.  
1f2b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f2c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f2d0 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30 5d 20       pBlk->a[0] 
1f2e0 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b 0a  = (char)iLayer;.
1f2f0 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e            pBlk->
1f300 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46  n = 1 + sqlite3F
1f310 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts3PutVarint(&pB
1f320 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72 29 3b  lk->a[1], iPtr);
1f330 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f340 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47 72 6f   }.      blobGro
1f350 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 42  wBuffer(pBlk, pB
1f360 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65 2c 20  lk->n + nSpace, 
1f370 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62  &rc);.      blob
1f380 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64  GrowBuffer(&pNod
1f390 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c 20 26  e->key, nTerm, &
1f3a0 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  rc);..      if( 
1f3b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f  .        if( pNo
1f3d0 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20 20 20  de->key.n ){.   
1f3e0 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b         pBlk->n +
1f3f0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
1f400 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b  Varint(&pBlk->a[
1f410 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69  pBlk->n], nPrefi
1f420 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
1f430 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b 3d        pBlk->n +=
1f440 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
1f450 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 70  arint(&pBlk->a[p
1f460 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78  Blk->n], nSuffix
1f470 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
1f480 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d  y(&pBlk->a[pBlk-
1f490 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65  >n], &zTerm[nPre
1f4a0 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  fix], nSuffix);.
1f4b0 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20          pBlk->n 
1f4c0 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20  += nSuffix;..   
1f4d0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64       memcpy(pNod
1f4e0 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72 6d 2c  e->key.a, zTerm,
1f4f0 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   nTerm);.       
1f500 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20   pNode->key.n = 
1f510 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  nTerm;.      }. 
1f520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f530 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6c  /* Otherwise, fl
1f540 75 73 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ush the current 
1f550 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c  node of layer iL
1f560 61 79 65 72 20 74 6f 20 64 69 73 6b 2e 0a 20 20  ayer to disk..  
1f570 20 20 20 20 2a 2a 20 54 68 65 6e 20 61 6c 6c 6f      ** Then allo
1f580 63 61 74 65 20 61 20 6e 65 77 2c 20 65 6d 70 74  cate a new, empt
1f590 79 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65 2e 20  y sibling node. 
1f5a0 54 68 65 20 6b 65 79 20 77 69 6c 6c 20 62 65 20  The key will be 
1f5b0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 2a 2a  written.      **
1f5c0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
1f5d0 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e 20 2a   of this node. *
1f5e0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  /.      rc = fts
1f5f0 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c  3WriteSegment(p,
1f600 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20   pNode->iBlock, 
1f610 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pNode->block.a, 
1f620 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b  pNode->block.n);
1f630 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1f640 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c  pNode->block.nAl
1f650 6c 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a  loc>=p->nNodeSiz
1f660 65 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65  e );.      pNode
1f670 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 28  ->block.a[0] = (
1f680 63 68 61 72 29 69 4c 61 79 65 72 3b 0a 20 20 20  char)iLayer;.   
1f690 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e     pNode->block.
1f6a0 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46  n = 1 + sqlite3F
1f6b0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e  ts3PutVarint(&pN
1f6c0 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 31 5d 2c  ode->block.a[1],
1f6d0 20 69 50 74 72 2b 31 29 3b 0a 0a 20 20 20 20 20   iPtr+1);..     
1f6e0 20 69 4e 65 78 74 50 74 72 20 3d 20 70 4e 6f 64   iNextPtr = pNod
1f6f0 65 2d 3e 69 42 6c 6f 63 6b 3b 0a 20 20 20 20 20  e->iBlock;.     
1f700 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2b 2b   pNode->iBlock++
1f710 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b  ;.      pNode->k
1f720 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ey.n = 0;.    }.
1f730 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f740 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 78 74 50  ITE_OK || iNextP
1f750 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  tr==0 ) return r
1f760 63 3b 0a 20 20 20 20 69 50 74 72 20 3d 20 69 4e  c;.    iPtr = iN
1f770 65 78 74 50 74 72 3b 0a 20 20 7d 0a 0a 20 20 61  extPtr;.  }..  a
1f780 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 72 65  ssert( 0 );.  re
1f790 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1f7a0 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 61   Append a term a
1f7b0 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
1f7c0 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 46  doclist to the F
1f7d0 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20  TS segment node 
1f7e0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f  currently.** sto
1f7f0 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 4e 6f  red in blob *pNo
1f800 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e 65 65  de. The node nee
1f810 64 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  d not contain an
1f820 79 20 74 65 72 6d 73 2c 20 62 75 74 20 74 68 65  y terms, but the
1f830 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75 73 74 20  .** header must 
1f840 62 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  be written befor
1f850 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1f860 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1f870 20 41 20 6e 6f 64 65 20 68 65 61 64 65 72 20 69   A node header i
1f880 73 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30 20  s a single 0x00 
1f890 62 79 74 65 20 66 6f 72 20 61 20 6c 65 61 66 20  byte for a leaf 
1f8a0 6e 6f 64 65 2c 20 6f 72 20 61 20 68 65 69 67 68  node, or a heigh
1f8b0 74 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f 6c 6c  t varint.** foll
1f8c0 6f 77 65 64 20 62 79 20 74 68 65 20 6c 65 66 74  owed by the left
1f8d0 2d 68 61 6e 64 2d 63 68 69 6c 64 20 76 61 72 69  -hand-child vari
1f8e0 6e 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 72 6e  nt for an intern
1f8f0 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  al node..**.** T
1f900 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 70  he term to be ap
1f910 70 65 6e 64 65 64 20 69 73 20 70 61 73 73 65 64  pended is passed
1f920 20 76 69 61 20 61 72 67 75 6d 65 6e 74 73 20 7a   via arguments z
1f930 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f 72 20  Term/nTerm. For 
1f940 61 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64 65 2c  a .** leaf node,
1f950 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
1f960 70 61 73 73 65 64 20 61 73 20 61 44 6f 63 6c 69  passed as aDocli
1f970 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46 6f 72  st/nDoclist. For
1f980 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20   an internal.** 
1f990 6e 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f 63 6c  node, both aDocl
1f9a0 69 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69 73 74  ist and nDoclist
1f9b0 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
1f9c0 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
1f9d0 73 69 7a 65 20 6f 66 20 74 68 65 20 76 61 6c 75  size of the valu
1f9e0 65 20 69 6e 20 62 6c 6f 62 20 70 50 72 65 76 20  e in blob pPrev 
1f9f0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
1fa00 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
1fa10 2a 2a 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  ** term written 
1fa20 74 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f 74 68  to the node. Oth
1fa30 65 72 77 69 73 65 2c 20 70 50 72 65 76 20 63 6f  erwise, pPrev co
1fa40 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f 66  ntains a copy of
1fa50 20 74 68 65 20 0a 2a 2a 20 70 72 65 76 69 6f 75   the .** previou
1fa60 73 20 74 65 72 6d 2e 20 42 65 66 6f 72 65 20 74  s term. Before t
1fa70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1fa80 75 72 6e 73 2c 20 69 74 20 69 73 20 75 70 64 61  urns, it is upda
1fa90 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  ted to contain a
1faa0 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54 65 72  .** copy of zTer
1fab0 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 49  m/nTerm..**.** I
1fac0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1fad0 74 20 74 68 65 20 62 75 66 66 65 72 20 61 73 73  t the buffer ass
1fae0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4e 6f  ociated with pNo
1faf0 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 6c 61  de is already la
1fb00 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f  rge.** enough to
1fb10 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
1fb20 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 65 20   new entry. The 
1fb30 62 75 66 66 65 72 20 61 73 73 6f 63 69 61 74 65  buffer associate
1fb40 64 20 77 69 74 68 20 70 50 72 65 76 0a 2a 2a 20  d with pPrev.** 
1fb50 69 73 20 65 78 74 65 6e 64 65 64 20 62 79 20 74  is extended by t
1fb60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
1fb70 72 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  requrired..**.**
1fb80 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e   If an error (i.
1fb90 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  e. OOM condition
1fba0 29 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  ) occurs, an SQL
1fbb0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1fbc0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
1fbd0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1fbe0 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
1fbf0 6e 74 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e  nt fts3AppendToN
1fc00 6f 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70 4e 6f  ode(.  Blob *pNo
1fc10 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
1fc20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1fc30 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 74 6f 20  t node image to 
1fc40 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 42  append to */.  B
1fc50 6c 6f 62 20 2a 70 50 72 65 76 2c 20 20 20 20 20  lob *pPrev,     
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fc70 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
1fc80 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72  ing previous ter
1fc90 6d 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63  m written */.  c
1fca0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
1fcb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1fcc0 2a 20 4e 65 77 20 74 65 72 6d 20 74 6f 20 77 72  * New term to wr
1fcd0 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ite */.  int nTe
1fce0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
1fcf0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fd00 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
1fd10 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
1fd20 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20  ar *aDoclist,   
1fd30 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69          /* Docli
1fd40 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74 6f 20  st (or NULL) to 
1fd50 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
1fd60 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20  Doclist         
1fd70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1fd80 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69  ze of aDoclist i
1fd90 6e 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b 0a 20  n bytes */ .){. 
1fda0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1fdb0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1fdc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1fdd0 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20  */.  int bFirst 
1fde0 3d 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30 29 3b  = (pPrev->n==0);
1fdf0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1fe00 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1fe10 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 2a  t term written *
1fe20 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  /.  int nPrefix;
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1fe50 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79  erm prefix in by
1fe60 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  tes */.  int nSu
1fe70 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
1fe80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fe90 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20   of term suffix 
1fea0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
1feb0 2a 20 4e 6f 64 65 20 6d 75 73 74 20 68 61 76 65  * Node must have
1fec0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
1fed0 61 72 74 65 64 2e 20 54 68 65 72 65 20 6d 75 73  arted. There mus
1fee0 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20 66  t be a doclist f
1fef0 6f 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66 20 6e  or a.  ** leaf n
1ff00 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 6d  ode, and there m
1ff10 75 73 74 20 6e 6f 74 20 62 65 20 61 20 64 6f 63  ust not be a doc
1ff20 6c 69 73 74 20 66 6f 72 20 61 6e 20 69 6e 74 65  list for an inte
1ff30 72 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f 0a 20  rnal node.  */. 
1ff40 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
1ff50 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  n>0 );.  assert(
1ff60 20 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d 3d 27   (pNode->a[0]=='
1ff70 5c 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73 74 21  \0')==(aDoclist!
1ff80 3d 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62 47 72  =0) );..  blobGr
1ff90 6f 77 42 75 66 66 65 72 28 70 50 72 65 76 2c 20  owBuffer(pPrev, 
1ffa0 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20 20 69  nTerm, &rc);.  i
1ffb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ffc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1ffd0 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50   nPrefix = fts3P
1ffe0 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
1fff0 72 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d 3e 6e  rev->a, pPrev->n
20000 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
20010 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65  .  nSuffix = nTe
20020 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20  rm - nPrefix;.  
20030 6d 65 6d 63 70 79 28 70 50 72 65 76 2d 3e 61 2c  memcpy(pPrev->a,
20040 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
20050 20 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e 54 65    pPrev->n = nTe
20060 72 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69 72 73  rm;..  if( bFirs
20070 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 6f 64  t==0 ){.    pNod
20080 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  e->n += sqlite3F
20090 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e  ts3PutVarint(&pN
200a0 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d  ode->a[pNode->n]
200b0 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a  , nPrefix);.  }.
200c0 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71    pNode->n += sq
200d0 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
200e0 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f  nt(&pNode->a[pNo
200f0 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 29  de->n], nSuffix)
20100 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64  ;.  memcpy(&pNod
20110 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20  e->a[pNode->n], 
20120 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c  &zTerm[nPrefix],
20130 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 4e 6f   nSuffix);.  pNo
20140 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69 78  de->n += nSuffix
20150 3b 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c 69 73  ;..  if( aDoclis
20160 74 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  t ){.    pNode->
20170 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  n += sqlite3Fts3
20180 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65  PutVarint(&pNode
20190 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e  ->a[pNode->n], n
201a0 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 6d 65  Doclist);.    me
201b0 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b 70  mcpy(&pNode->a[p
201c0 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63 6c 69  Node->n], aDocli
201d0 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
201e0 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e     pNode->n += n
201f0 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Doclist;.  }..  
20200 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e  assert( pNode->n
20210 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 20  <=pNode->nAlloc 
20220 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
20230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20240 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72   Append the curr
20250 65 6e 74 20 74 65 72 6d 20 61 6e 64 20 64 6f 63  ent term and doc
20260 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74 6f 20  list pointed to 
20270 62 79 20 63 75 72 73 6f 72 20 70 43 73 72 20 74  by cursor pCsr t
20280 6f 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e 64 61  o the.** appenda
20290 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d 65  ble b-tree segme
202a0 6e 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  nt opened for wr
202b0 69 74 69 6e 67 20 62 79 20 70 57 72 69 74 65 72  iting by pWriter
202c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
202d0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
202e0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
202f0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
20300 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
20310 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
20320 72 6d 65 72 67 65 41 70 70 65 6e 64 28 0a 20 20  rmergeAppend(.  
20330 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61  /* Fts3 table ha
20360 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  ndle */.  Incrme
20370 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
20380 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er,       /* Wri
20390 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
203a0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
203b0 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20  er *pCsr        
203c0 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 61 69  /* Cursor contai
203d0 6e 69 6e 67 20 74 65 72 6d 20 61 6e 64 20 64 6f  ning term and do
203e0 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  clist */.){.  co
203f0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
20400 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20  = pCsr->zTerm;. 
20410 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 43 73   int nTerm = pCs
20420 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f 6e 73  r->nTerm;.  cons
20430 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74  t char *aDoclist
20440 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73   = pCsr->aDoclis
20450 74 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  t;.  int nDoclis
20460 74 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69  t = pCsr->nDocli
20470 73 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  st;.  int rc = S
20480 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
20490 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
204a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
204b0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
204c0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
204d0 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
204e0 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 2a  quired on leaf *
204f0 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  /.  int nPrefix;
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20510 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 72 65    /* Size of pre
20520 66 69 78 20 73 68 61 72 65 64 20 77 69 74 68 20  fix shared with 
20530 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  previous term */
20540 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20  .  int nSuffix; 
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75 66 66   /* Size of suff
20570 69 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50 72 65  ix (nTerm - nPre
20580 66 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65 57 72  fix) */.  NodeWr
20590 69 74 65 72 20 2a 70 4c 65 61 66 3b 20 20 20 20  iter *pLeaf;    
205a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
205b0 74 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  t used to write 
205c0 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 0a 20  leaf nodes */.. 
205d0 20 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65   pLeaf = &pWrite
205e0 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30  r->aNodeWriter[0
205f0 5d 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66  ];.  nPrefix = f
20600 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
20610 73 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61 2c 20  s(pLeaf->key.a, 
20620 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20 7a 54  pLeaf->key.n, zT
20630 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e  erm, nTerm);.  n
20640 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d  Suffix = nTerm -
20650 20 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e 53 70   nPrefix;..  nSp
20660 61 63 65 20 20 3d 20 73 71 6c 69 74 65 33 46 74  ace  = sqlite3Ft
20670 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65  s3VarintLen(nPre
20680 66 69 78 29 3b 0a 20 20 6e 53 70 61 63 65 20 2b  fix);.  nSpace +
20690 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
206a0 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20  intLen(nSuffix) 
206b0 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 53 70  + nSuffix;.  nSp
206c0 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ace += sqlite3Ft
206d0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
206e0 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73 74  list) + nDoclist
206f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
20700 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 73 20  urrent block is 
20710 6e 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64 20 69  not empty, and i
20720 66 20 61 64 64 69 6e 67 20 74 68 69 73 20 74 65  f adding this te
20730 72 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  rm/doclist.  ** 
20740 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  to the current b
20750 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b 65 20  lock would make 
20760 69 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20 46  it larger than F
20770 74 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65 53 69  ts3Table.nNodeSi
20780 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c 20 77  ze.  ** bytes, w
20790 72 69 74 65 20 74 68 69 73 20 62 6c 6f 63 6b 20  rite this block 
207a0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
207b0 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4c  ase. */.  if( pL
207c0 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26  eaf->block.n>0 &
207d0 26 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e  & (pLeaf->block.
207e0 6e 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d 3e 6e  n + nSpace)>p->n
207f0 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  NodeSize ){.    
20800 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
20810 67 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66 2d 3e  gment(p, pLeaf->
20820 69 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62  iBlock, pLeaf->b
20830 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d 3e 62  lock.a, pLeaf->b
20840 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70 57 72  lock.n);.    pWr
20850 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b 0a 0a  iter->nWork++;..
20860 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63      /* Add the c
20870 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74  urrent term to t
20880 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20  he parent node. 
20890 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20 74  The term added t
208a0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  o the .    ** pa
208b0 72 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20 20 2a  rent must:.    *
208c0 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65  *.    **   a) be
208d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
208e0 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f  e largest term o
208f0 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
20900 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20  just written.   
20910 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20   **      to the 
20920 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20  database (still 
20930 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 4c 65  available in pLe
20940 61 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a 20 20  af->key), and.  
20950 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29    **.    **   b)
20960 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
20970 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65   equal to the te
20980 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61  rm about to be a
20990 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a  dded to the new.
209a0 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66      **      leaf
209b0 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65   node (zTerm/nTe
209c0 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rm)..    **.    
209d0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
209e0 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  s, it must be th
209f0 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72  e prefix of zTer
20a00 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20  m 1 byte longer 
20a10 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  than.    ** the 
20a20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69  common prefix (i
20a30 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20  f any) of zTerm 
20a40 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65  and pWriter->zTe
20a50 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rm..    */.    i
20a60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20a70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
20a80 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75 73 68  ts3IncrmergePush
20a90 28 70 2c 20 70 57 72 69 74 65 72 2c 20 7a 54 65  (p, pWriter, zTe
20aa0 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a  rm, nPrefix+1);.
20ab0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
20ac0 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
20ad0 74 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b 20 2a  t output block *
20ae0 2f 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69 42 6c  /.    pLeaf->iBl
20af0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66  ock++;.    pLeaf
20b00 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20  ->key.n = 0;.   
20b10 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20   pLeaf->block.n 
20b20 3d 20 30 3b 0a 0a 20 20 20 20 6e 53 75 66 66 69  = 0;..    nSuffi
20b30 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e  x = nTerm;.    n
20b40 53 70 61 63 65 20 20 3d 20 31 3b 0a 20 20 20 20  Space  = 1;.    
20b50 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65  nSpace += sqlite
20b60 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
20b70 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69  Suffix) + nSuffi
20b80 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d  x;.    nSpace +=
20b90 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
20ba0 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20  ntLen(nDoclist) 
20bb0 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a  + nDoclist;.  }.
20bc0 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  .  pWriter->nLea
20bd0 66 44 61 74 61 20 2b 3d 20 6e 53 70 61 63 65 3b  fData += nSpace;
20be0 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65  .  blobGrowBuffe
20bf0 72 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c  r(&pLeaf->block,
20c00 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20   pLeaf->block.n 
20c10 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b 0a  + nSpace, &rc);.
20c20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20c30 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
20c40 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3d 3d 30  Leaf->block.n==0
20c50 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 2d   ){.      pLeaf-
20c60 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b 0a 20 20  >block.n = 1;.  
20c70 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b      pLeaf->block
20c80 2e 61 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  .a[0] = '\0';.  
20c90 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 73    }.    rc = fts
20ca0 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20  3AppendToNode(. 
20cb0 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 62         &pLeaf->b
20cc0 6c 6f 63 6b 2c 20 26 70 4c 65 61 66 2d 3e 6b 65  lock, &pLeaf->ke
20cd0 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  y, zTerm, nTerm,
20ce0 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c   aDoclist, nDocl
20cf0 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  ist.    );.  }..
20d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20d10 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20d20 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
20d30 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e   release all dyn
20d40 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 20 68  amic resources h
20d50 65 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20 6d 65  eld by the.** me
20d60 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63  rge-writer objec
20d70 74 20 70 57 72 69 74 65 72 2c 20 61 6e 64 20 69  t pWriter, and i
20d80 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f  f no error has o
20d90 63 63 75 72 72 65 64 2c 20 74 6f 20 66 6c 75 73  ccurred, to flus
20da0 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73 74 61 6e  h.** all outstan
20db0 64 69 6e 67 20 6e 6f 64 65 20 62 75 66 66 65 72  ding node buffer
20dc0 73 20 68 65 6c 64 20 62 79 20 70 57 72 69 74 65  s held by pWrite
20dd0 72 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  r to disk..**.**
20de0 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20   If *pRc is not 
20df0 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
20e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20e10 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6e 6f 20  called, then no 
20e20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
20e30 64 65 20 74 6f 20 77 72 69 74 65 20 61 6e 79 20  de to write any 
20e40 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 20 49 6e  data to disk. In
20e50 73 74 65 61 64 2c 20 74 68 69 73 20 66 75 6e 63  stead, this func
20e60 74 69 6f 6e 20 73 65 72 76 65 73 20 6f 6e 6c 79  tion serves only
20e70 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 6f  .** to release o
20e80 75 74 73 74 61 6e 64 69 6e 67 20 72 65 73 6f 75  utstanding resou
20e90 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rces..**.** Othe
20ea0 72 77 69 73 65 2c 20 69 66 20 2a 70 52 63 20 69  rwise, if *pRc i
20eb0 73 20 69 6e 69 74 69 61 6c 6c 79 20 53 51 4c 49  s initially SQLI
20ec0 54 45 5f 4f 4b 20 61 6e 64 20 61 6e 20 65 72 72  TE_OK and an err
20ed0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  or occurs while.
20ee0 2a 2a 20 66 6c 75 73 68 69 6e 67 20 62 75 66 66  ** flushing buff
20ef0 65 72 73 20 74 6f 20 64 69 73 6b 2c 20 2a 70 52  ers to disk, *pR
20f00 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53  c is set to an S
20f10 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
20f20 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
20f30 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
20f40 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72  void fts3Incrmer
20f50 67 65 52 65 6c 65 61 73 65 28 0a 20 20 46 74 73  geRelease(.  Fts
20f60 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20f80 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
20f90 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65  e */.  Incrmerge
20fa0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
20fb0 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 2d         /* Merge-
20fc0 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  writer object */
20fd0 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ff0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72     /* IN/OUT: Er
21000 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20  ror code */.){. 
21010 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21030 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
21040 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f 6e 2d  ate through non-
21050 72 6f 6f 74 20 6c 61 79 65 72 73 20 2a 2f 0a 20  root layers */. 
21060 20 69 6e 74 20 69 52 6f 6f 74 3b 20 20 20 20 20   int iRoot;     
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 6f 6f   /* Index of roo
21090 74 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e  t in pWriter->aN
210a0 6f 64 65 57 72 69 74 65 72 20 2a 2f 0a 20 20 4e  odeWriter */.  N
210b0 6f 64 65 57 72 69 74 65 72 20 2a 70 52 6f 6f 74  odeWriter *pRoot
210c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
210d0 2a 20 4e 6f 64 65 57 72 69 74 65 72 20 66 6f 72  * NodeWriter for
210e0 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
210f0 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 20 20  int rc = *pRc;  
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  /* Error code */
21120 0a 0a 20 20 2f 2a 20 53 65 74 20 69 52 6f 6f 74  ..  /* Set iRoot
21130 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 69 6e   to the index in
21140 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57   pWriter->aNodeW
21150 72 69 74 65 72 5b 5d 20 6f 66 20 74 68 65 20 6f  riter[] of the o
21160 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 0a 20  utput segment . 
21170 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49   ** root node. I
21180 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 66 69  f the segment fi
21190 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 61  ts entirely on a
211a0 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 6e 6f 64   single leaf nod
211b0 65 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77 69  e, iRoot.  ** wi
211c0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 30 2e 20  ll be set to 0. 
211d0 49 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  If the root node
211e0 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f   is the parent o
211f0 66 20 74 68 65 20 6c 65 61 76 65 73 2c 20 69 52  f the leaves, iR
21200 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  oot.  ** will be
21210 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 20   1. And so on.  
21220 2a 2f 0a 20 20 66 6f 72 28 69 52 6f 6f 74 3d 46  */.  for(iRoot=F
21230 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
21240 45 5f 48 45 49 47 48 54 2d 31 3b 20 69 52 6f 6f  E_HEIGHT-1; iRoo
21250 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d 29 7b 0a  t>=0; iRoot--){.
21260 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a      NodeWriter *
21270 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72  pNode = &pWriter
21280 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 52  ->aNodeWriter[iR
21290 6f 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 4e  oot];.    if( pN
212a0 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 29  ode->block.n>0 )
212b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
212c0 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64  rt( *pRc || pNod
212d0 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63 3d  e->block.nAlloc=
212e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
212f0 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64 65 2d  ( *pRc || pNode-
21300 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d 30 20 29  >key.nAlloc==0 )
21310 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21320 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  ee(pNode->block.
21330 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  a);.    sqlite3_
21340 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  free(pNode->key.
21350 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6d  a);.  }..  /* Em
21360 70 74 79 20 6f 75 74 70 75 74 20 73 65 67 6d 65  pty output segme
21370 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  nt. This is a no
21380 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 69 52  -op. */.  if( iR
21390 6f 6f 74 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  oot<0 ) return;.
213a0 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65  .  /* The entire
213b0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
213c0 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  fits on a single
213d0 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c 6c 79 2c   node. Normally,
213e0 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 2a 2a   this means.  **
213f0 20 74 68 65 20 6e 6f 64 65 20 77 6f 75 6c 64 20   the node would 
21400 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 62  be stored as a b
21410 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f 6f 74  lob in the "root
21420 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
21430 25 5f 73 65 67 64 69 72 0a 20 20 2a 2a 20 74 61  %_segdir.  ** ta
21440 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  ble. However, th
21450 69 73 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  is is not permit
21460 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ted in this case
21470 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  . The problem is
21480 20 74 68 61 74 20 0a 20 20 2a 2a 20 73 70 61 63   that .  ** spac
21490 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
214a0 65 6e 20 72 65 73 65 72 76 65 64 20 69 6e 20 74  en reserved in t
214b0 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
214c0 62 6c 65 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  ble, and so the 
214d0 0a 20 20 2a 2a 20 73 74 61 72 74 5f 62 6c 6f 63  .  ** start_bloc
214e0 6b 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63 6b 20  k and end_block 
214f0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f  fields of the %_
21500 73 65 67 64 69 72 20 74 61 62 6c 65 20 6d 75 73  segdir table mus
21510 74 20 62 65 20 70 6f 70 75 6c 61 74 65 64 2e 20  t be populated. 
21520 0a 20 20 2a 2a 20 41 6e 64 2c 20 62 79 20 64 65  .  ** And, by de
21530 73 69 67 6e 20 6f 72 20 62 79 20 61 63 63 69 64  sign or by accid
21540 65 6e 74 2c 20 72 65 6c 65 61 73 65 64 20 76 65  ent, released ve
21550 72 73 69 6f 6e 73 20 6f 66 20 46 54 53 20 63 61  rsions of FTS ca
21560 6e 6e 6f 74 20 68 61 6e 64 6c 65 20 0a 20 20 2a  nnot handle .  *
21570 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20  * segments that 
21580 66 69 74 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  fit entirely on 
21590 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 77 69  the root node wi
215a0 74 68 20 73 74 61 72 74 5f 62 6c 6f 63 6b 21 3d  th start_block!=
215b0 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 73  0..  **.  ** Ins
215c0 74 65 61 64 2c 20 63 72 65 61 74 65 20 61 20 73  tead, create a s
215d0 79 6e 74 68 65 74 69 63 20 72 6f 6f 74 20 6e 6f  ynthetic root no
215e0 64 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  de that contains
215f0 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 61 20 0a   nothing but a .
21600 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
21610 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6e 74 65  the single conte
21620 6e 74 20 6e 6f 64 65 2e 20 53 6f 20 74 68 61 74  nt node. So that
21630 20 74 68 65 20 73 65 67 6d 65 6e 74 20 63 6f 6e   the segment con
21640 73 69 73 74 73 20 6f 66 20 61 0a 20 20 2a 2a 20  sists of a.  ** 
21650 73 69 6e 67 6c 65 20 6c 65 61 66 20 61 6e 64 20  single leaf and 
21660 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 69 6f  a single interio
21670 72 20 28 72 6f 6f 74 29 20 6e 6f 64 65 2e 0a 20  r (root) node.. 
21680 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f 3a 20 42   **.  ** Todo: B
21690 65 74 74 65 72 20 6d 69 67 68 74 20 62 65 20 74  etter might be t
216a0 6f 20 64 65 66 65 72 20 61 6c 6c 6f 63 61 74 69  o defer allocati
216b0 6e 67 20 73 70 61 63 65 20 69 6e 20 74 68 65 20  ng space in the 
216c0 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 2a 2a  %_segments .  **
216d0 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 77 65 20   table until we 
216e0 61 72 65 20 73 75 72 65 20 69 74 20 69 73 20 6e  are sure it is n
216f0 65 65 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eeded..  */.  if
21700 28 20 69 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( iRoot==0 ){.  
21710 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 63 6b 20 3d    Blob *pBlock =
21720 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65   &pWriter->aNode
21730 57 72 69 74 65 72 5b 31 5d 2e 62 6c 6f 63 6b 3b  Writer[1].block;
21740 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  .    blobGrowBuf
21750 66 65 72 28 70 42 6c 6f 63 6b 2c 20 31 20 2b 20  fer(pBlock, 1 + 
21760 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2c  FTS3_VARINT_MAX,
21770 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
21780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21790 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 61 5b        pBlock->a[
217a0 30 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20 20 20  0] = 0x01;.     
217b0 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20 31 20 2b   pBlock->n = 1 +
217c0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
217d0 61 72 69 6e 74 28 0a 20 20 20 20 20 20 20 20 20  arint(.         
217e0 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31 5d 2c 20   &pBlock->a[1], 
217f0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
21800 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 0a 20  iter[0].iBlock. 
21810 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
21820 20 20 69 52 6f 6f 74 20 3d 20 31 3b 0a 20 20 7d    iRoot = 1;.  }
21830 0a 20 20 70 52 6f 6f 74 20 3d 20 26 70 57 72 69  .  pRoot = &pWri
21840 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
21850 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f 2a 20 46  [iRoot];..  /* F
21860 6c 75 73 68 20 61 6c 6c 20 63 75 72 72 65 6e 74  lush all current
21870 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6e  ly outstanding n
21880 6f 64 65 73 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  odes to disk. */
21890 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 52  .  for(i=0; i<iR
218a0 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4e  oot; i++){.    N
218b0 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65  odeWriter *pNode
218c0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f   = &pWriter->aNo
218d0 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20  deWriter[i];.   
218e0 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63   if( pNode->bloc
218f0 6b 2e 6e 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c  k.n>0 && rc==SQL
21900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21910 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
21920 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d 3e  gment(p, pNode->
21930 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e 62  iBlock, pNode->b
21940 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62  lock.a, pNode->b
21950 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20  lock.n);.    }. 
21960 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21970 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 29 3b  pNode->block.a);
21980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
21990 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 29 3b  e(pNode->key.a);
219a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
219b0 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 72 65   the %_segdir re
219c0 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72  cord. */.  if( r
219d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
219e0 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
219f0 74 65 53 65 67 64 69 72 28 70 2c 20 0a 20 20 20  teSegdir(p, .   
21a00 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 41       pWriter->iA
21a10 62 73 4c 65 76 65 6c 2b 31 2c 20 20 20 20 20 20  bsLevel+1,      
21a20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 76 65           /* leve
21a30 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72  l */.        pWr
21a40 69 74 65 72 2d 3e 69 49 64 78 2c 20 20 20 20 20  iter->iIdx,     
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 2f 2a 20 69 64 78 20 2a 2f 0a 20 20 20 20 20   /* idx */.     
21a70 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61     pWriter->iSta
21a80 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rt,             
21a90 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74 5f         /* start_
21aa0 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  block */.       
21ab0 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57   pWriter->aNodeW
21ac0 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 2c  riter[0].iBlock,
21ad0 20 20 20 20 20 2f 2a 20 6c 65 61 76 65 73 5f 65       /* leaves_e
21ae0 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
21af0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e      pWriter->iEn
21b00 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
21b10 20 20 20 20 20 20 20 20 2f 2a 20 65 6e 64 5f 62          /* end_b
21b20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
21b30 28 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65 61  (pWriter->bNoLea
21b40 66 44 61 74 61 3d 3d 30 20 3f 20 70 57 72 69 74  fData==0 ? pWrit
21b50 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 3a 20  er->nLeafData : 
21b60 30 29 2c 20 20 20 2f 2a 20 65 6e 64 5f 62 6c 6f  0),   /* end_blo
21b70 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52  ck */.        pR
21b80 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 52  oot->block.a, pR
21b90 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 6e 20 20 20 20  oot->block.n    
21ba0 20 20 2f 2a 20 72 6f 6f 74 20 2a 2f 0a 20 20 20    /* root */.   
21bb0 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
21bc0 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e 62 6c  3_free(pRoot->bl
21bd0 6f 63 6b 2e 61 29 3b 0a 20 20 73 71 6c 69 74 65  ock.a);.  sqlite
21be0 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e 6b 65  3_free(pRoot->ke
21bf0 79 2e 61 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20  y.a);..  *pRc = 
21c00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
21c10 70 61 72 65 20 74 68 65 20 74 65 72 6d 20 69 6e  pare the term in
21c20 20 62 75 66 66 65 72 20 7a 4c 68 73 20 28 73 69   buffer zLhs (si
21c30 7a 65 20 69 6e 20 62 79 74 65 73 20 6e 4c 68 73  ze in bytes nLhs
21c40 29 20 77 69 74 68 20 74 68 61 74 20 69 6e 0a 2a  ) with that in.*
21c50 2a 20 7a 52 68 73 20 28 73 69 7a 65 20 69 6e 20  * zRhs (size in 
21c60 62 79 74 65 73 20 6e 52 68 73 29 20 75 73 69 6e  bytes nRhs) usin
21c70 67 20 6d 65 6d 63 6d 70 2e 20 49 66 20 6f 6e 65  g memcmp. If one
21c80 20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66 69   term is a prefi
21c90 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65  x of.** the othe
21ca0 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65  r, it is conside
21cb0 72 65 64 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65  red to be smalle
21cc0 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  r than the other
21cd0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d  ..**.** Return -
21ce0 76 65 20 69 66 20 7a 4c 68 73 20 69 73 20 73 6d  ve if zLhs is sm
21cf0 61 6c 6c 65 72 20 74 68 61 6e 20 7a 52 68 73 2c  aller than zRhs,
21d00 20 30 20 69 66 20 69 74 20 69 73 20 65 71 75 61   0 if it is equa
21d10 6c 2c 20 6f 72 20 2b 76 65 0a 2a 2a 20 69 66 20  l, or +ve.** if 
21d20 69 74 20 69 73 20 67 72 65 61 74 65 72 2e 0a 2a  it is greater..*
21d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
21d40 33 54 65 72 6d 43 6d 70 28 0a 20 20 63 6f 6e 73  3TermCmp(.  cons
21d50 74 20 63 68 61 72 20 2a 7a 4c 68 73 2c 20 69 6e  t char *zLhs, in
21d60 74 20 6e 4c 68 73 2c 20 20 20 20 20 2f 2a 20 4c  t nLhs,     /* L
21d70 48 53 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  HS of comparison
21d80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
21d90 20 2a 7a 52 68 73 2c 20 69 6e 74 20 6e 52 68 73   *zRhs, int nRhs
21da0 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
21db0 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b  comparison */.){
21dc0 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49  .  int nCmp = MI
21dd0 4e 28 6e 4c 68 73 2c 20 6e 52 68 73 29 3b 0a 20  N(nLhs, nRhs);. 
21de0 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 72 65 73   int res;..  res
21df0 20 3d 20 6d 65 6d 63 6d 70 28 7a 4c 68 73 2c 20   = memcmp(zLhs, 
21e00 7a 52 68 73 2c 20 6e 43 6d 70 29 3b 0a 20 20 69  zRhs, nCmp);.  i
21e10 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
21e20 3d 20 6e 4c 68 73 20 2d 20 6e 52 68 73 3b 0a 0a  = nLhs - nRhs;..
21e30 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
21e40 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
21e50 20 73 65 65 20 69 66 20 74 68 65 20 65 6e 74 72   see if the entr
21e60 79 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  y in the %_segme
21e70 6e 74 73 20 74 61 62 6c 65 20 77 69 74 68 20 62  nts table with b
21e80 6c 6f 63 6b 69 64 20 69 45 6e 64 20 69 73 20 0a  lockid iEnd is .
21e90 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 6e 6f 20 65  ** NULL. If no e
21ea0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
21eb0 74 68 65 20 65 6e 74 72 79 20 69 73 20 4e 55 4c  the entry is NUL
21ec0 4c 2c 20 73 65 74 20 2a 70 62 52 65 73 20 31 20  L, set *pbRes 1 
21ed0 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
21ee0 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
21ef0 73 65 74 20 2a 70 62 52 65 73 20 74 6f 20 30 2e  set *pbRes to 0.
21f00 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61   .**.** Or, if a
21f10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
21f20 68 69 6c 65 20 71 75 65 72 79 69 6e 67 20 74 68  hile querying th
21f30 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 74 75  e database, retu
21f40 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a  rn an SQLite .**
21f50 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
21f60 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
21f70 2a 70 62 52 65 73 20 69 73 20 75 6e 64 65 66 69  *pbRes is undefi
21f80 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
21f90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
21fa0 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 66 20  used to test if 
21fb0 61 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6e 20  a segment is an 
21fc0 22 61 70 70 65 6e 64 61 62 6c 65 22 20 73 65 67  "appendable" seg
21fd0 6d 65 6e 74 2e 20 49 66 20 69 74 0a 2a 2a 20 69  ment. If it.** i
21fe0 73 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20 65  s, then a NULL e
21ff0 6e 74 72 79 20 68 61 73 20 62 65 65 6e 20 69 6e  ntry has been in
22000 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
22010 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65  %_segments table
22020 0a 2a 2a 20 77 69 74 68 20 62 6c 6f 63 6b 69 64  .** with blockid
22030 20 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c   %_segdir.end_bl
22040 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
22050 6e 74 20 66 74 73 33 49 73 41 70 70 65 6e 64 61  nt fts3IsAppenda
22060 62 6c 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ble(Fts3Table *p
22070 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
22080 69 45 6e 64 2c 20 69 6e 74 20 2a 70 62 52 65 73  iEnd, int *pbRes
22090 29 7b 0a 20 20 69 6e 74 20 62 52 65 73 20 3d 20  ){.  int bRes = 
220a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
220b0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 74       /* Result t
220c0 6f 20 73 65 74 20 2a 70 62 52 65 73 20 74 6f 20  o set *pbRes to 
220d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
220e0 74 20 2a 70 43 68 65 63 6b 20 3d 20 30 3b 20 20  t *pCheck = 0;  
220f0 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
22100 74 20 74 6f 20 71 75 65 72 79 20 64 61 74 61 62  t to query datab
22110 61 73 65 20 77 69 74 68 20 2a 2f 0a 20 20 69 6e  ase with */.  in
22120 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22140 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22150 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
22160 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 47 4d 45  tmt(p, SQL_SEGME
22170 4e 54 5f 49 53 5f 41 50 50 45 4e 44 41 42 4c 45  NT_IS_APPENDABLE
22180 2c 20 26 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20  , &pCheck, 0);. 
22190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
221a0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
221b0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68  3_bind_int64(pCh
221c0 65 63 6b 2c 20 31 2c 20 69 45 6e 64 29 3b 0a 20  eck, 1, iEnd);. 
221d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
221e0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
221f0 70 43 68 65 63 6b 29 20 29 20 62 52 65 73 20 3d  pCheck) ) bRes =
22200 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   1;.    rc = sql
22210 69 74 65 33 5f 72 65 73 65 74 28 70 43 68 65 63  ite3_reset(pChec
22220 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2a 70 62  k);.  }.  .  *pb
22230 52 65 73 20 3d 20 62 52 65 73 3b 0a 20 20 72 65  Res = bRes;.  re
22240 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22250 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22260 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
22270 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e 20 69  nitializing an i
22280 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
22290 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   operation..** I
222a0 74 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  t checks if the 
222b0 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74  existing segment
222c0 20 77 69 74 68 20 69 6e 64 65 78 20 76 61 6c 75   with index valu
222d0 65 20 69 49 64 78 20 61 74 20 61 62 73 6f 6c 75  e iIdx at absolu
222e0 74 65 20 6c 65 76 65 6c 20 0a 2a 2a 20 28 69 41  te level .** (iA
222f0 62 73 4c 65 76 65 6c 2b 31 29 20 63 61 6e 20 62  bsLevel+1) can b
22300 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 62 79  e appended to by
22310 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
22320 20 6d 65 72 67 65 2e 20 49 66 20 69 74 20 63 61   merge. If it ca
22330 6e 2c 20 74 68 65 0a 2a 2a 20 6d 65 72 67 65 2d  n, the.** merge-
22340 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 70  writer object *p
22350 57 72 69 74 65 72 20 69 73 20 69 6e 69 74 69 61  Writer is initia
22360 6c 69 7a 65 64 20 74 6f 20 77 72 69 74 65 20 74  lized to write t
22370 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  o it..**.** An e
22380 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 20  xisting segment 
22390 63 61 6e 20 62 65 20 61 70 70 65 6e 64 65 64 20  can be appended 
223a0 74 6f 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65  to by an increme
223b0 6e 74 61 6c 20 6d 65 72 67 65 20 69 66 3a 0a 2a  ntal merge if:.*
223c0 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 77 61 73 20  *.**   * It was 
223d0 69 6e 69 74 69 61 6c 6c 79 20 63 72 65 61 74 65  initially create
223e0 64 20 61 73 20 61 6e 20 61 70 70 65 6e 64 61 62  d as an appendab
223f0 6c 65 20 73 65 67 6d 65 6e 74 20 28 77 69 74 68  le segment (with
22400 20 61 6c 6c 20 72 65 71 75 69 72 65 64 0a 2a 2a   all required.**
22410 20 20 20 20 20 73 70 61 63 65 20 70 72 65 2d 61       space pre-a
22420 6c 6c 6f 63 61 74 65 64 29 2c 20 61 6e 64 0a 2a  llocated), and.*
22430 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  *.**   * The fir
22440 73 74 20 6b 65 79 20 72 65 61 64 20 66 72 6f 6d  st key read from
22450 20 74 68 65 20 69 6e 70 75 74 20 28 61 72 67 75   the input (argu
22460 6d 65 6e 74 73 20 7a 4b 65 79 20 61 6e 64 20 6e  ments zKey and n
22470 4b 65 79 29 20 69 73 20 0a 2a 2a 20 20 20 20 20  Key) is .**     
22480 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
22490 20 6c 61 72 67 65 73 74 20 6b 65 79 20 63 75 72   largest key cur
224a0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
224b0 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 0a 2a   the potential.*
224c0 2a 20 20 20 20 20 6f 75 74 70 75 74 20 73 65 67  *     output seg
224d0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
224e0 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67  int fts3Incrmerg
224f0 65 4c 6f 61 64 28 0a 20 20 46 74 73 33 54 61 62  eLoad(.  Fts3Tab
22500 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
22510 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33           /* Fts3
22520 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
22530 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
22540 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
22550 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
22560 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65  evel of input se
22570 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  gments */.  int 
22580 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
22590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
225a0 6e 64 65 78 20 6f 66 20 63 61 6e 64 69 64 61 74  ndex of candidat
225b0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
225c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
225d0 20 2a 7a 4b 65 79 2c 20 20 20 20 20 20 20 20 20   *zKey,         
225e0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b        /* First k
225f0 65 79 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  ey to write */. 
22600 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22630 74 65 73 20 69 6e 20 6e 4b 65 79 20 2a 2f 0a 20  tes in nKey */. 
22640 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
22650 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20   *pWriter       
22660 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
22670 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  s object */.){. 
22680 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
226b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
226c0 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b 20  t *pSelect = 0; 
226d0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
226e0 6f 20 72 65 61 64 20 25 5f 73 65 67 64 69 72 20  o read %_segdir 
226f0 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 72 63 20 3d  entry */..  rc =
22700 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
22710 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49  SQL_SELECT_SEGDI
22720 52 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  R, &pSelect, 0);
22730 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
22750 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74  te3_int64 iStart
22760 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 56 61 6c   = 0;     /* Val
22770 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 73  ue of %_segdir.s
22780 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20  tart_block */.  
22790 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
227a0 69 4c 65 61 66 45 6e 64 20 3d 20 30 3b 20 20 20  iLeafEnd = 0;   
227b0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65  /* Value of %_se
227c0 67 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e 64 5f  gdir.leaves_end_
227d0 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c  block */.    sql
227e0 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20  ite3_int64 iEnd 
227f0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 56 61  = 0;       /* Va
22800 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e  lue of %_segdir.
22810 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  end_block */.   
22820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 52 6f   const char *aRo
22830 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ot = 0;        /
22840 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 25 5f 73  * Pointer to %_s
22850 65 67 64 69 72 2e 72 6f 6f 74 20 62 75 66 66 65  egdir.root buffe
22860 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f  r */.    int nRo
22870 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ot = 0;         
22880 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22890 66 20 61 52 6f 6f 74 5b 5d 20 69 6e 20 62 79 74  f aRoot[] in byt
228a0 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  es */.    int rc
228b0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
228c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
228d0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69  n code from sqli
228e0 74 65 33 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20  te3_reset() */. 
228f0 20 20 20 69 6e 74 20 62 41 70 70 65 6e 64 61 62     int bAppendab
22900 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  le = 0;         
22910 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
22920 69 66 20 73 65 67 6d 65 6e 74 20 69 73 20 61 70  if segment is ap
22930 70 65 6e 64 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  pendable */..   
22940 20 2f 2a 20 52 65 61 64 20 74 68 65 20 25 5f 73   /* Read the %_s
22950 65 67 64 69 72 20 65 6e 74 72 79 20 66 6f 72 20  egdir entry for 
22960 69 6e 64 65 78 20 69 49 64 78 20 61 62 73 6f 6c  index iIdx absol
22970 75 74 65 20 6c 65 76 65 6c 20 28 69 41 62 73 4c  ute level (iAbsL
22980 65 76 65 6c 2b 31 29 20 2a 2f 0a 20 20 20 20 73  evel+1) */.    s
22990 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
229a0 34 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 69 41  4(pSelect, 1, iA
229b0 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20  bsLevel+1);.    
229c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
229d0 28 70 53 65 6c 65 63 74 2c 20 32 2c 20 69 49 64  (pSelect, 2, iId
229e0 78 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  x);.    if( sqli
229f0 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
22a00 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
22a10 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
22a20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
22a30 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31 29  nt64(pSelect, 1)
22a40 3b 0a 20 20 20 20 20 20 69 4c 65 61 66 45 6e 64  ;.      iLeafEnd
22a50 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
22a60 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c  n_int64(pSelect,
22a70 20 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33 52   2);.      fts3R
22a80 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c 64  eadEndBlockField
22a90 28 70 53 65 6c 65 63 74 2c 20 33 2c 20 26 69 45  (pSelect, 3, &iE
22aa0 6e 64 2c 20 26 70 57 72 69 74 65 72 2d 3e 6e 4c  nd, &pWriter->nL
22ab0 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20  eafData);.      
22ac0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  if( pWriter->nLe
22ad0 61 66 44 61 74 61 3c 30 20 29 7b 0a 20 20 20 20  afData<0 ){.    
22ae0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65      pWriter->nLe
22af0 61 66 44 61 74 61 20 3d 20 70 57 72 69 74 65 72  afData = pWriter
22b00 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2a 20 2d 31  ->nLeafData * -1
22b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22b20 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65 61 66  pWriter->bNoLeaf
22b30 44 61 74 61 20 3d 20 28 70 57 72 69 74 65 72 2d  Data = (pWriter-
22b40 3e 6e 4c 65 61 66 44 61 74 61 3d 3d 30 29 3b 0a  >nLeafData==0);.
22b50 20 20 20 20 20 20 6e 52 6f 6f 74 20 3d 20 73 71        nRoot = sq
22b60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
22b70 65 73 28 70 53 65 6c 65 63 74 2c 20 34 29 3b 0a  es(pSelect, 4);.
22b80 20 20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71        aRoot = sq
22b90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
22ba0 62 28 70 53 65 6c 65 63 74 2c 20 34 29 3b 0a 20  b(pSelect, 4);. 
22bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22bc0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72  return sqlite3_r
22bd0 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  eset(pSelect);. 
22be0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
22bf0 63 6b 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  ck for the zero-
22c00 6c 65 6e 67 74 68 20 6d 61 72 6b 65 72 20 69 6e  length marker in
22c10 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
22c20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20  table */.    rc 
22c30 3d 20 66 74 73 33 49 73 41 70 70 65 6e 64 61 62  = fts3IsAppendab
22c40 6c 65 28 70 2c 20 69 45 6e 64 2c 20 26 62 41 70  le(p, iEnd, &bAp
22c50 70 65 6e 64 61 62 6c 65 29 3b 0a 0a 20 20 20 20  pendable);..    
22c60 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 7a 4b  /* Check that zK
22c70 65 79 2f 6e 4b 65 79 20 69 73 20 6c 61 72 67 65  ey/nKey is large
22c80 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
22c90 73 74 20 6b 65 79 20 74 68 65 20 63 61 6e 64 69  st key the candi
22ca0 64 61 74 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  date */.    if( 
22cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22cc0 20 62 41 70 70 65 6e 64 61 62 6c 65 20 29 7b 0a   bAppendable ){.
22cd0 20 20 20 20 20 20 63 68 61 72 20 2a 61 4c 65 61        char *aLea
22ce0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
22cf0 20 6e 4c 65 61 66 20 3d 20 30 3b 0a 0a 20 20 20   nLeaf = 0;..   
22d00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
22d10 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20  ts3ReadBlock(p, 
22d20 69 4c 65 61 66 45 6e 64 2c 20 26 61 4c 65 61 66  iLeafEnd, &aLeaf
22d30 2c 20 26 6e 4c 65 61 66 2c 20 30 29 3b 0a 20 20  , &nLeaf, 0);.  
22d40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22d50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22d60 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61 64   NodeReader read
22d70 65 72 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  er;.        for(
22d80 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 49  rc = nodeReaderI
22d90 6e 69 74 28 26 72 65 61 64 65 72 2c 20 61 4c 65  nit(&reader, aLe
22da0 61 66 2c 20 6e 4c 65 61 66 29 3b 0a 20 20 20 20  af, nLeaf);.    
22db0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
22dc0 54 45 5f 4f 4b 20 26 26 20 72 65 61 64 65 72 2e  TE_OK && reader.
22dd0 61 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  aNode;.         
22de0 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64     rc = nodeRead
22df0 65 72 4e 65 78 74 28 26 72 65 61 64 65 72 29 0a  erNext(&reader).
22e00 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
22e10 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 61       assert( rea
22e20 64 65 72 2e 61 4e 6f 64 65 20 29 3b 0a 20 20 20  der.aNode );.   
22e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22e40 66 28 20 66 74 73 33 54 65 72 6d 43 6d 70 28 7a  f( fts3TermCmp(z
22e50 4b 65 79 2c 20 6e 4b 65 79 2c 20 72 65 61 64 65  Key, nKey, reade
22e60 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72  r.term.a, reader
22e70 2e 74 65 72 6d 2e 6e 29 3c 3d 30 20 29 7b 0a 20  .term.n)<=0 ){. 
22e80 20 20 20 20 20 20 20 20 20 62 41 70 70 65 6e 64           bAppend
22e90 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
22ea0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 6f 64 65    }.        node
22eb0 52 65 61 64 65 72 52 65 6c 65 61 73 65 28 26 72  ReaderRelease(&r
22ec0 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  eader);.      }.
22ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22ee0 65 65 28 61 4c 65 61 66 29 3b 0a 20 20 20 20 7d  ee(aLeaf);.    }
22ef0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
22f00 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41 70 70 65  LITE_OK && bAppe
22f10 6e 64 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  ndable ){.      
22f20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  /* It is possibl
22f30 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 74  e to append to t
22f40 68 69 73 20 73 65 67 6d 65 6e 74 2e 20 53 65 74  his segment. Set
22f50 20 75 70 20 74 68 65 20 49 6e 63 72 6d 65 72 67   up the Incrmerg
22f60 65 57 72 69 74 65 72 0a 20 20 20 20 20 20 2a 2a  eWriter.      **
22f70 20 6f 62 6a 65 63 74 20 74 6f 20 64 6f 20 73 6f   object to do so
22f80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  .  */.      int 
22f90 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 65  i;.      int nHe
22fa0 69 67 68 74 20 3d 20 28 69 6e 74 29 61 52 6f 6f  ight = (int)aRoo
22fb0 74 5b 30 5d 3b 0a 20 20 20 20 20 20 4e 6f 64 65  t[0];.      Node
22fc0 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 3b 0a 0a  Writer *pNode;..
22fd0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
22fe0 4c 65 61 66 45 73 74 20 3d 20 28 69 6e 74 29 28  LeafEst = (int)(
22ff0 28 69 45 6e 64 20 2d 20 69 53 74 61 72 74 29 20  (iEnd - iStart) 
23000 2b 20 31 29 2f 46 54 53 5f 4d 41 58 5f 41 50 50  + 1)/FTS_MAX_APP
23010 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 0a  ENDABLE_HEIGHT;.
23020 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
23030 53 74 61 72 74 20 3d 20 69 53 74 61 72 74 3b 0a  Start = iStart;.
23040 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
23050 45 6e 64 20 3d 20 69 45 6e 64 3b 0a 20 20 20 20  End = iEnd;.    
23060 20 20 70 57 72 69 74 65 72 2d 3e 69 41 62 73 4c    pWriter->iAbsL
23070 65 76 65 6c 20 3d 20 69 41 62 73 4c 65 76 65 6c  evel = iAbsLevel
23080 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
23090 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20  >iIdx = iIdx;.. 
230a0 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65 69 67       for(i=nHeig
230b0 68 74 2b 31 3b 20 69 3c 46 54 53 5f 4d 41 58 5f  ht+1; i<FTS_MAX_
230c0 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
230d0 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  T; i++){.       
230e0 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57   pWriter->aNodeW
230f0 72 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63 6b 20  riter[i].iBlock 
23100 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72  = pWriter->iStar
23110 74 20 2b 20 69 2a 70 57 72 69 74 65 72 2d 3e 6e  t + i*pWriter->n
23120 4c 65 61 66 45 73 74 3b 0a 20 20 20 20 20 20 7d  LeafEst;.      }
23130 0a 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20  ..      pNode = 
23140 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57  &pWriter->aNodeW
23150 72 69 74 65 72 5b 6e 48 65 69 67 68 74 5d 3b 0a  riter[nHeight];.
23160 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c        pNode->iBl
23170 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e 69  ock = pWriter->i
23180 53 74 61 72 74 20 2b 20 70 57 72 69 74 65 72 2d  Start + pWriter-
23190 3e 6e 4c 65 61 66 45 73 74 2a 6e 48 65 69 67 68  >nLeafEst*nHeigh
231a0 74 3b 0a 20 20 20 20 20 20 62 6c 6f 62 47 72 6f  t;.      blobGro
231b0 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e  wBuffer(&pNode->
231c0 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 52 6f 6f 74  block, MAX(nRoot
231d0 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 2c  , p->nNodeSize),
231e0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
231f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23200 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
23210 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c  (pNode->block.a,
23220 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a   aRoot, nRoot);.
23230 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62          pNode->b
23240 6c 6f 63 6b 2e 6e 20 3d 20 6e 52 6f 6f 74 3b 0a  lock.n = nRoot;.
23250 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
23260 6f 72 28 69 3d 6e 48 65 69 67 68 74 3b 20 69 3e  or(i=nHeight; i>
23270 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
23280 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  _OK; i--){.     
23290 20 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65     NodeReader re
232a0 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  ader;.        pN
232b0 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  ode = &pWriter->
232c0 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a  aNodeWriter[i];.
232d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  .        rc = no
232e0 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 72 65  deReaderInit(&re
232f0 61 64 65 72 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  ader, pNode->blo
23300 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  ck.a, pNode->blo
23310 63 6b 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 77  ck.n);.        w
23320 68 69 6c 65 28 20 72 65 61 64 65 72 2e 61 4e 6f  hile( reader.aNo
23330 64 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  de && rc==SQLITE
23340 5f 4f 4b 20 29 20 72 63 20 3d 20 6e 6f 64 65 52  _OK ) rc = nodeR
23350 65 61 64 65 72 4e 65 78 74 28 26 72 65 61 64 65  eaderNext(&reade
23360 72 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62  r);.        blob
23370 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64  GrowBuffer(&pNod
23380 65 2d 3e 6b 65 79 2c 20 72 65 61 64 65 72 2e 74  e->key, reader.t
23390 65 72 6d 2e 6e 2c 20 26 72 63 29 3b 0a 20 20 20  erm.n, &rc);.   
233a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
233b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
233c0 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65      memcpy(pNode
233d0 2d 3e 6b 65 79 2e 61 2c 20 72 65 61 64 65 72 2e  ->key.a, reader.
233e0 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74  term.a, reader.t
233f0 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  erm.n);.        
23400 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d    pNode->key.n =
23410 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 3b 0a   reader.term.n;.
23420 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
23430 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23440 20 63 68 61 72 20 2a 61 42 6c 6f 63 6b 20 3d 20   char *aBlock = 
23450 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
23460 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  nt nBlock = 0;. 
23470 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65             pNode
23480 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f   = &pWriter->aNo
23490 64 65 57 72 69 74 65 72 5b 69 2d 31 5d 3b 0a 20  deWriter[i-1];. 
234a0 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65             pNode
234b0 2d 3e 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65  ->iBlock = reade
234c0 72 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20  r.iChild;.      
234d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
234e0 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
234f0 70 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64  p, reader.iChild
23500 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c 6f  , &aBlock, &nBlo
23510 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ck, 0);.        
23520 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66      blobGrowBuff
23530 65 72 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  er(&pNode->block
23540 2c 20 4d 41 58 28 6e 42 6c 6f 63 6b 2c 20 70 2d  , MAX(nBlock, p-
23550 3e 6e 4e 6f 64 65 53 69 7a 65 29 2c 20 26 72 63  >nNodeSize), &rc
23560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
23570 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23590 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e    memcpy(pNode->
235a0 62 6c 6f 63 6b 2e 61 2c 20 61 42 6c 6f 63 6b 2c  block.a, aBlock,
235b0 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   nBlock);.      
235c0 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62          pNode->b
235d0 6c 6f 63 6b 2e 6e 20 3d 20 6e 42 6c 6f 63 6b 3b  lock.n = nBlock;
235e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
235f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23600 65 33 5f 66 72 65 65 28 61 42 6c 6f 63 6b 29 3b  e3_free(aBlock);
23610 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
23630 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65  odeReaderRelease
23640 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20 20  (&reader);.     
23650 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
23660 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  2 = sqlite3_rese
23670 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  t(pSelect);.    
23680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23690 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
236a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
236b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
236c0 6e 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 73  ne the largest s
236d0 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 76 61 6c  egment index val
236e0 75 65 20 74 68 61 74 20 65 78 69 73 74 73 20 77  ue that exists w
236f0 69 74 68 69 6e 20 61 62 73 6f 6c 75 74 65 0a 2a  ithin absolute.*
23700 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65  * level iAbsLeve
23710 6c 2b 31 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  l+1. If no error
23720 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 69   occurs, set *pi
23730 49 64 78 20 74 6f 20 74 68 69 73 20 76 61 6c 75  Idx to this valu
23740 65 20 70 6c 75 73 0a 2a 2a 20 6f 6e 65 20 62 65  e plus.** one be
23750 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
23760 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66  QLITE_OK. Or, if
23770 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 65   there are no se
23780 67 6d 65 6e 74 73 20 61 74 20 61 6c 6c 20 0a 2a  gments at all .*
23790 2a 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 20 69  * within level i
237a0 41 62 73 4c 65 76 65 6c 2c 20 73 65 74 20 2a 70  AbsLevel, set *p
237b0 69 49 64 78 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  iIdx to zero..**
237c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
237d0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
237e0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
237f0 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20 76  ode. The final v
23800 61 6c 75 65 20 6f 66 0a 2a 2a 20 2a 70 69 49 64  alue of.** *piId
23810 78 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  x is undefined i
23820 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
23830 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
23840 6e 63 72 6d 65 72 67 65 4f 75 74 70 75 74 49 64  ncrmergeOutputId
23850 78 28 20 0a 20 20 46 74 73 33 54 61 62 6c 65 20  x( .  Fts3Table 
23860 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
23870 20 20 20 20 20 20 2f 2a 20 46 54 53 20 54 61 62        /* FTS Tab
23880 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
23890 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62  qlite3_int64 iAb
238a0 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f  sLevel,        /
238b0 2a 20 41 62 73 6f 6c 75 74 65 20 69 6e 64 65 78  * Absolute index
238c0 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
238d0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49  ts */.  int *piI
238e0 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
238f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
23900 4e 65 78 74 20 66 72 65 65 20 69 6e 64 65 78 20  Next free index 
23910 61 74 20 69 41 62 73 4c 65 76 65 6c 2b 31 20 2a  at iAbsLevel+1 *
23920 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
23930 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
23940 4f 75 74 70 75 74 49 64 78 20 3d 20 30 3b 20 20  OutputIdx = 0;  
23950 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20   /* SQL used to 
23960 66 69 6e 64 20 6f 75 74 70 75 74 20 69 6e 64 65  find output inde
23970 78 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  x */..  rc = fts
23980 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
23990 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44  NEXT_SEGMENT_IND
239a0 45 58 2c 20 26 70 4f 75 74 70 75 74 49 64 78 2c  EX, &pOutputIdx,
239b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
239c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
239d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
239e0 36 34 28 70 4f 75 74 70 75 74 49 64 78 2c 20 31  64(pOutputIdx, 1
239f0 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a  , iAbsLevel+1);.
23a00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
23a10 28 70 4f 75 74 70 75 74 49 64 78 29 3b 0a 20 20  (pOutputIdx);.  
23a20 20 20 2a 70 69 49 64 78 20 3d 20 73 71 6c 69 74    *piIdx = sqlit
23a30 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4f  e3_column_int(pO
23a40 75 74 70 75 74 49 64 78 2c 20 30 29 3b 0a 20 20  utputIdx, 0);.  
23a50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
23a60 65 73 65 74 28 70 4f 75 74 70 75 74 49 64 78 29  eset(pOutputIdx)
23a70 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
23a80 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6c  rc;.}../* .** Al
23a90 6c 6f 63 61 74 65 20 61 6e 20 61 70 70 65 6e 64  locate an append
23aa0 61 62 6c 65 20 6f 75 74 70 75 74 20 73 65 67 6d  able output segm
23ab0 65 6e 74 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20  ent on absolute 
23ac0 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2b  level iAbsLevel+
23ad0 31 0a 2a 2a 20 77 69 74 68 20 69 64 78 20 76 61  1.** with idx va
23ae0 6c 75 65 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  lue iIdx..**.** 
23af0 49 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  In the %_segdir 
23b00 74 61 62 6c 65 2c 20 61 20 73 65 67 6d 65 6e 74  table, a segment
23b10 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 74   is defined by t
23b20 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 72  he values in thr
23b30 65 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 3a 0a 2a  ee.** columns:.*
23b40 2a 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 5f 62  *.**     start_b
23b50 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 6c 65 61 76  lock.**     leav
23b60 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20  es_end_block.** 
23b70 20 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a      end_block.**
23b80 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 70 70 65  .** When an appe
23b90 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69  ndable segment i
23ba0 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  s allocated, it 
23bb0 69 73 20 65 73 74 69 6d 61 74 65 64 20 74 68 61  is estimated tha
23bc0 74 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  t the.** maximum
23bd0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
23be0 62 6c 6f 63 6b 73 20 74 68 61 74 20 6d 61 79 20  blocks that may 
23bf0 62 65 20 72 65 71 75 69 72 65 64 20 69 73 20 74  be required is t
23c00 68 65 20 73 75 6d 20 6f 66 20 74 68 65 0a 2a 2a  he sum of the.**
23c10 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
23c20 62 6c 6f 63 6b 73 20 63 6f 6e 73 75 6d 65 64 20  blocks consumed 
23c30 62 79 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  by the input seg
23c40 6d 65 6e 74 73 2c 20 70 6c 75 73 20 74 68 65 20  ments, plus the 
23c50 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 69 6e 70  number.** of inp
23c60 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 6d 75 6c  ut segments, mul
23c70 74 69 70 6c 69 65 64 20 62 79 20 74 77 6f 2e 20  tiplied by two. 
23c80 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 73 74  This value is st
23c90 6f 72 65 64 20 69 6e 20 73 74 61 63 6b 20 0a 2a  ored in stack .*
23ca0 2a 20 76 61 72 69 61 62 6c 65 20 6e 4c 65 61 66  * variable nLeaf
23cb0 45 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  Est..**.** A tot
23cc0 61 6c 20 6f 66 20 31 36 2a 6e 4c 65 61 66 45 73  al of 16*nLeafEs
23cd0 74 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  t blocks are all
23ce0 6f 63 61 74 65 64 20 77 68 65 6e 20 61 6e 20 61  ocated when an a
23cf0 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e  ppendable segmen
23d00 74 0a 2a 2a 20 69 73 20 63 72 65 61 74 65 64 20  t.** is created 
23d10 28 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b 20  ((1 + end_block 
23d20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 3d 3d  - start_block)==
23d30 31 36 2a 6e 4c 65 61 66 45 73 74 29 2e 20 54 68  16*nLeafEst). Th
23d40 65 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20  e contiguous.** 
23d50 61 72 72 61 79 20 6f 66 20 6c 65 61 66 20 6e 6f  array of leaf no
23d60 64 65 73 20 73 74 61 72 74 73 20 61 74 20 74 68  des starts at th
23d70 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 61 6c  e first block al
23d80 6c 6f 63 61 74 65 64 2e 20 54 68 65 20 61 72 72  located. The arr
23d90 61 79 0a 2a 2a 20 6f 66 20 69 6e 74 65 72 69 6f  ay.** of interio
23da0 72 20 6e 6f 64 65 73 20 74 68 61 74 20 61 72 65  r nodes that are
23db0 20 70 61 72 65 6e 74 73 20 6f 66 20 74 68 65 20   parents of the 
23dc0 6c 65 61 66 20 6e 6f 64 65 73 20 73 74 61 72 74  leaf nodes start
23dd0 20 61 74 20 62 6c 6f 63 6b 0a 2a 2a 20 28 73 74   at block.** (st
23de0 61 72 74 5f 62 6c 6f 63 6b 20 2b 20 28 31 20 2b  art_block + (1 +
23df0 20 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61   end_block - sta
23e00 72 74 5f 62 6c 6f 63 6b 29 20 2f 20 31 36 29 2e  rt_block) / 16).
23e10 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a   And so on..**.*
23e20 2a 20 49 6e 20 74 68 65 20 61 63 74 75 61 6c 20  * In the actual 
23e30 63 6f 64 65 20 62 65 6c 6f 77 2c 20 74 68 65 20  code below, the 
23e40 76 61 6c 75 65 20 22 31 36 22 20 69 73 20 72 65  value "16" is re
23e50 70 6c 61 63 65 64 20 77 69 74 68 20 74 68 65 20  placed with the 
23e60 0a 2a 2a 20 70 72 65 2d 70 72 6f 63 65 73 73 6f  .** pre-processo
23e70 72 20 6d 61 63 72 6f 20 46 54 53 5f 4d 41 58 5f  r macro FTS_MAX_
23e80 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
23e90 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
23ea0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72   fts3IncrmergeWr
23eb0 69 74 65 72 28 20 0a 20 20 46 74 73 33 54 61 62  iter( .  Fts3Tab
23ec0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
23ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33           /* Fts3
23ee0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
23ef0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
23f00 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
23f10 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
23f20 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65  evel of input se
23f30 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  gments */.  int 
23f40 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
23f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23f60 6e 64 65 78 20 6f 66 20 6e 65 77 20 6f 75 74 70  ndex of new outp
23f70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
23f80 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
23f90 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  er *pCsr,       
23fa0 2f 2a 20 43 75 72 73 6f 72 20 74 68 61 74 20 64  /* Cursor that d
23fb0 61 74 61 20 77 69 6c 6c 20 62 65 20 72 65 61 64  ata will be read
23fc0 20 66 72 6f 6d 20 2a 2f 0a 20 20 49 6e 63 72 6d   from */.  Incrm
23fd0 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69  ergeWriter *pWri
23fe0 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ter        /* Po
23ff0 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65  pulate this obje
24000 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
24010 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24030 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
24040 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24060 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
24070 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  ble */.  int nLe
24080 61 66 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20  afEst = 0;      
24090 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
240a0 6b 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ks allocated for
240b0 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 20   leaf nodes */. 
240c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
240d0 4c 65 61 66 45 73 74 20 3d 20 30 3b 20 20 20 20  LeafEst = 0;    
240e0 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20   /* SQL used to 
240f0 64 65 74 65 72 6d 69 6e 65 20 6e 4c 65 61 66 45  determine nLeafE
24100 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
24110 73 74 6d 74 20 2a 70 46 69 72 73 74 42 6c 6f 63  stmt *pFirstBloc
24120 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 51 4c 20 75  k = 0;  /* SQL u
24130 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
24140 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 2a 2f 0a   first block */.
24150 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
24160 6e 4c 65 61 66 45 73 74 2e 20 2a 2f 0a 20 20 72  nLeafEst. */.  r
24170 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
24180 70 2c 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f  p, SQL_MAX_LEAF_
24190 4e 4f 44 45 5f 45 53 54 49 4d 41 54 45 2c 20 26  NODE_ESTIMATE, &
241a0 70 4c 65 61 66 45 73 74 2c 20 30 29 3b 0a 20 20  pLeafEst, 0);.  
241b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
241c0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
241d0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c 65 61  _bind_int64(pLea
241e0 66 45 73 74 2c 20 31 2c 20 69 41 62 73 4c 65 76  fEst, 1, iAbsLev
241f0 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
24200 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c 65 61  _bind_int64(pLea
24210 66 45 73 74 2c 20 32 2c 20 70 43 73 72 2d 3e 6e  fEst, 2, pCsr->n
24220 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66  Segment);.    if
24230 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
24240 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 65 61 66  lite3_step(pLeaf
24250 45 73 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Est) ){.      nL
24260 65 61 66 45 73 74 20 3d 20 73 71 6c 69 74 65 33  eafEst = sqlite3
24270 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 65 61  _column_int(pLea
24280 66 45 73 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  fEst, 0);.    }.
24290 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
242a0 5f 72 65 73 65 74 28 70 4c 65 61 66 45 73 74 29  _reset(pLeafEst)
242b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
242c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
242d0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 43 61 6c  rn rc;..  /* Cal
242e0 63 75 6c 61 74 65 20 74 68 65 20 66 69 72 73 74  culate the first
242f0 20 62 6c 6f 63 6b 20 74 6f 20 75 73 65 20 69 6e   block to use in
24300 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
24310 65 6e 74 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ent */.  rc = ft
24320 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
24330 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49  _NEXT_SEGMENTS_I
24340 44 2c 20 26 70 46 69 72 73 74 42 6c 6f 63 6b 2c  D, &pFirstBlock,
24350 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
24360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24370 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
24380 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 46 69  sqlite3_step(pFi
24390 72 73 74 42 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  rstBlock) ){.   
243a0 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61     pWriter->iSta
243b0 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rt = sqlite3_col
243c0 75 6d 6e 5f 69 6e 74 36 34 28 70 46 69 72 73 74  umn_int64(pFirst
243d0 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Block, 0);.     
243e0 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 20 3d   pWriter->iEnd =
243f0 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74   pWriter->iStart
24400 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 57 72 69   - 1;.      pWri
24410 74 65 72 2d 3e 69 45 6e 64 20 2b 3d 20 6e 4c 65  ter->iEnd += nLe
24420 61 66 45 73 74 20 2a 20 46 54 53 5f 4d 41 58 5f  afEst * FTS_MAX_
24430 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
24440 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  T;.    }.    rc 
24450 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
24460 70 46 69 72 73 74 42 6c 6f 63 6b 29 3b 0a 20 20  pFirstBlock);.  
24470 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
24480 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
24490 63 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  c;..  /* Insert 
244a0 74 68 65 20 6d 61 72 6b 65 72 20 69 6e 20 74 68  the marker in th
244b0 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
244c0 6c 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  le to make sure 
244d0 6e 6f 62 6f 64 79 20 74 72 69 65 73 0a 20 20 2a  nobody tries.  *
244e0 2a 20 74 6f 20 73 74 65 61 6c 20 74 68 65 20 73  * to steal the s
244f0 70 61 63 65 20 6a 75 73 74 20 61 6c 6c 6f 63 61  pace just alloca
24500 74 65 64 2e 20 54 68 69 73 20 69 73 20 61 6c 73  ted. This is als
24510 6f 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 69  o used to identi
24520 66 79 20 0a 20 20 2a 2a 20 61 70 70 65 6e 64 61  fy .  ** appenda
24530 62 6c 65 20 73 65 67 6d 65 6e 74 73 2e 20 20 2a  ble segments.  *
24540 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 57 72 69  /.  rc = fts3Wri
24550 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72  teSegment(p, pWr
24560 69 74 65 72 2d 3e 69 45 6e 64 2c 20 30 2c 20 30  iter->iEnd, 0, 0
24570 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
24580 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
24590 72 63 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e  rc;..  pWriter->
245a0 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 41 62 73  iAbsLevel = iAbs
245b0 4c 65 76 65 6c 3b 0a 20 20 70 57 72 69 74 65 72  Level;.  pWriter
245c0 2d 3e 6e 4c 65 61 66 45 73 74 20 3d 20 6e 4c 65  ->nLeafEst = nLe
245d0 61 66 45 73 74 3b 0a 20 20 70 57 72 69 74 65 72  afEst;.  pWriter
245e0 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a  ->iIdx = iIdx;..
245f0 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
24600 61 72 72 61 79 20 6f 66 20 4e 6f 64 65 57 72 69  array of NodeWri
24610 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  ter objects */. 
24620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 46 54 53 5f   for(i=0; i<FTS_
24630 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48  MAX_APPENDABLE_H
24640 45 49 47 48 54 3b 20 69 2b 2b 29 7b 0a 20 20 20  EIGHT; i++){.   
24650 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57   pWriter->aNodeW
24660 72 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63 6b 20  riter[i].iBlock 
24670 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72  = pWriter->iStar
24680 74 20 2b 20 69 2a 70 57 72 69 74 65 72 2d 3e 6e  t + i*pWriter->n
24690 4c 65 61 66 45 73 74 3b 0a 20 20 7d 0a 20 20 72  LeafEst;.  }.  r
246a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
246b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
246c0 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
246d0 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
246e0 65 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  e. This involves
246f0 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 0a 2a 2a   running the .**
24700 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73   following two s
24710 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  tatements:.**.**
24720 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25     DELETE FROM %
24730 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65  _segdir WHERE le
24740 76 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76 65 6c  vel = :iAbsLevel
24750 20 41 4e 44 20 69 64 78 20 3d 20 3a 69 49 64 78   AND idx = :iIdx
24760 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 25 5f 73  .**   UPDATE %_s
24770 65 67 64 69 72 20 53 45 54 20 69 64 78 20 3d 20  egdir SET idx = 
24780 69 64 78 20 2d 20 31 20 57 48 45 52 45 20 6c 65  idx - 1 WHERE le
24790 76 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76 65 6c  vel = :iAbsLevel
247a0 20 41 4e 44 20 69 64 78 20 3e 20 3a 69 49 64 78   AND idx > :iIdx
247b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 45 4c 45 54  .**.** The DELET
247c0 45 20 73 74 61 74 65 6d 65 6e 74 20 72 65 6d 6f  E statement remo
247d0 76 65 73 20 74 68 65 20 73 70 65 63 69 66 69 63  ves the specific
247e0 20 25 5f 73 65 67 64 69 72 20 6c 65 76 65 6c 2e   %_segdir level.
247f0 20 54 68 65 20 55 50 44 41 54 45 20 0a 2a 2a 20   The UPDATE .** 
24800 73 74 61 74 65 6d 65 6e 74 20 65 6e 73 75 72 65  statement ensure
24810 73 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69  s that the remai
24820 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 68 61  ning segments ha
24830 76 65 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  ve contiguously 
24840 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 69 64 78  allocated.** idx
24850 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
24860 69 63 20 69 6e 74 20 66 74 73 33 52 65 6d 6f 76  ic int fts3Remov
24870 65 53 65 67 64 69 72 45 6e 74 72 79 28 0a 20 20  eSegdirEntry(.  
24880 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61  /* FTS3 table ha
248b0 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
248c0 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65  3_int64 iAbsLeve
248d0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73  l,        /* Abs
248e0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20 64  olute level to d
248f0 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  elete from */.  
24900 69 6e 74 20 69 49 64 78 20 20 20 20 20 20 20 20  int iIdx        
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24920 2f 2a 20 49 6e 64 65 78 20 6f 66 20 25 5f 73 65  /* Index of %_se
24930 67 64 69 72 20 65 6e 74 72 79 20 74 6f 20 64 65  gdir entry to de
24940 6c 65 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lete */.){.  int
24950 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24970 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
24980 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
24990 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20  Delete = 0;     
249a0 20 2f 2a 20 44 45 4c 45 54 45 20 73 74 61 74 65   /* DELETE state
249b0 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ment */..  rc = 
249c0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
249d0 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52  QL_DELETE_SEGDIR
249e0 5f 45 4e 54 52 59 2c 20 26 70 44 65 6c 65 74 65  _ENTRY, &pDelete
249f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
24a00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24a10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
24a20 74 36 34 28 70 44 65 6c 65 74 65 2c 20 31 2c 20  t64(pDelete, 1, 
24a30 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20  iAbsLevel);.    
24a40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
24a50 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 69 49 64  (pDelete, 2, iId
24a60 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
24a70 73 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20  step(pDelete);. 
24a80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
24a90 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a  reset(pDelete);.
24aa0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
24ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f  ;.}../*.** One o
24ac0 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20  r more segments 
24ad0 68 61 76 65 20 6a 75 73 74 20 62 65 65 6e 20 72  have just been r
24ae0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 61 62 73 6f  emoved from abso
24af0 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62 73 4c  lute level iAbsL
24b00 65 76 65 6c 2e 0a 2a 2a 20 55 70 64 61 74 65 20  evel..** Update 
24b10 74 68 65 20 27 69 64 78 27 20 76 61 6c 75 65 73  the 'idx' values
24b20 20 6f 66 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   of the remainin
24b30 67 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  g segments in th
24b40 65 20 6c 65 76 65 6c 20 73 6f 20 74 68 61 74 0a  e level so that.
24b50 2a 2a 20 74 68 65 20 69 64 78 20 76 61 6c 75 65  ** the idx value
24b60 73 20 61 72 65 20 61 20 63 6f 6e 74 69 67 75 6f  s are a contiguo
24b70 75 73 20 73 65 71 75 65 6e 63 65 20 73 74 61 72  us sequence star
24b80 74 69 6e 67 20 66 72 6f 6d 20 30 2e 0a 2a 2f 0a  ting from 0..*/.
24b90 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 52  static int fts3R
24ba0 65 70 61 63 6b 53 65 67 64 69 72 4c 65 76 65 6c  epackSegdirLevel
24bb0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
24bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24bd0 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
24be0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
24bf0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73  lite3_int64 iAbs
24c00 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 2f 2a  Level         /*
24c10 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   Absolute level 
24c20 74 6f 20 72 65 70 61 63 6b 20 2a 2f 0a 29 7b 0a  to repack */.){.
24c30 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
24c60 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 49 64 78 20   */.  int *aIdx 
24c70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24c80 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
24c90 66 20 72 65 6d 61 69 6e 69 6e 67 20 69 64 78 20  f remaining idx 
24ca0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
24cb0 6e 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  nIdx = 0;       
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
24cd0 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
24ce0 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  aIdx[] */.  int 
24cf0 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20  nAlloc = 0;     
24d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24d10 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
24d20 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74   aIdx[] */.  int
24d30 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24d50 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
24d60 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
24d70 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30  tmt *pSelect = 0
24d80 3b 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;      /* Select
24d90 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   statement to re
24da0 61 64 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f  ad idx values */
24db0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24dc0 2a 70 55 70 64 61 74 65 20 3d 20 30 3b 20 20 20  *pUpdate = 0;   
24dd0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74 61     /* Update sta
24de0 74 65 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79  tement to modify
24df0 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f 0a 0a   idx values */..
24e00 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
24e10 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
24e20 5f 49 4e 44 45 58 45 53 2c 20 26 70 53 65 6c 65  _INDEXES, &pSele
24e30 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ct, 0);.  if( rc
24e40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24e50 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
24e60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
24e70 36 34 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 69  64(pSelect, 1, i
24e80 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 77  AbsLevel);.    w
24e90 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
24ea0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
24eb0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
24ec0 20 69 66 28 20 6e 49 64 78 3e 3d 6e 41 6c 6c 6f   if( nIdx>=nAllo
24ed0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  c ){.        int
24ee0 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   *aNew;.        
24ef0 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20  nAlloc += 16;.  
24f00 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c        aNew = sql
24f10 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 49 64  ite3_realloc(aId
24f20 78 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  x, nAlloc*sizeof
24f30 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20  (int));.        
24f40 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20  if( !aNew ){.   
24f50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24f60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
24f70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24f80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 49 64     }.        aId
24f90 78 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  x = aNew;.      
24fa0 7d 0a 20 20 20 20 20 20 61 49 64 78 5b 6e 49 64  }.      aIdx[nId
24fb0 78 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 5f 63  x++] = sqlite3_c
24fc0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65 63  olumn_int(pSelec
24fd0 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
24fe0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
24ff0 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  eset(pSelect);. 
25000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25010 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
25020 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
25030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25040 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
25050 74 28 70 2c 20 53 51 4c 5f 53 48 49 46 54 5f 53  t(p, SQL_SHIFT_S
25060 45 47 44 49 52 5f 45 4e 54 52 59 2c 20 26 70 55  EGDIR_ENTRY, &pU
25070 70 64 61 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  pdate, 0);.  }. 
25080 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25090 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
250a0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 55 70  3_bind_int64(pUp
250b0 64 61 74 65 2c 20 32 2c 20 69 41 62 73 4c 65 76  date, 2, iAbsLev
250c0 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  el);.  }..  asse
250d0 72 74 28 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61  rt( p->bIgnoreSa
250e0 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20  vepoint==0 );.  
250f0 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f  p->bIgnoreSavepo
25100 69 6e 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  int = 1;.  for(i
25110 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
25120 4b 20 26 26 20 69 3c 6e 49 64 78 3b 20 69 2b 2b  K && i<nIdx; i++
25130 29 7b 0a 20 20 20 20 69 66 28 20 61 49 64 78 5b  ){.    if( aIdx[
25140 69 5d 21 3d 69 20 29 7b 0a 20 20 20 20 20 20 73  i]!=i ){.      s
25150 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
25160 70 55 70 64 61 74 65 2c 20 33 2c 20 61 49 64 78  pUpdate, 3, aIdx
25170 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [i]);.      sqli
25180 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70  te3_bind_int(pUp
25190 64 61 74 65 2c 20 31 2c 20 69 29 3b 0a 20 20 20  date, 1, i);.   
251a0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
251b0 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20  pUpdate);.      
251c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
251d0 65 74 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20  et(pUpdate);.   
251e0 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 62 49 67 6e   }.  }.  p->bIgn
251f0 6f 72 65 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  oreSavepoint = 0
25200 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
25210 65 28 61 49 64 78 29 3b 0a 20 20 72 65 74 75 72  e(aIdx);.  retur
25220 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
25230 76 6f 69 64 20 66 74 73 33 53 74 61 72 74 4e 6f  void fts3StartNo
25240 64 65 28 42 6c 6f 62 20 2a 70 4e 6f 64 65 2c 20  de(Blob *pNode, 
25250 69 6e 74 20 69 48 65 69 67 68 74 2c 20 73 71 6c  int iHeight, sql
25260 69 74 65 33 5f 69 6e 74 36 34 20 69 43 68 69 6c  ite3_int64 iChil
25270 64 29 7b 0a 20 20 70 4e 6f 64 65 2d 3e 61 5b 30  d){.  pNode->a[0
25280 5d 20 3d 20 28 63 68 61 72 29 69 48 65 69 67 68  ] = (char)iHeigh
25290 74 3b 0a 20 20 69 66 28 20 69 43 68 69 6c 64 20  t;.  if( iChild 
252a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
252b0 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 2b  Node->nAlloc>=1+
252c0 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
252d0 74 4c 65 6e 28 69 43 68 69 6c 64 29 20 29 3b 0a  tLen(iChild) );.
252e0 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31      pNode->n = 1
252f0 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50 75   + sqlite3Fts3Pu
25300 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e  tVarint(&pNode->
25310 61 5b 31 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20  a[1], iChild);. 
25320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
25330 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f  rt( pNode->nAllo
25340 63 3e 3d 31 20 29 3b 0a 20 20 20 20 70 4e 6f 64  c>=1 );.    pNod
25350 65 2d 3e 6e 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  e->n = 1;.  }.}.
25360 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
25370 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 61   two arguments a
25380 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
25390 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
253a0 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  a segment b-tree
253b0 0a 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 6e 6f  .** node. The no
253c0 64 65 20 6d 61 79 20 62 65 20 61 20 6c 65 61 66  de may be a leaf
253d0 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   or an internal 
253e0 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  node..**.** This
253f0 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65   function create
25400 73 20 61 20 6e 65 77 20 6e 6f 64 65 20 69 6d 61  s a new node ima
25410 67 65 20 69 6e 20 62 6c 6f 62 20 6f 62 6a 65 63  ge in blob objec
25420 74 20 2a 70 4e 65 77 20 62 79 20 63 6f 70 79 69  t *pNew by copyi
25430 6e 67 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20  ng.** all terms 
25440 74 68 61 74 20 61 72 65 20 67 72 65 61 74 65 72  that are greater
25450 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
25460 6f 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 28 66  o zTerm/nTerm (f
25470 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 29 0a 2a  or leaf nodes).*
25480 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
25490 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 28 66  n zTerm/nTerm (f
254a0 6f 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  or internal node
254b0 73 29 20 66 72 6f 6d 20 61 4e 6f 64 65 2f 6e 4e  s) from aNode/nN
254c0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
254d0 6e 74 20 66 74 73 33 54 72 75 6e 63 61 74 65 4e  nt fts3TruncateN
254e0 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode(.  const cha
254f0 72 20 2a 61 4e 6f 64 65 2c 20 20 20 20 20 20 20  r *aNode,       
25500 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
25510 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 2a 2f 0a  t node image */.
25520 20 20 69 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20    int nNode,    
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25540 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 4e 6f    /* Size of aNo
25550 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  de in bytes */. 
25560 20 42 6c 6f 62 20 2a 70 4e 65 77 2c 20 20 20 20   Blob *pNew,    
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25580 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 6e   /* OUT: Write n
25590 65 77 20 6e 6f 64 65 20 69 6d 61 67 65 20 68 65  ew node image he
255a0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
255b0 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
255c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20          /* Omit 
255d0 61 6c 6c 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65  all terms smalle
255e0 72 20 74 68 61 6e 20 74 68 69 73 20 2a 2f 0a 20  r than this */. 
255f0 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25610 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72   /* Size of zTer
25620 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
25630 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
25640 69 42 6c 6f 63 6b 20 20 20 20 20 20 20 20 20 20  iBlock          
25650 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20 6e 75  /* OUT: Block nu
25660 6d 62 65 72 20 69 6e 20 6e 65 78 74 20 6c 61 79  mber in next lay
25670 65 72 20 64 6f 77 6e 20 2a 2f 0a 29 7b 0a 20 20  er down */.){.  
25680 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61 64 65  NodeReader reade
25690 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
256a0 2f 2a 20 52 65 61 64 65 72 20 6f 62 6a 65 63 74  /* Reader object
256b0 20 2a 2f 0a 20 20 42 6c 6f 62 20 70 72 65 76 20   */.  Blob prev 
256c0 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20  = {0, 0, 0};    
256d0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
256e0 73 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 74  s term written t
256f0 6f 20 6e 65 77 20 6e 6f 64 65 20 2a 2f 0a 20 20  o new node */.  
25700 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25710 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
25720 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25730 2f 0a 20 20 69 6e 74 20 62 4c 65 61 66 20 3d 20  /.  int bLeaf = 
25740 61 4e 6f 64 65 5b 30 5d 3d 3d 27 5c 30 27 3b 20  aNode[0]=='\0'; 
25750 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
25760 61 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 0a  a leaf node */..
25770 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
25780 71 75 69 72 65 64 20 6f 75 74 70 75 74 20 73 70  quired output sp
25790 61 63 65 20 2a 2f 0a 20 20 62 6c 6f 62 47 72 6f  ace */.  blobGro
257a0 77 42 75 66 66 65 72 28 70 4e 65 77 2c 20 6e 4e  wBuffer(pNew, nN
257b0 6f 64 65 2c 20 26 72 63 29 3b 0a 20 20 69 66 28  ode, &rc);.  if(
257c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
257d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e   return rc;.  pN
257e0 65 77 2d 3e 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ew->n = 0;..  /*
257f0 20 50 6f 70 75 6c 61 74 65 20 6e 65 77 20 6e 6f   Populate new no
25800 64 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 66  de buffer */.  f
25810 6f 72 28 72 63 20 3d 20 6e 6f 64 65 52 65 61 64  or(rc = nodeRead
25820 65 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20  erInit(&reader, 
25830 61 4e 6f 64 65 2c 20 6e 4e 6f 64 65 29 3b 20 0a  aNode, nNode); .
25840 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
25850 5f 4f 4b 20 26 26 20 72 65 61 64 65 72 2e 61 4e  _OK && reader.aN
25860 6f 64 65 3b 20 0a 20 20 20 20 20 20 72 63 20 3d  ode; .      rc =
25870 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
25880 26 72 65 61 64 65 72 29 0a 20 20 29 7b 0a 20 20  &reader).  ){.  
25890 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 3d 3d 30    if( pNew->n==0
258a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   ){.      int re
258b0 73 20 3d 20 66 74 73 33 54 65 72 6d 43 6d 70 28  s = fts3TermCmp(
258c0 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72  reader.term.a, r
258d0 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20 7a 54  eader.term.n, zT
258e0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
258f0 20 20 20 69 66 28 20 72 65 73 3c 30 20 7c 7c 20     if( res<0 || 
25900 28 62 4c 65 61 66 3d 3d 30 20 26 26 20 72 65 73  (bLeaf==0 && res
25910 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
25920 0a 20 20 20 20 20 20 66 74 73 33 53 74 61 72 74  .      fts3Start
25930 4e 6f 64 65 28 70 4e 65 77 2c 20 28 69 6e 74 29  Node(pNew, (int)
25940 61 4e 6f 64 65 5b 30 5d 2c 20 72 65 61 64 65 72  aNode[0], reader
25950 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  .iChild);.      
25960 2a 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65  *piBlock = reade
25970 72 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 7d 0a  r.iChild;.    }.
25980 20 20 20 20 72 63 20 3d 20 66 74 73 33 41 70 70      rc = fts3App
25990 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20 20 20 20  endToNode(.     
259a0 20 20 20 70 4e 65 77 2c 20 26 70 72 65 76 2c 20     pNew, &prev, 
259b0 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72  reader.term.a, r
259c0 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 0a 20 20  eader.term.n,.  
259d0 20 20 20 20 20 20 72 65 61 64 65 72 2e 61 44 6f        reader.aDo
259e0 63 6c 69 73 74 2c 20 72 65 61 64 65 72 2e 6e 44  clist, reader.nD
259f0 6f 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20  oclist.    );.  
25a00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25a10 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  _OK ) break;.  }
25a20 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 3d 3d  .  if( pNew->n==
25a30 30 20 29 7b 0a 20 20 20 20 66 74 73 33 53 74 61  0 ){.    fts3Sta
25a40 72 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28 69 6e  rtNode(pNew, (in
25a50 74 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65 61 64  t)aNode[0], read
25a60 65 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  er.iChild);.    
25a70 2a 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65  *piBlock = reade
25a80 72 2e 69 43 68 69 6c 64 3b 0a 20 20 7d 0a 20 20  r.iChild;.  }.  
25a90 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 3c  assert( pNew->n<
25aa0 3d 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 29 3b  =pNew->nAlloc );
25ab0 0a 0a 20 20 6e 6f 64 65 52 65 61 64 65 72 52 65  ..  nodeReaderRe
25ac0 6c 65 61 73 65 28 26 72 65 61 64 65 72 29 3b 0a  lease(&reader);.
25ad0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25ae0 72 65 76 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e  rev.a);.  return
25af0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
25b00 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73 20 73  move all terms s
25b10 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54 65 72  maller than zTer
25b20 6d 2f 6e 54 65 72 6d 20 66 72 6f 6d 20 73 65 67  m/nTerm from seg
25b30 6d 65 6e 74 20 69 49 64 78 20 69 6e 20 61 62 73  ment iIdx in abs
25b40 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65 6c 20  olute .** level 
25b50 69 41 62 73 4c 65 76 65 6c 2e 20 54 68 69 73 20  iAbsLevel. This 
25b60 6d 61 79 20 69 6e 76 6f 6c 76 65 20 64 65 6c 65  may involve dele
25b70 74 69 6e 67 20 65 6e 74 72 69 65 73 20 66 72 6f  ting entries fro
25b80 6d 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  m the %_segments
25b90 0a 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 6d  .** table, and m
25ba0 6f 64 69 66 79 69 6e 67 20 65 78 69 73 74 69 6e  odifying existin
25bb0 67 20 65 6e 74 72 69 65 73 20 69 6e 20 62 6f 74  g entries in bot
25bc0 68 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  h the %_segments
25bd0 20 61 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a   and %_segdir.**
25be0 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53   tables..**.** S
25bf0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
25c00 72 6e 65 64 20 69 66 20 74 68 65 20 73 65 67 6d  rned if the segm
25c10 65 6e 74 20 69 73 20 75 70 64 61 74 65 64 20 73  ent is updated s
25c20 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 4f 72 20  uccessfully. Or 
25c30 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  an.** SQLite err
25c40 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
25c50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25c60 20 66 74 73 33 54 72 75 6e 63 61 74 65 53 65 67   fts3TruncateSeg
25c70 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62 6c  ment(.  Fts3Tabl
25c80 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
25c90 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
25ca0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
25cb0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
25cc0 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
25cd0 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
25ce0 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74 20 74  vel of segment t
25cf0 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20 69 6e  o modify */.  in
25d00 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d20 20 49 6e 64 65 78 20 77 69 74 68 69 6e 20 6c 65   Index within le
25d30 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74 20 74  vel of segment t
25d40 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20 63 6f  o modify */.  co
25d50 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d70 20 52 65 6d 6f 76 65 20 74 65 72 6d 73 20 73 6d   Remove terms sm
25d80 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
25d90 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20  */.  int nTerm  
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25db0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25dc0 20 62 79 74 65 73 20 69 6e 20 62 75 66 66 65 72   bytes in buffer
25dd0 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69   zTerm */.){.  i
25de0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25df0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
25e00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25e10 0a 20 20 42 6c 6f 62 20 72 6f 6f 74 20 3d 20 7b  .  Blob root = {
25e20 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20  0,0,0};         
25e30 20 20 20 2f 2a 20 4e 65 77 20 72 6f 6f 74 20 70     /* New root p
25e40 61 67 65 20 69 6d 61 67 65 20 2a 2f 0a 20 20 42  age image */.  B
25e50 6c 6f 62 20 62 6c 6f 63 6b 20 3d 20 7b 30 2c 30  lob block = {0,0
25e60 2c 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ,0};           /
25e70 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 66 6f  * Buffer used fo
25e80 72 20 61 6e 79 20 6f 74 68 65 72 20 62 6c 6f 63  r any other bloc
25e90 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  k */.  sqlite3_i
25ea0 6e 74 36 34 20 69 42 6c 6f 63 6b 20 3d 20 30 3b  nt64 iBlock = 0;
25eb0 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
25ec0 69 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  id */.  sqlite3_
25ed0 69 6e 74 36 34 20 69 4e 65 77 53 74 61 72 74 20  int64 iNewStart 
25ee0 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 76  = 0;    /* New v
25ef0 61 6c 75 65 20 66 6f 72 20 69 53 74 61 72 74 42  alue for iStartB
25f00 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lock */.  sqlite
25f10 33 5f 69 6e 74 36 34 20 69 4f 6c 64 53 74 61 72  3_int64 iOldStar
25f20 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 6c 64  t = 0;    /* Old
25f30 20 76 61 6c 75 65 20 66 6f 72 20 69 53 74 61 72   value for iStar
25f40 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69  tBlock */.  sqli
25f50 74 65 33 5f 73 74 6d 74 20 2a 70 46 65 74 63 68  te3_stmt *pFetch
25f60 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53   = 0;       /* S
25f70 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
25f80 20 66 65 74 63 68 20 73 65 67 64 69 72 20 2a 2f   fetch segdir */
25f90 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
25fa0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
25fb0 43 54 5f 53 45 47 44 49 52 2c 20 26 70 46 65 74  CT_SEGDIR, &pFet
25fc0 63 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ch, 0);.  if( rc
25fd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25fe0 20 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20     int rc2;     
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 73 65   /* sqlite3_rese
26010 74 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  t() return code 
26020 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  */.    sqlite3_b
26030 69 6e 64 5f 69 6e 74 36 34 28 70 46 65 74 63 68  ind_int64(pFetch
26040 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b  , 1, iAbsLevel);
26050 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
26060 64 5f 69 6e 74 28 70 46 65 74 63 68 2c 20 32 2c  d_int(pFetch, 2,
26070 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   iIdx);.    if( 
26080 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
26090 74 65 33 5f 73 74 65 70 28 70 46 65 74 63 68 29  te3_step(pFetch)
260a0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
260b0 63 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20 73 71  char *aRoot = sq
260c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
260d0 62 28 70 46 65 74 63 68 2c 20 34 29 3b 0a 20 20  b(pFetch, 4);.  
260e0 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20      int nRoot = 
260f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
26100 79 74 65 73 28 70 46 65 74 63 68 2c 20 34 29 3b  ytes(pFetch, 4);
26110 0a 20 20 20 20 20 20 69 4f 6c 64 53 74 61 72 74  .      iOldStart
26120 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
26130 6e 5f 69 6e 74 36 34 28 70 46 65 74 63 68 2c 20  n_int64(pFetch, 
26140 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
26150 74 73 33 54 72 75 6e 63 61 74 65 4e 6f 64 65 28  ts3TruncateNode(
26160 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 72  aRoot, nRoot, &r
26170 6f 6f 74 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  oot, zTerm, nTer
26180 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20 20 20  m, &iBlock);.   
26190 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c   }.    rc2 = sql
261a0 69 74 65 33 5f 72 65 73 65 74 28 70 46 65 74 63  ite3_reset(pFetc
261b0 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  h);.    if( rc==
261c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
261d0 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 77 68 69   rc2;.  }..  whi
261e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
261f0 4b 20 26 26 20 69 42 6c 6f 63 6b 20 29 7b 0a 20  K && iBlock ){. 
26200 20 20 20 63 68 61 72 20 2a 61 42 6c 6f 63 6b 20     char *aBlock 
26210 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6c  = 0;.    int nBl
26220 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69 4e 65  ock = 0;.    iNe
26230 77 53 74 61 72 74 20 3d 20 69 42 6c 6f 63 6b 3b  wStart = iBlock;
26240 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
26250 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
26260 70 2c 20 69 42 6c 6f 63 6b 2c 20 26 61 42 6c 6f  p, iBlock, &aBlo
26270 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b  ck, &nBlock, 0);
26280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
262a0 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63 61 74  rc = fts3Truncat
262b0 65 4e 6f 64 65 28 61 42 6c 6f 63 6b 2c 20 6e 42  eNode(aBlock, nB
262c0 6c 6f 63 6b 2c 20 26 62 6c 6f 63 6b 2c 20 7a 54  lock, &block, zT
262d0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c  erm, nTerm, &iBl
262e0 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ock);.    }.    
262f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26300 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
26310 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74  fts3WriteSegment
26320 28 70 2c 20 69 4e 65 77 53 74 61 72 74 2c 20 62  (p, iNewStart, b
26330 6c 6f 63 6b 2e 61 2c 20 62 6c 6f 63 6b 2e 6e 29  lock.a, block.n)
26340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
26350 74 65 33 5f 66 72 65 65 28 61 42 6c 6f 63 6b 29  te3_free(aBlock)
26360 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69  ;.  }..  /* Vari
26370 61 62 6c 65 20 69 4e 65 77 53 74 61 72 74 20 6e  able iNewStart n
26380 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
26390 66 69 72 73 74 20 76 61 6c 69 64 20 6c 65 61 66  first valid leaf
263a0 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20   node. */.  if( 
263b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
263c0 20 69 4e 65 77 53 74 61 72 74 20 29 7b 0a 20 20   iNewStart ){.  
263d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
263e0 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 72 63  pDel = 0;.    rc
263f0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
26400 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47  , SQL_DELETE_SEG
26410 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70 44  MENTS_RANGE, &pD
26420 65 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  el, 0);.    if( 
26430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
26450 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20  ind_int64(pDel, 
26460 31 2c 20 69 4f 6c 64 53 74 61 72 74 29 3b 0a 20  1, iOldStart);. 
26470 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
26480 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 32 2c  d_int64(pDel, 2,
26490 20 69 4e 65 77 53 74 61 72 74 2d 31 29 3b 0a 20   iNewStart-1);. 
264a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
264b0 70 28 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 72  p(pDel);.      r
264c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
264d0 74 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pDel);.    }. 
264e0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
264f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
26500 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 68  qlite3_stmt *pCh
26510 6f 6d 70 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  omp = 0;.    rc 
26520 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
26530 20 53 51 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49   SQL_CHOMP_SEGDI
26540 52 2c 20 26 70 43 68 6f 6d 70 2c 20 30 29 3b 0a  R, &pChomp, 0);.
26550 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
26570 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
26580 34 28 70 43 68 6f 6d 70 2c 20 31 2c 20 69 4e 65  4(pChomp, 1, iNe
26590 77 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73  wStart);.      s
265a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
265b0 28 70 43 68 6f 6d 70 2c 20 32 2c 20 72 6f 6f 74  (pChomp, 2, root
265c0 2e 61 2c 20 72 6f 6f 74 2e 6e 2c 20 53 51 4c 49  .a, root.n, SQLI
265d0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
265e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
265f0 6e 74 36 34 28 70 43 68 6f 6d 70 2c 20 33 2c 20  nt64(pChomp, 3, 
26600 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20  iAbsLevel);.    
26610 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
26620 6e 74 28 70 43 68 6f 6d 70 2c 20 34 2c 20 69 49  nt(pChomp, 4, iI
26630 64 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dx);.      sqlit
26640 65 33 5f 73 74 65 70 28 70 43 68 6f 6d 70 29 3b  e3_step(pChomp);
26650 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26660 74 65 33 5f 72 65 73 65 74 28 70 43 68 6f 6d 70  te3_reset(pChomp
26670 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26680 73 71 6c 69 74 65 33 5f 66 72 65 65 28 72 6f 6f  sqlite3_free(roo
26690 74 2e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t.a);.  sqlite3_
266a0 66 72 65 65 28 62 6c 6f 63 6b 2e 61 29 3b 0a 20  free(block.a);. 
266b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
266c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
266d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
266e0 65 72 20 61 6e 20 69 6e 63 72 6d 65 6e 74 61 6c  er an incrmental
266f0 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e  -merge operation
26700 20 68 61 73 20 72 75 6e 20 74 6f 0a 2a 2a 20 6d   has run to.** m
26710 65 72 67 65 20 28 6f 72 20 70 61 72 74 69 61 6c  erge (or partial
26720 6c 79 20 6d 65 72 67 65 29 20 74 77 6f 20 6f 72  ly merge) two or
26730 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 66   more segments f
26740 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  rom absolute lev
26750 65 6c 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 2e  el.** iAbsLevel.
26760 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 70 75  .**.** Each inpu
26770 74 20 73 65 67 6d 65 6e 74 20 69 73 20 65 69 74  t segment is eit
26780 68 65 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  her removed from
26790 20 74 68 65 20 64 62 20 63 6f 6d 70 6c 65 74 65   the db complete
267a0 6c 79 20 28 69 66 20 61 6c 6c 20 6f 66 0a 2a 2a  ly (if all of.**
267b0 20 69 74 73 20 64 61 74 61 20 77 61 73 20 63 6f   its data was co
267c0 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
267d0 75 74 20 73 65 67 6d 65 6e 74 20 62 79 20 74 68  ut segment by th
267e0 65 20 69 6e 63 72 6d 65 72 67 65 20 6f 70 65 72  e incrmerge oper
267f0 61 74 69 6f 6e 29 0a 2a 2a 20 6f 72 20 6d 6f 64  ation).** or mod
26800 69 66 69 65 64 20 69 6e 20 70 6c 61 63 65 20 73  ified in place s
26810 6f 20 74 68 61 74 20 69 74 20 6e 6f 20 6c 6f 6e  o that it no lon
26820 67 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ger contains tho
26830 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  se entries that.
26840 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 75 70  ** have been dup
26850 6c 69 63 61 74 65 64 20 69 6e 20 74 68 65 20 6f  licated in the o
26860 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 0a 2a  utput segment..*
26870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
26880 33 49 6e 63 72 6d 65 72 67 65 43 68 6f 6d 70 28  3IncrmergeChomp(
26890 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268b0 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65 20     /* FTS table 
268c0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
268d0 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
268e0 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
268f0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 63 6f  bsolute level co
26900 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74  ntaining segment
26910 73 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  s */.  Fts3Multi
26920 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c  SegReader *pCsr,
26930 20 20 20 20 20 20 20 2f 2a 20 43 68 6f 6d 70 20         /* Chomp 
26940 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 6f 70 65  all segments ope
26950 6e 65 64 20 62 79 20 74 68 69 73 20 63 75 72 73  ned by this curs
26960 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  or */.  int *pnR
26970 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
26980 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26990 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6e 6f  r of segments no
269a0 74 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  t deleted */.){.
269b0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
269c0 52 65 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Rem = 0;.  int r
269d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
269e0 20 20 66 6f 72 28 69 3d 70 43 73 72 2d 3e 6e 53    for(i=pCsr->nS
269f0 65 67 6d 65 6e 74 2d 31 3b 20 69 3e 3d 30 20 26  egment-1; i>=0 &
26a00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
26a10 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 33 53   i--){.    Fts3S
26a20 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
26a30 20 30 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 0a   0;.    int j;..
26a40 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
26a50 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62  Fts3SegReader ob
26a60 6a 65 63 74 20 77 69 74 68 20 46 74 73 33 53 65  ject with Fts3Se
26a70 67 52 65 61 64 65 72 2e 69 49 64 78 3d 3d 69 2e  gReader.iIdx==i.
26a80 20 49 74 20 69 73 20 68 69 64 69 6e 67 0a 20 20   It is hiding.  
26a90 20 20 2a 2a 20 73 6f 6d 65 77 68 65 72 65 20 69    ** somewhere i
26aa0 6e 20 74 68 65 20 70 43 73 72 2d 3e 61 70 53 65  n the pCsr->apSe
26ab0 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 20  gment[] array.  
26ac0 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
26ad0 41 4c 57 41 59 53 28 6a 3c 70 43 73 72 2d 3e 6e  ALWAYS(j<pCsr->n
26ae0 53 65 67 6d 65 6e 74 29 3b 20 6a 2b 2b 29 7b 0a  Segment); j++){.
26af0 20 20 20 20 20 20 70 53 65 67 20 3d 20 70 43 73        pSeg = pCs
26b00 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b  r->apSegment[j];
26b10 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d  .      if( pSeg-
26b20 3e 69 49 64 78 3d 3d 69 20 29 20 62 72 65 61 6b  >iIdx==i ) break
26b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
26b40 72 74 28 20 6a 3c 70 43 73 72 2d 3e 6e 53 65 67  rt( j<pCsr->nSeg
26b50 6d 65 6e 74 20 26 26 20 70 53 65 67 2d 3e 69 49  ment && pSeg->iI
26b60 64 78 3d 3d 69 20 29 3b 0a 0a 20 20 20 20 69 66  dx==i );..    if
26b70 28 20 70 53 65 67 2d 3e 61 4e 6f 64 65 3d 3d 30  ( pSeg->aNode==0
26b80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 67   ){.      /* Seg
26b90 2d 72 65 61 64 65 72 20 69 73 20 61 74 20 45 4f  -reader is at EO
26ba0 46 2e 20 52 65 6d 6f 76 65 20 74 68 65 20 65 6e  F. Remove the en
26bb0 74 69 72 65 20 69 6e 70 75 74 20 73 65 67 6d 65  tire input segme
26bc0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  nt. */.      rc 
26bd0 3d 20 66 74 73 33 44 65 6c 65 74 65 53 65 67 6d  = fts3DeleteSegm
26be0 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20  ent(p, pSeg);.  
26bf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26c10 20 72 63 20 3d 20 66 74 73 33 52 65 6d 6f 76 65   rc = fts3Remove
26c20 53 65 67 64 69 72 45 6e 74 72 79 28 70 2c 20 69  SegdirEntry(p, i
26c30 41 62 73 4c 65 76 65 6c 2c 20 70 53 65 67 2d 3e  AbsLevel, pSeg->
26c40 69 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iIdx);.      }. 
26c50 20 20 20 20 20 2a 70 6e 52 65 6d 20 3d 20 30 3b       *pnRem = 0;
26c60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26c70 20 20 2f 2a 20 54 68 65 20 69 6e 63 72 65 6d 65    /* The increme
26c80 6e 74 61 6c 20 6d 65 72 67 65 20 64 69 64 20 6e  ntal merge did n
26c90 6f 74 20 63 6f 70 79 20 61 6c 6c 20 74 68 65 20  ot copy all the 
26ca0 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 0a  data from this .
26cb0 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
26cc0 20 74 6f 20 74 68 65 20 75 70 70 65 72 20 6c 65   to the upper le
26cd0 76 65 6c 2e 20 54 68 65 20 73 65 67 6d 65 6e 74  vel. The segment
26ce0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 69 6e 20   is modified in 
26cf0 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a 20 73  place.      ** s
26d00 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  o that it contai
26d10 6e 73 20 6e 6f 20 6b 65 79 73 20 73 6d 61 6c 6c  ns no keys small
26d20 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54  er than zTerm/nT
26d30 65 72 6d 2e 20 2a 2f 20 0a 20 20 20 20 20 20 63  erm. */ .      c
26d40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
26d50 20 3d 20 70 53 65 67 2d 3e 7a 54 65 72 6d 3b 0a   = pSeg->zTerm;.
26d60 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20        int nTerm 
26d70 3d 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3b 0a 20  = pSeg->nTerm;. 
26d80 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 72       rc = fts3Tr
26d90 75 6e 63 61 74 65 53 65 67 6d 65 6e 74 28 70 2c  uncateSegment(p,
26da0 20 69 41 62 73 4c 65 76 65 6c 2c 20 70 53 65 67   iAbsLevel, pSeg
26db0 2d 3e 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  ->iIdx, zTerm, n
26dc0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 6e 52 65  Term);.      nRe
26dd0 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  m++;.    }.  }..
26de0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26df0 5f 4f 4b 20 26 26 20 6e 52 65 6d 21 3d 70 43 73  _OK && nRem!=pCs
26e00 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 7b 0a 20  r->nSegment ){. 
26e10 20 20 20 72 63 20 3d 20 66 74 73 33 52 65 70 61     rc = fts3Repa
26e20 63 6b 53 65 67 64 69 72 4c 65 76 65 6c 28 70 2c  ckSegdirLevel(p,
26e30 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 7d   iAbsLevel);.  }
26e40 0a 0a 20 20 2a 70 6e 52 65 6d 20 3d 20 6e 52 65  ..  *pnRem = nRe
26e50 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  m;.  return rc;.
26e60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72 65 20 61  }../*.** Store a
26e70 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e  n incr-merge hin
26e80 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
26e90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26ea0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
26eb0 6e 74 53 74 6f 72 65 28 46 74 73 33 54 61 62 6c  ntStore(Fts3Tabl
26ec0 65 20 2a 70 2c 20 42 6c 6f 62 20 2a 70 48 69 6e  e *p, Blob *pHin
26ed0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  t){.  sqlite3_st
26ee0 6d 74 20 2a 70 52 65 70 6c 61 63 65 20 3d 20 30  mt *pReplace = 0
26ef0 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
26f20 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  de */..  rc = ft
26f30 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
26f40 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 2c 20 26  _REPLACE_STAT, &
26f50 70 52 65 70 6c 61 63 65 2c 20 30 29 3b 0a 20 20  pReplace, 0);.  
26f60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26f70 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
26f80 5f 62 69 6e 64 5f 69 6e 74 28 70 52 65 70 6c 61  _bind_int(pRepla
26f90 63 65 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f  ce, 1, FTS_STAT_
26fa0 49 4e 43 52 4d 45 52 47 45 48 49 4e 54 29 3b 0a  INCRMERGEHINT);.
26fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
26fc0 5f 62 6c 6f 62 28 70 52 65 70 6c 61 63 65 2c 20  _blob(pReplace, 
26fd0 32 2c 20 70 48 69 6e 74 2d 3e 61 2c 20 70 48 69  2, pHint->a, pHi
26fe0 6e 74 2d 3e 6e 2c 20 53 51 4c 49 54 45 5f 53 54  nt->n, SQLITE_ST
26ff0 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
27000 65 33 5f 73 74 65 70 28 70 52 65 70 6c 61 63 65  e3_step(pReplace
27010 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
27020 74 65 33 5f 72 65 73 65 74 28 70 52 65 70 6c 61  te3_reset(pRepla
27030 63 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ce);.  }..  retu
27040 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27050 4c 6f 61 64 20 61 6e 20 69 6e 63 72 2d 6d 65 72  Load an incr-mer
27060 67 65 20 68 69 6e 74 20 66 72 6f 6d 20 74 68 65  ge hint from the
27070 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 69   database. The i
27080 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74 2c 20  ncr-merge hint, 
27090 69 66 20 6f 6e 65 20 0a 2a 2a 20 65 78 69 73 74  if one .** exist
270a0 73 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  s, is stored in 
270b0 74 68 65 20 72 6f 77 69 64 3d 3d 31 20 72 6f 77  the rowid==1 row
270c0 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20 74   of the %_stat t
270d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  able..**.** If s
270e0 75 63 63 65 73 73 66 75 6c 2c 20 70 6f 70 75 6c  uccessful, popul
270f0 61 74 65 20 62 6c 6f 62 20 2a 70 48 69 6e 74 20  ate blob *pHint 
27100 77 69 74 68 20 74 68 65 20 76 61 6c 75 65 20 72  with the value r
27110 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 73  ead from the %_s
27120 74 61 74 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  tat.** table and
27130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27140 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  K. Otherwise, if
27150 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
27160 2c 20 72 65 74 75 72 6e 20 61 6e 0a 2a 2a 20 53  , return an.** S
27170 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27190 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e  fts3IncrmergeHin
271a0 74 4c 6f 61 64 28 46 74 73 33 54 61 62 6c 65 20  tLoad(Fts3Table 
271b0 2a 70 2c 20 42 6c 6f 62 20 2a 70 48 69 6e 74 29  *p, Blob *pHint)
271c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
271d0 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20   *pSelect = 0;. 
271e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 48 69 6e   int rc;..  pHin
271f0 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 72 63 20 3d  t->n = 0;.  rc =
27200 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
27210 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c  SQL_SELECT_STAT,
27220 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
27230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27240 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
27250 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  2;.    sqlite3_b
27260 69 6e 64 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c  ind_int(pSelect,
27270 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 49 4e 43   1, FTS_STAT_INC
27280 52 4d 45 52 47 45 48 49 4e 54 29 3b 0a 20 20 20  RMERGEHINT);.   
27290 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
272a0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
272b0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
272c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 48 69 6e  const char *aHin
272d0 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
272e0 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c 65 63 74 2c  mn_blob(pSelect,
272f0 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e   0);.      int n
27300 48 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Hint = sqlite3_c
27310 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c  olumn_bytes(pSel
27320 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ect, 0);.      i
27330 66 28 20 61 48 69 6e 74 20 29 7b 0a 20 20 20 20  f( aHint ){.    
27340 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66      blobGrowBuff
27350 65 72 28 70 48 69 6e 74 2c 20 6e 48 69 6e 74 2c  er(pHint, nHint,
27360 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
27370 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
27390 6d 63 70 79 28 70 48 69 6e 74 2d 3e 61 2c 20 61  mcpy(pHint->a, a
273a0 48 69 6e 74 2c 20 6e 48 69 6e 74 29 3b 0a 20 20  Hint, nHint);.  
273b0 20 20 20 20 20 20 20 20 70 48 69 6e 74 2d 3e 6e          pHint->n
273c0 20 3d 20 6e 48 69 6e 74 3b 0a 20 20 20 20 20 20   = nHint;.      
273d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
273e0 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  }.    rc2 = sqli
273f0 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63  te3_reset(pSelec
27400 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
27410 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
27420 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   rc2;.  }..  ret
27430 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27440 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20   If *pRc is not 
27450 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
27460 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27470 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
27480 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
27490 69 73 65 2c 20 61 70 70 65 6e 64 20 61 6e 20 65  ise, append an e
274a0 6e 74 72 79 20 74 6f 20 74 68 65 20 68 69 6e 74  ntry to the hint
274b0 20 73 74 6f 72 65 64 20 69 6e 20 62 6c 6f 62 20   stored in blob 
274c0 2a 70 48 69 6e 74 2e 20 45 61 63 68 20 65 6e 74  *pHint. Each ent
274d0 72 79 0a 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f  ry.** consists o
274e0 66 20 74 77 6f 20 76 61 72 69 6e 74 73 2c 20 74  f two varints, t
274f0 68 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  he absolute leve
27500 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  l number of the 
27510 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 0a  input segments .
27520 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ** and the numbe
27530 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
27540 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  nts..**.** If su
27550 63 63 65 73 73 66 75 6c 2c 20 6c 65 61 76 65 20  ccessful, leave 
27560 2a 70 52 63 20 73 65 74 20 74 6f 20 53 51 4c 49  *pRc set to SQLI
27570 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e  TE_OK and return
27580 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
27590 63 75 72 73 2c 0a 2a 2a 20 73 65 74 20 2a 70 52  curs,.** set *pR
275a0 63 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65  c to an SQLite e
275b0 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65  rror code before
275c0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
275d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 49  tatic void fts3I
275e0 6e 63 72 6d 65 72 67 65 48 69 6e 74 50 75 73 68  ncrmergeHintPush
275f0 28 0a 20 20 42 6c 6f 62 20 2a 70 48 69 6e 74 2c  (.  Blob *pHint,
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27610 20 20 20 20 2f 2a 20 48 69 6e 74 20 62 6c 6f 62      /* Hint blob
27620 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f   to append to */
27630 0a 20 20 69 36 34 20 69 41 62 73 4c 65 76 65 6c  .  i64 iAbsLevel
27640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27650 20 20 20 2f 2a 20 46 69 72 73 74 20 76 61 72 69     /* First vari
27660 6e 74 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 68  nt to store in h
27670 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  int */.  int nIn
27680 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
27690 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
276a0 6e 64 20 76 61 72 69 6e 74 20 74 6f 20 73 74 6f  nd varint to sto
276b0 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a 20 20  re in hint */.  
276c0 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20  int *pRc        
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
276f0 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 62 6c   code */.){.  bl
27700 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 48 69  obGrowBuffer(pHi
27710 6e 74 2c 20 70 48 69 6e 74 2d 3e 6e 20 2b 20 32  nt, pHint->n + 2
27720 2a 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58  *FTS3_VARINT_MAX
27730 2c 20 70 52 63 29 3b 0a 20 20 69 66 28 20 2a 70  , pRc);.  if( *p
27740 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
27750 0a 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d  .    pHint->n +=
27760 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
27770 61 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b  arint(&pHint->a[
27780 70 48 69 6e 74 2d 3e 6e 5d 2c 20 69 41 62 73 4c  pHint->n], iAbsL
27790 65 76 65 6c 29 3b 0a 20 20 20 20 70 48 69 6e 74  evel);.    pHint
277a0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
277b0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 48 69  s3PutVarint(&pHi
277c0 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e 6e 5d 2c  nt->a[pHint->n],
277d0 20 28 69 36 34 29 6e 49 6e 70 75 74 29 3b 0a 20   (i64)nInput);. 
277e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
277f0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
27800 28 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70  (most recently p
27810 75 73 68 65 64 29 20 66 72 6f 6d 20 74 68 65 20  ushed) from the 
27820 68 69 6e 74 20 62 6c 6f 62 20 2a 70 48 69 6e 74  hint blob *pHint
27830 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 72 65 6d  .** and then rem
27840 6f 76 65 20 74 68 65 20 65 6e 74 72 79 2e 20 57  ove the entry. W
27850 72 69 74 65 20 74 68 65 20 74 77 6f 20 76 61 6c  rite the two val
27860 75 65 73 20 72 65 61 64 20 74 6f 20 2a 70 69 41  ues read to *piA
27870 62 73 4c 65 76 65 6c 20 61 6e 64 20 0a 2a 2a 20  bsLevel and .** 
27880 2a 70 6e 49 6e 70 75 74 20 62 65 66 6f 72 65 20  *pnInput before 
27890 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
278a0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
278b0 75 72 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  urs, return SQLI
278c0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 20 68 69  TE_OK. If the hi
278d0 6e 74 20 62 6c 6f 62 20 69 6e 20 2a 70 48 69 6e  nt blob in *pHin
278e0 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  t does.** not co
278f0 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 74  ntain at least t
27900 77 6f 20 76 61 6c 69 64 20 76 61 72 69 6e 74 73  wo valid varints
27910 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
27920 43 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2f  CORRUPT_VTAB..*/
27930 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
27940 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 50 6f 70  IncrmergeHintPop
27950 28 42 6c 6f 62 20 2a 70 48 69 6e 74 2c 20 69 36  (Blob *pHint, i6
27960 34 20 2a 70 69 41 62 73 4c 65 76 65 6c 2c 20 69  4 *piAbsLevel, i
27970 6e 74 20 2a 70 6e 49 6e 70 75 74 29 7b 0a 20 20  nt *pnInput){.  
27980 63 6f 6e 73 74 20 69 6e 74 20 6e 48 69 6e 74 20  const int nHint 
27990 3d 20 70 48 69 6e 74 2d 3e 6e 3b 0a 20 20 69 6e  = pHint->n;.  in
279a0 74 20 69 3b 0a 0a 20 20 69 20 3d 20 70 48 69 6e  t i;..  i = pHin
279b0 74 2d 3e 6e 2d 32 3b 0a 20 20 77 68 69 6c 65 28  t->n-2;.  while(
279c0 20 69 3e 30 20 26 26 20 28 70 48 69 6e 74 2d 3e   i>0 && (pHint->
279d0 61 5b 69 2d 31 5d 20 26 20 30 78 38 30 29 20 29  a[i-1] & 0x80) )
279e0 20 69 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 69   i--;.  while( i
279f0 3e 30 20 26 26 20 28 70 48 69 6e 74 2d 3e 61 5b  >0 && (pHint->a[
27a00 69 2d 31 5d 20 26 20 30 78 38 30 29 20 29 20 69  i-1] & 0x80) ) i
27a10 2d 2d 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20  --;..  pHint->n 
27a20 3d 20 69 3b 0a 20 20 69 20 2b 3d 20 73 71 6c 69  = i;.  i += sqli
27a30 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
27a40 28 26 70 48 69 6e 74 2d 3e 61 5b 69 5d 2c 20 70  (&pHint->a[i], p
27a50 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 69 20  iAbsLevel);.  i 
27a60 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74  += fts3GetVarint
27a70 33 32 28 26 70 48 69 6e 74 2d 3e 61 5b 69 5d 2c  32(&pHint->a[i],
27a80 20 70 6e 49 6e 70 75 74 29 3b 0a 20 20 69 66 28   pnInput);.  if(
27a90 20 69 21 3d 6e 48 69 6e 74 20 29 20 72 65 74 75   i!=nHint ) retu
27aa0 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56  rn FTS_CORRUPT_V
27ab0 54 41 42 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  TAB;..  return S
27ac0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
27ad0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 61 6e 20 69  .** Attempt an i
27ae0 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
27af0 20 74 68 61 74 20 77 72 69 74 65 73 20 6e 4d 65   that writes nMe
27b00 72 67 65 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e  rge leaf blocks.
27b10 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  .**.** Increment
27b20 61 6c 20 6d 65 72 67 65 73 20 68 61 70 70 65 6e  al merges happen
27b30 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 61   nMin segments a
27b40 74 20 61 20 74 69 6d 65 2e 20 54 68 65 20 73 65  t a time. The se
27b50 67 6d 65 6e 74 73 20 0a 2a 2a 20 74 6f 20 62 65  gments .** to be
27b60 20 6d 65 72 67 65 64 20 61 72 65 20 74 68 65 20   merged are the 
27b70 6e 4d 69 6e 20 6f 6c 64 65 73 74 20 73 65 67 6d  nMin oldest segm
27b80 65 6e 74 73 20 28 74 68 65 20 6f 6e 65 73 20 77  ents (the ones w
27b90 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
27ba0 20 0a 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20   .** values for 
27bb0 74 68 65 20 5f 73 65 67 64 69 72 2e 69 64 78 20  the _segdir.idx 
27bc0 66 69 65 6c 64 29 20 69 6e 20 74 68 65 20 68 69  field) in the hi
27bd0 67 68 65 73 74 20 6c 65 76 65 6c 20 74 68 61 74  ghest level that
27be0 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 74   contains .** at
27bf0 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d   least nMin segm
27c00 65 6e 74 73 2e 20 4d 75 6c 74 69 70 6c 65 20 6d  ents. Multiple m
27c10 65 72 67 65 73 20 6d 69 67 68 74 20 6f 63 63 75  erges might occu
27c20 72 20 69 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  r in an attempt 
27c30 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 68 65  to .** write the
27c40 20 71 75 6f 74 61 20 6f 66 20 6e 4d 65 72 67 65   quota of nMerge
27c50 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2f   leaf blocks..*/
27c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
27c70 49 6e 63 72 6d 65 72 67 65 28 46 74 73 33 54 61  Incrmerge(Fts3Ta
27c80 62 6c 65 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  ble *p, int nMer
27c90 67 65 2c 20 69 6e 74 20 6e 4d 69 6e 29 7b 0a 20  ge, int nMin){. 
27ca0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27cd0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  */.  int nRem = 
27ce0 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20  nMerge;         
27cf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27d00 66 20 6c 65 61 66 20 70 61 67 65 73 20 79 65 74  f leaf pages yet
27d10 20 74 6f 20 20 62 65 20 77 72 69 74 74 65 6e 20   to  be written 
27d20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
27d30 67 52 65 61 64 65 72 20 2a 70 43 73 72 3b 20 20  gReader *pCsr;  
27d40 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 75       /* Cursor u
27d50 73 65 64 20 74 6f 20 72 65 61 64 20 69 6e 70 75  sed to read inpu
27d60 74 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 33  t data */.  Fts3
27d70 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74  SegFilter *pFilt
27d80 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  er;         /* F
27d90 69 6c 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ilter used with 
27da0 63 75 72 73 6f 72 20 70 43 73 72 20 2a 2f 0a 20  cursor pCsr */. 
27db0 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
27dc0 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
27dd0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
27de0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 20  t */.  int nSeg 
27df0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
27e00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27e10 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
27e20 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ts */.  sqlite3_
27e30 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 20  int64 iAbsLevel 
27e40 3d 20 30 3b 20 20 20 20 2f 2a 20 41 62 73 6f 6c  = 0;    /* Absol
27e50 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72  ute level number
27e60 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20   to work on */. 
27e70 20 42 6c 6f 62 20 68 69 6e 74 20 3d 20 7b 30 2c   Blob hint = {0,
27e80 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20   0, 0};         
27e90 20 2f 2a 20 48 69 6e 74 20 72 65 61 64 20 66 72   /* Hint read fr
27ea0 6f 6d 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20  om %_stat table 
27eb0 2a 2f 0a 20 20 69 6e 74 20 62 44 69 72 74 79 48  */.  int bDirtyH
27ec0 69 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  int = 0;        
27ed0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
27ee0 62 6c 6f 62 20 27 68 69 6e 74 27 20 68 61 73 20  blob 'hint' has 
27ef0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f  been modified */
27f00 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
27f10 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 75  space for the cu
27f20 72 73 6f 72 2c 20 66 69 6c 74 65 72 20 61 6e 64  rsor, filter and
27f30 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20   writer objects 
27f40 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
27f50 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 2a  Alloc = sizeof(*
27f60 70 43 73 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a  pCsr) + sizeof(*
27f70 70 46 69 6c 74 65 72 29 20 2b 20 73 69 7a 65 6f  pFilter) + sizeo
27f80 66 28 2a 70 57 72 69 74 65 72 29 3b 0a 20 20 70  f(*pWriter);.  p
27f90 57 72 69 74 65 72 20 3d 20 28 49 6e 63 72 6d 65  Writer = (Incrme
27fa0 72 67 65 57 72 69 74 65 72 20 2a 29 73 71 6c 69  rgeWriter *)sqli
27fb0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f  te3_malloc(nAllo
27fc0 63 29 3b 0a 20 20 69 66 28 20 21 70 57 72 69 74  c);.  if( !pWrit
27fd0 65 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  er ) return SQLI
27fe0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 46 69 6c  TE_NOMEM;.  pFil
27ff0 74 65 72 20 3d 20 28 46 74 73 33 53 65 67 46 69  ter = (Fts3SegFi
28000 6c 74 65 72 20 2a 29 26 70 57 72 69 74 65 72 5b  lter *)&pWriter[
28010 31 5d 3b 0a 20 20 70 43 73 72 20 3d 20 28 46 74  1];.  pCsr = (Ft
28020 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
28030 20 2a 29 26 70 46 69 6c 74 65 72 5b 31 5d 3b 0a   *)&pFilter[1];.
28040 0a 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72  .  rc = fts3Incr
28050 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 70 2c  mergeHintLoad(p,
28060 20 26 68 69 6e 74 29 3b 0a 20 20 77 68 69 6c 65   &hint);.  while
28070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28080 26 26 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20  && nRem>0 ){.   
28090 20 63 6f 6e 73 74 20 69 36 34 20 6e 4d 6f 64 20   const i64 nMod 
280a0 3d 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  = FTS3_SEGDIR_MA
280b0 58 4c 45 56 45 4c 20 2a 20 70 2d 3e 6e 49 6e 64  XLEVEL * p->nInd
280c0 65 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ex;.    sqlite3_
280d0 73 74 6d 74 20 2a 70 46 69 6e 64 4c 65 76 65 6c  stmt *pFindLevel
280e0 20 3d 20 30 3b 20 2f 2a 20 53 51 4c 20 75 73 65   = 0; /* SQL use
280f0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
28100 41 62 73 4c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  AbsLevel */.    
28110 69 6e 74 20 62 55 73 65 48 69 6e 74 20 3d 20 30  int bUseHint = 0
28120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28130 20 54 72 75 65 20 69 66 20 61 74 74 65 6d 70 74   True if attempt
28140 69 6e 67 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ing to append */
28150 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20  .    int iIdx = 
28160 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
28170 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 64     /* Largest id
28180 78 20 69 6e 20 6c 65 76 65 6c 20 28 69 41 62 73  x in level (iAbs
28190 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 0a 20 20 20  Level+1) */..   
281a0 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 25   /* Search the %
281b0 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 66 6f  _segdir table fo
281c0 72 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 6c  r the absolute l
281d0 65 76 65 6c 20 77 69 74 68 20 74 68 65 20 73 6d  evel with the sm
281e0 61 6c 6c 65 73 74 0a 20 20 20 20 2a 2a 20 72 65  allest.    ** re
281f0 6c 61 74 69 76 65 20 6c 65 76 65 6c 20 6e 75 6d  lative level num
28200 62 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ber that contain
28210 73 20 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e 20  s at least nMin 
28220 73 65 67 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79  segments, if any
28230 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20  ..    ** If one 
28240 69 73 20 66 6f 75 6e 64 2c 20 73 65 74 20 69 41  is found, set iA
28250 62 73 4c 65 76 65 6c 20 74 6f 20 74 68 65 20 61  bsLevel to the a
28260 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75  bsolute level nu
28270 6d 62 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20  mber and.    ** 
28280 6e 53 65 67 20 74 6f 20 6e 4d 69 6e 2e 20 49 66  nSeg to nMin. If
28290 20 6e 6f 20 6c 65 76 65 6c 20 77 69 74 68 20 61   no level with a
282a0 74 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65 67  t least nMin seg
282b0 6d 65 6e 74 73 20 63 61 6e 20 62 65 20 66 6f 75  ments can be fou
282c0 6e 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  nd, .    ** set 
282d0 6e 53 65 67 20 74 6f 20 2d 31 2e 0a 20 20 20 20  nSeg to -1..    
282e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
282f0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 46  SqlStmt(p, SQL_F
28300 49 4e 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 2c  IND_MERGE_LEVEL,
28310 20 26 70 46 69 6e 64 4c 65 76 65 6c 2c 20 30 29   &pFindLevel, 0)
28320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
28330 6e 64 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76 65  nd_int(pFindLeve
28340 6c 2c 20 31 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  l, 1, nMin);.   
28350 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
28360 70 28 70 46 69 6e 64 4c 65 76 65 6c 29 3d 3d 53  p(pFindLevel)==S
28370 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
28380 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 73     iAbsLevel = s
28390 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
283a0 74 36 34 28 70 46 69 6e 64 4c 65 76 65 6c 2c 20  t64(pFindLevel, 
283b0 30 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d  0);.      nSeg =
283c0 20 6e 4d 69 6e 3b 0a 20 20 20 20 7d 65 6c 73 65   nMin;.    }else
283d0 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 2d  {.      nSeg = -
283e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
283f0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
28400 70 46 69 6e 64 4c 65 76 65 6c 29 3b 0a 0a 20 20  pFindLevel);..  
28410 20 20 2f 2a 20 49 66 20 74 68 65 20 68 69 6e 74    /* If the hint
28420 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
28430 5f 73 74 61 74 20 74 61 62 6c 65 20 69 73 20 6e  _stat table is n
28440 6f 74 20 65 6d 70 74 79 2c 20 63 68 65 63 6b 20  ot empty, check 
28450 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  if the.    ** la
28460 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 20 73  st entry in it s
28470 70 65 63 69 66 69 65 73 20 61 20 72 65 6c 61 74  pecifies a relat
28480 69 76 65 20 6c 65 76 65 6c 20 73 6d 61 6c 6c 65  ive level smalle
28490 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  r than or equal.
284a0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 65      ** to the le
284b0 76 65 6c 20 69 64 65 6e 74 69 66 69 65 64 20 62  vel identified b
284c0 79 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  y the block abov
284d0 65 20 28 69 66 20 61 6e 79 29 2e 20 49 66 20 73  e (if any). If s
284e0 6f 2c 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20  o, this .    ** 
284f0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
28500 20 6c 6f 6f 70 20 77 69 6c 6c 20 77 6f 72 6b 20   loop will work 
28510 6f 6e 20 6d 65 72 67 69 6e 67 20 61 74 20 74 68  on merging at th
28520 65 20 68 69 6e 74 65 64 20 6c 65 76 65 6c 2e 0a  e hinted level..
28530 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
28540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28550 68 69 6e 74 2e 6e 20 29 7b 0a 20 20 20 20 20 20  hint.n ){.      
28560 69 6e 74 20 6e 48 69 6e 74 20 3d 20 68 69 6e 74  int nHint = hint
28570 2e 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  .n;.      sqlite
28580 33 5f 69 6e 74 36 34 20 69 48 69 6e 74 41 62 73  3_int64 iHintAbs
28590 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20  Level = 0;      
285a0 2f 2a 20 48 69 6e 74 20 6c 65 76 65 6c 20 2a 2f  /* Hint level */
285b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74  .      int nHint
285c0 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Seg = 0;        
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
285e0 48 69 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73  Hint number of s
285f0 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 20 20  egments */..    
28600 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
28610 65 72 67 65 48 69 6e 74 50 6f 70 28 26 68 69 6e  ergeHintPop(&hin
28620 74 2c 20 26 69 48 69 6e 74 41 62 73 4c 65 76 65  t, &iHintAbsLeve
28630 6c 2c 20 26 6e 48 69 6e 74 53 65 67 29 3b 0a 20  l, &nHintSeg);. 
28640 20 20 20 20 20 69 66 28 20 6e 53 65 67 3c 30 20       if( nSeg<0 
28650 7c 7c 20 28 69 41 62 73 4c 65 76 65 6c 20 25 20  || (iAbsLevel % 
28660 6e 4d 6f 64 29 20 3e 3d 20 28 69 48 69 6e 74 41  nMod) >= (iHintA
28670 62 73 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20  bsLevel % nMod) 
28680 29 7b 0a 20 20 20 20 20 20 20 20 69 41 62 73 4c  ){.        iAbsL
28690 65 76 65 6c 20 3d 20 69 48 69 6e 74 41 62 73 4c  evel = iHintAbsL
286a0 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 6e 53  evel;.        nS
286b0 65 67 20 3d 20 6e 48 69 6e 74 53 65 67 3b 0a 20  eg = nHintSeg;. 
286c0 20 20 20 20 20 20 20 62 55 73 65 48 69 6e 74 20         bUseHint 
286d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 44 69  = 1;.        bDi
286e0 72 74 79 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20  rtyHint = 1;.   
286f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28700 20 20 2f 2a 20 54 68 69 73 20 75 6e 64 6f 65 73    /* This undoes
28710 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
28720 68 65 20 48 69 6e 74 50 6f 70 28 29 20 61 62 6f  he HintPop() abo
28730 76 65 20 2d 20 73 6f 20 74 68 61 74 20 6e 6f 20  ve - so that no 
28740 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  entry.        **
28750 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
28760 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62 2e 20   the hint blob. 
28770 20 2a 2f 0a 20 20 20 20 20 20 20 20 68 69 6e 74   */.        hint
28780 2e 6e 20 3d 20 6e 48 69 6e 74 3b 0a 20 20 20 20  .n = nHint;.    
28790 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
287a0 2a 20 49 66 20 6e 53 65 67 20 69 73 20 6c 65 73  * If nSeg is les
287b0 73 20 74 68 61 74 20 7a 65 72 6f 2c 20 74 68 65  s that zero, the
287c0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 65  n there is no le
287d0 76 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73  vel with at leas
287e0 74 0a 20 20 20 20 2a 2a 20 6e 4d 69 6e 20 73 65  t.    ** nMin se
287f0 67 6d 65 6e 74 73 20 61 6e 64 20 6e 6f 20 68 69  gments and no hi
28800 6e 74 20 69 6e 20 74 68 65 20 25 5f 73 74 61 74  nt in the %_stat
28810 20 74 61 62 6c 65 2e 20 4e 6f 20 77 6f 72 6b 20   table. No work 
28820 74 6f 20 64 6f 2e 0a 20 20 20 20 2a 2a 20 45 78  to do..    ** Ex
28830 69 74 20 65 61 72 6c 79 20 69 6e 20 74 68 69 73  it early in this
28840 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
28850 66 28 20 6e 53 65 67 3c 30 20 29 20 62 72 65 61  f( nSeg<0 ) brea
28860 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  k;..    /* Open 
28870 61 20 63 75 72 73 6f 72 20 74 6f 20 69 74 65 72  a cursor to iter
28880 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
28890 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
288a0 6f 6c 64 65 73 74 20 6e 53 65 67 20 0a 20 20 20  oldest nSeg .   
288b0 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 66 20 61   ** indexes of a
288c0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41  bsolute level iA
288d0 62 73 4c 65 76 65 6c 2e 20 49 66 20 74 68 69 73  bsLevel. If this
288e0 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65   cursor is opene
288f0 64 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20  d using .    ** 
28900 74 68 65 20 27 68 69 6e 74 27 20 70 61 72 61 6d  the 'hint' param
28910 65 74 65 72 73 2c 20 69 74 20 69 73 20 70 6f 73  eters, it is pos
28920 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 72 65  sible that there
28930 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e   are less than n
28940 53 65 67 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  Seg.    ** segme
28950 6e 74 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  nts available in
28960 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
28970 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
28980 6e 6f 20 77 6f 72 6b 20 69 73 0a 20 20 20 20 2a  no work is.    *
28990 2a 20 64 6f 6e 65 20 6f 6e 20 69 41 62 73 4c 65  * done on iAbsLe
289a0 76 65 6c 20 2d 20 66 61 6c 6c 20 74 68 72 6f 75  vel - fall throu
289b0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
289c0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
289d0 6c 6f 6f 70 20 0a 20 20 20 20 2a 2a 20 74 6f 20  loop .    ** to 
289e0 73 74 61 72 74 20 77 6f 72 6b 20 6f 6e 20 73 6f  start work on so
289f0 6d 65 20 6f 74 68 65 72 20 6c 65 76 65 6c 2e 20  me other level. 
28a00 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
28a10 57 72 69 74 65 72 2c 20 30 2c 20 6e 41 6c 6c 6f  Writer, 0, nAllo
28a20 63 29 3b 0a 20 20 20 20 70 46 69 6c 74 65 72 2d  c);.    pFilter-
28a30 3e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45  >flags = FTS3_SE
28a40 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f  GMENT_REQUIRE_PO
28a50 53 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  S;..    if( rc==
28a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28a70 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
28a80 6d 65 72 67 65 4f 75 74 70 75 74 49 64 78 28 70  mergeOutputIdx(p
28a90 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 26 69 49  , iAbsLevel, &iI
28aa0 64 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  dx);.      asser
28ab0 74 28 20 62 55 73 65 48 69 6e 74 3d 3d 31 20 7c  t( bUseHint==1 |
28ac0 7c 20 62 55 73 65 48 69 6e 74 3d 3d 30 20 29 3b  | bUseHint==0 );
28ad0 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3d  .      if( iIdx=
28ae0 3d 30 20 7c 7c 20 28 62 55 73 65 48 69 6e 74 20  =0 || (bUseHint 
28af0 26 26 20 69 49 64 78 3d 3d 31 29 20 29 7b 0a 20  && iIdx==1) ){. 
28b00 20 20 20 20 20 20 20 69 6e 74 20 62 49 67 6e 6f         int bIgno
28b10 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  re = 0;.        
28b20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
28b30 49 73 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69 41  IsMaxLevel(p, iA
28b40 62 73 4c 65 76 65 6c 2b 31 2c 20 26 62 49 67 6e  bsLevel+1, &bIgn
28b50 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ore);.        if
28b60 28 20 62 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  ( bIgnore ){.   
28b70 20 20 20 20 20 20 20 70 46 69 6c 74 65 72 2d 3e         pFilter->
28b80 66 6c 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45  flags |= FTS3_SE
28b90 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50  GMENT_IGNORE_EMP
28ba0 54 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  TY;.        }.  
28bb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
28bc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
28be0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 73   fts3IncrmergeCs
28bf0 72 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  r(p, iAbsLevel, 
28c00 6e 53 65 67 2c 20 70 43 73 72 29 3b 0a 20 20 20  nSeg, pCsr);.   
28c10 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
28c20 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 70 43 73 72  E_OK==rc && pCsr
28c30 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 6e 53 65 67  ->nSegment==nSeg
28c40 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
28c50 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
28c60 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
28c70 61 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69  art(p, pCsr, pFi
28c80 6c 74 65 72 29 29 0a 20 20 20 20 20 26 26 20 53  lter)).     && S
28c90 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d  QLITE_ROW==(rc =
28ca0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
28cb0 65 61 64 65 72 53 74 65 70 28 70 2c 20 70 43 73  eaderStep(p, pCs
28cc0 72 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  r)).    ){.     
28cd0 20 69 66 28 20 62 55 73 65 48 69 6e 74 20 26 26   if( bUseHint &&
28ce0 20 69 49 64 78 3e 30 20 29 7b 0a 20 20 20 20 20   iIdx>0 ){.     
28cf0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
28d00 4b 65 79 20 3d 20 70 43 73 72 2d 3e 7a 54 65 72  Key = pCsr->zTer
28d10 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  m;.        int n
28d20 4b 65 79 20 3d 20 70 43 73 72 2d 3e 6e 54 65 72  Key = pCsr->nTer
28d30 6d 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  m;.        rc = 
28d40 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61  fts3IncrmergeLoa
28d50 64 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  d(p, iAbsLevel, 
28d60 69 49 64 78 2d 31 2c 20 7a 4b 65 79 2c 20 6e 4b  iIdx-1, zKey, nK
28d70 65 79 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  ey, pWriter);.  
28d80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28d90 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
28da0 6d 65 72 67 65 57 72 69 74 65 72 28 70 2c 20 69  mergeWriter(p, i
28db0 41 62 73 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20  AbsLevel, iIdx, 
28dc0 70 43 73 72 2c 20 70 57 72 69 74 65 72 29 3b 0a  pCsr, pWriter);.
28dd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
28de0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28df0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65   && pWriter->nLe
28e00 61 66 45 73 74 20 29 7b 0a 20 20 20 20 20 20 20  afEst ){.       
28e10 20 66 74 73 33 4c 6f 67 4d 65 72 67 65 28 6e 53   fts3LogMerge(nS
28e20 65 67 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a  eg, iAbsLevel);.
28e30 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20          do {.   
28e40 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
28e50 49 6e 63 72 6d 65 72 67 65 41 70 70 65 6e 64 28  IncrmergeAppend(
28e60 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 73 72  p, pWriter, pCsr
28e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
28ea0 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70  3SegReaderStep(p
28eb0 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , pCsr);.       
28ec0 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
28ed0 6e 57 6f 72 6b 3e 3d 6e 52 65 6d 20 26 26 20 72  nWork>=nRem && r
28ee0 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c==SQLITE_ROW ) 
28ef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28f00 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20          }while( 
28f10 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
28f20 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70  ;..        /* Up
28f30 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20 74  date or delete t
28f40 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
28f50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
28f60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28f70 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65 6d  {.          nRem
28f80 20 2d 3d 20 28 31 20 2b 20 70 57 72 69 74 65 72   -= (1 + pWriter
28f90 2d 3e 6e 57 6f 72 6b 29 3b 0a 20 20 20 20 20 20  ->nWork);.      
28fa0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
28fb0 72 6d 65 72 67 65 43 68 6f 6d 70 28 70 2c 20 69  rmergeChomp(p, i
28fc0 41 62 73 4c 65 76 65 6c 2c 20 70 43 73 72 2c 20  AbsLevel, pCsr, 
28fd0 26 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 20 20  &nSeg);.        
28fe0 20 20 69 66 28 20 6e 53 65 67 21 3d 30 20 29 7b    if( nSeg!=0 ){
28ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 44 69  .            bDi
29000 72 74 79 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20  rtyHint = 1;.   
29010 20 20 20 20 20 20 20 20 20 66 74 73 33 49 6e 63           fts3Inc
29020 72 6d 65 72 67 65 48 69 6e 74 50 75 73 68 28 26  rmergeHintPush(&
29030 68 69 6e 74 2c 20 69 41 62 73 4c 65 76 65 6c 2c  hint, iAbsLevel,
29040 20 6e 53 65 67 2c 20 26 72 63 29 3b 0a 20 20 20   nSeg, &rc);.   
29050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29060 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
29070 20 20 69 66 28 20 6e 53 65 67 21 3d 30 20 29 7b    if( nSeg!=0 ){
29080 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72  .        pWriter
29090 2d 3e 6e 4c 65 61 66 44 61 74 61 20 3d 20 70 57  ->nLeafData = pW
290a0 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61  riter->nLeafData
290b0 20 2a 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   * -1;.      }. 
290c0 20 20 20 20 20 66 74 73 33 49 6e 63 72 6d 65 72       fts3Incrmer
290d0 67 65 52 65 6c 65 61 73 65 28 70 2c 20 70 57 72  geRelease(p, pWr
290e0 69 74 65 72 2c 20 26 72 63 29 3b 0a 20 20 20 20  iter, &rc);.    
290f0 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 26 26    if( nSeg==0 &&
29100 20 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65 61   pWriter->bNoLea
29110 66 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  fData==0 ){.    
29120 20 20 20 20 66 74 73 33 50 72 6f 6d 6f 74 65 53      fts3PromoteS
29130 65 67 6d 65 6e 74 73 28 70 2c 20 69 41 62 73 4c  egments(p, iAbsL
29140 65 76 65 6c 2b 31 2c 20 70 57 72 69 74 65 72 2d  evel+1, pWriter-
29150 3e 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20  >nLeafData);.   
29160 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29170 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
29180 61 64 65 72 46 69 6e 69 73 68 28 70 43 73 72 29  aderFinish(pCsr)
29190 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
291a0 65 20 74 68 65 20 68 69 6e 74 20 76 61 6c 75 65  e the hint value
291b0 73 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 74 61  s into the %_sta
291c0 74 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  t table for the 
291d0 6e 65 78 74 20 69 6e 63 72 2d 6d 65 72 67 65 72  next incr-merger
291e0 20 2a 2f 0a 20 20 69 66 28 20 62 44 69 72 74 79   */.  if( bDirty
291f0 48 69 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  Hint && rc==SQLI
29200 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
29210 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  = fts3IncrmergeH
29220 69 6e 74 53 74 6f 72 65 28 70 2c 20 26 68 69 6e  intStore(p, &hin
29230 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
29240 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 29  e3_free(pWriter)
29250 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
29260 28 68 69 6e 74 2e 61 29 3b 0a 20 20 72 65 74 75  (hint.a);.  retu
29270 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29280 43 6f 6e 76 65 72 74 20 74 68 65 20 74 65 78 74  Convert the text
29290 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 2a 70   beginning at *p
292a0 7a 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  z into an intege
292b0 72 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  r and return.** 
292c0 69 74 73 20 76 61 6c 75 65 2e 20 20 41 64 76 61  its value.  Adva
292d0 6e 63 65 20 2a 70 7a 20 74 6f 20 70 6f 69 6e 74  nce *pz to point
292e0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68   to the first ch
292f0 61 72 61 63 74 65 72 20 70 61 73 74 0a 2a 2a 20  aracter past.** 
29300 74 68 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  the integer..*/.
29310 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 47  static int fts3G
29320 65 74 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  etint(const char
29330 20 2a 2a 70 7a 29 7b 0a 20 20 63 6f 6e 73 74 20   **pz){.  const 
29340 63 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20  char *z = *pz;. 
29350 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
29360 69 6c 65 28 20 28 2a 7a 29 3e 3d 27 30 27 20 26  ile( (*z)>='0' &
29370 26 20 28 2a 7a 29 3c 3d 27 39 27 20 29 20 69 20  & (*z)<='9' ) i 
29380 3d 20 31 30 2a 69 20 2b 20 2a 28 7a 2b 2b 29 20  = 10*i + *(z++) 
29390 2d 20 27 30 27 3b 0a 20 20 2a 70 7a 20 3d 20 7a  - '0';.  *pz = z
293a0 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
293b0 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73  ./*.** Process s
293c0 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65  tatements of the
293d0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
293e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c  INSERT INTO tabl
293f0 65 28 74 61 62 6c 65 29 20 56 41 4c 55 45 53 28  e(table) VALUES(
29400 27 6d 65 72 67 65 3d 41 2c 42 27 29 3b 0a 2a 2a  'merge=A,B');.**
29410 0a 2a 2a 20 41 20 61 6e 64 20 42 20 61 72 65 20  .** A and B are 
29420 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
29430 63 6f 64 65 20 74 6f 20 62 65 20 74 68 65 20 6e  code to be the n
29440 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
29450 67 65 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 66  ges.** written f
29460 6f 72 20 74 68 65 20 6d 65 72 67 65 2c 20 61 6e  or the merge, an
29470 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75  d the minimum nu
29480 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
29490 20 6f 6e 20 61 20 6c 65 76 65 6c 0a 2a 2a 20 62   on a level.** b
294a0 65 66 6f 72 65 20 69 74 20 77 69 6c 6c 20 62 65  efore it will be
294b0 20 73 65 6c 65 63 74 65 64 20 66 6f 72 20 61 20   selected for a 
294c0 6d 65 72 67 65 2c 20 72 65 73 70 65 63 74 69 76  merge, respectiv
294d0 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
294e0 6e 74 20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72  nt fts3DoIncrmer
294f0 67 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ge(.  Fts3Table 
29500 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
29510 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
29520 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
29530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
29540 61 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  am              
29550 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
29560 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
29570 69 6e 67 20 22 41 2c 42 22 20 2a 2f 0a 29 7b 0a  ing "A,B" */.){.
29580 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
29590 6e 4d 69 6e 20 3d 20 28 46 54 53 33 5f 4d 45 52  nMin = (FTS3_MER
295a0 47 45 5f 43 4f 55 4e 54 20 2f 20 32 29 3b 0a 20  GE_COUNT / 2);. 
295b0 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 30 3b   int nMerge = 0;
295c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
295d0 20 3d 20 7a 50 61 72 61 6d 3b 0a 0a 20 20 2f 2a   = zParam;..  /*
295e0 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
295f0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 2a 2f  integer value */
29600 0a 20 20 6e 4d 65 72 67 65 20 3d 20 66 74 73 33  .  nMerge = fts3
29610 47 65 74 69 6e 74 28 26 7a 29 3b 0a 0a 20 20 2f  Getint(&z);..  /
29620 2a 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69  * If the first i
29630 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 73 20  nteger value is 
29640 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 27 2c  followed by a ',
29650 27 2c 20 20 72 65 61 64 20 74 68 65 20 73 65 63  ',  read the sec
29660 6f 6e 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  ond.  ** integer
29670 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 69 66 28   value. */.  if(
29680 20 7a 5b 30 5d 3d 3d 27 2c 27 20 26 26 20 7a 5b   z[0]==',' && z[
29690 31 5d 21 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20  1]!='\0' ){.    
296a0 7a 2b 2b 3b 0a 20 20 20 20 6e 4d 69 6e 20 3d 20  z++;.    nMin = 
296b0 66 74 73 33 47 65 74 69 6e 74 28 26 7a 29 3b 0a  fts3Getint(&z);.
296c0 20 20 7d 0a 0a 20 20 69 66 28 20 7a 5b 30 5d 21    }..  if( z[0]!
296d0 3d 27 5c 30 27 20 7c 7c 20 6e 4d 69 6e 3c 32 20  ='\0' || nMin<2 
296e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
296f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
29700 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
29710 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 21  TE_OK;.    if( !
29720 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20  p->bHasStat ){. 
29730 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
29740 62 46 74 73 34 3d 3d 30 20 29 3b 0a 20 20 20 20  bFts4==0 );.    
29750 20 20 73 71 6c 69 74 65 33 46 74 73 33 43 72 65    sqlite3Fts3Cre
29760 61 74 65 53 74 61 74 54 61 62 6c 65 28 26 72 63  ateStatTable(&rc
29770 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , p);.    }.    
29780 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29790 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
297a0 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d  sqlite3Fts3Incrm
297b0 65 72 67 65 28 70 2c 20 6e 4d 65 72 67 65 2c 20  erge(p, nMerge, 
297c0 6e 4d 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nMin);.    }.   
297d0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
297e0 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20  entsClose(p);.  
297f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29800 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
29810 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68  statements of th
29820 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
29830 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62   INSERT INTO tab
29840 6c 65 28 74 61 62 6c 65 29 20 56 41 4c 55 45 53  le(table) VALUES
29850 28 27 61 75 74 6f 6d 65 72 67 65 3d 58 27 29 3b  ('automerge=X');
29860 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  .**.** where X i
29870 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 58  s an integer.  X
29880 3d 3d 30 20 6d 65 61 6e 73 20 74 6f 20 74 75 72  ==0 means to tur
29890 6e 20 61 75 74 6f 6d 65 72 67 65 20 6f 66 66 2e  n automerge off.
298a0 20 20 58 21 3d 30 20 6d 65 61 6e 73 0a 2a 2a 20    X!=0 means.** 
298b0 74 75 72 6e 20 69 74 20 6f 6e 2e 20 20 54 68 65  turn it on.  The
298c0 20 73 65 74 74 69 6e 67 20 69 73 20 70 65 72 73   setting is pers
298d0 69 73 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  istent..*/.stati
298e0 63 20 69 6e 74 20 66 74 73 33 44 6f 41 75 74 6f  c int fts3DoAuto
298f0 69 6e 63 72 6d 65 72 67 65 28 0a 20 20 46 74 73  incrmerge(.  Fts
29900 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29920 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
29930 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
29940 72 20 2a 7a 50 61 72 61 6d 20 20 20 20 20 20 20  r *zParam       
29950 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
29960 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
29970 63 6f 6e 74 61 69 6e 69 6e 67 20 62 6f 6f 6c 65  containing boole
29980 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  an */.){.  int r
29990 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
299a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
299b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Stmt = 0;.  p->n
299c0 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20  Autoincrmerge = 
299d0 66 74 73 33 47 65 74 69 6e 74 28 26 7a 50 61 72  fts3Getint(&zPar
299e0 61 6d 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41  am);.  if( p->nA
299f0 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 31 20  utoincrmerge==1 
29a00 7c 7c 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d  || p->nAutoincrm
29a10 65 72 67 65 3e 46 54 53 33 5f 4d 45 52 47 45 5f  erge>FTS3_MERGE_
29a20 43 4f 55 4e 54 20 29 7b 0a 20 20 20 20 70 2d 3e  COUNT ){.    p->
29a30 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d  nAutoincrmerge =
29a40 20 38 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   8;.  }.  if( !p
29a50 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20  ->bHasStat ){.  
29a60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74    assert( p->bFt
29a70 73 34 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  s4==0 );.    sql
29a80 69 74 65 33 46 74 73 33 43 72 65 61 74 65 53 74  ite3Fts3CreateSt
29a90 61 74 54 61 62 6c 65 28 26 72 63 2c 20 70 29 3b  atTable(&rc, p);
29aa0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
29ab0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
29ac0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
29ad0 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53  p, SQL_REPLACE_S
29ae0 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  TAT, &pStmt, 0);
29af0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
29b00 72 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  rn rc;.  sqlite3
29b10 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
29b20 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 41 55 54   1, FTS_STAT_AUT
29b30 4f 49 4e 43 52 4d 45 52 47 45 29 3b 0a 20 20 73  OINCRMERGE);.  s
29b40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
29b50 70 53 74 6d 74 2c 20 32 2c 20 70 2d 3e 6e 41 75  pStmt, 2, p->nAu
29b60 74 6f 69 6e 63 72 6d 65 72 67 65 29 3b 0a 20 20  toincrmerge);.  
29b70 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
29b80 6d 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  mt);.  rc = sqli
29b90 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
29ba0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29bb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
29bc0 20 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   64-bit checksum
29bd0 20 66 6f 72 20 74 68 65 20 46 54 53 20 69 6e 64   for the FTS ind
29be0 65 78 20 65 6e 74 72 79 20 73 70 65 63 69 66 69  ex entry specifi
29bf0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 61 72 67  ed by the.** arg
29c00 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20 66  uments to this f
29c10 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
29c20 69 63 20 75 36 34 20 66 74 73 33 43 68 65 63 6b  ic u64 fts3Check
29c30 73 75 6d 45 6e 74 72 79 28 0a 20 20 63 6f 6e 73  sumEntry(.  cons
29c40 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  t char *zTerm,  
29c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29c60 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
29c70 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
29c80 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ca0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
29cb0 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
29cc0 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
29cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29ce0 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65       /* Language
29cf0 20 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20   id for current 
29d00 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  row */.  int iIn
29d10 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
29d20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
29d30 78 20 28 30 2e 2e 46 74 73 33 54 61 62 6c 65 2e  x (0..Fts3Table.
29d40 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69  nIndex-1) */.  i
29d50 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20  64 iDocid,      
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29d70 2a 20 44 6f 63 69 64 20 66 6f 72 20 63 75 72 72  * Docid for curr
29d80 65 6e 74 20 72 6f 77 2e 20 2a 2f 0a 20 20 69 6e  ent row. */.  in
29d90 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29db0 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a   Column number *
29dc0 2f 0a 20 20 69 6e 74 20 69 50 6f 73 20 20 20 20  /.  int iPos    
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29de0 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
29df0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
29e00 20 75 36 34 20 72 65 74 20 3d 20 28 75 36 34 29   u64 ret = (u64)
29e10 69 44 6f 63 69 64 3b 0a 0a 20 20 72 65 74 20 2b  iDocid;..  ret +
29e20 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 4c 61  = (ret<<3) + iLa
29e30 6e 67 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  ngid;.  ret += (
29e40 72 65 74 3c 3c 33 29 20 2b 20 69 49 6e 64 65 78  ret<<3) + iIndex
29e50 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
29e60 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65  <3) + iCol;.  re
29e70 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
29e80 69 50 6f 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  iPos;.  for(i=0;
29e90 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
29ea0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
29eb0 20 7a 54 65 72 6d 5b 69 5d 3b 0a 0a 20 20 72 65   zTerm[i];..  re
29ec0 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
29ed0 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 68 65 63  ** Return a chec
29ee0 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72  ksum of all entr
29ef0 69 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69  ies in the FTS i
29f00 6e 64 65 78 20 74 68 61 74 20 63 6f 72 72 65 73  ndex that corres
29f10 70 6f 6e 64 20 74 6f 0a 2a 2a 20 6c 61 6e 67 75  pond to.** langu
29f20 61 67 65 20 69 64 20 69 4c 61 6e 67 69 64 2e 20  age id iLangid. 
29f30 54 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  The checksum is 
29f40 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 58 4f  calculated by XO
29f50 52 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  Ring the checksu
29f60 6d 73 0a 2a 2a 20 6f 66 20 65 61 63 68 20 69 6e  ms.** of each in
29f70 64 69 76 69 64 75 61 6c 20 65 6e 74 72 79 20 28  dividual entry (
29f80 73 65 65 20 66 74 73 33 43 68 65 63 6b 73 75 6d  see fts3Checksum
29f90 45 6e 74 72 79 28 29 29 20 74 6f 67 65 74 68 65  Entry()) togethe
29fa0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  r..**.** If succ
29fb0 65 73 73 66 75 6c 2c 20 74 68 65 20 63 68 65 63  essful, the chec
29fc0 6b 73 75 6d 20 76 61 6c 75 65 20 69 73 20 72 65  ksum value is re
29fd0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 52 63 20  turned and *pRc 
29fe0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
29ff0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
2a000 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2a010 72 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20  rs, *pRc is set 
2a020 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  to an SQLite err
2a030 6f 72 20 63 6f 64 65 2e 20 54 68 65 0a 2a 2a 20  or code. The.** 
2a040 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
2a050 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
2a060 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
2a070 63 20 75 36 34 20 66 74 73 33 43 68 65 63 6b 73  c u64 fts3Checks
2a080 75 6d 49 6e 64 65 78 28 0a 20 20 46 74 73 33 54  umIndex(.  Fts3T
2a090 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
2a0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
2a0b0 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
2a0c0 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
2a0d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a0e0 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65       /* Language
2a0f0 20 69 64 20 74 6f 20 72 65 74 75 72 6e 20 63 6b   id to return ck
2a100 73 75 6d 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  sum for */.  int
2a110 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a130 49 6e 64 65 78 20 74 6f 20 63 6b 73 75 6d 20 28  Index to cksum (
2a140 30 2e 2e 70 2d 3e 6e 49 6e 64 65 78 2d 31 29 20  0..p->nIndex-1) 
2a150 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20  */.  int *pRc   
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
2a180 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20  urn code */.){. 
2a190 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 66   Fts3SegFilter f
2a1a0 69 6c 74 65 72 3b 0a 20 20 46 74 73 33 4d 75 6c  ilter;.  Fts3Mul
2a1b0 74 69 53 65 67 52 65 61 64 65 72 20 63 73 72 3b  tiSegReader csr;
2a1c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 36 34  .  int rc;.  u64
2a1d0 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 0a 20 20 61   cksum = 0;..  a
2a1e0 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c  ssert( *pRc==SQL
2a1f0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 6d 65 6d  ITE_OK );..  mem
2a200 73 65 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20  set(&filter, 0, 
2a210 73 69 7a 65 6f 66 28 66 69 6c 74 65 72 29 29 3b  sizeof(filter));
2a220 0a 20 20 6d 65 6d 73 65 74 28 26 63 73 72 2c 20  .  memset(&csr, 
2a230 30 2c 20 73 69 7a 65 6f 66 28 63 73 72 29 29 3b  0, sizeof(csr));
2a240 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
2a250 3d 20 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f  =  FTS3_SEGMENT_
2a260 52 45 51 55 49 52 45 5f 50 4f 53 7c 46 54 53 33  REQUIRE_POS|FTS3
2a270 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f  _SEGMENT_IGNORE_
2a280 45 4d 50 54 59 3b 0a 20 20 66 69 6c 74 65 72 2e  EMPTY;.  filter.
2a290 66 6c 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45  flags |= FTS3_SE
2a2a0 47 4d 45 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20 72  GMENT_SCAN;..  r
2a2b0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
2a2c0 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a  egReaderCursor(.
2a2d0 20 20 20 20 20 20 70 2c 20 69 4c 61 6e 67 69 64        p, iLangid
2a2e0 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53  , iIndex, FTS3_S
2a2f0 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 30 2c  EGCURSOR_ALL, 0,
2a300 20 30 2c 20 30 2c 20 31 2c 26 63 73 72 0a 20 20   0, 0, 1,&csr.  
2a310 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
2a330 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65   = sqlite3Fts3Se
2a340 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20  gReaderStart(p, 
2a350 26 63 73 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a  &csr, &filter);.
2a360 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
2a370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a380 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
2a390 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  W==(rc = sqlite3
2a3a0 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65  Fts3SegReaderSte
2a3b0 70 28 70 2c 20 26 63 73 72 29 29 20 29 7b 0a 20  p(p, &csr)) ){. 
2a3c0 20 20 20 20 20 63 68 61 72 20 2a 70 43 73 72 20       char *pCsr 
2a3d0 3d 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 3b 0a  = csr.aDoclist;.
2a3e0 20 20 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64        char *pEnd
2a3f0 20 3d 20 26 70 43 73 72 5b 63 73 72 2e 6e 44 6f   = &pCsr[csr.nDo
2a400 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 20 20 69  clist];..      i
2a410 36 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20  64 iDocid = 0;. 
2a420 20 20 20 20 20 69 36 34 20 69 43 6f 6c 20 3d 20       i64 iCol = 
2a430 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69 50 6f  0;.      i64 iPo
2a440 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70 43  s = 0;..      pC
2a450 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  sr += sqlite3Fts
2a460 33 47 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c  3GetVarint(pCsr,
2a470 20 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 20   &iDocid);.     
2a480 20 77 68 69 6c 65 28 20 70 43 73 72 3c 70 45 6e   while( pCsr<pEn
2a490 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  d ){.        i64
2a4a0 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20   iVal = 0;.     
2a4b0 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74     pCsr += sqlit
2a4c0 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
2a4d0 70 43 73 72 2c 20 26 69 56 61 6c 29 3b 0a 20 20  pCsr, &iVal);.  
2a4e0 20 20 20 20 20 20 69 66 28 20 70 43 73 72 3c 70        if( pCsr<p
2a4f0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
2a500 20 69 66 28 20 69 56 61 6c 3d 3d 30 20 7c 7c 20   if( iVal==0 || 
2a510 69 56 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  iVal==1 ){.     
2a520 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 30 3b         iCol = 0;
2a530 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f  .            iPo
2a540 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2a550 20 20 20 69 66 28 20 69 56 61 6c 20 29 7b 0a 20     if( iVal ){. 
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73               pCs
2a570 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  r += sqlite3Fts3
2a580 47 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20  GetVarint(pCsr, 
2a590 26 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  &iCol);.        
2a5a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a5b0 20 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d           pCsr +=
2a5c0 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
2a5d0 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 56 61  arint(pCsr, &iVa
2a5e0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
2a5f0 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 56 61 6c    iDocid += iVal
2a600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2a610 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2a620 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f  .            iPo
2a630 73 20 2b 3d 20 28 69 56 61 6c 20 2d 20 32 29 3b  s += (iVal - 2);
2a640 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6b 73  .            cks
2a650 75 6d 20 3d 20 63 6b 73 75 6d 20 5e 20 66 74 73  um = cksum ^ fts
2a660 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a  3ChecksumEntry(.
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 63 73 72 2e 7a 54 65 72 6d 2c 20 63 73 72 2e 6e  csr.zTerm, csr.n
2a690 54 65 72 6d 2c 20 69 4c 61 6e 67 69 64 2c 20 69  Term, iLangid, i
2a6a0 49 6e 64 65 78 2c 20 69 44 6f 63 69 64 2c 0a 20  Index, iDocid,. 
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a6c0 69 6e 74 29 69 43 6f 6c 2c 20 28 69 6e 74 29 69  int)iCol, (int)i
2a6d0 50 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  Pos.            
2a6e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2a6f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a700 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2a710 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
2a720 72 46 69 6e 69 73 68 28 26 63 73 72 29 3b 0a 0a  rFinish(&csr);..
2a730 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 72    *pRc = rc;.  r
2a740 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
2a750 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
2a760 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2a770 68 65 20 46 54 53 20 69 6e 64 65 78 20 6d 61 74  he FTS index mat
2a780 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ch the current c
2a790 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
2a7a0 2a 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  * content table.
2a7b0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2a7c0 75 72 73 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  urs and the cont
2a7d0 65 6e 74 73 20 64 6f 20 6d 61 74 63 68 2c 20 73  ents do match, s
2a7e0 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74 6f 20 74  et *pbOk.** to t
2a7f0 72 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  rue and return S
2a800 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 20 69 66 20  QLITE_OK. Or if 
2a810 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  the contents do 
2a820 6e 6f 74 20 6d 61 74 63 68 2c 20 73 65 74 20 2a  not match, set *
2a830 70 62 4f 6b 0a 2a 2a 20 74 6f 20 66 61 6c 73 65  pbOk.** to false
2a840 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2a850 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
2a860 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 2e 67  rror occurs (e.g
2a870 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f 20 65  . an OOM or IO e
2a880 72 72 6f 72 29 2c 20 72 65 74 75 72 6e 20 61 6e  rror), return an
2a890 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a   SQLite error .*
2a8a0 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  * code. The fina
2a8b0 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 4f 6b  l value of *pbOk
2a8c0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
2a8d0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
2a8e0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
2a8f0 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73  tegrityCheck(Fts
2a900 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a  3Table *p, int *
2a910 70 62 4f 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  pbOk){.  int rc 
2a920 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a930 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a940 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34  rn code */.  u64
2a950 20 63 6b 73 75 6d 31 20 3d 20 30 3b 20 20 20 20   cksum1 = 0;    
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a970 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  Checksum based o
2a980 6e 20 46 54 53 20 69 6e 64 65 78 20 63 6f 6e 74  n FTS index cont
2a990 65 6e 74 73 20 2a 2f 0a 20 20 75 36 34 20 63 6b  ents */.  u64 ck
2a9a0 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20  sum2 = 0;       
2a9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
2a9c0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 25  cksum based on %
2a9d0 5f 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 65 6e 74  _content content
2a9e0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
2a9f0 74 6d 74 20 2a 70 41 6c 6c 4c 61 6e 67 69 64 20  tmt *pAllLangid 
2aa00 3d 20 30 3b 20 20 20 2f 2a 20 53 74 61 74 65 6d  = 0;   /* Statem
2aa10 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6c  ent to return al
2aa20 6c 20 6c 61 6e 67 75 61 67 65 2d 69 64 73 20 2a  l language-ids *
2aa30 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  /..  /* This blo
2aa40 63 6b 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68  ck calculates th
2aa50 65 20 63 68 65 63 6b 73 75 6d 20 61 63 63 6f 72  e checksum accor
2aa60 64 69 6e 67 20 74 6f 20 74 68 65 20 46 54 53 20  ding to the FTS 
2aa70 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d  index. */.  rc =
2aa80 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
2aa90 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c  SQL_SELECT_ALL_L
2aaa0 41 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67  ANGID, &pAllLang
2aab0 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  id, 0);.  if( rc
2aac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2aad0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
2aae0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
2aaf0 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 31 2c 20  (pAllLangid, 1, 
2ab00 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 29 3b  p->iPrevLangid);
2ab10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
2ab20 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64  d_int(pAllLangid
2ab30 2c 20 32 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b  , 2, p->nIndex);
2ab40 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
2ab50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
2ab60 69 74 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61  ite3_step(pAllLa
2ab70 6e 67 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ngid)==SQLITE_RO
2ab80 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  W ){.      int i
2ab90 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33  Langid = sqlite3
2aba0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c  _column_int(pAll
2abb0 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20 20 20  Langid, 0);.    
2abc0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
2abd0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e  or(i=0; i<p->nIn
2abe0 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  dex; i++){.     
2abf0 20 20 20 63 6b 73 75 6d 31 20 3d 20 63 6b 73 75     cksum1 = cksu
2ac00 6d 31 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75  m1 ^ fts3Checksu
2ac10 6d 49 6e 64 65 78 28 70 2c 20 69 4c 61 6e 67 69  mIndex(p, iLangi
2ac20 64 2c 20 69 2c 20 26 72 63 29 3b 0a 20 20 20 20  d, i, &rc);.    
2ac30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
2ac40 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  2 = sqlite3_rese
2ac50 74 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20  t(pAllLangid);. 
2ac60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ac70 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
2ac80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
2ac90 62 6c 6f 63 6b 20 63 61 6c 63 75 6c 61 74 65 73  block calculates
2aca0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 63   the checksum ac
2acb0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 25  cording to the %
2acc0 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a  _content table *
2acd0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2ace0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2acf0 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
2ad00 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
2ad10 64 75 6c 65 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e  dule = p->pToken
2ad20 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  izer->pModule;. 
2ad30 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2ad40 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  *pStmt = 0;.    
2ad50 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 0a  char *zSql;.   .
2ad60 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2ad70 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
2ad80 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65 61  CT %s" , p->zRea
2ad90 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20  dExprlist);.    
2ada0 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20  if( !zSql ){.   
2adb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2adc0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
2add0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ade0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2adf0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
2ae00 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
2ae10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ae20 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Sql);.    }..   
2ae30 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2ae40 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
2ae50 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2ae60 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
2ae70 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 73    i64 iDocid = s
2ae80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2ae90 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  t64(pStmt, 0);. 
2aea0 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d       int iLang =
2aeb0 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63   langidFromSelec
2aec0 74 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  t(p, pStmt);.   
2aed0 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20     int iCol;..  
2aee0 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
2aef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2af00 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e   iCol<p->nColumn
2af10 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
2af20 20 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69     if( p->abNoti
2af30 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20  ndexed[iCol]==0 
2af40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
2af50 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d  st char *zText =
2af60 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2af70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2af80 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31  xt(pStmt, iCol+1
2af90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
2afa0 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33   nText = sqlite3
2afb0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
2afc0 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20  tmt, iCol+1);.  
2afd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2afe0 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72  tokenizer_cursor
2aff0 20 2a 70 54 20 3d 20 30 3b 0a 0a 20 20 20 20 20   *pT = 0;..     
2b000 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b010 33 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a  3Fts3OpenTokeniz
2b020 65 72 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72  er(p->pTokenizer
2b030 2c 20 69 4c 61 6e 67 2c 20 7a 54 65 78 74 2c 20  , iLang, zText, 
2b040 6e 54 65 78 74 2c 26 70 54 29 3b 0a 20 20 20 20  nText,&pT);.    
2b050 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
2b060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b070 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63            char c
2b080 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20  onst *zToken;   
2b090 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
2b0a0 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a  ntaining token *
2b0b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
2b0c0 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20  t nToken = 0;   
2b0d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b0e0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 6f  r of bytes in to
2b0f0 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ken */.         
2b100 20 20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30     int iDum1 = 0
2b110 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20  , iDum2 = 0; /* 
2b120 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20  Dummy variables 
2b130 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2b140 6e 74 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20  nt iPos = 0;    
2b150 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
2b160 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e  tion of token in
2b170 20 7a 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20 20   zText */..     
2b180 20 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64         rc = pMod
2b190 75 6c 65 2d 3e 78 4e 65 78 74 28 70 54 2c 20 26  ule->xNext(pT, &
2b1a0 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c  zToken, &nToken,
2b1b0 20 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c   &iDum1, &iDum2,
2b1c0 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20   &iPos);.       
2b1d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b1e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b1f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6b 73               cks
2b210 75 6d 32 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66  um2 = cksum2 ^ f
2b220 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79  ts3ChecksumEntry
2b230 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
2b240 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b      zToken, nTok
2b250 65 6e 2c 20 69 4c 61 6e 67 2c 20 30 2c 20 69 44  en, iLang, 0, iD
2b260 6f 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  ocid, iCol, iPos
2b270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
2b280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b290 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 49  for(i=1; i<p->nI
2b2a0 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b2c0 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 6e 50 72  p->aIndex[i].nPr
2b2d0 65 66 69 78 3c 3d 6e 54 6f 6b 65 6e 20 29 7b 0a  efix<=nToken ){.
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d    cksum2 = cksum
2b300 32 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d  2 ^ fts3Checksum
2b310 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20  Entry(.         
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
2b330 6b 65 6e 2c 20 70 2d 3e 61 49 6e 64 65 78 5b 69  ken, p->aIndex[i
2b340 5d 2e 6e 50 72 65 66 69 78 2c 20 69 4c 61 6e 67  ].nPrefix, iLang
2b350 2c 20 69 2c 20 69 44 6f 63 69 64 2c 20 69 43 6f  , i, iDocid, iCo
2b360 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20 20 20 20  l, iPos.        
2b370 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
2b380 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2b390 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2b3a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b3b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b3c0 20 20 20 69 66 28 20 70 54 20 29 20 70 4d 6f 64     if( pT ) pMod
2b3d0 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54 29 3b  ule->xClose(pT);
2b3e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b3f0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2b400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b420 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71   }.    }..    sq
2b430 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2b440 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  Stmt);.  }..  *p
2b450 62 4f 6b 20 3d 20 28 63 6b 73 75 6d 31 3d 3d 63  bOk = (cksum1==c
2b460 6b 73 75 6d 32 29 3b 0a 20 20 72 65 74 75 72 6e  ksum2);.  return
2b470 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75   rc;.}../*.** Ru
2b480 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
2b490 63 68 65 63 6b 2e 20 49 66 20 6e 6f 20 65 72 72  check. If no err
2b4a0 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  or occurs and th
2b4b0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
2b4c0 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 46 54 53  ts of.** the FTS
2b4d0 20 69 6e 64 65 78 20 61 72 65 20 63 6f 72 72 65   index are corre
2b4e0 63 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ct, return SQLIT
2b4f0 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65  E_OK. Or, if the
2b500 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2b510 0a 2a 2a 20 46 54 53 20 69 6e 64 65 78 20 61 72  .** FTS index ar
2b520 65 20 69 6e 63 6f 72 72 65 63 74 2c 20 72 65 74  e incorrect, ret
2b530 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b540 50 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a 20 4f  PT_VTAB..**.** O
2b550 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28  r, if an error (
2b560 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49  e.g. an OOM or I
2b570 4f 20 65 72 72 6f 72 29 20 6f 63 63 75 72 73 2c  O error) occurs,
2b580 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
2b590 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
2b5a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
2b5b0 67 72 69 74 79 2d 63 68 65 63 6b 20 77 6f 72 6b  grity-check work
2b5c0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 46 6f  s as follows. Fo
2b5d0 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 61 6e 64  r each token and
2b5e0 20 69 6e 64 65 78 65 64 20 74 6f 6b 65 6e 0a 2a   indexed token.*
2b5f0 2a 20 70 72 65 66 69 78 20 69 6e 20 74 68 65 20  * prefix in the 
2b600 64 6f 63 75 6d 65 6e 74 20 73 65 74 2c 20 61 20  document set, a 
2b610 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  64-bit checksum 
2b620 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 28 62  is calculated (b
2b630 79 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 66 74 73  y code.** in fts
2b640 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29  3ChecksumEntry()
2b650 29 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66  ) based on the f
2b660 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2b670 20 20 20 20 2b 20 54 68 65 20 69 6e 64 65 78 20      + The index 
2b680 6e 75 6d 62 65 72 20 28 30 20 66 6f 72 20 74 68  number (0 for th
2b690 65 20 6d 61 69 6e 20 69 6e 64 65 78 2c 20 31 20  e main index, 1 
2b6a0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 70 72  for the first pr
2b6b0 65 66 69 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e  efix.**       in
2b6c0 64 65 78 20 65 74 63 2e 29 2c 0a 2a 2a 20 20 20  dex etc.),.**   
2b6d0 20 20 2b 20 54 68 65 20 74 6f 6b 65 6e 20 28 6f    + The token (o
2b6e0 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 29 20  r token prefix) 
2b6f0 74 65 78 74 20 69 74 73 65 6c 66 2c 20 0a 2a 2a  text itself, .**
2b700 20 20 20 20 20 2b 20 54 68 65 20 6c 61 6e 67 75       + The langu
2b710 61 67 65 2d 69 64 20 6f 66 20 74 68 65 20 72 6f  age-id of the ro
2b720 77 20 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c  w it appears in,
2b730 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 64 6f  .**     + The do
2b740 63 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20 69  cid of the row i
2b750 74 20 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a 2a  t appears in,.**
2b760 20 20 20 20 20 2b 20 54 68 65 20 63 6f 6c 75 6d       + The colum
2b770 6e 20 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c  n it appears in,
2b780 20 61 6e 64 0a 2a 2a 20 20 20 20 20 2b 20 54 68   and.**     + Th
2b790 65 20 74 6f 6b 65 6e 73 20 70 6f 73 69 74 69 6f  e tokens positio
2b7a0 6e 20 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f  n within that co
2b7b0 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lumn..**.** The 
2b7c0 63 68 65 63 6b 73 75 6d 73 20 66 6f 72 20 61 6c  checksums for al
2b7d0 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  l entries in the
2b7e0 20 69 6e 64 65 78 20 61 72 65 20 58 4f 52 65 64   index are XORed
2b7f0 20 74 6f 67 65 74 68 65 72 20 74 6f 20 63 72 65   together to cre
2b800 61 74 65 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  ate.** a single 
2b810 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
2b820 20 65 6e 74 69 72 65 20 69 6e 64 65 78 2e 0a 2a   entire index..*
2b830 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 72 69  *.** The integri
2b840 74 79 2d 63 68 65 63 6b 20 63 6f 64 65 20 63 61  ty-check code ca
2b850 6c 63 75 6c 61 74 65 73 20 74 68 65 20 73 61 6d  lculates the sam
2b860 65 20 63 68 65 63 6b 73 75 6d 20 69 6e 20 74 77  e checksum in tw
2b870 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o ways:.**.**   
2b880 20 20 31 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67    1. By scanning
2b890 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2b8a0 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 2c 20   the FTS index, 
2b8b0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 32 2e 20 42  and .**     2. B
2b8c0 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 64 20 74  y scanning and t
2b8d0 6f 6b 65 6e 69 7a 69 6e 67 20 74 68 65 20 63 6f  okenizing the co
2b8e0 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a  ntent table..**.
2b8f0 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20 63 68  ** If the two ch
2b900 65 63 6b 73 75 6d 73 20 61 72 65 20 69 64 65 6e  ecksums are iden
2b910 74 69 63 61 6c 2c 20 74 68 65 20 69 6e 74 65 67  tical, the integ
2b920 72 69 74 79 2d 63 68 65 63 6b 20 69 73 20 64 65  rity-check is de
2b930 65 6d 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20  emed to have.** 
2b940 70 61 73 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  passed..*/.stati
2b950 63 20 69 6e 74 20 66 74 73 33 44 6f 49 6e 74 65  c int fts3DoInte
2b960 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 46 74  grityCheck(.  Ft
2b970 73 33 54 61 62 6c 65 20 2a 70 20 20 20 20 20 20  s3Table *p      
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b990 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
2b9a0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
2b9b0 63 3b 0a 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30  c;.  int bOk = 0
2b9c0 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 49 6e 74  ;.  rc = fts3Int
2b9d0 65 67 72 69 74 79 43 68 65 63 6b 28 70 2c 20 26  egrityCheck(p, &
2b9e0 62 4f 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  bOk);.  if( rc==
2b9f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
2ba00 3d 3d 30 20 29 20 72 63 20 3d 20 46 54 53 5f 43  ==0 ) rc = FTS_C
2ba10 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 72  ORRUPT_VTAB;.  r
2ba20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2ba30 2a 2a 20 48 61 6e 64 6c 65 20 61 20 27 73 70 65  ** Handle a 'spe
2ba40 63 69 61 6c 27 20 49 4e 53 45 52 54 20 6f 66 20  cial' INSERT of 
2ba50 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
2ba60 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
2ba70 62 6c 28 74 62 6c 29 20 56 41 4c 55 45 53 28 3c  bl(tbl) VALUES(<
2ba80 65 78 70 72 3e 29 22 0a 2a 2a 0a 2a 2a 20 41 72  expr>)".**.** Ar
2ba90 67 75 6d 65 6e 74 20 70 56 61 6c 20 63 6f 6e 74  gument pVal cont
2baa0 61 69 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  ains the result 
2bab0 6f 66 20 3c 65 78 70 72 3e 2e 20 43 75 72 72 65  of <expr>. Curre
2bac0 6e 74 6c 79 20 74 68 65 20 6f 6e 6c 79 20 0a 2a  ntly the only .*
2bad0 2a 20 6d 65 61 6e 69 6e 67 66 75 6c 20 76 61 6c  * meaningful val
2bae0 75 65 20 74 6f 20 69 6e 73 65 72 74 20 69 73 20  ue to insert is 
2baf0 74 68 65 20 74 65 78 74 20 27 6f 70 74 69 6d 69  the text 'optimi
2bb00 7a 65 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ze'..*/.static i
2bb10 6e 74 20 66 74 73 33 53 70 65 63 69 61 6c 49 6e  nt fts3SpecialIn
2bb20 73 65 72 74 28 46 74 73 33 54 61 62 6c 65 20 2a  sert(Fts3Table *
2bb30 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  p, sqlite3_value
2bb40 20 2a 70 56 61 6c 29 7b 0a 20 20 69 6e 74 20 72   *pVal){.  int r
2bb50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2bb60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2bb70 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 63  turn Code */.  c
2bb80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20  onst char *zVal 
2bb90 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
2bba0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
2bbb0 78 74 28 70 56 61 6c 29 3b 0a 20 20 69 6e 74 20  xt(pVal);.  int 
2bbc0 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  nVal = sqlite3_v
2bbd0 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
2bbe0 3b 0a 0a 20 20 69 66 28 20 21 7a 56 61 6c 20 29  ;..  if( !zVal )
2bbf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2bc00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
2bc10 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 38 20 26  se if( nVal==8 &
2bc20 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
2bc30 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6f 70 74  nicmp(zVal, "opt
2bc40 69 6d 69 7a 65 22 2c 20 38 29 20 29 7b 0a 20 20  imize", 8) ){.  
2bc50 20 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74    rc = fts3DoOpt
2bc60 69 6d 69 7a 65 28 70 2c 20 30 29 3b 0a 20 20 7d  imize(p, 0);.  }
2bc70 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 37  else if( nVal==7
2bc80 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
2bc90 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 72  trnicmp(zVal, "r
2bca0 65 62 75 69 6c 64 22 2c 20 37 29 20 29 7b 0a 20  ebuild", 7) ){. 
2bcb0 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 52 65     rc = fts3DoRe
2bcc0 62 75 69 6c 64 28 70 29 3b 0a 20 20 7d 65 6c 73  build(p);.  }els
2bcd0 65 20 69 66 28 20 6e 56 61 6c 3d 3d 31 35 20 26  e if( nVal==15 &
2bce0 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
2bcf0 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 69 6e 74  nicmp(zVal, "int
2bd00 65 67 72 69 74 79 2d 63 68 65 63 6b 22 2c 20 31  egrity-check", 1
2bd10 35 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  5) ){.    rc = f
2bd20 74 73 33 44 6f 49 6e 74 65 67 72 69 74 79 43 68  ts3DoIntegrityCh
2bd30 65 63 6b 28 70 29 3b 0a 20 20 7d 65 6c 73 65 20  eck(p);.  }else 
2bd40 69 66 28 20 6e 56 61 6c 3e 36 20 26 26 20 30 3d  if( nVal>6 && 0=
2bd50 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
2bd60 70 28 7a 56 61 6c 2c 20 22 6d 65 72 67 65 3d 22  p(zVal, "merge="
2bd70 2c 20 36 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  , 6) ){.    rc =
2bd80 20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72 67 65   fts3DoIncrmerge
2bd90 28 70 2c 20 26 7a 56 61 6c 5b 36 5d 29 3b 0a 20  (p, &zVal[6]);. 
2bda0 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e   }else if( nVal>
2bdb0 31 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  10 && 0==sqlite3
2bdc0 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20  _strnicmp(zVal, 
2bdd0 22 61 75 74 6f 6d 65 72 67 65 3d 22 2c 20 31 30  "automerge=", 10
2bde0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  ) ){.    rc = ft
2bdf0 73 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72 67  s3DoAutoincrmerg
2be00 65 28 70 2c 20 26 7a 56 61 6c 5b 31 30 5d 29 3b  e(p, &zVal[10]);
2be10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2be20 45 53 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EST.  }else if( 
2be30 6e 56 61 6c 3e 39 20 26 26 20 30 3d 3d 73 71 6c  nVal>9 && 0==sql
2be40 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2be50 61 6c 2c 20 22 6e 6f 64 65 73 69 7a 65 3d 22 2c  al, "nodesize=",
2be60 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4e   9) ){.    p->nN
2be70 6f 64 65 53 69 7a 65 20 3d 20 61 74 6f 69 28 26  odeSize = atoi(&
2be80 7a 56 61 6c 5b 39 5d 29 3b 0a 20 20 20 20 72 63  zVal[9]);.    rc
2be90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2bea0 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 31  }else if( nVal>1
2beb0 31 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f  1 && 0==sqlite3_
2bec0 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22  strnicmp(zVal, "
2bed0 6d 61 78 70 65 6e 64 69 6e 67 3d 22 2c 20 39 29  maxpending=", 9)
2bee0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50   ){.    p->nMaxP
2bef0 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 61 74 6f  endingData = ato
2bf00 69 28 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a 20 20  i(&zVal[11]);.  
2bf10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2bf20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  ;.  }else if( nV
2bf30 61 6c 3e 32 31 20 26 26 20 30 3d 3d 73 71 6c 69  al>21 && 0==sqli
2bf40 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
2bf50 6c 2c 20 22 74 65 73 74 2d 6e 6f 2d 69 6e 63 72  l, "test-no-incr
2bf60 2d 64 6f 63 6c 69 73 74 3d 22 2c 20 32 31 29 20  -doclist=", 21) 
2bf70 29 7b 0a 20 20 20 20 70 2d 3e 62 4e 6f 49 6e 63  ){.    p->bNoInc
2bf80 72 44 6f 63 6c 69 73 74 20 3d 20 61 74 6f 69 28  rDoclist = atoi(
2bf90 26 7a 56 61 6c 5b 32 31 5d 29 3b 0a 20 20 20 20  &zVal[21]);.    
2bfa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2bfb0 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
2bfc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bfd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
2bfe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
2bff0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2c000 4c 45 5f 46 54 53 34 5f 44 45 46 45 52 52 45 44  LE_FTS4_DEFERRED
2c010 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
2c020 6c 20 63 61 63 68 65 64 20 64 65 66 65 72 72 65  l cached deferre
2c030 64 20 64 6f 63 6c 69 73 74 73 2e 20 44 65 66 65  d doclists. Defe
2c040 72 72 65 64 20 64 6f 63 6c 69 73 74 73 20 61 72  rred doclists ar
2c050 65 20 63 61 63 68 65 64 0a 2a 2a 20 28 61 6c 6c  e cached.** (all
2c060 6f 63 61 74 65 64 29 20 62 79 20 74 68 65 20 73  ocated) by the s
2c070 71 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 44  qlite3Fts3CacheD
2c080 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28  eferredDoclists(
2c090 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  ) function..*/.v
2c0a0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 46  oid sqlite3Fts3F
2c0b0 72 65 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69  reeDeferredDocli
2c0c0 73 74 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a  sts(Fts3Cursor *
2c0d0 70 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65 66  pCsr){.  Fts3Def
2c0e0 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66  erredToken *pDef
2c0f0 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73  ;.  for(pDef=pCs
2c100 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44  r->pDeferred; pD
2c110 65 66 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70  ef; pDef=pDef->p
2c120 4e 65 78 74 29 7b 0a 20 20 20 20 66 74 73 33 50  Next){.    fts3P
2c130 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 65  endingListDelete
2c140 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pDef->pList);. 
2c150 20 20 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 3d     pDef->pList =
2c160 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
2c170 20 46 72 65 65 20 61 6c 6c 20 65 6e 74 72 69 65   Free all entrie
2c180 73 20 69 6e 20 74 68 65 20 70 43 73 72 2d 3e 70  s in the pCsr->p
2c190 44 65 66 66 65 72 65 64 20 6c 69 73 74 2e 20 45  Deffered list. E
2c1a0 6e 74 72 69 65 73 20 61 72 65 20 61 64 64 65 64  ntries are added
2c1b0 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20 6c 69 73   to .** this lis
2c1c0 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 46  t using sqlite3F
2c1d0 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 29 2e  ts3DeferToken().
2c1e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c1f0 46 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64  Fts3FreeDeferred
2c200 54 6f 6b 65 6e 73 28 46 74 73 33 43 75 72 73 6f  Tokens(Fts3Curso
2c210 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 33  r *pCsr){.  Fts3
2c220 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
2c230 44 65 66 3b 0a 20 20 46 74 73 33 44 65 66 65 72  Def;.  Fts3Defer
2c240 72 65 64 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b  redToken *pNext;
2c250 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72  .  for(pDef=pCsr
2c260 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65  ->pDeferred; pDe
2c270 66 3b 20 70 44 65 66 3d 70 4e 65 78 74 29 7b 0a  f; pDef=pNext){.
2c280 20 20 20 20 70 4e 65 78 74 20 3d 20 70 44 65 66      pNext = pDef
2c290 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66 74 73  ->pNext;.    fts
2c2a0 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65  3PendingListDele
2c2b0 74 65 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b  te(pDef->pList);
2c2c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2c2d0 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a 20 20 70  e(pDef);.  }.  p
2c2e0 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 3d  Csr->pDeferred =
2c2f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
2c300 65 72 61 74 65 20 64 65 66 65 72 72 65 64 2d 64  erate deferred-d
2c310 6f 63 6c 69 73 74 73 20 66 6f 72 20 61 6c 6c 20  oclists for all 
2c320 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 70 43  tokens in the pC
2c330 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69  sr->pDeferred li
2c340 73 74 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74  st.** based on t
2c350 68 65 20 72 6f 77 20 74 68 61 74 20 70 43 73 72  he row that pCsr
2c360 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2c370 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 41 20 64 65  s to..**.** A de
2c380 66 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 20 69  ferred-doclist i
2c390 73 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65 72  s like any other
2c3a0 20 64 6f 63 6c 69 73 74 20 77 69 74 68 20 70 6f   doclist with po
2c3b0 73 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  sition informati
2c3c0 6f 6e 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 2c 20  on.** included, 
2c3d0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 6f  except that it o
2c3e0 6e 6c 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  nly contains ent
2c3f0 72 69 65 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ries for a singl
2c400 65 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20  e row of the.** 
2c410 74 61 62 6c 65 2c 20 6e 6f 74 20 66 6f 72 20 61  table, not for a
2c420 6c 6c 20 72 6f 77 73 2e 0a 2a 2f 0a 69 6e 74 20  ll rows..*/.int 
2c430 73 71 6c 69 74 65 33 46 74 73 33 43 61 63 68 65  sqlite3Fts3Cache
2c440 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73  DeferredDoclists
2c450 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73  (Fts3Cursor *pCs
2c460 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2c470 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2c480 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2c490 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 43  code */.  if( pC
2c4a0 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 29 7b  sr->pDeferred ){
2c4b0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4d0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
2c4e0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 61  erate through ta
2c4f0 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ble columns */. 
2c500 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2c510 20 69 44 6f 63 69 64 3b 20 20 20 20 20 20 20 20   iDocid;        
2c520 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 74 68 65   /* Docid of the
2c530 20 72 6f 77 20 70 43 73 72 20 70 6f 69 6e 74 73   row pCsr points
2c540 20 74 6f 20 2a 2f 0a 20 20 20 20 46 74 73 33 44   to */.    Fts3D
2c550 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44  eferredToken *pD
2c560 65 66 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ef;      /* Used
2c570 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2c580 75 67 68 20 64 65 66 65 72 72 65 64 20 74 6f 6b  ugh deferred tok
2c590 65 6e 73 20 2a 2f 0a 20 20 0a 20 20 20 20 46 74  ens */.  .    Ft
2c5a0 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
2c5b0 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e  s3Table *)pCsr->
2c5c0 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20  base.pVtab;.    
2c5d0 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
2c5e0 72 20 2a 70 54 20 3d 20 70 2d 3e 70 54 6f 6b 65  r *pT = p->pToke
2c5f0 6e 69 7a 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  nizer;.    sqlit
2c600 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
2c610 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75  ule const *pModu
2c620 6c 65 20 3d 20 70 54 2d 3e 70 4d 6f 64 75 6c 65  le = pT->pModule
2c630 3b 0a 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  ;.   .    assert
2c640 28 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72  ( pCsr->isRequir
2c650 65 53 65 65 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eSeek==0 );.    
2c660 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33  iDocid = sqlite3
2c670 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43  _column_int64(pC
2c680 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20  sr->pStmt, 0);. 
2c690 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69   .    for(i=0; i
2c6a0 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 72  <p->nColumn && r
2c6b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
2c6c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
2c6d0 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 5d  >abNotindexed[i]
2c6e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
2c6f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
2c700 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2c710 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2c720 74 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d 74  text(pCsr->pStmt
2c730 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
2c740 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
2c750 72 5f 63 75 72 73 6f 72 20 2a 70 54 43 20 3d 20  r_cursor *pTC = 
2c760 30 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  0;..        rc =
2c770 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e   sqlite3Fts3Open
2c780 54 6f 6b 65 6e 69 7a 65 72 28 70 54 2c 20 70 43  Tokenizer(pT, pC
2c790 73 72 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 54 65  sr->iLangid, zTe
2c7a0 78 74 2c 20 2d 31 2c 20 26 70 54 43 29 3b 0a 20  xt, -1, &pTC);. 
2c7b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63         while( rc
2c7c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c7d0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f           char co
2c7e0 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20 20  nst *zToken;    
2c7f0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
2c800 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f  taining token */
2c810 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
2c820 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  Token = 0;      
2c830 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c840 66 20 62 79 74 65 73 20 69 6e 20 74 6f 6b 65 6e  f bytes in token
2c850 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
2c860 74 20 69 44 75 6d 31 20 3d 20 30 2c 20 69 44 75  t iDum1 = 0, iDu
2c870 6d 32 20 3d 20 30 3b 20 2f 2a 20 44 75 6d 6d 79  m2 = 0; /* Dummy
2c880 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
2c890 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73          int iPos
2c8a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c8b0 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66    /* Position of
2c8c0 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20   token in zText 
2c8d0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 72 63  */..          rc
2c8e0 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78   = pModule->xNex
2c8f0 74 28 70 54 43 2c 20 26 7a 54 6f 6b 65 6e 2c 20  t(pTC, &zToken, 
2c900 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c  &nToken, &iDum1,
2c910 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b   &iDum2, &iPos);
2c920 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70  .          for(p
2c930 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72  Def=pCsr->pDefer
2c940 72 65 64 3b 20 70 44 65 66 20 26 26 20 72 63 3d  red; pDef && rc=
2c950 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65 66  =SQLITE_OK; pDef
2c960 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pDef->pNext){. 
2c970 20 20 20 20 20 20 20 20 20 20 20 46 74 73 33 50             Fts3P
2c980 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54 20  hraseToken *pPT 
2c990 3d 20 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a  = pDef->pToken;.
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c9b0 28 70 44 65 66 2d 3e 69 43 6f 6c 3e 3d 70 2d 3e  (pDef->iCol>=p->
2c9c0 6e 43 6f 6c 75 6d 6e 20 7c 7c 20 70 44 65 66 2d  nColumn || pDef-
2c9d0 3e 69 43 6f 6c 3d 3d 69 29 0a 20 20 20 20 20 20  >iCol==i).      
2c9e0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
2c9f0 54 2d 3e 62 46 69 72 73 74 3d 3d 30 20 7c 7c 20  T->bFirst==0 || 
2ca00 69 50 6f 73 3d 3d 30 29 0a 20 20 20 20 20 20 20  iPos==0).       
2ca10 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 54           && (pPT
2ca20 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 28  ->n==nToken || (
2ca30 70 50 54 2d 3e 69 73 50 72 65 66 69 78 20 26 26  pPT->isPrefix &&
2ca40 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29 29   pPT->n<nToken))
2ca50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca60 20 26 26 20 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a   && (0==memcmp(z
2ca70 54 6f 6b 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70  Token, pPT->z, p
2ca80 50 54 2d 3e 6e 29 29 0a 20 20 20 20 20 20 20 20  PT->n)).        
2ca90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2caa0 20 20 20 20 20 20 20 66 74 73 33 50 65 6e 64 69         fts3Pendi
2cab0 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 44  ngListAppend(&pD
2cac0 65 66 2d 3e 70 4c 69 73 74 2c 20 69 44 6f 63 69  ef->pList, iDoci
2cad0 64 2c 20 69 2c 20 69 50 6f 73 2c 20 26 72 63 29  d, i, iPos, &rc)
2cae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2caf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cb00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2cb10 28 20 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d  ( pTC ) pModule-
2cb20 3e 78 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20  >xClose(pTC);.  
2cb30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2cb40 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
2cb50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2cb60 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
2cb70 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e 70 44  or(pDef=pCsr->pD
2cb80 65 66 65 72 72 65 64 3b 20 70 44 65 66 20 26 26  eferred; pDef &&
2cb90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
2cba0 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74  pDef=pDef->pNext
2cbb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  ){.      if( pDe
2cbc0 66 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f->pList ){.    
2cbd0 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e      rc = fts3Pen
2cbe0 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
2cbf0 72 69 6e 74 28 26 70 44 65 66 2d 3e 70 4c 69 73  rint(&pDef->pLis
2cc00 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
2cc10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2cc20 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
2cc30 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 72 65  lite3Fts3Deferre
2cc40 64 54 6f 6b 65 6e 4c 69 73 74 28 0a 20 20 46 74  dTokenList(.  Ft
2cc50 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20  s3DeferredToken 
2cc60 2a 70 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 70  *p, .  char **pp
2cc70 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 2a 70 6e  Data, .  int *pn
2cc80 44 61 74 61 0a 29 7b 0a 20 20 63 68 61 72 20 2a  Data.){.  char *
2cc90 70 52 65 74 3b 0a 20 20 69 6e 74 20 6e 53 6b 69  pRet;.  int nSki
2cca0 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  p;.  sqlite3_int
2ccb0 36 34 20 64 75 6d 6d 79 3b 0a 0a 20 20 2a 70 70  64 dummy;..  *pp
2ccc0 44 61 74 61 20 3d 20 30 3b 0a 20 20 2a 70 6e 44  Data = 0;.  *pnD
2ccd0 61 74 61 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ata = 0;..  if( 
2cce0 70 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  p->pList==0 ){. 
2ccf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cd00 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74  _OK;.  }..  pRet
2cd10 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2cd20 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 70 4c 69  e3_malloc(p->pLi
2cd30 73 74 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 69 66  st->nData);.  if
2cd40 28 20 21 70 52 65 74 20 29 20 72 65 74 75 72 6e  ( !pRet ) return
2cd50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
2cd60 20 20 6e 53 6b 69 70 20 3d 20 73 71 6c 69 74 65    nSkip = sqlite
2cd70 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70  3Fts3GetVarint(p
2cd80 2d 3e 70 4c 69 73 74 2d 3e 61 44 61 74 61 2c 20  ->pList->aData, 
2cd90 26 64 75 6d 6d 79 29 3b 0a 20 20 2a 70 6e 44 61  &dummy);.  *pnDa
2cda0 74 61 20 3d 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e  ta = p->pList->n
2cdb0 44 61 74 61 20 2d 20 6e 53 6b 69 70 3b 0a 20 20  Data - nSkip;.  
2cdc0 2a 70 70 44 61 74 61 20 3d 20 70 52 65 74 3b 0a  *ppData = pRet;.
2cdd0 20 20 0a 20 20 6d 65 6d 63 70 79 28 70 52 65 74    .  memcpy(pRet
2cde0 2c 20 26 70 2d 3e 70 4c 69 73 74 2d 3e 61 44 61  , &p->pList->aDa
2cdf0 74 61 5b 6e 53 6b 69 70 5d 2c 20 2a 70 6e 44 61  ta[nSkip], *pnDa
2ce00 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ta);.  return SQ
2ce10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2ce20 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 66  * Add an entry f
2ce30 6f 72 20 74 6f 6b 65 6e 20 70 54 6f 6b 65 6e 20  or token pToken 
2ce40 74 6f 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65  to the pCsr->pDe
2ce50 66 65 72 72 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  ferred list..*/.
2ce60 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 44  int sqlite3Fts3D
2ce70 65 66 65 72 54 6f 6b 65 6e 28 0a 20 20 46 74 73  eferToken(.  Fts
2ce80 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  3Cursor *pCsr,  
2ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cea0 46 74 73 33 20 74 61 62 6c 65 20 63 75 72 73 6f  Fts3 table curso
2ceb0 72 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73  r */.  Fts3Phras
2cec0 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20  eToken *pToken, 
2ced0 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20         /* Token 
2cee0 74 6f 20 64 65 66 65 72 20 2a 2f 0a 20 20 69 6e  to defer */.  in
2cef0 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cf10 20 43 6f 6c 75 6d 6e 20 74 68 61 74 20 74 6f 6b   Column that tok
2cf20 65 6e 20 6d 75 73 74 20 61 70 70 65 61 72 20 69  en must appear i
2cf30 6e 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b 0a  n (or -1) */.){.
2cf40 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f    Fts3DeferredTo
2cf50 6b 65 6e 20 2a 70 44 65 66 65 72 72 65 64 3b 0a  ken *pDeferred;.
2cf60 20 20 70 44 65 66 65 72 72 65 64 20 3d 20 73 71    pDeferred = sq
2cf70 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2cf80 65 6f 66 28 2a 70 44 65 66 65 72 72 65 64 29 29  eof(*pDeferred))
2cf90 3b 0a 20 20 69 66 28 20 21 70 44 65 66 65 72 72  ;.  if( !pDeferr
2cfa0 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
2cfb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2cfc0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 66   }.  memset(pDef
2cfd0 65 72 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  erred, 0, sizeof
2cfe0 28 2a 70 44 65 66 65 72 72 65 64 29 29 3b 0a 20  (*pDeferred));. 
2cff0 20 70 44 65 66 65 72 72 65 64 2d 3e 70 54 6f 6b   pDeferred->pTok
2d000 65 6e 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20 20 70  en = pToken;.  p
2d010 44 65 66 65 72 72 65 64 2d 3e 70 4e 65 78 74 20  Deferred->pNext 
2d020 3d 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  = pCsr->pDeferre
2d030 64 3b 20 0a 20 20 70 44 65 66 65 72 72 65 64 2d  d; .  pDeferred-
2d040 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20  >iCol = iCol;.  
2d050 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20  pCsr->pDeferred 
2d060 3d 20 70 44 65 66 65 72 72 65 64 3b 0a 0a 20 20  = pDeferred;..  
2d070 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2d080 70 44 65 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a  pDeferred==0 );.
2d090 20 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72    pToken->pDefer
2d0a0 72 65 64 20 3d 20 70 44 65 66 65 72 72 65 64 3b  red = pDeferred;
2d0b0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2d0c0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
2d0d0 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61 6c  /*.** SQLite val
2d0e0 75 65 20 70 52 6f 77 69 64 20 63 6f 6e 74 61 69  ue pRowid contai
2d0f0 6e 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  ns the rowid of 
2d100 61 20 72 6f 77 20 74 68 61 74 20 6d 61 79 20 6f  a row that may o
2d110 72 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  r may not be.** 
2d120 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 46  present in the F
2d130 54 53 33 20 74 61 62 6c 65 2e 20 49 66 20 69 74  TS3 table. If it
2d140 20 69 73 2c 20 64 65 6c 65 74 65 20 69 74 20 61   is, delete it a
2d150 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f  nd adjust the co
2d160 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75 62  ntents.** of sub
2d170 73 69 64 75 61 72 79 20 64 61 74 61 20 73 74 72  siduary data str
2d180 75 63 74 75 72 65 73 20 61 63 63 6f 72 64 69 6e  uctures accordin
2d190 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  gly..*/.static i
2d1a0 6e 74 20 66 74 73 33 44 65 6c 65 74 65 42 79 52  nt fts3DeleteByR
2d1b0 6f 77 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c  owid(.  Fts3Tabl
2d1c0 65 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33  e *p, .  sqlite3
2d1d0 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20  _value *pRowid, 
2d1e0 0a 20 20 69 6e 74 20 2a 70 6e 43 68 6e 67 2c 20  .  int *pnChng, 
2d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d200 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 44 65     /* IN/OUT: De
2d210 63 72 65 6d 65 6e 74 20 69 66 20 72 6f 77 20 69  crement if row i
2d220 73 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  s deleted */.  u
2d230 33 32 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a 20 20  32 *aSzDel.){.  
2d240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d250 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2d260 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2d270 2f 0a 20 20 69 6e 74 20 62 46 6f 75 6e 64 20 3d  /.  int bFound =
2d280 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d290 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2a      /* True if *
2d2a0 70 52 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73  pRowid really is
2d2b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
2d2c0 0a 0a 20 20 66 74 73 33 44 65 6c 65 74 65 54 65  ..  fts3DeleteTe
2d2d0 72 6d 73 28 26 72 63 2c 20 70 2c 20 70 52 6f 77  rms(&rc, p, pRow
2d2e0 69 64 2c 20 61 53 7a 44 65 6c 2c 20 26 62 46 6f  id, aSzDel, &bFo
2d2f0 75 6e 64 29 3b 0a 20 20 69 66 28 20 62 46 6f 75  und);.  if( bFou
2d300 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
2d310 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
2d320 73 45 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 20  sEmpty = 0;     
2d330 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
2d340 74 69 6e 67 20 2a 70 52 6f 77 69 64 20 6c 65 61  ting *pRowid lea
2d350 76 65 73 20 74 68 65 20 74 61 62 6c 65 20 65 6d  ves the table em
2d360 70 74 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  pty */.    rc = 
2d370 66 74 73 33 49 73 45 6d 70 74 79 28 70 2c 20 70  fts3IsEmpty(p, p
2d380 52 6f 77 69 64 2c 20 26 69 73 45 6d 70 74 79 29  Rowid, &isEmpty)
2d390 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2d3a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d3b0 20 69 66 28 20 69 73 45 6d 70 74 79 20 29 7b 0a   if( isEmpty ){.
2d3c0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
2d3d0 69 6e 67 20 74 68 69 73 20 72 6f 77 20 6d 65 61  ing this row mea
2d3e0 6e 73 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62  ns the whole tab
2d3f0 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 49 6e 20  le is empty. In 
2d400 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 20 20  this case.      
2d410 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
2d420 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20  contents of all 
2d430 74 68 72 65 65 20 74 61 62 6c 65 73 20 61 6e 64  three tables and
2d440 20 74 68 72 6f 77 20 61 77 61 79 20 61 6e 79 0a   throw away any.
2d450 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
2d460 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 54 65  in the pendingTe
2d470 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20  rms hash table. 
2d480 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2d490 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70   fts3DeleteAll(p
2d4a0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 1);.        *p
2d4b0 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nChng = 0;.     
2d4c0 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 44 65 6c     memset(aSzDel
2d4d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29  , 0, sizeof(u32)
2d4e0 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31   * (p->nColumn+1
2d4f0 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d 65  ) * 2);.      }e
2d500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e  lse{.        *pn
2d510 43 68 6e 67 20 3d 20 2a 70 6e 43 68 6e 67 20 2d  Chng = *pnChng -
2d520 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
2d530 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
2d540 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
2d550 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20  ts3SqlExec(&rc, 
2d560 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43 4f  p, SQL_DELETE_CO
2d570 4e 54 45 4e 54 2c 20 26 70 52 6f 77 69 64 29 3b  NTENT, &pRowid);
2d580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d590 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f     if( p->bHasDo
2d5a0 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  csize ){.       
2d5b0 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26     fts3SqlExec(&
2d5c0 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
2d5d0 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70 52 6f 77  E_DOCSIZE, &pRow
2d5e0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  id);.        }. 
2d5f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d600 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2d610 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2d620 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77  ction does the w
2d630 6f 72 6b 20 66 6f 72 20 74 68 65 20 78 55 70 64  ork for the xUpd
2d640 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20 46 54  ate method of FT
2d650 53 33 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  S3 virtual.** ta
2d660 62 6c 65 73 2e 20 54 68 65 20 73 63 68 65 6d 61  bles. The schema
2d670 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
2d680 74 61 62 6c 65 20 62 65 69 6e 67 3a 0a 2a 2a 0a  table being:.**.
2d690 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2d6a0 42 4c 45 20 3c 74 61 62 6c 65 20 6e 61 6d 65 3e  BLE <table name>
2d6b0 28 20 0a 2a 2a 20 20 20 20 20 20 20 3c 75 73 65  ( .**       <use
2d6c0 72 20 63 6f 6c 75 6d 6e 73 3e 2c 0a 2a 2a 20 20  r columns>,.**  
2d6d0 20 20 20 20 20 3c 74 61 62 6c 65 20 6e 61 6d 65       <table name
2d6e0 3e 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20  > HIDDEN, .**   
2d6f0 20 20 20 20 64 6f 63 69 64 20 48 49 44 44 45 4e      docid HIDDEN
2d700 2c 20 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 61 6e  , .**       <lan
2d710 67 69 64 3e 20 48 49 44 44 45 4e 0a 2a 2a 20 20  gid> HIDDEN.**  
2d720 20 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 0a 2a 2f 0a     );.**.** .*/.
2d730 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 55  int sqlite3Fts3U
2d740 70 64 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 73  pdateMethod(.  s
2d750 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
2d760 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab,            /
2d770 2a 20 46 54 53 33 20 76 74 61 62 20 6f 62 6a 65  * FTS3 vtab obje
2d780 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ct */.  int nArg
2d790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d7a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2d7b0 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61  of argument arra
2d7c0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  y */.  sqlite3_v
2d7d0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20  alue **apVal,   
2d7e0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
2d7f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2d800 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a    sqlite_int64 *
2d810 70 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  pRowid          
2d820 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 66    /* OUT: The af
2d830 66 65 63 74 65 64 20 28 6f 72 20 65 66 66 65 63  fected (or effec
2d840 74 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  ted) rowid */.){
2d850 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20  .  Fts3Table *p 
2d860 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70  = (Fts3Table *)p
2d870 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Vtab;.  int rc =
2d880 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d890 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d8a0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
2d8b0 69 73 52 65 6d 6f 76 65 20 3d 20 30 3b 20 20 20  isRemove = 0;   
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d8d0 72 75 65 20 66 6f 72 20 61 6e 20 55 50 44 41 54  rue for an UPDAT
2d8e0 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20  E or DELETE */. 
2d8f0 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20 30   u32 *aSzIns = 0
2d900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d910 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 69 6e 73   /* Sizes of ins
2d920 65 72 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 20  erted documents 
2d930 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c  */.  u32 *aSzDel
2d940 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d950 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
2d960 20 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e   deleted documen
2d970 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e  ts */.  int nChn
2d980 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
2d990 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 74 20 63          /* Net c
2d9a0 68 61 6e 67 65 20 69 6e 20 6e 75 6d 62 65 72 20  hange in number 
2d9b0 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a  of documents */.
2d9c0 20 20 69 6e 74 20 62 49 6e 73 65 72 74 44 6f 6e    int bInsertDon
2d9d0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 74 20  e = 0;..  /* At 
2d9e0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75  this point it mu
2d9f0 73 74 20 62 65 20 6b 6e 6f 77 6e 20 69 66 20 74  st be known if t
2da00 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20  he %_stat table 
2da10 65 78 69 73 74 73 20 6f 72 20 6e 6f 74 2e 0a 20  exists or not.. 
2da20 20 2a 2a 20 53 6f 20 62 48 61 73 53 74 61 74 20   ** So bHasStat 
2da30 6d 61 79 20 6e 6f 74 20 62 65 20 32 2e 20 20 2a  may not be 2.  *
2da40 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  /.  assert( p->b
2da50 48 61 73 53 74 61 74 3d 3d 30 20 7c 7c 20 70 2d  HasStat==0 || p-
2da60 3e 62 48 61 73 53 74 61 74 3d 3d 31 20 29 3b 0a  >bHasStat==1 );.
2da70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
2da80 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20  egments==0 );.  
2da90 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 6e  assert( .      n
2daa0 41 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20 20  Arg==1          
2dab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 45             /* DE
2dac0 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
2dad0 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d 28  */.   || nArg==(
2dae0 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b  2 + p->nColumn +
2daf0 20 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20 6f   3)  /* INSERT o
2db00 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  r UPDATE operati
2db10 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20 2f  ons */.  );..  /
2db20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22 73  * Check for a "s
2db30 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20 6f  pecial" INSERT o
2db40 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66  peration. One of
2db50 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
2db60 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
2db70 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55  TO xyz(xyz) VALU
2db80 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a 20  ES('command');. 
2db90 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   */.  if( nArg>1
2dba0 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f   .   && sqlite3_
2dbb0 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
2dbc0 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
2dbd0 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  L .   && sqlite3
2dbe0 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2dbf0 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29  l[p->nColumn+2])
2dc00 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20  !=SQLITE_NULL . 
2dc10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
2dc20 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28 70  3SpecialInsert(p
2dc30 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75  , apVal[p->nColu
2dc40 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74 6f  mn+2]);.    goto
2dc50 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d   update_out;.  }
2dc60 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26  ..  if( nArg>1 &
2dc70 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
2dc80 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70 2d  int(apVal[2 + p-
2dc90 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c 30  >nColumn + 2])<0
2dca0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2dcb0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
2dcc0 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
2dcd0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  out;.  }..  /* A
2dce0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
2dcf0 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67 65   hold the change
2dd00 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a   in document siz
2dd10 65 73 20 2a 2f 0a 20 20 61 53 7a 44 65 6c 20 3d  es */.  aSzDel =
2dd20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2dd30 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30   sizeof(aSzDel[0
2dd40 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ])*(p->nColumn+1
2dd50 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53 7a  )*2 );.  if( aSz
2dd60 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Del==0 ){.    rc
2dd70 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2dd80 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
2dd90 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a 49  _out;.  }.  aSzI
2dda0 6e 73 20 3d 20 26 61 53 7a 44 65 6c 5b 70 2d 3e  ns = &aSzDel[p->
2ddb0 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d 65  nColumn+1];.  me
2ddc0 6d 73 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c 20  mset(aSzDel, 0, 
2ddd0 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30 5d  sizeof(aSzDel[0]
2dde0 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29  )*(p->nColumn+1)
2ddf0 2a 32 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73  *2);..  rc = fts
2de00 33 57 72 69 74 65 6c 6f 63 6b 28 70 29 3b 0a 20  3Writelock(p);. 
2de10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2de20 4f 4b 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65  OK ) goto update
2de30 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  _out;..  /* If t
2de40 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54  his is an INSERT
2de50 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 61   operation, or a
2de60 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f  n UPDATE that mo
2de70 64 69 66 69 65 73 20 74 68 65 20 72 6f 77 69 64  difies the rowid
2de80 0a 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 65  .  ** value, the
2de90 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  n this operation
2dea0 20 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74 72   requires constr
2deb0 61 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  aint handling.. 
2dec0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
2ded0 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65  on-conflict mode
2dee0 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 69   is REPLACE, thi
2def0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
2df00 20 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 20   existing row.  
2df10 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  ** should be del
2df20 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
2df30 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e  tabase before in
2df40 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20  serting the new 
2df50 72 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 66  row. Or,.  ** if
2df60 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74   the on-conflict
2df70 20 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20 74   mode is other t
2df80 68 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 65  han REPLACE, the
2df90 6e 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d 75  n this method mu
2dfa0 73 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  st.  ** detect t
2dfb0 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 20  he conflict and 
2dfc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2dfd0 4e 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65 20  NSTRAINT before 
2dfe0 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a  beginning to.  *
2dff0 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  * modify the dat
2e000 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
2e010 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26  .  if( nArg>1 &&
2e020 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d   p->zContentTbl=
2e030 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e  =0 ){.    /* Fin
2e040 64 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a 65  d the value obje
2e050 63 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  ct that holds th
2e060 65 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c 75  e new rowid valu
2e070 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
2e080 33 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f 77  3_value *pNewRow
2e090 69 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d 3e  id = apVal[3+p->
2e0a0 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 66  nColumn];.    if
2e0b0 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2e0c0 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29 3d  type(pNewRowid)=
2e0d0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
2e0e0 20 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64 20        pNewRowid 
2e0f0 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20  = apVal[1];.    
2e100 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
2e110 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e  e3_value_type(pN
2e120 65 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45  ewRowid)!=SQLITE
2e130 5f 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20 20  _NULL && ( .    
2e140 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
2e150 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29  e_type(apVal[0])
2e160 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20  ==SQLITE_NULL.  
2e170 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61     || sqlite3_va
2e180 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
2e190 30 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  0])!=sqlite3_val
2e1a0 75 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f 77  ue_int64(pNewRow
2e1b0 69 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  id).    )){.    
2e1c0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77    /* The new row
2e1d0 69 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  id is not NULL (
2e1e0 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  in this case the
2e1f0 20 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a 20   rowid will be. 
2e200 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
2e210 63 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 61  cally assigned a
2e220 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  nd there is no c
2e230 68 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66 6c  hance of a confl
2e240 69 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20 20  ict), and .     
2e250 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
2e260 74 20 69 73 20 65 69 74 68 65 72 20 61 6e 20 49  t is either an I
2e270 4e 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41  NSERT or an UPDA
2e280 54 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73  TE that modifies
2e290 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 6f   the.      ** ro
2e2a0 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20 69  wid column. So i
2e2b0 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d  f the conflict m
2e2c0 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20  ode is REPLACE, 
2e2d0 74 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79 0a  then delete any.
2e2e0 20 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e        ** existin
2e2f0 67 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64  g row with rowid
2e300 3d 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20 20  =pNewRowid. .   
2e310 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
2e320 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69  r, if the confli
2e330 63 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20 52  ct mode is not R
2e340 45 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20 74  EPLACE, insert t
2e350 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e  he new record in
2e360 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  to .      ** the
2e370 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
2e380 2e 20 49 66 20 77 65 20 68 69 74 20 74 68 65 20  . If we hit the 
2e390 64 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20  duplicate rowid 
2e3a0 63 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 61  constraint (or a
2e3b0 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
2e3c0 72 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20 64  r error) while d
2e3d0 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e 20  oing so, return 
2e3e0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2e3f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
2e400 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 61  his branch may a
2e410 6c 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77 52  lso run if pNewR
2e420 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61 20  owid contains a 
2e430 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e 6f  value that canno
2e440 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c 6f  t.      ** be lo
2e450 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74  sslessly convert
2e460 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
2e470 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2e480 74 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20 20  the eventual .  
2e490 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 66      ** call to f
2e4a0 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 29 20  ts3InsertData() 
2e4b0 28 65 69 74 68 65 72 20 6a 75 73 74 20 62 65 6c  (either just bel
2e4c0 6f 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f 6e  ow or further on
2e4d0 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a   in this.      *
2e4e0 2a 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c 6c  * function) will
2e4f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
2e500 49 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73 33  ISMATCH. If fts3
2e510 44 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69 73  DeleteByRowid is
2e520 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f 6b   .      ** invok
2e530 65 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c 65  ed, it will dele
2e540 74 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73 69  te zero rows (si
2e550 6e 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c 20  nce no row will 
2e560 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f  have.      ** do
2e570 63 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 69  cid=$pNewRowid i
2e580 66 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73 20  f $pNewRowid is 
2e590 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76  not an integer v
2e5a0 61 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  alue)..      */.
2e5b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e5c0 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69  3_vtab_on_confli
2e5d0 63 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 54  ct(p->db)==SQLIT
2e5e0 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20  E_REPLACE ){.   
2e5f0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65       rc = fts3De
2e600 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20 70  leteByRowid(p, p
2e610 4e 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e 67  NewRowid, &nChng
2e620 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 20  , aSzDel);.     
2e630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e640 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44  rc = fts3InsertD
2e650 61 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52  ata(p, apVal, pR
2e660 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
2e670 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b 0a  InsertDone = 1;.
2e680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e690 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
2e6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
2e6b0 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20  o update_out;.  
2e6c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
2e6d0 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55  is a DELETE or U
2e6e0 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c  PDATE operation,
2e6f0 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 20   remove the old 
2e700 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28  record. */.  if(
2e710 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2e720 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53  ype(apVal[0])!=S
2e730 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
2e740 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e750 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
2e760 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 49  al[0])==SQLITE_I
2e770 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72 63  NTEGER );.    rc
2e780 20 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79 52   = fts3DeleteByR
2e790 6f 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30 5d  owid(p, apVal[0]
2e7a0 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c  , &nChng, aSzDel
2e7b0 29 3b 0a 20 20 20 20 69 73 52 65 6d 6f 76 65 20  );.    isRemove 
2e7c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
2e7d0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49   If this is an I
2e7e0 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20  NSERT or UPDATE 
2e7f0 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72  operation, inser
2e800 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  t the new record
2e810 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e  . */.  if( nArg>
2e820 31 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  1 && rc==SQLITE_
2e830 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
2e840 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
2e850 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
2e860 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b  2 + p->nColumn +
2e870 20 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 62 49   2]);.    if( bI
2e880 6e 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b 0a  nsertDone==0 ){.
2e890 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49        rc = fts3I
2e8a0 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 56  nsertData(p, apV
2e8b0 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20  al, pRowid);.   
2e8c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e8d0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2e8e0 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
2e8f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2e900 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  = FTS_CORRUPT_VT
2e910 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  AB;.      }.    
2e920 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2e930 4c 49 54 45 5f 4f 4b 20 26 26 20 28 21 69 73 52  LITE_OK && (!isR
2e940 65 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69 64  emove || *pRowid
2e950 21 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20  !=p->iPrevDocid 
2e960 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2e970 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
2e980 44 6f 63 69 64 28 70 2c 20 30 2c 20 69 4c 61 6e  Docid(p, 0, iLan
2e990 67 69 64 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20  gid, *pRowid);. 
2e9a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2e9b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2e9d0 50 72 65 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77  PrevDocid==*pRow
2e9e0 69 64 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  id );.      rc =
2e9f0 20 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73   fts3InsertTerms
2ea00 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 61 70 56  (p, iLangid, apV
2ea10 61 6c 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20  al, aSzIns);.   
2ea20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 48   }.    if( p->bH
2ea30 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20  asDocsize ){.   
2ea40 20 20 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63     fts3InsertDoc
2ea50 73 69 7a 65 28 26 72 63 2c 20 70 2c 20 61 53 7a  size(&rc, p, aSz
2ea60 49 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Ins);.    }.    
2ea70 6e 43 68 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nChng++;.  }..  
2ea80 69 66 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a  if( p->bFts4 ){.
2ea90 20 20 20 20 66 74 73 33 55 70 64 61 74 65 44 6f      fts3UpdateDo
2eaa0 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20  cTotals(&rc, p, 
2eab0 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20  aSzIns, aSzDel, 
2eac0 6e 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70  nChng);.  }.. up
2ead0 64 61 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  date_out:.  sqli
2eae0 74 65 33 5f 66 72 65 65 28 61 53 7a 44 65 6c 29  te3_free(aSzDel)
2eaf0 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ;.  sqlite3Fts3S
2eb00 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b  egmentsClose(p);
2eb10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2eb20 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ./* .** Flush an
2eb30 79 20 64 61 74 61 20 69 6e 20 74 68 65 20 70 65  y data in the pe
2eb40 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
2eb50 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20   table to disk. 
2eb60 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
2eb70 2a 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  * merge all segm
2eb80 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
2eb90 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20  base (including 
2eba0 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c  the new segment,
2ebb0 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61   if .** there wa
2ebc0 73 20 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c  s any data to fl
2ebd0 75 73 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67  ush) into a sing
2ebe0 6c 65 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a  le segment. .*/.
2ebf0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f  int sqlite3Fts3O
2ec00 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c  ptimize(Fts3Tabl
2ec10 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
2ec20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2ec30 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
2ec40 45 50 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c  EPOINT fts3", 0,
2ec50 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2ec60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ec70 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70     rc = fts3DoOp
2ec80 74 69 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20  timize(p, 1);.  
2ec90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2eca0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
2ecb0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
2ecc0 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65  int rc2 = sqlite
2ecd0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52  3_exec(p->db, "R
2ece0 45 4c 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c  ELEASE fts3", 0,
2ecf0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
2ed00 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
2ed10 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20   ) rc = rc2;.   
2ed20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2ed30 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2ed40 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66  , "ROLLBACK TO f
2ed50 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ts3", 0, 0, 0);.
2ed60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
2ed70 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41  ec(p->db, "RELEA
2ed80 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20  SE fts3", 0, 0, 
2ed90 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
2eda0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
2edb0 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72  ntsClose(p);.  r
2edc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
2edd0 64 69 66 0a                                      dif.