/ Hex Artifact Content
Login

Artifact f33df1670b97be82a217d7b9400def27464e54aab41f7e016eaf057498f09f64:


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 2c 20 63  "SELECT level, c
3660: 6f 75 6e 74 28 2a 29 20 41 53 20 63 6e 74 20 46  ount(*) AS cnt F
3670: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
3680: 72 27 20 22 0a 20 20 20 20 20 20 20 20 20 22 20  r' ".         " 
3690: 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c 20   GROUP BY level 
36a0: 48 41 56 49 4e 47 20 63 6e 74 3e 3d 3f 22 0a 20  HAVING cnt>=?". 
36b0: 20 20 20 20 20 20 20 20 22 20 20 4f 52 44 45 52          "  ORDER
36c0: 20 42 59 20 28 6c 65 76 65 6c 20 25 25 20 31 30   BY (level %% 10
36d0: 32 34 29 20 41 53 43 20 4c 49 4d 49 54 20 31 22  24) ASC LIMIT 1"
36e0: 2c 0a 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  ,../* Estimate t
36f0: 68 65 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f  he upper limit o
3700: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3710: 6c 65 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20  leaf nodes in a 
3720: 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63  new segment.** c
3730: 72 65 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e  reated by mergin
3740: 67 20 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20  g the oldest :2 
3750: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62  segments from ab
3760: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e  solute level :1.
3770: 20 53 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   See .** functio
3780: 6e 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63  n sqlite3Fts3Inc
3790: 72 6d 65 72 67 65 28 29 20 66 6f 72 20 64 65 74  rmerge() for det
37a0: 61 69 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20  ails.  */./* 29 
37b0: 2a 2f 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74  */ "SELECT 2 * t
37c0: 6f 74 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f  otal(1 + leaves_
37d0: 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72  end_block - star
37e0: 74 5f 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20  t_block) ".     
37f0: 20 20 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27      "  FROM %Q.'
3800: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3810: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69   level = ? AND i
3820: 64 78 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c  dx < ?",../* SQL
3830: 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45  _DELETE_SEGDIR_E
3840: 4e 54 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65  NTRY.**   Delete
3850: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e   the %_segdir en
3860: 74 72 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20  try on absolute 
3870: 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e  level :1 with in
3880: 64 65 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33  dex :2.  */./* 3
3890: 30 20 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f  0 */ "DELETE FRO
38a0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
38b0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
38c0: 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a   AND idx = ?",..
38d0: 2f 2a 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47  /* SQL_SHIFT_SEG
38e0: 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d  DIR_ENTRY.**   M
38f0: 6f 64 69 66 79 20 74 68 65 20 69 64 78 20 76 61  odify the idx va
3900: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d  lue for the segm
3910: 65 6e 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20  ent with idx=:3 
3920: 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  on absolute leve
3930: 6c 20 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e  l :2.**   to :1.
3940: 20 20 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55    */./* 31 */ "U
3950: 50 44 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67  PDATE %Q.'%q_seg
3960: 64 69 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f  dir' SET idx = ?
3970: 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41   WHERE level=? A
3980: 4e 44 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53  ND idx=?",../* S
3990: 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
39a0: 0a 2a 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e  .**   Read a sin
39b0: 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  gle entry from t
39c0: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
39d0: 65 2e 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f  e. The entry fro
39e0: 6d 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20  m absolute .**  
39f0: 20 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69   level :1 with i
3a00: 6e 64 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20  ndex value :2.  
3a10: 2a 2f 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45  */./* 32 */  "SE
3a20: 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f  LECT idx, start_
3a30: 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e  block, leaves_en
3a40: 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f  d_block, end_blo
3a50: 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20  ck, root ".     
3a60: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e         "FROM %Q.
3a70: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
3a80: 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20  E level = ? AND 
3a90: 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51  idx = ?",../* SQ
3aa0: 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a  L_CHOMP_SEGDIR.*
3ab0: 2a 20 20 20 55 70 64 61 74 65 20 74 68 65 20 73  *   Update the s
3ac0: 74 61 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20  tart_block (:1) 
3ad0: 61 6e 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69  and root (:2) fi
3ae0: 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65  elds of the %_se
3af0: 67 64 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20  gdir.**   entry 
3b00: 6c 6f 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c  located on absol
3b10: 75 74 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74  ute level :3 wit
3b20: 68 20 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a  h index :4.  */.
3b30: 2f 2a 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54  /* 33 */  "UPDAT
3b40: 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  E %Q.'%q_segdir'
3b50: 20 53 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b   SET start_block
3b60: 20 3d 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a   = ?, root = ?".
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45              "WHE
3b80: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44  RE level = ? AND
3b90: 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53   idx = ?",../* S
3ba0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
3bb0: 50 45 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65  PENDABLE.**   Re
3bc0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
3bd0: 77 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74  w if the segment
3be0: 20 77 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d   with end_block=
3bf0: 3f 20 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e  ? is appendable.
3c00: 20 4f 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73   Or.**   no rows
3c10: 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a   otherwise.  */.
3c20: 2f 2a 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43  /* 34 */  "SELEC
3c30: 54 20 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  T 1 FROM %Q.'%q_
3c40: 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20  segments' WHERE 
3c50: 62 6c 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c  blockid=? AND bl
3c60: 6f 63 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f  ock IS NULL",../
3c70: 2a 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44  * SQL_SELECT_IND
3c80: 45 58 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e  EXES.**   Return
3c90: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c   the list of val
3ca0: 69 64 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78  id segment index
3cb0: 65 73 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20  es for absolute 
3cc0: 6c 65 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33  level ?  */./* 3
3cd0: 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64  5 */  "SELECT id
3ce0: 78 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  x FROM %Q.'%q_se
3cf0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3d00: 6c 3d 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41  l=? ORDER BY 1 A
3d10: 53 43 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c  SC",../* SQL_SEL
3d20: 45 43 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20  ECT_MXLEVEL.**  
3d30: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67   Return the larg
3d40: 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76  est relative lev
3d50: 65 6c 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  el in the FTS in
3d60: 64 65 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20  dex or indexes. 
3d70: 20 2a 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53   */./* 36 */  "S
3d80: 45 4c 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c  ELECT max( level
3d90: 20 25 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20   %% 1024 ) FROM 
3da0: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c  %Q.'%q_segdir'",
3db0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ..          /* R
3dc0: 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73 20 69  eturn segments i
3dd0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f 6c 64  n order from old
3de0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 2a 2f  est to newest.*/
3df0: 20 0a 2f 2a 20 33 37 20 2a 2f 20 20 22 53 45 4c   ./* 37 */  "SEL
3e00: 45 43 54 20 6c 65 76 65 6c 2c 20 69 64 78 2c 20  ECT level, idx, 
3e10: 65 6e 64 5f 62 6c 6f 63 6b 20 22 0a 20 20 20 20  end_block ".    
3e20: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
3e30: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
3e40: 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e  RE level BETWEEN
3e50: 20 3f 20 41 4e 44 20 3f 20 22 0a 20 20 20 20 20   ? AND ? ".     
3e60: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
3e70: 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64 78   level DESC, idx
3e80: 20 41 53 43 22 2c 0a 0a 20 20 20 20 20 20 20 20   ASC",..        
3e90: 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74 61 74    /* Update stat
3ea0: 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c  ements used whil
3eb0: 65 20 70 72 6f 6d 6f 74 69 6e 67 20 73 65 67 6d  e promoting segm
3ec0: 65 6e 74 73 20 2a 2f 0a 2f 2a 20 33 38 20 2a 2f  ents */./* 38 */
3ed0: 20 20 22 55 50 44 41 54 45 20 4f 52 20 46 41 49    "UPDATE OR FAI
3ee0: 4c 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  L %Q.'%q_segdir'
3ef0: 20 53 45 54 20 6c 65 76 65 6c 3d 2d 31 2c 69 64   SET level=-1,id
3f00: 78 3d 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  x=? ".          
3f10: 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f    "WHERE level=?
3f20: 20 41 4e 44 20 69 64 78 3d 3f 22 2c 0a 2f 2a 20   AND idx=?",./* 
3f30: 33 39 20 2a 2f 20 20 22 55 50 44 41 54 45 20 4f  39 */  "UPDATE O
3f40: 52 20 46 41 49 4c 20 25 51 2e 27 25 71 5f 73 65  R FAIL %Q.'%q_se
3f50: 67 64 69 72 27 20 53 45 54 20 6c 65 76 65 6c 3d  gdir' SET level=
3f60: 3f 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 2d 31  ? WHERE level=-1
3f70: 22 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63  "..  };.  int rc
3f80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3f90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3fa0: 74 6d 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tmt;..  assert( 
3fb0: 53 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53 71  SizeofArray(azSq
3fc0: 6c 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28  l)==SizeofArray(
3fd0: 70 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20 61  p->aStmt) );.  a
3fe0: 73 73 65 72 74 28 20 65 53 74 6d 74 3c 53 69 7a  ssert( eStmt<Siz
3ff0: 65 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 20  eofArray(azSql) 
4000: 26 26 20 65 53 74 6d 74 3e 3d 30 20 29 3b 0a 20  && eStmt>=0 );. 
4010: 20 0a 20 20 70 53 74 6d 74 20 3d 20 70 2d 3e 61   .  pStmt = p->a
4020: 53 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 69  Stmt[eStmt];.  i
4030: 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20  f( !pStmt ){.   
4040: 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
4050: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
4060: 4e 54 7c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  NT|SQLITE_PREPAR
4070: 45 5f 4e 4f 5f 56 54 41 42 3b 0a 20 20 20 20 63  E_NO_VTAB;.    c
4080: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 69  har *zSql;.    i
4090: 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f  f( eStmt==SQL_CO
40a0: 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29 7b 0a  NTENT_INSERT ){.
40b0: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
40c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53  ite3_mprintf(azS
40d0: 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44  ql[eStmt], p->zD
40e0: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e  b, p->zName, p->
40f0: 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74 29 3b  zWriteExprlist);
4100: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
4110: 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54  Stmt==SQL_SELECT
4120: 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49  _CONTENT_BY_ROWI
4130: 44 20 29 7b 0a 20 20 20 20 20 20 66 20 26 3d 20  D ){.      f &= 
4140: 7e 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f  ~SQLITE_PREPARE_
4150: 4e 4f 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 7a  NO_VTAB;.      z
4160: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
4170: 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d  rintf(azSql[eStm
4180: 74 5d 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72  t], p->zReadExpr
4190: 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  list);.    }else
41a0: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
41b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
41c0: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
41d0: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  zDb, p->zName);.
41e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
41f0: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Sql ){.      rc 
4200: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
4210: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4220: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
4230: 65 70 61 72 65 5f 76 33 28 70 2d 3e 64 62 2c 20  epare_v3(p->db, 
4240: 7a 53 71 6c 2c 20 2d 31 2c 20 66 2c 20 26 70 53  zSql, -1, f, &pS
4250: 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  tmt, NULL);.    
4260: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4270: 53 71 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Sql);.      asse
4280: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4290: 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 20 29 3b  K || pStmt==0 );
42a0: 0a 20 20 20 20 20 20 70 2d 3e 61 53 74 6d 74 5b  .      p->aStmt[
42b0: 65 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74 3b 0a  eStmt] = pStmt;.
42c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
42d0: 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  apVal ){.    int
42e0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72   i;.    int nPar
42f0: 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  am = sqlite3_bin
4300: 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
4310: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 66 6f  t(pStmt);.    fo
4320: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
4330: 45 5f 4f 4b 20 26 26 20 69 3c 6e 50 61 72 61 6d  E_OK && i<nParam
4340: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
4350: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
4360: 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 2b 31  value(pStmt, i+1
4370: 2c 20 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20  , apVal[i]);.   
4380: 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70   }.  }.  *pp = p
4390: 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  Stmt;.  return r
43a0: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  c;.}...static in
43b0: 74 20 66 74 73 33 53 65 6c 65 63 74 44 6f 63 73  t fts3SelectDocs
43c0: 69 7a 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ize(.  Fts3Table
43d0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
43e0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
43f0: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
4400: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
4410: 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20  Docid,          
4420: 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 62 69 6e   /* Docid to bin
4430: 64 20 66 6f 72 20 53 51 4c 5f 53 45 4c 45 43 54  d for SQL_SELECT
4440: 5f 44 4f 43 53 49 5a 45 20 2a 2f 0a 20 20 73 71  _DOCSIZE */.  sq
4450: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
4460: 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt           /*
4470: 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20   OUT: Statement 
4480: 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  handle */.){.  s
4490: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
44a0: 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  mt = 0;        /
44b0: 2a 20 53 74 61 74 65 6d 65 6e 74 20 72 65 71 75  * Statement requ
44c0: 65 73 74 65 64 20 66 72 6f 6d 20 66 74 73 33 53  ested from fts3S
44d0: 71 6c 53 74 6d 74 28 29 20 2a 2f 0a 20 20 69 6e  qlStmt() */.  in
44e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4500: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
4510: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
4520: 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f 53 45  tmt(pTab, SQL_SE
4530: 4c 45 43 54 5f 44 4f 43 53 49 5a 45 2c 20 26 70  LECT_DOCSIZE, &p
4540: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
4550: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4560: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
4570: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
4580: 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 72  , iDocid);.    r
4590: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
45a0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
45b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
45c0: 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
45d0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29  n_type(pStmt, 0)
45e0: 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  !=SQLITE_BLOB ){
45f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
4600: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
4610: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4620: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
4630: 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
4640: 42 3b 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d  B;.      pStmt =
4650: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
4660: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4670: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
4680: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d    *ppStmt = pStm
4690: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
46a0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
46b0: 73 33 53 65 6c 65 63 74 44 6f 63 74 6f 74 61 6c  s3SelectDoctotal
46c0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
46d0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
46e0: 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
46f0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
4700: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
4710: 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt           /*
4720: 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20   OUT: Statement 
4730: 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  handle */.){.  s
4740: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
4750: 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
4760: 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ;.  rc = fts3Sql
4770: 53 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f 53  Stmt(pTab, SQL_S
4780: 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74  ELECT_STAT, &pSt
4790: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
47a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
47b0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
47c0: 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54  int(pStmt, 1, FT
47d0: 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29  S_STAT_DOCTOTAL)
47e0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
47f0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 21 3d 53  3_step(pStmt)!=S
4800: 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20 7c  QLITE_ROW.     |
4810: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
4820: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 21  _type(pStmt, 0)!
4830: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20  =SQLITE_BLOB.   
4840: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
4850: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
4860: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
4870: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
4880: 63 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f  c = FTS_CORRUPT_
4890: 56 54 41 42 3b 0a 20 20 20 20 20 20 70 53 74 6d  VTAB;.      pStm
48a0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
48b0: 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74  .  *ppStmt = pSt
48c0: 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  mt;.  return rc;
48d0: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
48e0: 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65  ts3SelectDocsize
48f0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
4900: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
4910: 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
4920: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
4930: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63  lite3_int64 iDoc
4940: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id,           /*
4950: 20 44 6f 63 69 64 20 74 6f 20 72 65 61 64 20 73   Docid to read s
4960: 69 7a 65 20 64 61 74 61 20 66 6f 72 20 2a 2f 0a  ize data for */.
4970: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4980: 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20  *ppStmt         
4990: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
49a0: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b  ent handle */.){
49b0: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 65  .  return fts3Se
49c0: 6c 65 63 74 44 6f 63 73 69 7a 65 28 70 54 61 62  lectDocsize(pTab
49d0: 2c 20 69 44 6f 63 69 64 2c 20 70 70 53 74 6d 74  , iDocid, ppStmt
49e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 69  );.}../*.** Simi
49f0: 6c 61 72 20 74 6f 20 66 74 73 33 53 71 6c 53 74  lar to fts3SqlSt
4a00: 6d 74 28 29 2e 20 45 78 63 65 70 74 2c 20 61 66  mt(). Except, af
4a10: 74 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20  ter binding the 
4a20: 70 61 72 61 6d 65 74 65 72 73 20 69 6e 0a 2a 2a  parameters in.**
4a30: 20 61 72 72 61 79 20 61 70 56 61 6c 5b 5d 20 74   array apVal[] t
4a40: 6f 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  o the SQL statem
4a50: 65 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  ent identified b
4a60: 79 20 65 53 74 6d 74 2c 20 74 68 65 20 73 74 61  y eStmt, the sta
4a70: 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65 78 65  tement.** is exe
4a80: 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cuted..**.** Ret
4a90: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
4aa0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
4ab0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
4ac0: 65 78 65 63 75 74 65 64 2c 20 6f 72 20 61 6e 0a  executed, or an.
4ad0: 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
4ae0: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
4af0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4b00: 74 73 33 53 71 6c 45 78 65 63 28 0a 20 20 69 6e  ts3SqlExec(.  in
4b10: 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20  t *pRC,         
4b20: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
4b30: 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54   code */.  Fts3T
4b40: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
4b50: 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53 33 20      /* The FTS3 
4b60: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65  table */.  int e
4b70: 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  Stmt,           
4b80: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
4b90: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 76 61  statement to eva
4ba0: 6c 75 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  luate */.  sqlit
4bb0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
4bc0: 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72      /* Parameter
4bd0: 73 20 74 6f 20 62 69 6e 64 20 2a 2f 0a 29 7b 0a  s to bind */.){.
4be0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4bf0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
4c00: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
4c10: 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74 73  turn;.  rc = fts
4c20: 33 53 71 6c 53 74 6d 74 28 70 2c 20 65 53 74 6d  3SqlStmt(p, eStm
4c30: 74 2c 20 26 70 53 74 6d 74 2c 20 61 70 56 61 6c  t, &pStmt, apVal
4c40: 29 3b 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ); .  if( rc==SQ
4c50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
4c60: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
4c70: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
4c80: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
4c90: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20  );.  }.  *pRC = 
4ca0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
4cb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e 73 75  is function ensu
4cc0: 72 65 73 20 74 68 61 74 20 74 68 65 20 63 61 6c  res that the cal
4cd0: 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64  ler has obtained
4ce0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 2a   an exclusive .*
4cf0: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
4d00: 61 62 6c 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  able-lock on the
4d10: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
4d20: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
4d30: 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 77 72 69  d before .** wri
4d40: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
4d50: 20 66 74 73 33 20 74 61 62 6c 65 2e 20 49 66 20   fts3 table. If 
4d60: 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  this lock is not
4d70: 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74 2c   acquired first,
4d80: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
4d90: 6c 65 72 20 6d 61 79 20 65 6e 64 20 75 70 20 61  ler may end up a
4da0: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61 6b  ttempting to tak
4db0: 65 20 74 68 69 73 20 6c 6f 63 6b 20 61 73 20 70  e this lock as p
4dc0: 61 72 74 20 6f 66 20 63 6f 6d 6d 69 74 74 69 6e  art of committin
4dd0: 67 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  g.** a transacti
4de0: 6f 6e 2c 20 63 61 75 73 69 6e 67 20 53 51 4c 69  on, causing SQLi
4df0: 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  te to return SQL
4e00: 49 54 45 5f 4c 4f 43 4b 45 44 20 6f 72 20 0a 2a  ITE_LOCKED or .*
4e10: 2a 20 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  * LOCKED_SHAREDC
4e20: 41 43 48 45 74 6f 20 61 20 43 4f 4d 4d 49 54 20  ACHEto a COMMIT 
4e30: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  command..**.** I
4e40: 74 20 69 73 20 62 65 73 74 20 74 6f 20 61 76 6f  t is best to avo
4e50: 69 64 20 74 68 69 73 20 62 65 63 61 75 73 65 20  id this because 
4e60: 69 66 20 46 54 53 33 20 72 65 74 75 72 6e 73 20  if FTS3 returns 
4e70: 61 6e 79 20 65 72 72 6f 72 20 77 68 65 6e 20 0a  any error when .
4e80: 2a 2a 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  ** committing a 
4e90: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
4ea0: 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
4eb0: 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
4ec0: 64 20 62 61 63 6b 2e 20 0a 2a 2a 20 41 6e 64 20  d back. .** And 
4ed0: 74 68 69 73 20 69 73 20 6e 6f 74 20 77 68 61 74  this is not what
4ee0: 20 75 73 65 72 73 20 65 78 70 65 63 74 20 77 68   users expect wh
4ef0: 65 6e 20 74 68 65 79 20 67 65 74 20 53 51 4c 49  en they get SQLI
4f00: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
4f10: 43 41 43 48 45 2e 20 0a 2a 2a 20 49 74 20 63 61  CACHE. .** It ca
4f20: 6e 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69  n still happen i
4f30: 66 20 74 68 65 20 75 73 65 72 20 6c 6f 63 6b 73  f the user locks
4f40: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
4f50: 74 61 62 6c 65 73 20 64 69 72 65 63 74 6c 79 20  tables directly 
4f60: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61  .** instead of a
4f70: 63 63 65 73 73 69 6e 67 20 74 68 65 6d 20 76 69  ccessing them vi
4f80: 61 20 46 54 53 2e 0a 2a 2f 0a 73 74 61 74 69 63  a FTS..*/.static
4f90: 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 6c 6f   int fts3Writelo
4fa0: 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  ck(Fts3Table *p)
4fb0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4fc0: 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28  ITE_OK;.  .  if(
4fd0: 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
4fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4ff0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
5000: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
5010: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
5020: 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c 2c  TE_SEGDIR_LEVEL,
5030: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
5040: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5050: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
5060: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
5070: 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  tmt, 1);.      s
5080: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
5090: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
50a0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
50b0: 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mt);.    }.  }..
50c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
50d0: 2f 2a 0a 2a 2a 20 46 54 53 20 6d 61 69 6e 74 61  /*.** FTS mainta
50e0: 69 6e 73 20 61 20 73 65 70 61 72 61 74 65 20 69  ins a separate i
50f0: 6e 64 65 78 65 73 20 66 6f 72 20 65 61 63 68 20  ndexes for each 
5100: 6c 61 6e 67 75 61 67 65 2d 69 64 20 28 61 20 33  language-id (a 3
5110: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 29 2e 0a  2-bit integer)..
5120: 2a 2a 20 57 69 74 68 69 6e 20 65 61 63 68 20 6c  ** Within each l
5130: 61 6e 67 75 61 67 65 20 69 64 2c 20 61 20 73 65  anguage id, a se
5140: 70 61 72 61 74 65 20 69 6e 64 65 78 20 69 73 20  parate index is 
5150: 6d 61 69 6e 74 61 69 6e 65 64 20 74 6f 20 73 74  maintained to st
5160: 6f 72 65 20 74 68 65 0a 2a 2a 20 64 6f 63 75 6d  ore the.** docum
5170: 65 6e 74 20 74 65 72 6d 73 2c 20 61 6e 64 20 65  ent terms, and e
5180: 61 63 68 20 63 6f 6e 66 69 67 75 72 65 64 20 70  ach configured p
5190: 72 65 66 69 78 20 73 69 7a 65 20 28 63 6f 6e 66  refix size (conf
51a0: 69 67 75 72 65 64 20 74 68 65 20 46 54 53 20 0a  igured the FTS .
51b0: 2a 2a 20 22 70 72 65 66 69 78 3d 22 20 6f 70 74  ** "prefix=" opt
51c0: 69 6f 6e 29 2e 20 41 6e 64 20 65 61 63 68 20 69  ion). And each i
51d0: 6e 64 65 78 20 63 6f 6e 73 69 73 74 73 20 6f 66  ndex consists of
51e0: 20 6d 75 6c 74 69 70 6c 65 20 6c 65 76 65 6c 73   multiple levels
51f0: 20 28 22 72 65 6c 61 74 69 76 65 0a 2a 2a 20 6c   ("relative.** l
5200: 65 76 65 6c 73 22 29 2e 0a 2a 2a 0a 2a 2a 20 41  evels")..**.** A
5210: 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65 73  ll three of thes
5220: 65 20 76 61 6c 75 65 73 20 28 74 68 65 20 6c 61  e values (the la
5230: 6e 67 75 61 67 65 20 69 64 2c 20 74 68 65 20 73  nguage id, the s
5240: 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 61 6e  pecific index an
5250: 64 20 74 68 65 0a 2a 2a 20 6c 65 76 65 6c 20 77  d the.** level w
5260: 69 74 68 69 6e 20 74 68 65 20 69 6e 64 65 78 29  ithin the index)
5270: 20 61 72 65 20 65 6e 63 6f 64 65 64 20 69 6e 20   are encoded in 
5280: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  64-bit integer v
5290: 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20  alues stored.** 
52a0: 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  in the %_segdir 
52b0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54  table on disk. T
52c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
52d0: 75 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20  used to convert 
52e0: 74 68 72 65 65 0a 2a 2a 20 73 65 70 61 72 61 74  three.** separat
52f0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 76 61 6c 75  e component valu
5300: 65 73 20 69 6e 74 6f 20 74 68 65 20 73 69 6e 67  es into the sing
5310: 6c 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  le 64-bit intege
5320: 72 20 76 61 6c 75 65 20 74 68 61 74 0a 2a 2a 20  r value that.** 
5330: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 71  can be used to q
5340: 75 65 72 79 20 74 68 65 20 25 5f 73 65 67 64 69  uery the %_segdi
5350: 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  r table..**.** S
5360: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 65 61 63  pecifically, eac
5370: 68 20 6c 61 6e 67 75 61 67 65 2d 69 64 2f 69 6e  h language-id/in
5380: 64 65 78 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  dex combination 
5390: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 31 30 32  is allocated 102
53a0: 34 20 0a 2a 2a 20 36 34 2d 62 69 74 20 69 6e 74  4 .** 64-bit int
53b0: 65 67 65 72 20 6c 65 76 65 6c 20 76 61 6c 75 65  eger level value
53c0: 73 20 28 22 61 62 73 6f 6c 75 74 65 20 6c 65 76  s ("absolute lev
53d0: 65 6c 73 22 29 2e 20 54 68 65 20 6d 61 69 6e 20  els"). The main 
53e0: 74 65 72 6d 73 20 69 6e 64 65 78 0a 2a 2a 20 66  terms index.** f
53f0: 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 30  or language-id 0
5400: 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   is allocate val
5410: 75 65 73 20 30 2d 31 30 32 33 2e 20 54 68 65 20  ues 0-1023. The 
5420: 66 69 72 73 74 20 70 72 65 66 69 78 20 69 6e 64  first prefix ind
5430: 65 78 0a 2a 2a 20 28 69 66 20 61 6e 79 29 20 66  ex.** (if any) f
5440: 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 30  or language-id 0
5450: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 76 61   is allocated va
5460: 6c 75 65 73 20 31 30 32 34 2d 32 30 34 37 2e 20  lues 1024-2047. 
5470: 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 4c 61  And so on..** La
5480: 6e 67 75 61 67 65 20 31 20 69 6e 64 65 78 65 73  nguage 1 indexes
5490: 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 69   are allocated i
54a0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
54b0: 77 69 6e 67 20 6c 61 6e 67 75 61 67 65 20 30 2e  wing language 0.
54c0: 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20 66 6f 72 20 61  .**.** So, for a
54d0: 20 73 79 73 74 65 6d 20 77 69 74 68 20 6e 50 72   system with nPr
54e0: 65 66 69 78 20 70 72 65 66 69 78 20 69 6e 64 65  efix prefix inde
54f0: 78 65 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  xes configured, 
5500: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a 20  the block of.** 
5510: 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73 20  absolute levels 
5520: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
5530: 20 74 6f 20 6c 61 6e 67 75 61 67 65 2d 69 64 20   to language-id 
5540: 69 4c 61 6e 67 69 64 20 61 6e 64 20 69 6e 64 65  iLangid and inde
5550: 78 20 0a 2a 2a 20 69 49 6e 64 65 78 20 73 74 61  x .** iIndex sta
5560: 72 74 73 20 61 74 20 61 62 73 6f 6c 75 74 65 20  rts at absolute 
5570: 6c 65 76 65 6c 20 28 28 69 4c 61 6e 67 69 64 20  level ((iLangid 
5580: 2a 20 28 6e 50 72 65 66 69 78 2b 31 29 20 2b 20  * (nPrefix+1) + 
5590: 69 49 6e 64 65 78 29 20 2a 20 31 30 32 34 29 2e  iIndex) * 1024).
55a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
55b0: 65 33 5f 69 6e 74 36 34 20 67 65 74 41 62 73 6f  e3_int64 getAbso
55c0: 6c 75 74 65 4c 65 76 65 6c 28 0a 20 20 46 74 73  luteLevel(.  Fts
55d0: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55f0: 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
5600: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  e */.  int iLang
5610: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
5620: 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
5630: 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ge id */.  int i
5640: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
5650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
5660: 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64 65 78  dex in p->aIndex
5670: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  [] */.  int iLev
5680: 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  el              
5690: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
56a0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
56b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
56c0: 36 34 20 69 42 61 73 65 3b 20 20 20 20 20 20 20  64 iBase;       
56d0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 62       /* First ab
56e0: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 66 6f 72  solute level for
56f0: 20 69 4c 61 6e 67 69 64 2f 69 49 6e 64 65 78 20   iLangid/iIndex 
5700: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  */.  assert( iLa
5710: 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73 73  ngid>=0 );.  ass
5720: 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e 30  ert( p->nIndex>0
5730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49   );.  assert( iI
5740: 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65  ndex>=0 && iInde
5750: 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a  x<p->nIndex );..
5760: 20 20 69 42 61 73 65 20 3d 20 28 28 73 71 6c 69    iBase = ((sqli
5770: 74 65 33 5f 69 6e 74 36 34 29 69 4c 61 6e 67 69  te3_int64)iLangi
5780: 64 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 20 2b 20  d * p->nIndex + 
5790: 69 49 6e 64 65 78 29 20 2a 20 46 54 53 33 5f 53  iIndex) * FTS3_S
57a0: 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 3b 0a  EGDIR_MAXLEVEL;.
57b0: 20 20 72 65 74 75 72 6e 20 69 42 61 73 65 20 2b    return iBase +
57c0: 20 69 4c 65 76 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a   iLevel;.}../*.*
57d0: 2a 20 53 65 74 20 2a 70 70 53 74 6d 74 20 74 6f  * Set *ppStmt to
57e0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
57f0: 64 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 20  dle that may be 
5800: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
5810: 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 72  through.** all r
5820: 6f 77 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67  ows in the %_seg
5830: 64 69 72 20 74 61 62 6c 65 2c 20 66 72 6f 6d 20  dir table, from 
5840: 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74  oldest to newest
5850: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
5860: 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
5870: 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72 6f  E_OK. If an erro
5880: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70  r occurs while p
5890: 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
58a0: 74 65 6d 65 6e 74 2c 20 0a 2a 2a 20 72 65 74 75  tement, .** retu
58b0: 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
58c0: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
58d0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
58e0: 72 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  r one instance o
58f0: 66 20 74 68 69 73 20 53 51 4c 20 73 74 61 74 65  f this SQL state
5900: 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 64 20 66 6f  ment compiled fo
5910: 72 0a 2a 2a 20 65 61 63 68 20 46 54 53 33 20 74  r.** each FTS3 t
5920: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
5930: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
5940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
5950: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
5960: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 3a   %_segdir table:
5970: 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 69 64 78 0a  .**.**   0: idx.
5980: 2a 2a 20 20 20 31 3a 20 73 74 61 72 74 5f 62 6c  **   1: start_bl
5990: 6f 63 6b 0a 2a 2a 20 20 20 32 3a 20 6c 65 61 76  ock.**   2: leav
59a0: 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20  es_end_block.** 
59b0: 20 20 33 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a    3: end_block.*
59c0: 2a 20 20 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a 69  *   4: root.*/.i
59d0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 41 6c  nt sqlite3Fts3Al
59e0: 6c 53 65 67 64 69 72 73 28 0a 20 20 46 74 73 33  lSegdirs(.  Fts3
59f0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
5a10: 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  TS3 table */.  i
5a20: 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20  nt iLangid,     
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a40: 2a 20 4c 61 6e 67 75 61 67 65 20 62 65 69 6e 67  * Language being
5a50: 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 69 6e   queried */.  in
5a60: 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20  t iIndex,       
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a80: 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49   Index for p->aI
5a90: 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ndex[] */.  int 
5aa0: 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5ac0: 65 76 65 6c 20 74 6f 20 73 65 6c 65 63 74 20 28  evel to select (
5ad0: 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 29 20  relative level) 
5ae0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
5af0: 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20  t **ppStmt      
5b00: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6d       /* OUT: Com
5b10: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20  piled statement 
5b20: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
5b30: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
5b40: 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 61 73  pStmt = 0;..  as
5b50: 73 65 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46 54  sert( iLevel==FT
5b60: 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
5b70: 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30 20 29 3b   || iLevel>=0 );
5b80: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65  .  assert( iLeve
5b90: 6c 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  l<FTS3_SEGDIR_MA
5ba0: 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73 65  XLEVEL );.  asse
5bb0: 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26  rt( iIndex>=0 &&
5bc0: 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65   iIndex<p->nInde
5bd0: 78 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76  x );..  if( iLev
5be0: 65 6c 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 22  el<0 ){.    /* "
5bf0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 5f  SELECT * FROM %_
5c00: 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65 76  segdir WHERE lev
5c10: 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  el BETWEEN ? AND
5c20: 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 22   ? ORDER BY ..."
5c30: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
5c40: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
5c50: 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e  SELECT_LEVEL_RAN
5c60: 47 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  GE, &pStmt, 0);.
5c70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5c80: 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
5c90: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
5ca0: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65 74  64(pStmt, 1, get
5cb0: 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
5cc0: 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
5cd0: 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  , 0));.      sql
5ce0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
5cf0: 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20  pStmt, 2, .     
5d00: 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65       getAbsolute
5d10: 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
5d20: 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53  , iIndex, FTS3_S
5d30: 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31  EGDIR_MAXLEVEL-1
5d40: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
5d50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
5d60: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
5d70: 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c  %_segdir WHERE l
5d80: 65 76 65 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42  evel = ? ORDER B
5d90: 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72 63  Y ..." */.    rc
5da0: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
5db0: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56  , SQL_SELECT_LEV
5dc0: 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  EL, &pStmt, 0);.
5dd0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5de0: 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
5df0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
5e00: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65 74  64(pStmt, 1, get
5e10: 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
5e20: 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
5e30: 2c 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 7d  ,iLevel));.    }
5e40: 0a 20 20 7d 0a 20 20 2a 70 70 53 74 6d 74 20 3d  .  }.  *ppStmt =
5e50: 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e   pStmt;.  return
5e60: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   rc;.}.../*.** A
5e70: 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 76  ppend a single v
5e80: 61 72 69 6e 74 20 74 6f 20 61 20 50 65 6e 64 69  arint to a Pendi
5e90: 6e 67 4c 69 73 74 20 62 75 66 66 65 72 2e 20 53  ngList buffer. S
5ea0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
5eb0: 72 6e 65 64 0a 2a 2a 20 69 66 20 73 75 63 63 65  rned.** if succe
5ec0: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
5ed0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
5ee0: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
5ef0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
5f00: 73 6f 20 73 65 72 76 65 73 20 74 6f 20 61 6c 6c  so serves to all
5f10: 6f 63 61 74 65 20 74 68 65 20 50 65 6e 64 69 6e  ocate the Pendin
5f20: 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20  gList structure 
5f30: 69 74 73 65 6c 66 2e 0a 2a 2a 20 46 6f 72 20 65  itself..** For e
5f40: 78 61 6d 70 6c 65 2c 20 74 6f 20 63 72 65 61 74  xample, to creat
5f50: 65 20 61 20 6e 65 77 20 50 65 6e 64 69 6e 67 4c  e a new PendingL
5f60: 69 73 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ist structure co
5f70: 6e 74 61 69 6e 69 6e 67 20 74 77 6f 0a 2a 2a 20  ntaining two.** 
5f80: 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  varints:.**.**  
5f90: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20   PendingList *p 
5fa0: 3d 20 30 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65  = 0;.**   fts3Pe
5fb0: 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56  ndingListAppendV
5fc0: 61 72 69 6e 74 28 26 70 2c 20 31 29 3b 0a 2a 2a  arint(&p, 1);.**
5fd0: 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69     fts3PendingLi
5fe0: 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  stAppendVarint(&
5ff0: 70 2c 20 32 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  p, 2);.*/.static
6000: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
6010: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
6020: 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  (.  PendingList 
6030: 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
6040: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
6050: 6f 69 6e 74 65 72 20 74 6f 20 50 65 6e 64 69 6e  ointer to Pendin
6060: 67 4c 69 73 74 20 73 74 72 75 63 74 20 2a 2f 0a  gList struct */.
6070: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
6080: 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i               
6090: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61 70    /* Value to ap
60a0: 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
60b0: 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  ){.  PendingList
60c0: 20 2a 70 20 3d 20 2a 70 70 3b 0a 0a 20 20 2f 2a   *p = *pp;..  /*
60d0: 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 67 72 6f   Allocate or gro
60e0: 77 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69 73  w the PendingLis
60f0: 74 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 2a  t as required. *
6100: 2f 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  /.  if( !p ){.  
6110: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
6120: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 29 20  lloc(sizeof(*p) 
6130: 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66 28 20  + 100);.    if( 
6140: 21 70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  !p ){.      retu
6150: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6160: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53  .    }.    p->nS
6170: 70 61 63 65 20 3d 20 31 30 30 3b 0a 20 20 20 20  pace = 100;.    
6180: 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72  p->aData = (char
6190: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d   *)&p[1];.    p-
61a0: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a  >nData = 0;.  }.
61b0: 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 44    else if( p->nD
61c0: 61 74 61 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f  ata+FTS3_VARINT_
61d0: 4d 41 58 2b 31 3e 70 2d 3e 6e 53 70 61 63 65 20  MAX+1>p->nSpace 
61e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  ){.    int nNew 
61f0: 3d 20 70 2d 3e 6e 53 70 61 63 65 20 2a 20 32 3b  = p->nSpace * 2;
6200: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6210: 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  _realloc(p, size
6220: 6f 66 28 2a 70 29 20 2b 20 6e 4e 65 77 29 3b 0a  of(*p) + nNew);.
6230: 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20      if( !p ){.  
6240: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6250: 28 2a 70 70 29 3b 0a 20 20 20 20 20 20 2a 70 70  (*pp);.      *pp
6260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
6270: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6280: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53  .    }.    p->nS
6290: 70 61 63 65 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  pace = nNew;.   
62a0: 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61   p->aData = (cha
62b0: 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 7d 0a 0a  r *)&p[1];.  }..
62c0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
62d0: 6e 65 77 20 73 65 72 69 61 6c 69 7a 65 64 20 76  new serialized v
62e0: 61 72 69 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  arint to the end
62f0: 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f   of the list. */
6300: 0a 20 20 70 2d 3e 6e 44 61 74 61 20 2b 3d 20 73  .  p->nData += s
6310: 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
6320: 69 6e 74 28 26 70 2d 3e 61 44 61 74 61 5b 70 2d  int(&p->aData[p-
6330: 3e 6e 44 61 74 61 5d 2c 20 69 29 3b 0a 20 20 70  >nData], i);.  p
6340: 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61  ->aData[p->nData
6350: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 2a 70 70 20  ] = '\0';.  *pp 
6360: 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = p;.  return SQ
6370: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6380: 2a 20 41 64 64 20 61 20 64 6f 63 69 64 2f 63 6f  * Add a docid/co
6390: 6c 75 6d 6e 2f 70 6f 73 69 74 69 6f 6e 20 65 6e  lumn/position en
63a0: 74 72 79 20 74 6f 20 61 20 50 65 6e 64 69 6e 67  try to a Pending
63b0: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  List structure. 
63c0: 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72  Non-zero.** is r
63d0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
63e0: 74 72 75 63 74 75 72 65 20 69 73 20 73 71 6c 69  tructure is sqli
63f0: 74 65 33 5f 72 65 61 6c 6c 6f 63 65 64 20 61 73  te3_realloced as
6400: 20 70 61 72 74 20 6f 66 20 61 64 64 69 6e 67 0a   part of adding.
6410: 2a 2a 20 74 68 65 20 65 6e 74 72 79 2e 20 4f 74  ** the entry. Ot
6420: 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e 0a 2a  herwise, zero..*
6430: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
6440: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52  rror occurs, *pR
6450: 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  c is set to SQLI
6460: 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65 20  TE_NOMEM before 
6470: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 5a 65  returning..** Ze
6480: 72 6f 20 69 73 20 61 6c 77 61 79 73 20 72 65 74  ro is always ret
6490: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
64a0: 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  se. Otherwise, i
64b0: 66 20 6e 6f 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f no OOM error o
64c0: 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
64d0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
64e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
64f0: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
6500: 70 70 65 6e 64 28 0a 20 20 50 65 6e 64 69 6e 67  ppend(.  Pending
6510: 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20 20  List **pp,      
6520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
6530: 55 54 3a 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  UT: PendingList 
6540: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73  structure */.  s
6550: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
6560: 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  cid,           /
6570: 2a 20 44 6f 63 69 64 20 66 6f 72 20 65 6e 74 72  * Docid for entr
6580: 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 73 71  y to add */.  sq
6590: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 6f 6c  lite3_int64 iCol
65a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
65b0: 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 65 6e 74 72   Column for entr
65c0: 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 73 71  y to add */.  sq
65d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f 73  lite3_int64 iPos
65e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
65f0: 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 65 72   Position of ter
6600: 6d 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20 61  m for entry to a
6610: 64 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  dd */.  int *pRc
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
6640: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 29  Return code */.)
6650: 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  {.  PendingList 
6660: 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 6e 74 20  *p = *pp;.  int 
6670: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6680: 0a 20 20 61 73 73 65 72 74 28 20 21 70 20 7c 7c  .  assert( !p ||
6690: 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 3c 3d   p->iLastDocid<=
66a0: 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20 69 66 28  iDocid );..  if(
66b0: 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44   !p || p->iLastD
66c0: 6f 63 69 64 21 3d 69 44 6f 63 69 64 20 29 7b 0a  ocid!=iDocid ){.
66d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
66e0: 34 20 69 44 65 6c 74 61 20 3d 20 69 44 6f 63 69  4 iDelta = iDoci
66f0: 64 20 2d 20 28 70 20 3f 20 70 2d 3e 69 4c 61 73  d - (p ? p->iLas
6700: 74 44 6f 63 69 64 20 3a 20 30 29 3b 0a 20 20 20  tDocid : 0);.   
6710: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
6720: 61 73 73 65 72 74 28 20 70 2d 3e 6e 44 61 74 61  assert( p->nData
6730: 3c 70 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20  <p->nSpace );.  
6740: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
6750: 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 3d 3d  Data[p->nData]==
6760: 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 44  0 );.      p->nD
6770: 61 74 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ata++;.    }.   
6780: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
6790: 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e  (rc = fts3Pendin
67a0: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
67b0: 74 28 26 70 2c 20 69 44 65 6c 74 61 29 29 20 29  t(&p, iDelta)) )
67c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65 6e  {.      goto pen
67d0: 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f  dinglistappend_o
67e0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ut;.    }.    p-
67f0: 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 2d 31 3b 0a  >iLastCol = -1;.
6800: 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73 20      p->iLastPos 
6810: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73  = 0;.    p->iLas
6820: 74 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b  tDocid = iDocid;
6830: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
6840: 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 43 6f 6c  0 && p->iLastCol
6850: 21 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66  !=iCol ){.    if
6860: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
6870: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69   = fts3PendingLi
6880: 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  stAppendVarint(&
6890: 70 2c 20 31 29 29 0a 20 20 20 20 20 7c 7c 20 53  p, 1)).     || S
68a0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
68b0: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
68c0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20  ppendVarint(&p, 
68d0: 69 43 6f 6c 29 29 0a 20 20 20 20 29 7b 0a 20 20  iCol)).    ){.  
68e0: 20 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e 67      goto pending
68f0: 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b 0a  listappend_out;.
6900: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c 61      }.    p->iLa
6910: 73 74 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20  stCol = iCol;.  
6920: 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20    p->iLastPos = 
6930: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  0;.  }.  if( iCo
6940: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  l>=0 ){.    asse
6950: 72 74 28 20 69 50 6f 73 3e 70 2d 3e 69 4c 61 73  rt( iPos>p->iLas
6960: 74 50 6f 73 20 7c 7c 20 28 69 50 6f 73 3d 3d 30  tPos || (iPos==0
6970: 20 26 26 20 70 2d 3e 69 4c 61 73 74 50 6f 73 3d   && p->iLastPos=
6980: 3d 30 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  =0) );.    rc = 
6990: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
69a0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20  ppendVarint(&p, 
69b0: 32 2b 69 50 6f 73 2d 70 2d 3e 69 4c 61 73 74 50  2+iPos-p->iLastP
69c0: 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  os);.    if( rc=
69d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
69e0: 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73 20      p->iLastPos 
69f0: 3d 20 69 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20  = iPos;.    }.  
6a00: 7d 0a 0a 20 70 65 6e 64 69 6e 67 6c 69 73 74 61  }.. pendinglista
6a10: 70 70 65 6e 64 5f 6f 75 74 3a 0a 20 20 2a 70 52  ppend_out:.  *pR
6a20: 63 20 3d 20 72 63 3b 0a 20 20 69 66 28 20 70 21  c = rc;.  if( p!
6a30: 3d 2a 70 70 20 29 7b 0a 20 20 20 20 2a 70 70 20  =*pp ){.    *pp 
6a40: 3d 20 70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = p;.    return 
6a50: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6a60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  0;.}../*.** Free
6a70: 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 6f   a PendingList o
6a80: 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20  bject allocated 
6a90: 62 79 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  by fts3PendingLi
6aa0: 73 74 41 70 70 65 6e 64 28 29 2e 0a 2a 2f 0a 73  stAppend()..*/.s
6ab0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 50  tatic void fts3P
6ac0: 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 65  endingListDelete
6ad0: 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c  (PendingList *pL
6ae0: 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ist){.  sqlite3_
6af0: 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  free(pList);.}..
6b00: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74  /*.** Add an ent
6b10: 72 79 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  ry to one of the
6b20: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68   pending-terms h
6b30: 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ash tables..*/.s
6b40: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65  tatic int fts3Pe
6b50: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e 65  ndingTermsAddOne
6b60: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
6b70: 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 0a 20 20  ,.  int iCol,.  
6b80: 69 6e 74 20 69 50 6f 73 2c 0a 20 20 46 74 73 33  int iPos,.  Fts3
6b90: 48 61 73 68 20 2a 70 48 61 73 68 2c 20 20 20 20  Hash *pHash,    
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6bb0: 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 68 61 73  ending terms has
6bc0: 68 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 65  h table to add e
6bd0: 6e 74 72 79 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e  ntry to */.  con
6be0: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 2c  st char *zToken,
6bf0: 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 0a 29 7b  .  int nToken.){
6c00: 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a  .  PendingList *
6c10: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 63 20  pList;.  int rc 
6c20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
6c30: 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e 67  pList = (Pending
6c40: 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68 46  List *)fts3HashF
6c50: 69 6e 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65  ind(pHash, zToke
6c60: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  n, nToken);.  if
6c70: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70  ( pList ){.    p
6c80: 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 2d  ->nPendingData -
6c90: 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20  = (pList->nData 
6ca0: 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f  + nToken + sizeo
6cb0: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29 29  f(Fts3HashElem))
6cc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 74 73 33  ;.  }.  if( fts3
6cd0: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
6ce0: 64 28 26 70 4c 69 73 74 2c 20 70 2d 3e 69 50 72  d(&pList, p->iPr
6cf0: 65 76 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20 69  evDocid, iCol, i
6d00: 50 6f 73 2c 20 26 72 63 29 20 29 7b 0a 20 20 20  Pos, &rc) ){.   
6d10: 20 69 66 28 20 70 4c 69 73 74 3d 3d 66 74 73 33   if( pList==fts3
6d20: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
6d30: 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , zToken, nToken
6d40: 2c 20 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  , pList) ){.    
6d50: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c    /* Malloc fail
6d60: 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69  ed while inserti
6d70: 6e 67 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  ng the new entry
6d80: 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
6d90: 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e  .      ** happen
6da0: 20 69 66 20 74 68 65 72 65 20 77 61 73 20 6e 6f   if there was no
6db0: 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
6dc0: 66 6f 72 20 74 68 69 73 20 74 6f 6b 65 6e 2e 0a  for this token..
6dd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
6de0: 73 73 65 72 74 28 20 30 3d 3d 66 74 73 33 48 61  ssert( 0==fts3Ha
6df0: 73 68 46 69 6e 64 28 70 48 61 73 68 2c 20 7a 54  shFind(pHash, zT
6e00: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29 3b  oken, nToken) );
6e10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6e20: 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ree(pList);.    
6e30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
6e40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
6e50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6e60: 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65  OK ){.    p->nPe
6e70: 6e 64 69 6e 67 44 61 74 61 20 2b 3d 20 28 70 4c  ndingData += (pL
6e80: 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f  ist->nData + nTo
6e90: 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  ken + sizeof(Fts
6ea0: 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d  3HashElem));.  }
6eb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6ec0: 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65 20  ./*.** Tokenize 
6ed0: 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
6ee0: 65 64 20 73 74 72 69 6e 67 20 7a 54 65 78 74 20  ed string zText 
6ef0: 61 6e 64 20 61 64 64 20 61 6c 6c 20 74 6f 6b 65  and add all toke
6f00: 6e 73 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e  ns to the.** pen
6f10: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 2d  ding-terms hash-
6f20: 74 61 62 6c 65 2e 20 54 68 65 20 64 6f 63 69 64  table. The docid
6f30: 20 75 73 65 64 20 69 73 20 74 68 61 74 20 63 75   used is that cu
6f40: 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
6f50: 6e 0a 2a 2a 20 70 2d 3e 69 50 72 65 76 44 6f 63  n.** p->iPrevDoc
6f60: 69 64 2c 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  id, and the colu
6f70: 6d 6e 20 69 73 20 73 70 65 63 69 66 69 65 64 20  mn is specified 
6f80: 62 79 20 61 72 67 75 6d 65 6e 74 20 69 43 6f 6c  by argument iCol
6f90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
6fa0: 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
6fb0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
6fc0: 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
6fd0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
6fe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
6ff0: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64  3PendingTermsAdd
7000: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
7010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7020: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e 74      /* Table int
7030: 6f 20 77 68 69 63 68 20 74 65 78 74 20 77 69 6c  o which text wil
7040: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f  l be inserted */
7050: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69     /* Language i
7080: 64 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 63 6f  d to use */.  co
7090: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70b0: 20 54 65 78 74 20 6f 66 20 64 6f 63 75 6d 65 6e   Text of documen
70c0: 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  t to be inserted
70d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
7100: 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78 74 20  into which text 
7110: 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
7120: 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 57 6f  d */.  u32 *pnWo
7130: 72 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rd              
7140: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
7150: 3a 20 49 6e 63 72 2e 20 62 79 20 6e 75 6d 62 65  : Incr. by numbe
7160: 72 20 74 6f 6b 65 6e 73 20 69 6e 73 65 72 74 65  r tokens inserte
7170: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
7180: 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d  ;.  int iStart =
7190: 20 30 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d   0;.  int iEnd =
71a0: 20 30 3b 0a 20 20 69 6e 74 20 69 50 6f 73 20 3d   0;.  int iPos =
71b0: 20 30 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 64 20   0;.  int nWord 
71c0: 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e  = 0;..  char con
71d0: 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69 6e  st *zToken;.  in
71e0: 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 0a 20  t nToken = 0;.. 
71f0: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
7200: 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d  er *pTokenizer =
7210: 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a   p->pTokenizer;.
7220: 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
7230: 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74  zer_module const
7240: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 6f 6b   *pModule = pTok
7250: 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b  enizer->pModule;
7260: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
7270: 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 73  izer_cursor *pCs
7280: 72 3b 0a 20 20 69 6e 74 20 28 2a 78 4e 65 78 74  r;.  int (*xNext
7290: 29 28 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  )(sqlite3_tokeni
72a0: 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  zer_cursor *pCur
72b0: 73 6f 72 2c 0a 20 20 20 20 20 20 63 6f 6e 73 74  sor,.      const
72c0: 20 63 68 61 72 2a 2a 2c 69 6e 74 2a 2c 69 6e 74   char**,int*,int
72d0: 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29 3b 0a 0a 20  *,int*,int*);.. 
72e0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 69   assert( pTokeni
72f0: 7a 65 72 20 26 26 20 70 4d 6f 64 75 6c 65 20 29  zer && pModule )
7300: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
7310: 73 65 72 20 68 61 73 20 69 6e 73 65 72 74 65 64  ser has inserted
7320: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74   a NULL value, t
7330: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
7340: 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   be called with.
7350: 20 20 2a 2a 20 7a 54 65 78 74 3d 3d 30 2e 20 49    ** zText==0. I
7360: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 64 64  n this case, add
7370: 20 7a 65 72 6f 20 74 6f 6b 65 6e 20 65 6e 74 72   zero token entr
7380: 69 65 73 20 74 6f 20 74 68 65 20 68 61 73 68 20  ies to the hash 
7390: 74 61 62 6c 65 20 61 6e 64 20 0a 20 20 2a 2a 20  table and .  ** 
73a0: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
73b0: 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20  .  if( zText==0 
73c0: 29 7b 0a 20 20 20 20 2a 70 6e 57 6f 72 64 20 3d  ){.    *pnWord =
73d0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
73e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
73f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
7400: 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70  3OpenTokenizer(p
7410: 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67  Tokenizer, iLang
7420: 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  id, zText, -1, &
7430: 70 43 73 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCsr);.  if( rc!
7440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7460: 0a 0a 20 20 78 4e 65 78 74 20 3d 20 70 4d 6f 64  ..  xNext = pMod
7470: 75 6c 65 2d 3e 78 4e 65 78 74 3b 0a 20 20 77 68  ule->xNext;.  wh
7480: 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ile( SQLITE_OK==
7490: 72 63 0a 20 20 20 20 20 20 26 26 20 53 51 4c 49  rc.      && SQLI
74a0: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e 65  TE_OK==(rc = xNe
74b0: 78 74 28 70 43 73 72 2c 20 26 7a 54 6f 6b 65 6e  xt(pCsr, &zToken
74c0: 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 53 74 61  , &nToken, &iSta
74d0: 72 74 2c 20 26 69 45 6e 64 2c 20 26 69 50 6f 73  rt, &iEnd, &iPos
74e0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
74f0: 69 3b 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3e  i;.    if( iPos>
7500: 3d 6e 57 6f 72 64 20 29 20 6e 57 6f 72 64 20 3d  =nWord ) nWord =
7510: 20 69 50 6f 73 2b 31 3b 0a 0a 20 20 20 20 2f 2a   iPos+1;..    /*
7520: 20 50 6f 73 69 74 69 6f 6e 73 20 63 61 6e 6e 6f   Positions canno
7530: 74 20 62 65 20 6e 65 67 61 74 69 76 65 3b 20 77  t be negative; w
7540: 65 20 75 73 65 20 2d 31 20 61 73 20 61 20 74 65  e use -1 as a te
7550: 72 6d 69 6e 61 74 6f 72 20 69 6e 74 65 72 6e 61  rminator interna
7560: 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 54 6f 6b 65  lly..    ** Toke
7570: 6e 73 20 6d 75 73 74 20 68 61 76 65 20 61 20 6e  ns must have a n
7580: 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a  on-zero length..
7590: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
75a0: 50 6f 73 3c 30 20 7c 7c 20 21 7a 54 6f 6b 65 6e  Pos<0 || !zToken
75b0: 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d 30 20 29 7b   || nToken<=0 ){
75c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
75d0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
75e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
75f0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65 72    /* Add the ter
7600: 6d 20 74 6f 20 74 68 65 20 74 65 72 6d 73 20 69  m to the terms i
7610: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ndex */.    rc =
7620: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
7630: 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20 20  sAddOne(.       
7640: 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20   p, iCol, iPos, 
7650: 26 70 2d 3e 61 49 6e 64 65 78 5b 30 5d 2e 68 50  &p->aIndex[0].hP
7660: 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20  ending, zToken, 
7670: 6e 54 6f 6b 65 6e 0a 20 20 20 20 29 3b 0a 20 20  nToken.    );.  
7680: 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68    .    /* Add th
7690: 65 20 74 65 72 6d 20 74 6f 20 65 61 63 68 20 6f  e term to each o
76a0: 66 20 74 68 65 20 70 72 65 66 69 78 20 69 6e 64  f the prefix ind
76b0: 65 78 65 73 20 74 68 61 74 20 69 74 20 69 73 20  exes that it is 
76c0: 6e 6f 74 20 74 6f 6f 20 0a 20 20 20 20 2a 2a 20  not too .    ** 
76d0: 73 68 6f 72 74 20 66 6f 72 2e 20 2a 2f 0a 20 20  short for. */.  
76e0: 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
76f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
7700: 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20  >nIndex; i++){. 
7710: 20 20 20 20 20 73 74 72 75 63 74 20 46 74 73 33       struct Fts3
7720: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
7730: 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 3b 0a 20  &p->aIndex[i];. 
7740: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3c       if( nToken<
7750: 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 20  pIndex->nPrefix 
7760: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7770: 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
7780: 6e 67 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20  ngTermsAddOne(. 
7790: 20 20 20 20 20 20 20 20 20 70 2c 20 69 43 6f 6c           p, iCol
77a0: 2c 20 69 50 6f 73 2c 20 26 70 49 6e 64 65 78 2d  , iPos, &pIndex-
77b0: 3e 68 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65  >hPending, zToke
77c0: 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66  n, pIndex->nPref
77d0: 69 78 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ix.      );.    
77e0: 7d 0a 20 20 7d 0a 0a 20 20 70 4d 6f 64 75 6c 65  }.  }..  pModule
77f0: 2d 3e 78 43 6c 6f 73 65 28 70 43 73 72 29 3b 0a  ->xClose(pCsr);.
7800: 20 20 2a 70 6e 57 6f 72 64 20 2b 3d 20 6e 57 6f    *pnWord += nWo
7810: 72 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63  rd;.  return (rc
7820: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20  ==SQLITE_DONE ? 
7830: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b  SQLITE_OK : rc);
7840: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 69  .}../* .** Calli
7850: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
7860: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
7870: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
7880: 20 74 6f 20 0a 2a 2a 20 66 74 73 33 50 65 6e 64   to .** fts3Pend
7890: 69 6e 67 54 65 72 6d 73 41 64 64 28 29 20 61 72  ingTermsAdd() ar
78a0: 65 20 74 6f 20 61 64 64 20 74 65 72 6d 2f 70 6f  e to add term/po
78b0: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 70 61 69 72  sition-list pair
78c0: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e  s for the.** con
78d0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 6f 63  tents of the doc
78e0: 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64  ument with docid
78f0: 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a 73 74 61 74   iDocid..*/.stat
7900: 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69  ic int fts3Pendi
7910: 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 0a 20 20  ngTermsDocid(.  
7920: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61 62  /* Full-text tab
7950: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
7960: 6e 74 20 62 44 65 6c 65 74 65 2c 20 20 20 20 20  nt bDelete,     
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7980: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 6f  * True if this o
7990: 70 20 69 73 20 61 20 64 65 6c 65 74 65 20 2a 2f  p is a delete */
79a0: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69     /* Language i
79d0: 64 20 6f 66 20 72 6f 77 20 62 65 69 6e 67 20 77  d of row being w
79e0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c 69  ritten */.  sqli
79f0: 74 65 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20  te_int64 iDocid 
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
7a10: 6f 63 69 64 20 6f 66 20 72 6f 77 20 62 65 69 6e  ocid of row bein
7a20: 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a  g written */.){.
7a30: 20 20 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69    assert( iLangi
7a40: 64 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d>=0 );.  assert
7a50: 28 20 62 44 65 6c 65 74 65 3d 3d 31 20 7c 7c 20  ( bDelete==1 || 
7a60: 62 44 65 6c 65 74 65 3d 3d 30 20 29 3b 0a 0a 20  bDelete==0 );.. 
7a70: 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29 20   /* TODO(shess) 
7a80: 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72 20  Explore whether 
7a90: 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68 69  partially flushi
7aa0: 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f 6e  ng the buffer on
7ab0: 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c 75  .  ** forced-flu
7ac0: 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64 65  sh would provide
7ad0: 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d 61   better performa
7ae0: 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74 20  nce.  I suspect 
7af0: 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65 20  that if.  ** we 
7b00: 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63 6c  ordered the docl
7b10: 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e 64  ists by size and
7b20: 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61 72   flushed the lar
7b30: 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a 20  gest until the. 
7b40: 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20 68   ** buffer was h
7b50: 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74 20  alf empty, that 
7b60: 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c 65  would let the le
7b70: 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72 6d  ss frequent term
7b80: 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20  s.  ** generate 
7b90: 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73 2e  longer doclists.
7ba0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f 63  .  */.  if( iDoc
7bb0: 69 64 3c 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  id<p->iPrevDocid
7bc0: 20 0a 20 20 20 7c 7c 20 28 69 44 6f 63 69 64 3d   .   || (iDocid=
7bd0: 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20 26  =p->iPrevDocid &
7be0: 26 20 70 2d 3e 62 50 72 65 76 44 65 6c 65 74 65  & p->bPrevDelete
7bf0: 3d 3d 30 29 0a 20 20 20 7c 7c 20 70 2d 3e 69 50  ==0).   || p->iP
7c00: 72 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e 67  revLangid!=iLang
7c10: 69 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65 6e  id.   || p->nPen
7c20: 64 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78  dingData>p->nMax
7c30: 50 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20 29  PendingData .  )
7c40: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
7c50: 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
7c60: 67 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a  gTermsFlush(p);.
7c70: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7c80: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
7c90: 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65  c;.  }.  p->iPre
7ca0: 76 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b  vDocid = iDocid;
7cb0: 0a 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69  .  p->iPrevLangi
7cc0: 64 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20 70  d = iLangid;.  p
7cd0: 2d 3e 62 50 72 65 76 44 65 6c 65 74 65 20 3d 20  ->bPrevDelete = 
7ce0: 62 44 65 6c 65 74 65 3b 0a 20 20 72 65 74 75 72  bDelete;.  retur
7cf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7d00: 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68  /*.** Discard th
7d10: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
7d20: 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  e pending-terms 
7d30: 68 61 73 68 20 74 61 62 6c 65 73 2e 20 0a 2a 2f  hash tables. .*/
7d40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
7d50: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65  3PendingTermsCle
7d60: 61 72 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  ar(Fts3Table *p)
7d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
7d80: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e 64 65  (i=0; i<p->nInde
7d90: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  x; i++){.    Fts
7da0: 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d  3HashElem *pElem
7db0: 3b 0a 20 20 20 20 46 74 73 33 48 61 73 68 20 2a  ;.    Fts3Hash *
7dc0: 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e 64  pHash = &p->aInd
7dd0: 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e 67 3b 0a  ex[i].hPending;.
7de0: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 66 74      for(pElem=ft
7df0: 73 33 48 61 73 68 46 69 72 73 74 28 70 48 61 73  s3HashFirst(pHas
7e00: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
7e10: 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28 70 45  =fts3HashNext(pE
7e20: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 50 65 6e  lem)){.      Pen
7e30: 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 20  dingList *pList 
7e40: 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a  = (PendingList *
7e50: 29 66 74 73 33 48 61 73 68 44 61 74 61 28 70 45  )fts3HashData(pE
7e60: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 33  lem);.      fts3
7e70: 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74  PendingListDelet
7e80: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  e(pList);.    }.
7e90: 20 20 20 20 66 74 73 33 48 61 73 68 43 6c 65 61      fts3HashClea
7ea0: 72 28 70 48 61 73 68 29 3b 0a 20 20 7d 0a 20 20  r(pHash);.  }.  
7eb0: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
7ec0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
7ed0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
7ee0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55 70  alled by the xUp
7ef0: 64 61 74 65 28 29 20 6d 65 74 68 6f 64 20 61 73  date() method as
7f00: 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45   part of an INSE
7f10: 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  RT.** operation.
7f20: 20 49 74 20 61 64 64 73 20 65 6e 74 72 69 65 73   It adds entries
7f30: 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
7f40: 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  n the new record
7f50: 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69   to the.** pendi
7f60: 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61 62  ngTerms hash tab
7f70: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  le..**.** Argume
7f80: 6e 74 20 61 70 56 61 6c 20 69 73 20 74 68 65 20  nt apVal is the 
7f90: 73 61 6d 65 20 61 73 20 74 68 65 20 73 69 6d 69  same as the simi
7fa0: 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61 72 67 75  larly named argu
7fb0: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 0a 2a  ment passed to.*
7fc0: 2a 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61  * fts3InsertData
7fd0: 28 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 44  (). Parameter iD
7fe0: 6f 63 69 64 20 69 73 20 74 68 65 20 64 6f 63 69  ocid is the doci
7ff0: 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77  d of the new row
8000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8010: 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28  fts3InsertTerms(
8020: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
8030: 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c   .  int iLangid,
8040: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
8050: 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20 20 75 33  e **apVal, .  u3
8060: 32 20 2a 61 53 7a 0a 29 7b 0a 20 20 69 6e 74 20  2 *aSz.){.  int 
8070: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8090: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
80a0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69   */.  for(i=2; i
80b0: 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b 20 69  <p->nColumn+2; i
80c0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
80d0: 6c 20 3d 20 69 2d 32 3b 0a 20 20 20 20 69 66 28  l = i-2;.    if(
80e0: 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64   p->abNotindexed
80f0: 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iCol]==0 ){.   
8100: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8110: 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
8120: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
8130: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69 5d  ue_text(apVal[i]
8140: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  );.      int rc 
8150: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
8160: 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69 64  msAdd(p, iLangid
8170: 2c 20 7a 54 65 78 74 2c 20 69 43 6f 6c 2c 20 26  , zText, iCol, &
8180: 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20  aSz[iCol]);.    
8190: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
81a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
81b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
81c0: 7d 0a 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e  }.      aSz[p->n
81d0: 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74  Column] += sqlit
81e0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
81f0: 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  pVal[i]);.    }.
8200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8210: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8220: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
8230: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
8240: 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64  xUpdate() method
8250: 20 66 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f   for an INSERT o
8260: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  peration..** The
8270: 20 61 70 56 61 6c 20 70 61 72 61 6d 65 74 65 72   apVal parameter
8280: 20 69 73 20 70 61 73 73 65 64 20 61 20 63 6f 70   is passed a cop
8290: 79 20 6f 66 20 74 68 65 20 61 70 56 61 6c 20 61  y of the apVal a
82a0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 62  rgument passed b
82b0: 79 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 74  y.** SQLite to t
82c0: 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74  he xUpdate() met
82d0: 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a 0a 2a 2a 20  hod. i.e:.**.** 
82e0: 20 20 61 70 56 61 6c 5b 30 5d 20 20 20 20 20 20    apVal[0]      
82f0: 20 20 20 20 20 20 20 20 20 20 4e 6f 74 20 75 73            Not us
8300: 65 64 20 66 6f 72 20 49 4e 53 45 52 54 2e 0a 2a  ed for INSERT..*
8310: 2a 20 20 20 61 70 56 61 6c 5b 31 5d 20 20 20 20  *   apVal[1]    
8320: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 69              rowi
8330: 64 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 32 5d 20  d.**   apVal[2] 
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
8350: 65 66 74 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65  eft-most user-de
8360: 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  fined column.** 
8370: 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61 70 56 61 6c    ....**   apVal
8380: 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 20 20  [p->nColumn+1]  
8390: 20 20 20 52 69 67 68 74 2d 6d 6f 73 74 20 75 73     Right-most us
83a0: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er-defined colum
83b0: 6e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e  n.**   apVal[p->
83c0: 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20 20 20 20 48  nColumn+2]     H
83d0: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 77 69 74  idden column wit
83e0: 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  h same name as t
83f0: 61 62 6c 65 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  able.**   apVal[
8400: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 20 20 20  p->nColumn+3]   
8410: 20 20 48 69 64 64 65 6e 20 22 64 6f 63 69 64 22    Hidden "docid"
8420: 20 63 6f 6c 75 6d 6e 20 28 61 6c 69 61 73 20 66   column (alias f
8430: 6f 72 20 72 6f 77 69 64 29 0a 2a 2a 20 20 20 61  or rowid).**   a
8440: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
8450: 34 5d 20 20 20 20 20 48 69 64 64 65 6e 20 6c 61  4]     Hidden la
8460: 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e 0a  nguageid column.
8470: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
8480: 73 33 49 6e 73 65 72 74 44 61 74 61 28 0a 20 20  s3InsertData(.  
8490: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61 62  /* Full-text tab
84c0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
84d0: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20  value **apVal,  
84e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
84f0: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 69 6e   of values to in
8500: 73 65 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  sert */.  sqlite
8510: 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64  3_int64 *piDocid
8520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8530: 3a 20 44 6f 63 69 64 20 66 6f 72 20 72 6f 77 20  : Docid for row 
8540: 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 2a 2f  just inserted */
8550: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8580: 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
8590: 33 5f 73 74 6d 74 20 2a 70 43 6f 6e 74 65 6e 74  3_stmt *pContent
85a0: 49 6e 73 65 72 74 3b 20 20 20 2f 2a 20 49 4e 53  Insert;   /* INS
85b0: 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65  ERT INTO %_conte
85c0: 6e 74 20 56 41 4c 55 45 53 28 2e 2e 2e 29 20 2a  nt VALUES(...) *
85d0: 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e  /..  if( p->zCon
85e0: 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20 73  tentTbl ){.    s
85f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
8600: 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 70 2d 3e  owid = apVal[p->
8610: 6e 43 6f 6c 75 6d 6e 2b 33 5d 3b 0a 20 20 20 20  nColumn+3];.    
8620: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
8630: 65 5f 74 79 70 65 28 70 52 6f 77 69 64 29 3d 3d  e_type(pRowid)==
8640: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
8650: 20 20 20 20 20 70 52 6f 77 69 64 20 3d 20 61 70       pRowid = ap
8660: 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  Val[1];.    }.  
8670: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8680: 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64 29  lue_type(pRowid)
8690: 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  !=SQLITE_INTEGER
86a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
86b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
86c0: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  NT;.    }.    *p
86d0: 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33  iDocid = sqlite3
86e0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 52 6f  _value_int64(pRo
86f0: 77 69 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  wid);.    return
8700: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8710: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
8720: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
8730: 65 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74  e used to insert
8740: 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 25   data into the %
8750: 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 74 61  _content.  ** ta
8760: 62 6c 65 2e 20 54 68 65 20 53 51 4c 20 66 6f 72  ble. The SQL for
8770: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
8780: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
8790: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f  INSERT INTO %_co
87a0: 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 3f 2c 20  ntent VALUES(?, 
87b0: 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 0a  ?, ?, ...).  **.
87c0: 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65 6d 65    ** The stateme
87d0: 6e 74 20 66 65 61 74 75 72 65 73 20 4e 20 27 3f  nt features N '?
87e0: 27 20 76 61 72 69 61 62 6c 65 73 2c 20 77 68 65  ' variables, whe
87f0: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
8800: 65 72 20 6f 66 20 75 73 65 72 0a 20 20 2a 2a 20  er of user.  ** 
8810: 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  defined columns 
8820: 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  in the FTS3 tabl
8830: 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66 6f 72 20  e, plus one for 
8840: 74 68 65 20 64 6f 63 69 64 20 66 69 65 6c 64 2e  the docid field.
8850: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  .  */.  rc = fts
8860: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
8870: 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 2c 20  CONTENT_INSERT, 
8880: 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c  &pContentInsert,
8890: 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 69   &apVal[1]);.  i
88a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
88b0: 20 26 26 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65   && p->zLanguage
88c0: 69 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  id ){.    rc = s
88d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
88e0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 74 65 6e  .        pConten
88f0: 74 49 6e 73 65 72 74 2c 20 70 2d 3e 6e 43 6f 6c  tInsert, p->nCol
8900: 75 6d 6e 2b 32 2c 20 0a 20 20 20 20 20 20 20 20  umn+2, .        
8910: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
8920: 74 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75  t(apVal[p->nColu
8930: 6d 6e 2b 34 5d 29 0a 20 20 20 20 29 3b 0a 20 20  mn+4]).    );.  
8940: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
8950: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
8960: 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 69  c;..  /* There i
8970: 73 20 61 20 71 75 69 72 6b 20 68 65 72 65 2e 20  s a quirk here. 
8980: 54 68 65 20 75 73 65 72 73 20 49 4e 53 45 52 54  The users INSERT
8990: 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 68   statement may h
89a0: 61 76 65 20 73 70 65 63 69 66 69 65 64 0a 20 20  ave specified.  
89b0: 2a 2a 20 61 20 76 61 6c 75 65 20 66 6f 72 20 74  ** a value for t
89c0: 68 65 20 22 72 6f 77 69 64 22 20 66 69 65 6c 64  he "rowid" field
89d0: 2c 20 66 6f 72 20 74 68 65 20 22 64 6f 63 69 64  , for the "docid
89e0: 22 20 66 69 65 6c 64 2c 20 6f 72 20 66 6f 72 20  " field, or for 
89f0: 62 6f 74 68 2e 0a 20 20 2a 2a 20 57 68 69 63 68  both..  ** Which
8a00: 20 69 73 20 61 20 70 72 6f 62 6c 65 6d 2c 20 73   is a problem, s
8a10: 69 6e 63 65 20 22 72 6f 77 69 64 22 20 61 6e 64  ince "rowid" and
8a20: 20 22 64 6f 63 69 64 22 20 61 72 65 20 61 6c 69   "docid" are ali
8a30: 61 73 65 73 20 66 6f 72 20 74 68 65 0a 20 20 2a  ases for the.  *
8a40: 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 46 6f  * same value. Fo
8a50: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
8a60: 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
8a70: 54 4f 20 66 74 73 33 74 62 6c 28 72 6f 77 69 64  TO fts3tbl(rowid
8a80: 2c 20 64 6f 63 69 64 29 20 56 41 4c 55 45 53 28  , docid) VALUES(
8a90: 31 2c 20 32 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  1, 2);.  **.  **
8aa0: 20 49 6e 20 46 54 53 33 2c 20 74 68 69 73 20 69   In FTS3, this i
8ab0: 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 74 20 69  s an error. It i
8ac0: 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 73 70  s an error to sp
8ad0: 65 63 69 66 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 76  ecify non-NULL v
8ae0: 61 6c 75 65 73 0a 20 20 2a 2a 20 66 6f 72 20 62  alues.  ** for b
8af0: 6f 74 68 20 64 6f 63 69 64 20 61 6e 64 20 73 6f  oth docid and so
8b00: 6d 65 20 6f 74 68 65 72 20 72 6f 77 69 64 20 61  me other rowid a
8b10: 6c 69 61 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lias..  */.  if(
8b20: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
8b30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8b40: 28 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c  (apVal[3+p->nCol
8b50: 75 6d 6e 5d 29 20 29 7b 0a 20 20 20 20 69 66 28  umn]) ){.    if(
8b60: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
8b70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8b80: 28 61 70 56 61 6c 5b 30 5d 29 0a 20 20 20 20 20  (apVal[0]).     
8b90: 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d  && SQLITE_NULL!=
8ba0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8bb0: 70 65 28 61 70 56 61 6c 5b 31 5d 29 0a 20 20 20  pe(apVal[1]).   
8bc0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
8bd0: 6f 77 69 64 2f 64 6f 63 69 64 20 63 6f 6e 66 6c  owid/docid confl
8be0: 69 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ict. */.      re
8bf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8c00: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
8c10: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76  = sqlite3_bind_v
8c20: 61 6c 75 65 28 70 43 6f 6e 74 65 6e 74 49 6e 73  alue(pContentIns
8c30: 65 72 74 2c 20 31 2c 20 61 70 56 61 6c 5b 33 2b  ert, 1, apVal[3+
8c40: 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20  p->nColumn]);.  
8c50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8c60: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8c70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 65 63 75  .  }..  /* Execu
8c80: 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  te the statement
8c90: 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 72   to insert the r
8ca0: 65 63 6f 72 64 2e 20 53 65 74 20 2a 70 69 44 6f  ecord. Set *piDo
8cb0: 63 69 64 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a  cid to the .  **
8cc0: 20 6e 65 77 20 64 6f 63 69 64 20 76 61 6c 75 65   new docid value
8cd0: 2e 20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  . .  */.  sqlite
8ce0: 33 5f 73 74 65 70 28 70 43 6f 6e 74 65 6e 74 49  3_step(pContentI
8cf0: 6e 73 65 72 74 29 3b 0a 20 20 72 63 20 3d 20 73  nsert);.  rc = s
8d00: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 6f  qlite3_reset(pCo
8d10: 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 0a 20  ntentInsert);.. 
8d20: 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 71 6c 69   *piDocid = sqli
8d30: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
8d40: 72 6f 77 69 64 28 70 2d 3e 64 62 29 3b 0a 20 20  rowid(p->db);.  
8d50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a  return rc;.}....
8d60: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  /*.** Remove all
8d70: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 46   data from the F
8d80: 54 53 33 20 74 61 62 6c 65 2e 20 43 6c 65 61 72  TS3 table. Clear
8d90: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
8da0: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 70 65  containing.** pe
8db0: 6e 64 69 6e 67 20 74 65 72 6d 73 2e 0a 2a 2f 0a  nding terms..*/.
8dc0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
8dd0: 65 6c 65 74 65 41 6c 6c 28 46 74 73 33 54 61 62  eleteAll(Fts3Tab
8de0: 6c 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6e 74  le *p, int bCont
8df0: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ent){.  int rc =
8e00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
8e10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
8e20: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
8e30: 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  Discard the cont
8e40: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64  ents of the pend
8e50: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
8e60: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
8e70: 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72  e3Fts3PendingTer
8e80: 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20 2f  msClear(p);..  /
8e90: 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 74 68  * Delete everyth
8ea0: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ing from the sha
8eb0: 64 6f 77 20 74 61 62 6c 65 73 2e 20 45 78 63 65  dow tables. Exce
8ec0: 70 74 2c 20 6c 65 61 76 65 20 25 5f 63 6f 6e 74  pt, leave %_cont
8ed0: 65 6e 74 20 61 73 0a 20 20 2a 2a 20 69 73 20 69  ent as.  ** is i
8ee0: 66 20 62 43 6f 6e 74 65 6e 74 20 69 73 20 66 61  f bContent is fa
8ef0: 6c 73 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lse.  */.  asser
8f00: 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62  t( p->zContentTb
8f10: 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e 74 65 6e 74  l==0 || bContent
8f20: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43 6f  ==0 );.  if( bCo
8f30: 6e 74 65 6e 74 20 29 20 66 74 73 33 53 71 6c 45  ntent ) fts3SqlE
8f40: 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
8f50: 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54 45  DELETE_ALL_CONTE
8f60: 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73 33 53 71  NT, 0);.  fts3Sq
8f70: 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51  lExec(&rc, p, SQ
8f80: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47  L_DELETE_ALL_SEG
8f90: 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20 66 74 73  MENTS, 0);.  fts
8fa0: 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c  3SqlExec(&rc, p,
8fb0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
8fc0: 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20 69 66  SEGDIR, 0);.  if
8fd0: 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65  ( p->bHasDocsize
8fe0: 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45   ){.    fts3SqlE
8ff0: 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
9000: 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49  DELETE_ALL_DOCSI
9010: 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ZE, 0);.  }.  if
9020: 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b  ( p->bHasStat ){
9030: 0a 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63  .    fts3SqlExec
9040: 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
9050: 45 54 45 5f 41 4c 4c 5f 53 54 41 54 2c 20 30 29  ETE_ALL_STAT, 0)
9060: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9070: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  c;.}../*.**.*/.s
9080: 74 61 74 69 63 20 69 6e 74 20 6c 61 6e 67 69 64  tatic int langid
9090: 46 72 6f 6d 53 65 6c 65 63 74 28 46 74 73 33 54  FromSelect(Fts3T
90a0: 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  able *p, sqlite3
90b0: 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 29 7b  _stmt *pSelect){
90c0: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d  .  int iLangid =
90d0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4c 61   0;.  if( p->zLa
90e0: 6e 67 75 61 67 65 69 64 20 29 20 69 4c 61 6e 67  nguageid ) iLang
90f0: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
9100: 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c  umn_int(pSelect,
9110: 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a   p->nColumn+1);.
9120: 20 20 72 65 74 75 72 6e 20 69 4c 61 6e 67 69 64    return iLangid
9130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
9140: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  irst element in 
9150: 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72 72 61  the apVal[] arra
9160: 79 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  y is assumed to 
9170: 63 6f 6e 74 61 69 6e 20 74 68 65 20 64 6f 63 69  contain the doci
9180: 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65 67 65 72  d.** (an integer
9190: 29 20 6f 66 20 61 20 72 6f 77 20 61 62 6f 75 74  ) of a row about
91a0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
91b0: 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73  Remove all terms
91c0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 75 6c   from the.** ful
91d0: 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 2a 2f  l-text index..*/
91e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
91f0: 33 44 65 6c 65 74 65 54 65 72 6d 73 28 20 0a 20  3DeleteTerms( . 
9200: 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20   int *pRC,      
9210: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9220: 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  lt code */.  Fts
9230: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
9240: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53 20       /* The FTS 
9250: 74 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  table to delete 
9260: 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  from */.  sqlite
9270: 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c  3_value *pRowid,
9280: 20 20 2f 2a 20 54 68 65 20 64 6f 63 69 64 20 74    /* The docid t
9290: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
92a0: 20 20 75 33 32 20 2a 61 53 7a 2c 20 20 20 20 20    u32 *aSz,     
92b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
92c0: 65 73 20 6f 66 20 64 65 6c 65 74 65 64 20 64 6f  es of deleted do
92d0: 63 75 6d 65 6e 74 20 77 72 69 74 74 65 6e 20 68  cument written h
92e0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  ere */.  int *pb
92f0: 46 6f 75 6e 64 20 20 20 20 20 20 20 20 20 20 20  Found           
9300: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
9310: 74 72 75 65 20 69 66 20 72 6f 77 20 72 65 61 6c  true if row real
9320: 6c 79 20 64 6f 65 73 20 65 78 69 73 74 20 2a 2f  ly does exist */
9330: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
9340: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
9350: 65 6c 65 63 74 3b 0a 0a 20 20 61 73 73 65 72 74  elect;..  assert
9360: 28 20 2a 70 62 46 6f 75 6e 64 3d 3d 30 20 29 3b  ( *pbFound==0 );
9370: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
9380: 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74 73  turn;.  rc = fts
9390: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
93a0: 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42  SELECT_CONTENT_B
93b0: 59 5f 52 4f 57 49 44 2c 20 26 70 53 65 6c 65 63  Y_ROWID, &pSelec
93c0: 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 69  t, &pRowid);.  i
93d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
93e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
93f0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
9400: 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29 7b  step(pSelect) ){
9410: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9420: 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20      int iLangid 
9430: 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65  = langidFromSele
9440: 63 74 28 70 2c 20 70 53 65 6c 65 63 74 29 3b 0a  ct(p, pSelect);.
9450: 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69 64        i64 iDocid
9460: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
9470: 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c  n_int64(pSelect,
9480: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
9490: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
94a0: 44 6f 63 69 64 28 70 2c 20 31 2c 20 69 4c 61 6e  Docid(p, 1, iLan
94b0: 67 69 64 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20  gid, iDocid);.  
94c0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d      for(i=1; rc=
94d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
94e0: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  =p->nColumn; i++
94f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9500: 43 6f 6c 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20  Col = i-1;.     
9510: 20 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69     if( p->abNoti
9520: 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20  ndexed[iCol]==0 
9530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
9540: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d  st char *zText =
9550: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
9560: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9570: 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a  xt(pSelect, i);.
9580: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
9590: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41  ts3PendingTermsA
95a0: 64 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 7a  dd(p, iLangid, z
95b0: 54 65 78 74 2c 20 2d 31 2c 20 26 61 53 7a 5b 69  Text, -1, &aSz[i
95c0: 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  Col]);.         
95d0: 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d   aSz[p->nColumn]
95e0: 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   += sqlite3_colu
95f0: 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74  mn_bytes(pSelect
9600: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , i);.        }.
9610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9620: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9630: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9640: 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
9650: 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 43 20  );.        *pRC 
9660: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
9670: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
9680: 20 20 20 20 2a 70 62 46 6f 75 6e 64 20 3d 20 31      *pbFound = 1
9690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
96a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
96b0: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65  Select);.  }else
96c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
96d0: 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
96e0: 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 7d  }.  *pRC = rc;.}
96f0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
9700: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f 20 61  declaration to a
9710: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 63  ccount for the c
9720: 69 72 63 75 6c 61 72 20 64 65 70 65 6e 64 65 6e  ircular dependen
9730: 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a 20 66 75  cy between.** fu
9740: 6e 63 74 69 6f 6e 73 20 66 74 73 33 53 65 67 6d  nctions fts3Segm
9750: 65 6e 74 4d 65 72 67 65 28 29 20 61 6e 64 20 66  entMerge() and f
9760: 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69  ts3AllocateSegdi
9770: 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  rIdx()..*/.stati
9780: 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e  c int fts3Segmen
9790: 74 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c 65  tMerge(Fts3Table
97a0: 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e   *, int, int, in
97b0: 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  t);../* .** This
97c0: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
97d0: 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65 6c 20  tes a new level 
97e0: 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69 6e 20  iLevel index in 
97f0: 74 68 65 20 73 65 67 64 69 72 20 74 61 62 6c 65  the segdir table
9800: 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 69 6e  ..** Usually, in
9810: 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63 61  dexes are alloca
9820: 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c 65 76  ted within a lev
9830: 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 20  el sequentially 
9840: 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68  starting.** with
9850: 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63   0, so the alloc
9860: 61 74 65 64 20 69 6e 64 65 78 20 69 73 20 6f 6e  ated index is on
9870: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  e greater than t
9880: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9890: 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20  d.** by:.**.**  
98a0: 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64 78 29   SELECT max(idx)
98b0: 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57   FROM %_segdir W
98c0: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 4c  HERE level = :iL
98d0: 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  evel.**.** Howev
98e0: 65 72 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  er, if there are
98f0: 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f 4d 45   already FTS3_ME
9900: 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65 78 65  RGE_COUNT indexe
9910: 73 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74  s at the request
9920: 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74 68 65  ed.** level, the
9930: 79 20 61 72 65 20 6d 65 72 67 65 64 20 69 6e 74  y are merged int
9940: 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  o a single level
9950: 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65 67 6d   (iLevel+1) segm
9960: 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ent and the .** 
9970: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  allocated index 
9980: 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  is 0..**.** If s
9990: 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 49 64  uccessful, *piId
99a0: 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
99b0: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  allocated index 
99c0: 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54 45 5f  slot and SQLITE_
99d0: 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  OK.** returned. 
99e0: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
99f0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
9a00: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9a10: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 41  static int fts3A
9a20: 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
9a30: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
9a40: 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  , .  int iLangid
9a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9a60: 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65       /* Language
9a70: 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e   id */.  int iIn
9a80: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
9a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9aa0: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20  x for p->aIndex 
9ab0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
9ac0: 20 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 0a 29   .  int *piIdx.)
9ad0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
9b00: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
9b10: 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b 20  stmt *pNextIdx; 
9b20: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
9b30: 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61 74   for next idx at
9b40: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a 2f   level iLevel */
9b50: 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20 30  .  int iNext = 0
9b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9b70: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
9b80: 71 75 65 72 79 20 70 4e 65 78 74 49 64 78 20 2a  query pNextIdx *
9b90: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  /..  assert( iLa
9ba0: 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73 73  ngid>=0 );.  ass
9bb0: 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e 3d  ert( p->nIndex>=
9bc0: 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 76  1 );..  /* Set v
9bd0: 61 72 69 61 62 6c 65 20 69 4e 65 78 74 20 74 6f  ariable iNext to
9be0: 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61   the next availa
9bf0: 62 6c 65 20 73 65 67 64 69 72 20 69 6e 64 65 78  ble segdir index
9c00: 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c   at level iLevel
9c10: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33  . */.  rc = fts3
9c20: 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e  SqlStmt(p, SQL_N
9c30: 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45  EXT_SEGMENT_INDE
9c40: 58 2c 20 26 70 4e 65 78 74 49 64 78 2c 20 30 29  X, &pNextIdx, 0)
9c50: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
9c60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
9c70: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
9c80: 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 49 64  .        pNextId
9c90: 78 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74  x, 1, getAbsolut
9ca0: 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
9cb0: 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65  d, iIndex, iLeve
9cc0: 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  l).    );.    if
9cd0: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
9ce0: 6c 69 74 65 33 5f 73 74 65 70 28 70 4e 65 78 74  lite3_step(pNext
9cf0: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4e  Idx) ){.      iN
9d00: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ext = sqlite3_co
9d10: 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74 49 64  lumn_int(pNextId
9d20: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  x, 0);.    }.   
9d30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
9d40: 73 65 74 28 70 4e 65 78 74 49 64 78 29 3b 0a 20  set(pNextIdx);. 
9d50: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
9d60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
9d70: 2a 20 49 66 20 69 4e 65 78 74 20 69 73 20 46 54  * If iNext is FT
9d80: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20  S3_MERGE_COUNT, 
9d90: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
9da0: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 73 20  level iLevel is 
9db0: 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 66  already.    ** f
9dc0: 75 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73  ull, merge all s
9dd0: 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76 65 6c  egments in level
9de0: 20 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61 20 73   iLevel into a s
9df0: 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31 0a 20  ingle iLevel+1. 
9e00: 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 61 6e     ** segment an
9e10: 64 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65 77 6c  d allocate (newl
9e20: 79 20 66 72 65 65 64 29 20 69 6e 64 65 78 20 30  y freed) index 0
9e30: 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c   at level iLevel
9e40: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
9e50: 20 2a 2a 20 69 66 20 69 4e 65 78 74 20 69 73 20   ** if iNext is 
9e60: 6c 65 73 73 20 74 68 61 6e 20 46 54 53 33 5f 4d  less than FTS3_M
9e70: 45 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c 6c 6f  ERGE_COUNT, allo
9e80: 63 61 74 65 20 69 6e 64 65 78 20 69 4e 65 78 74  cate index iNext
9e90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9ea0: 20 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d 45 52   iNext>=FTS3_MER
9eb0: 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20 20  GE_COUNT ){.    
9ec0: 20 20 66 74 73 33 4c 6f 67 4d 65 72 67 65 28 31    fts3LogMerge(1
9ed0: 36 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  6, getAbsoluteLe
9ee0: 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
9ef0: 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 29  iIndex, iLevel))
9f00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
9f10: 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c  3SegmentMerge(p,
9f20: 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
9f30: 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , iLevel);.     
9f40: 20 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20 20 20   *piIdx = 0;.   
9f50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
9f60: 69 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a 20 20  iIdx = iNext;.  
9f70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9f80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
9f90: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
9fa0: 62 6c 65 20 69 73 20 64 65 63 6c 61 72 65 64 20  ble is declared 
9fb0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
9fc0: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
9fd0: 20 25 5f 73 65 67 6d 65 6e 74 73 28 62 6c 6f 63   %_segments(bloc
9fe0: 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  kid INTEGER PRIM
9ff0: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
a000: 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  LOB).**.** This 
a010: 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 64  function reads d
a020: 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ata from a singl
a030: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 25 5f 73  e row of the %_s
a040: 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20 54  egments table. T
a050: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 72  he.** specific r
a060: 6f 77 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  ow is identified
a070: 20 62 79 20 74 68 65 20 69 42 6c 6f 63 6b 69 64   by the iBlockid
a080: 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20 70   parameter. If p
a090: 61 42 6c 6f 62 20 69 73 20 6e 6f 74 0a 2a 2a 20  aBlob is not.** 
a0a0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 62 75 66  NULL, then a buf
a0b0: 66 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  fer is allocated
a0c0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d   using sqlite3_m
a0d0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 70 75  alloc() and popu
a0e0: 6c 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  lated.** with th
a0f0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
a100: 65 20 62 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e  e blob stored in
a110: 20 74 68 65 20 22 62 6c 6f 63 6b 22 20 63 6f 6c   the "block" col
a120: 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69  umn of the .** i
a130: 64 65 6e 74 69 66 69 65 64 20 74 61 62 6c 65 20  dentified table 
a140: 72 6f 77 20 69 73 2e 20 57 68 65 74 68 65 72 20  row is. Whether 
a150: 6f 72 20 6e 6f 74 20 70 61 42 6c 6f 62 20 69 73  or not paBlob is
a160: 20 4e 55 4c 4c 2c 20 2a 70 6e 42 6c 6f 62 20 69   NULL, *pnBlob i
a170: 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  s set.** to the 
a180: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
a190: 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
a1a0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
a1b0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
a1c0: 63 75 72 73 2c 20 6f 72 20 74 68 65 20 74 61 62  curs, or the tab
a1d0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  le does not cont
a1e0: 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65  ain the specifie
a1f0: 64 20 72 6f 77 2c 0a 2a 2a 20 61 6e 20 53 51 4c  d row,.** an SQL
a200: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
a210: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
a220: 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
a230: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
a240: 0a 2a 2a 20 70 61 42 6c 6f 62 20 69 73 20 6e 6f  .** paBlob is no
a250: 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  n-NULL, then it 
a260: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
a270: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
a280: 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e 74 75  ler to.** eventu
a290: 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72 65  ally free the re
a2a0: 74 75 72 6e 65 64 20 62 75 66 66 65 72 2e 0a 2a  turned buffer..*
a2b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
a2c0: 6f 6e 20 6d 61 79 20 6c 65 61 76 65 20 61 6e 20  on may leave an 
a2d0: 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 62 6c 6f  open sqlite3_blo
a2e0: 62 2a 20 68 61 6e 64 6c 65 20 69 6e 20 74 68 65  b* handle in the
a2f0: 0a 2a 2a 20 46 74 73 33 54 61 62 6c 65 2e 70 53  .** Fts3Table.pS
a300: 65 67 6d 65 6e 74 73 20 76 61 72 69 61 62 6c 65  egments variable
a310: 2e 20 54 68 69 73 20 68 61 6e 64 6c 65 20 69 73  . This handle is
a320: 20 72 65 75 73 65 64 20 62 79 20 73 75 62 73 65   reused by subse
a330: 71 75 65 6e 74 20 63 61 6c 6c 73 0a 2a 2a 20 74  quent calls.** t
a340: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
a350: 20 54 68 65 20 68 61 6e 64 6c 65 20 6d 61 79 20   The handle may 
a360: 62 65 20 63 6c 6f 73 65 64 20 62 79 20 63 61 6c  be closed by cal
a370: 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ling the.** sqli
a380: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
a390: 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lose() function.
a3a0: 20 52 65 75 73 69 6e 67 20 61 20 62 6c 6f 62 20   Reusing a blob 
a3b0: 68 61 6e 64 6c 65 20 69 73 20 61 20 68 61 6e 64  handle is a hand
a3c0: 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  y.** performance
a3d0: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2c 20 62 75   improvement, bu
a3e0: 74 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c  t the blob handl
a3f0: 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
a400: 62 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 65 66  be closed.** bef
a410: 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 72  ore control is r
a420: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
a430: 73 65 72 20 28 74 6f 20 70 72 65 76 65 6e 74 20  ser (to prevent 
a440: 61 20 6c 6f 63 6b 20 62 65 69 6e 67 20 68 65 6c  a lock being hel
a450: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  d.** on the data
a460: 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6c 6f  base file for lo
a470: 6e 67 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  nger than necess
a480: 61 72 79 29 2e 20 54 68 75 73 2c 20 61 6e 79 20  ary). Thus, any 
a490: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2a  virtual table.**
a4a0: 20 6d 65 74 68 6f 64 20 28 78 46 69 6c 74 65 72   method (xFilter
a4b0: 20 65 74 63 2e 29 20 74 68 61 74 20 6d 61 79 20   etc.) that may 
a4c0: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
a4d0: 72 65 63 74 6c 79 20 63 61 6c 6c 20 74 68 69 73  rectly call this
a4e0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
a4f0: 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 46 74  t call sqlite3Ft
a500: 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
a510: 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
a520: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
a530: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
a540: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
a570: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
a580: 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63  ite3_int64 iBloc
a590: 6b 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  kid,         /* 
a5a0: 41 63 63 65 73 73 20 74 68 65 20 72 6f 77 20 77  Access the row w
a5b0: 69 74 68 20 62 6c 6f 63 6b 69 64 3d 24 69 42 6c  ith blockid=$iBl
a5c0: 6f 63 6b 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  ockid */.  char 
a5d0: 2a 2a 70 61 42 6c 6f 62 2c 20 20 20 20 20 20 20  **paBlob,       
a5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
a5f0: 54 3a 20 42 6c 6f 62 20 64 61 74 61 20 69 6e 20  T: Blob data in 
a600: 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72 20  malloc'd buffer 
a610: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 6c 6f 62  */.  int *pnBlob
a620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a630: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
a640: 65 20 6f 66 20 62 6c 6f 62 20 64 61 74 61 20 2a  e of blob data *
a650: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 61 64 20  /.  int *pnLoad 
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a670: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 79 74 65      /* OUT: Byte
a680: 73 20 61 63 74 75 61 6c 6c 79 20 6c 6f 61 64 65  s actually loade
a690: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
a6a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a6b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
a6c0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
a6d0: 2a 20 70 6e 42 6c 6f 62 20 6d 75 73 74 20 62 65  * pnBlob must be
a6e0: 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 70 61 42 6c 6f   non-NULL. paBlo
a6f0: 62 20 6d 61 79 20 62 65 20 4e 55 4c 4c 20 6f 72  b may be NULL or
a700: 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 2a 2f 0a 20 20   non-NULL. */.  
a710: 61 73 73 65 72 74 28 20 70 6e 42 6c 6f 62 20 29  assert( pnBlob )
a720: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 67  ;..  if( p->pSeg
a730: 6d 65 6e 74 73 20 29 7b 0a 20 20 20 20 72 63 20  ments ){.    rc 
a740: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
a750: 65 6f 70 65 6e 28 70 2d 3e 70 53 65 67 6d 65 6e  eopen(p->pSegmen
a760: 74 73 2c 20 69 42 6c 6f 63 6b 69 64 29 3b 0a 20  ts, iBlockid);. 
a770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
a780: 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54  0==p->zSegmentsT
a790: 62 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a  bl ){.      p->z
a7a0: 53 65 67 6d 65 6e 74 73 54 62 6c 20 3d 20 73 71  SegmentsTbl = sq
a7b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
a7c0: 73 5f 73 65 67 6d 65 6e 74 73 22 2c 20 70 2d 3e  s_segments", p->
a7d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
a7e0: 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e 74  ( 0==p->zSegment
a7f0: 73 54 62 6c 20 29 20 72 65 74 75 72 6e 20 53 51  sTbl ) return SQ
a800: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
a810: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
a820: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0a 20 20  e3_blob_open(.  
a830: 20 20 20 20 20 70 2d 3e 64 62 2c 20 70 2d 3e 7a       p->db, p->z
a840: 44 62 2c 20 70 2d 3e 7a 53 65 67 6d 65 6e 74 73  Db, p->zSegments
a850: 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 42  Tbl, "block", iB
a860: 6c 6f 63 6b 69 64 2c 20 30 2c 20 26 70 2d 3e 70  lockid, 0, &p->p
a870: 53 65 67 6d 65 6e 74 73 0a 20 20 20 20 29 3b 0a  Segments.    );.
a880: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
a890: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a8a0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69  int nByte = sqli
a8b0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
a8c0: 2d 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20  ->pSegments);.  
a8d0: 20 20 2a 70 6e 42 6c 6f 62 20 3d 20 6e 42 79 74    *pnBlob = nByt
a8e0: 65 3b 0a 20 20 20 20 69 66 28 20 70 61 42 6c 6f  e;.    if( paBlo
a8f0: 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  b ){.      char 
a900: 2a 61 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33  *aByte = sqlite3
a910: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 20 2b 20  _malloc(nByte + 
a920: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
a930: 47 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61  G);.      if( !a
a940: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
a950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
a960: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
a970: 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4c 6f          if( pnLo
a980: 61 64 20 26 26 20 6e 42 79 74 65 3e 28 46 54 53  ad && nByte>(FTS
a990: 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52  3_NODE_CHUNK_THR
a9a0: 45 53 48 4f 4c 44 29 20 29 7b 0a 20 20 20 20 20  ESHOLD) ){.     
a9b0: 20 20 20 20 20 6e 42 79 74 65 20 3d 20 46 54 53       nByte = FTS
a9c0: 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49 5a 45  3_NODE_CHUNKSIZE
a9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 4c  ;.          *pnL
a9e0: 6f 61 64 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  oad = nByte;.   
a9f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
aa00: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
aa10: 5f 72 65 61 64 28 70 2d 3e 70 53 65 67 6d 65 6e  _read(p->pSegmen
aa20: 74 73 2c 20 61 42 79 74 65 2c 20 6e 42 79 74 65  ts, aByte, nByte
aa30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  , 0);.        me
aa40: 6d 73 65 74 28 26 61 42 79 74 65 5b 6e 42 79 74  mset(&aByte[nByt
aa50: 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44 45  e], 0, FTS3_NODE
aa60: 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 20  _PADDING);.     
aa70: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
aa80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
aa90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
aaa0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Byte);.         
aab0: 20 61 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   aByte = 0;.    
aac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
aad0: 20 20 20 20 2a 70 61 42 6c 6f 62 20 3d 20 61 42      *paBlob = aB
aae0: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  yte;.    }.  }..
aaf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ab00: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
ab10: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 61 74 20 70  blob handle at p
ab20: 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69 66 20  ->pSegments, if 
ab30: 69 74 20 69 73 20 6f 70 65 6e 2e 20 53 65 65 20  it is open. See 
ab40: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 0a 2a  comments above.*
ab50: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 46 74 73  * the sqlite3Fts
ab60: 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66 75 6e  3ReadBlock() fun
ab70: 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c  ction for detail
ab80: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
ab90: 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c  e3Fts3SegmentsCl
aba0: 6f 73 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ose(Fts3Table *p
abb0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ){.  sqlite3_blo
abc0: 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 53 65 67 6d  b_close(p->pSegm
abd0: 65 6e 74 73 29 3b 0a 20 20 70 2d 3e 70 53 65 67  ents);.  p->pSeg
abe0: 6d 65 6e 74 73 20 3d 20 30 3b 0a 7d 0a 20 20 20  ments = 0;.}.   
abf0: 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73   .static int fts
ac00: 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52 65  3SegReaderIncrRe
ac10: 61 64 28 46 74 73 33 53 65 67 52 65 61 64 65 72  ad(Fts3SegReader
ac20: 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69 6e   *pReader){.  in
ac30: 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  t nRead;        
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac50: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ac60: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
ac70: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac90: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
aca0: 0a 20 20 6e 52 65 61 64 20 3d 20 4d 49 4e 28 70  .  nRead = MIN(p
acb0: 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 2d 20  Reader->nNode - 
acc0: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
acd0: 74 65 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48  te, FTS3_NODE_CH
ace0: 55 4e 4b 53 49 5a 45 29 3b 0a 20 20 72 63 20 3d  UNKSIZE);.  rc =
acf0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
ad00: 61 64 28 0a 20 20 20 20 20 20 70 52 65 61 64 65  ad(.      pReade
ad10: 72 2d 3e 70 42 6c 6f 62 2c 20 0a 20 20 20 20 20  r->pBlob, .     
ad20: 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65   &pReader->aNode
ad30: 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c  [pReader->nPopul
ad40: 61 74 65 5d 2c 0a 20 20 20 20 20 20 6e 52 65 61  ate],.      nRea
ad50: 64 2c 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  d,.      pReader
ad60: 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20 20 29 3b  ->nPopulate.  );
ad70: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
ad80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65  TE_OK ){.    pRe
ad90: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20  ader->nPopulate 
ada0: 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 20 20 6d 65  += nRead;.    me
adb0: 6d 73 65 74 28 26 70 52 65 61 64 65 72 2d 3e 61  mset(&pReader->a
adc0: 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50  Node[pReader->nP
add0: 6f 70 75 6c 61 74 65 5d 2c 20 30 2c 20 46 54 53  opulate], 0, FTS
ade0: 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b  3_NODE_PADDING);
adf0: 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65 72  .    if( pReader
ae00: 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 70 52 65  ->nPopulate==pRe
ae10: 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20  ader->nNode ){. 
ae20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f       sqlite3_blo
ae30: 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 2d  b_close(pReader-
ae40: 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 70  >pBlob);.      p
ae50: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d 20  Reader->pBlob = 
ae60: 30 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  0;.      pReader
ae70: 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3d 20 30 3b  ->nPopulate = 0;
ae80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ae90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
aea0: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
aeb0: 64 65 72 52 65 71 75 69 72 65 28 46 74 73 33 53  derRequire(Fts3S
aec0: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
aed0: 72 2c 20 63 68 61 72 20 2a 70 46 72 6f 6d 2c 20  r, char *pFrom, 
aee0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
aef0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
af00: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52 65  ;.  assert( !pRe
af10: 61 64 65 72 2d 3e 70 42 6c 6f 62 20 0a 20 20 20  ader->pBlob .   
af20: 20 20 20 20 7c 7c 20 28 70 46 72 6f 6d 3e 3d 70      || (pFrom>=p
af30: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 26 26  Reader->aNode &&
af40: 20 70 46 72 6f 6d 3c 26 70 52 65 61 64 65 72 2d   pFrom<&pReader-
af50: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
af60: 6e 4e 6f 64 65 5d 29 0a 20 20 29 3b 0a 20 20 77  nNode]).  );.  w
af70: 68 69 6c 65 28 20 70 52 65 61 64 65 72 2d 3e 70  hile( pReader->p
af80: 42 6c 6f 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  Blob && rc==SQLI
af90: 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 20  TE_OK .     &&  
afa0: 28 70 46 72 6f 6d 20 2d 20 70 52 65 61 64 65 72  (pFrom - pReader
afb0: 2d 3e 61 4e 6f 64 65 20 2b 20 6e 42 79 74 65 29  ->aNode + nByte)
afc0: 3e 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c  >pReader->nPopul
afd0: 61 74 65 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  ate.  ){.    rc 
afe0: 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  = fts3SegReaderI
aff0: 6e 63 72 52 65 61 64 28 70 52 65 61 64 65 72 29  ncrRead(pReader)
b000: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b010: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
b020: 61 6e 20 46 74 73 33 53 65 67 52 65 61 64 65 72  an Fts3SegReader
b030: 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
b040: 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 73 74 61 74   at EOF..*/.stat
b050: 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 52  ic void fts3SegR
b060: 65 61 64 65 72 53 65 74 45 6f 66 28 46 74 73 33  eaderSetEof(Fts3
b070: 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 29  SegReader *pSeg)
b080: 7b 0a 20 20 69 66 28 20 21 66 74 73 33 53 65 67  {.  if( !fts3Seg
b090: 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79  ReaderIsRootOnly
b0a0: 28 70 53 65 67 29 20 29 7b 0a 20 20 20 20 73 71  (pSeg) ){.    sq
b0b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 67 2d  lite3_free(pSeg-
b0c0: 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c  >aNode);.    sql
b0d0: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
b0e0: 70 53 65 67 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  pSeg->pBlob);.  
b0f0: 20 20 70 53 65 67 2d 3e 70 42 6c 6f 62 20 3d 20    pSeg->pBlob = 
b100: 30 3b 0a 20 20 7d 0a 20 20 70 53 65 67 2d 3e 61  0;.  }.  pSeg->a
b110: 4e 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Node = 0;.}../*.
b120: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
b130: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
b140: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
b150: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65  t to the next te
b160: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 73 65 67  rm in the.** seg
b170: 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73 73  ment. If success
b180: 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
b190: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
b1a0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20  here is no next 
b1b0: 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  term,.** SQLITE_
b1c0: 44 4f 4e 45 2e 20 4f 74 68 65 72 77 69 73 65 2c  DONE. Otherwise,
b1d0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
b1e0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
b1f0: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
b200: 65 72 4e 65 78 74 28 0a 20 20 46 74 73 33 54 61  erNext(.  Fts3Ta
b210: 62 6c 65 20 2a 70 2c 20 0a 20 20 46 74 73 33 53  ble *p, .  Fts3S
b220: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
b230: 72 2c 0a 20 20 69 6e 74 20 62 49 6e 63 72 0a 29  r,.  int bIncr.)
b240: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
b270: 64 65 20 6f 66 20 76 61 72 69 6f 75 73 20 73 75  de of various su
b280: 62 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  b-routines */.  
b290: 63 68 61 72 20 2a 70 4e 65 78 74 3b 20 20 20 20  char *pNext;    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 2f 2a 20 43 75 72 73 6f 72 20 76 61 72 69 61 62  /* Cursor variab
b2c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  le */.  int nPre
b2d0: 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
b2e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b2f0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 65  r of bytes in te
b300: 72 6d 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  rm prefix */.  i
b310: 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20  nt nSuffix;     
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b330: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b340: 73 20 69 6e 20 74 65 72 6d 20 73 75 66 66 69 78  s in term suffix
b350: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 70 52 65 61   */..  if( !pRea
b360: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 7b  der->aDoclist ){
b370: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65  .    pNext = pRe
b380: 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d  ader->aNode;.  }
b390: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 78 74 20  else{.    pNext 
b3a0: 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  = &pReader->aDoc
b3b0: 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44  list[pReader->nD
b3c0: 6f 63 6c 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20 20  oclist];.  }..  
b3d0: 69 66 28 20 21 70 4e 65 78 74 20 7c 7c 20 70 4e  if( !pNext || pN
b3e0: 65 78 74 3e 3d 26 70 52 65 61 64 65 72 2d 3e 61  ext>=&pReader->a
b3f0: 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e  Node[pReader->nN
b400: 6f 64 65 5d 20 29 7b 0a 0a 20 20 20 20 69 66 28  ode] ){..    if(
b410: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
b420: 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29  Pending(pReader)
b430: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 48 61   ){.      Fts3Ha
b440: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d 20  shElem *pElem = 
b450: 2a 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78  *(pReader->ppNex
b460: 74 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  tElem);.      sq
b470: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64  lite3_free(pRead
b480: 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20  er->aNode);.    
b490: 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65    pReader->aNode
b4a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
b4b0: 70 45 6c 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  pElem ){.       
b4c0: 20 63 68 61 72 20 2a 61 43 6f 70 79 3b 0a 20 20   char *aCopy;.  
b4d0: 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73        PendingLis
b4e0: 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e 64  t *pList = (Pend
b4f0: 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61  ingList *)fts3Ha
b500: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
b510: 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
b520: 20 3d 20 70 4c 69 73 74 2d 3e 6e 44 61 74 61 2b   = pList->nData+
b530: 31 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  1;.        pRead
b540: 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61  er->zTerm = (cha
b550: 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79 28  r *)fts3HashKey(
b560: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  pElem);.        
b570: 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d  pReader->nTerm =
b580: 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65   fts3HashKeysize
b590: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20  (pElem);.       
b5a0: 20 61 43 6f 70 79 20 3d 20 28 63 68 61 72 2a 29   aCopy = (char*)
b5b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
b5c0: 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 69  Copy);.        i
b5d0: 66 28 20 21 61 43 6f 70 79 20 29 20 72 65 74 75  f( !aCopy ) retu
b5e0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b5f0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
b600: 61 43 6f 70 79 2c 20 70 4c 69 73 74 2d 3e 61 44  aCopy, pList->aD
b610: 61 74 61 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  ata, nCopy);.   
b620: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e       pReader->nN
b630: 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e  ode = pReader->n
b640: 44 6f 63 6c 69 73 74 20 3d 20 6e 43 6f 70 79 3b  Doclist = nCopy;
b650: 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72  .        pReader
b660: 2d 3e 61 4e 6f 64 65 20 3d 20 70 52 65 61 64 65  ->aNode = pReade
b670: 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61 43  r->aDoclist = aC
b680: 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 70 52 65  opy;.        pRe
b690: 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d  ader->ppNextElem
b6a0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
b6b0: 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  rt( pReader->aNo
b6c0: 64 65 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  de );.      }.  
b6d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b6e0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
b6f0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 65   fts3SegReaderSe
b700: 74 45 6f 66 28 70 52 65 61 64 65 72 29 3b 0a 0a  tEof(pReader);..
b710: 20 20 20 20 2f 2a 20 49 66 20 69 43 75 72 72 65      /* If iCurre
b720: 6e 74 42 6c 6f 63 6b 3e 3d 69 4c 65 61 66 45 6e  ntBlock>=iLeafEn
b730: 64 42 6c 6f 63 6b 2c 20 74 68 69 73 20 69 73 20  dBlock, this is 
b740: 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74 69 6f 6e  an EOF condition
b750: 2e 20 41 6c 6c 20 6c 65 61 66 20 0a 20 20 20 20  . All leaf .    
b760: 2a 2a 20 62 6c 6f 63 6b 73 20 68 61 76 65 20 61  ** blocks have a
b770: 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 61 76  lready been trav
b780: 65 72 73 65 64 2e 20 20 2a 2f 0a 20 20 20 20 61  ersed.  */.    a
b790: 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e  ssert( pReader->
b7a0: 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3c 3d 70  iCurrentBlock<=p
b7b0: 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64  Reader->iLeafEnd
b7c0: 42 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28  Block );.    if(
b7d0: 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65   pReader->iCurre
b7e0: 6e 74 42 6c 6f 63 6b 3e 3d 70 52 65 61 64 65 72  ntBlock>=pReader
b7f0: 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20  ->iLeafEndBlock 
b800: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b810: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
b820: 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
b830: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
b840: 0a 20 20 20 20 20 20 20 20 70 2c 20 2b 2b 70 52  .        p, ++pR
b850: 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42  eader->iCurrentB
b860: 6c 6f 63 6b 2c 20 26 70 52 65 61 64 65 72 2d 3e  lock, &pReader->
b870: 61 4e 6f 64 65 2c 20 26 70 52 65 61 64 65 72 2d  aNode, &pReader-
b880: 3e 6e 4e 6f 64 65 2c 20 0a 20 20 20 20 20 20 20  >nNode, .       
b890: 20 28 62 49 6e 63 72 20 3f 20 26 70 52 65 61 64   (bIncr ? &pRead
b8a0: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3a 20  er->nPopulate : 
b8b0: 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  0).    );.    if
b8c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b8d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
b8e0: 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72   assert( pReader
b8f0: 2d 3e 70 42 6c 6f 62 3d 3d 30 20 29 3b 0a 20 20  ->pBlob==0 );.  
b900: 20 20 69 66 28 20 62 49 6e 63 72 20 26 26 20 70    if( bIncr && p
b910: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
b920: 65 3c 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  e<pReader->nNode
b930: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65   ){.      pReade
b940: 72 2d 3e 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 53  r->pBlob = p->pS
b950: 65 67 6d 65 6e 74 73 3b 0a 20 20 20 20 20 20 70  egments;.      p
b960: 2d 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b  ->pSegments = 0;
b970: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 78 74  .    }.    pNext
b980: 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64   = pReader->aNod
b990: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
b9a0: 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72  ( !fts3SegReader
b9b0: 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65  IsPending(pReade
b9c0: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74  r) );..  rc = ft
b9d0: 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69  s3SegReaderRequi
b9e0: 72 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65 78  re(pReader, pNex
b9f0: 74 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  t, FTS3_VARINT_M
ba00: 41 58 2a 32 29 3b 0a 20 20 69 66 28 20 72 63 21  AX*2);.  if( rc!
ba10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
ba20: 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 2f 2a 20  urn rc;.  .  /* 
ba30: 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 46  Because of the F
ba40: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
ba50: 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
ba60: 67 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  g, the following
ba70: 20 69 73 20 0a 20 20 2a 2a 20 73 61 66 65 20 28   is .  ** safe (
ba80: 6e 6f 20 72 69 73 6b 20 6f 66 20 6f 76 65 72 72  no risk of overr
ba90: 65 61 64 29 20 65 76 65 6e 20 69 66 20 74 68 65  ead) even if the
baa0: 20 6e 6f 64 65 20 64 61 74 61 20 69 73 20 63 6f   node data is co
bab0: 72 72 75 70 74 65 64 2e 20 2a 2f 0a 20 20 70 4e  rrupted. */.  pN
bac0: 65 78 74 20 2b 3d 20 66 74 73 33 47 65 74 56 61  ext += fts3GetVa
bad0: 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e  rint32(pNext, &n
bae0: 50 72 65 66 69 78 29 3b 0a 20 20 70 4e 65 78 74  Prefix);.  pNext
baf0: 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e   += fts3GetVarin
bb00: 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 53 75 66  t32(pNext, &nSuf
bb10: 66 69 78 29 3b 0a 20 20 69 66 28 20 6e 53 75 66  fix);.  if( nSuf
bb20: 66 69 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 28 26  fix<=0 .   || (&
bb30: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70  pReader->aNode[p
bb40: 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 2d  Reader->nNode] -
bb50: 20 70 4e 65 78 74 29 3c 6e 53 75 66 66 69 78 0a   pNext)<nSuffix.
bb60: 20 20 20 7c 7c 20 6e 50 72 65 66 69 78 3e 70 52     || nPrefix>pR
bb70: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f  eader->nTermAllo
bb80: 63 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  c.  ){.    retur
bb90: 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  n FTS_CORRUPT_VT
bba0: 41 42 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 6f  AB;.  }..  /* Bo
bbb0: 74 68 20 6e 50 72 65 66 69 78 20 61 6e 64 20 6e  th nPrefix and n
bbc0: 53 75 66 66 69 78 20 77 65 72 65 20 72 65 61 64  Suffix were read
bbd0: 20 62 79 20 66 74 73 33 47 65 74 56 61 72 69 6e   by fts3GetVarin
bbe0: 74 33 32 28 29 20 61 6e 64 20 73 6f 20 61 72 65  t32() and so are
bbf0: 0a 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 30 20  .  ** between 0 
bc00: 61 6e 64 20 30 78 37 46 46 46 46 46 46 46 2e 20  and 0x7FFFFFFF. 
bc10: 42 75 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  But the sum of t
bc20: 68 65 20 74 77 6f 20 6d 61 79 20 63 61 75 73 65  he two may cause
bc30: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6f 76   integer.  ** ov
bc40: 65 72 66 6c 6f 77 20 2d 20 68 65 6e 63 65 20 74  erflow - hence t
bc50: 68 65 20 28 69 36 34 29 20 63 61 73 74 73 2e 20  he (i64) casts. 
bc60: 20 2a 2f 0a 20 20 69 66 28 20 28 69 36 34 29 6e   */.  if( (i64)n
bc70: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3e 28  Prefix+nSuffix>(
bc80: 69 36 34 29 70 52 65 61 64 65 72 2d 3e 6e 54 65  i64)pReader->nTe
bc90: 72 6d 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  rmAlloc ){.    i
bca0: 36 34 20 6e 4e 65 77 20 3d 20 28 28 69 36 34 29  64 nNew = ((i64)
bcb0: 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 29  nPrefix+nSuffix)
bcc0: 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  *2;.    char *zN
bcd0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
bce0: 6c 6c 6f 63 36 34 28 70 52 65 61 64 65 72 2d 3e  lloc64(pReader->
bcf0: 7a 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20 20  zTerm, nNew);.  
bd00: 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20    if( !zNew ){. 
bd10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bd20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
bd30: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65      pReader->zTe
bd40: 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70  rm = zNew;.    p
bd50: 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c  Reader->nTermAll
bd60: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a  oc = nNew;.  }..
bd70: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
bd80: 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61  aderRequire(pRea
bd90: 64 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66  der, pNext, nSuf
bda0: 66 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f  fix+FTS3_VARINT_
bdb0: 4d 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  MAX);.  if( rc!=
bdc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
bdd0: 72 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70 79  rn rc;..  memcpy
bde0: 28 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d  (&pReader->zTerm
bdf0: 5b 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78 74  [nPrefix], pNext
be00: 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 52  , nSuffix);.  pR
be10: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e  eader->nTerm = n
be20: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a  Prefix+nSuffix;.
be30: 20 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66    pNext += nSuff
be40: 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66  ix;.  pNext += f
be50: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
be60: 4e 65 78 74 2c 20 26 70 52 65 61 64 65 72 2d 3e  Next, &pReader->
be70: 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 52 65  nDoclist);.  pRe
be80: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d  ader->aDoclist =
be90: 20 70 4e 65 78 74 3b 0a 20 20 70 52 65 61 64 65   pNext;.  pReade
bea0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
beb0: 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   0;..  /* Check 
bec0: 74 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73 74  that the doclist
bed0: 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
bee0: 20 74 6f 20 65 78 74 65 6e 64 20 70 61 73 74 20   to extend past 
bef0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
bf00: 20 2a 2a 20 62 2d 74 72 65 65 20 6e 6f 64 65 2e   ** b-tree node.
bf10: 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   And that the fi
bf20: 6e 61 6c 20 62 79 74 65 20 6f 66 20 74 68 65 20  nal byte of the 
bf30: 64 6f 63 6c 69 73 74 20 69 73 20 30 78 30 30 2e  doclist is 0x00.
bf40: 20 49 66 20 65 69 74 68 65 72 20 0a 20 20 2a 2a   If either .  **
bf50: 20 6f 66 20 74 68 65 73 65 20 73 74 61 74 65 6d   of these statem
bf60: 65 6e 74 73 20 69 73 20 75 6e 74 72 75 65 2c 20  ents is untrue, 
bf70: 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 73 74  then the data st
bf80: 72 75 63 74 75 72 65 20 69 73 20 63 6f 72 72 75  ructure is corru
bf90: 70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  pt..  */.  if( p
bfa0: 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74  Reader->nDoclist
bfb0: 20 3e 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64   > pReader->nNod
bfc0: 65 2d 28 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  e-(pReader->aDoc
bfd0: 6c 69 73 74 2d 70 52 65 61 64 65 72 2d 3e 61 4e  list-pReader->aN
bfe0: 6f 64 65 29 0a 20 20 20 7c 7c 20 28 70 52 65 61  ode).   || (pRea
bff0: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d  der->nPopulate==
c000: 30 20 26 26 20 70 52 65 61 64 65 72 2d 3e 61 44  0 && pReader->aD
c010: 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e  oclist[pReader->
c020: 6e 44 6f 63 6c 69 73 74 2d 31 5d 29 0a 20 20 29  nDoclist-1]).  )
c030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53  {.    return FTS
c040: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
c050: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c060: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c070: 53 65 74 20 74 68 65 20 53 65 67 52 65 61 64 65  Set the SegReade
c080: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
c090: 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 69 6e  e first docid in
c0a0: 20 74 68 65 20 64 6f 63 6c 69 73 74 20 61 73 73   the doclist ass
c0b0: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
c0c0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
c0d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c0e0: 66 74 73 33 53 65 67 52 65 61 64 65 72 46 69 72  fts3SegReaderFir
c0f0: 73 74 44 6f 63 69 64 28 46 74 73 33 54 61 62 6c  stDocid(Fts3Tabl
c100: 65 20 2a 70 54 61 62 2c 20 46 74 73 33 53 65 67  e *pTab, Fts3Seg
c110: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29  Reader *pReader)
c120: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c130: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
c140: 28 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c  ( pReader->aDocl
c150: 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
c160: 20 21 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73   !pReader->pOffs
c170: 65 74 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  etList );.  if( 
c180: 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26  pTab->bDescIdx &
c190: 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  & fts3SegReaderI
c1a0: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
c1b0: 29 20 29 7b 0a 20 20 20 20 75 38 20 62 45 6f 66  ) ){.    u8 bEof
c1c0: 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65   = 0;.    pReade
c1d0: 72 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20  r->iDocid = 0;. 
c1e0: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66     pReader->nOff
c1f0: 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  setList = 0;.   
c200: 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c   sqlite3Fts3Docl
c210: 69 73 74 50 72 65 76 28 30 2c 0a 20 20 20 20 20  istPrev(0,.     
c220: 20 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63     pReader->aDoc
c230: 6c 69 73 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e  list, pReader->n
c240: 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64 65  Doclist, &pReade
c250: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 2c 20  r->pOffsetList, 
c260: 0a 20 20 20 20 20 20 20 20 26 70 52 65 61 64 65  .        &pReade
c270: 72 2d 3e 69 44 6f 63 69 64 2c 20 26 70 52 65 61  r->iDocid, &pRea
c280: 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  der->nOffsetList
c290: 2c 20 26 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20  , &bEof.    );. 
c2a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
c2b0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65   fts3SegReaderRe
c2c0: 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70  quire(pReader, p
c2d0: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
c2e0: 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  , FTS3_VARINT_MA
c2f0: 58 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  X);.    if( rc==
c300: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c310: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
c320: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
c330: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
c340: 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f  t, &pReader->iDo
c350: 63 69 64 29 3b 0a 20 20 20 20 20 20 70 52 65 61  cid);.      pRea
c360: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
c370: 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f   = &pReader->aDo
c380: 63 6c 69 73 74 5b 6e 5d 3b 0a 20 20 20 20 7d 0a  clist[n];.    }.
c390: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c3a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
c3b0: 65 20 74 68 65 20 53 65 67 52 65 61 64 65 72 20  e the SegReader 
c3c0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
c3d0: 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 20 74 68  next docid in th
c3e0: 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 61 73 73  e doclist.** ass
c3f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
c400: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a   current term..*
c410: 2a 20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  * .** If argumen
c420: 74 73 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20  ts ppOffsetList 
c430: 61 6e 64 20 70 6e 4f 66 66 73 65 74 4c 69 73 74  and pnOffsetList
c440: 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74   are not NULL, t
c450: 68 65 6e 20 0a 2a 2a 20 2a 70 70 4f 66 66 73 65  hen .** *ppOffse
c460: 74 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20  tList is set to 
c470: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
c480: 73 74 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74  st column-offset
c490: 20 6c 69 73 74 0a 2a 2a 20 69 6e 20 74 68 65 20   list.** in the 
c4a0: 64 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 28 69  doclist entry (i
c4b0: 2e 65 2e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .e. immediately 
c4c0: 70 61 73 74 20 74 68 65 20 64 6f 63 69 64 20 76  past the docid v
c4d0: 61 72 69 6e 74 29 2e 0a 2a 2a 20 2a 70 6e 4f 66  arint)..** *pnOf
c4e0: 66 73 65 74 4c 69 73 74 20 69 73 20 73 65 74 20  fsetList is set 
c4f0: 74 6f 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  to the length of
c500: 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
c510: 6d 6e 2d 6f 66 66 73 65 74 0a 2a 2a 20 6c 69 73  mn-offset.** lis
c520: 74 73 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  ts, not includin
c530: 67 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  g the nul-termin
c540: 61 74 6f 72 20 62 79 74 65 2e 20 46 6f 72 20 65  ator byte. For e
c550: 78 61 6d 70 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  xample:.*/.stati
c560: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
c570: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 0a 20 20  derNextDocid(.  
c580: 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c  Fts3Table *pTab,
c590: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
c5a0: 20 2a 70 52 65 61 64 65 72 2c 20 20 20 20 20 20   *pReader,      
c5b0: 20 20 20 2f 2a 20 52 65 61 64 65 72 20 74 6f 20     /* Reader to 
c5c0: 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20  advance to next 
c5d0: 64 6f 63 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  docid */.  char 
c5e0: 2a 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 2c 20  **ppOffsetList, 
c5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
c600: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  T: Pointer to cu
c610: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 2d 6c  rrent position-l
c620: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ist */.  int *pn
c630: 4f 66 66 73 65 74 4c 69 73 74 20 20 20 20 20 20  OffsetList      
c640: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
c650: 20 4c 65 6e 67 74 68 20 6f 66 20 2a 70 70 4f 66   Length of *ppOf
c660: 66 73 65 74 4c 69 73 74 20 69 6e 20 62 79 74 65  fsetList in byte
c670: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
c680: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c690: 63 68 61 72 20 2a 70 20 3d 20 70 52 65 61 64 65  char *p = pReade
c6a0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a  r->pOffsetList;.
c6b0: 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20    char c = 0;.. 
c6c0: 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 0a 20   assert( p );.. 
c6d0: 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63   if( pTab->bDesc
c6e0: 49 64 78 20 26 26 20 66 74 73 33 53 65 67 52 65  Idx && fts3SegRe
c6f0: 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52  aderIsPending(pR
c700: 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  eader) ){.    /*
c710: 20 41 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73   A pending-terms
c720: 20 73 65 67 2d 72 65 61 64 65 72 20 66 6f 72 20   seg-reader for 
c730: 61 6e 20 46 54 53 34 20 74 61 62 6c 65 20 74 68  an FTS4 table th
c740: 61 74 20 75 73 65 73 20 6f 72 64 65 72 3d 64 65  at uses order=de
c750: 73 63 2e 0a 20 20 20 20 2a 2a 20 50 65 6e 64 69  sc..    ** Pendi
c760: 6e 67 2d 74 65 72 6d 73 20 64 6f 63 6c 69 73 74  ng-terms doclist
c770: 73 20 61 72 65 20 61 6c 77 61 79 73 20 62 75 69  s are always bui
c780: 6c 74 20 75 70 20 69 6e 20 61 73 63 65 6e 64 69  lt up in ascendi
c790: 6e 67 20 6f 72 64 65 72 2c 20 73 6f 0a 20 20 20  ng order, so.   
c7a0: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 69   ** we have to i
c7b0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
c7c0: 68 65 6d 20 62 61 63 6b 77 61 72 64 73 20 68 65  hem backwards he
c7d0: 72 65 2e 20 2a 2f 0a 20 20 20 20 75 38 20 62 45  re. */.    u8 bE
c7e0: 6f 66 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  of = 0;.    if( 
c7f0: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a  ppOffsetList ){.
c800: 20 20 20 20 20 20 2a 70 70 4f 66 66 73 65 74 4c        *ppOffsetL
c810: 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 70  ist = pReader->p
c820: 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20 20  OffsetList;.    
c830: 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20    *pnOffsetList 
c840: 3d 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73  = pReader->nOffs
c850: 65 74 4c 69 73 74 20 2d 20 31 3b 0a 20 20 20 20  etList - 1;.    
c860: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
c870: 33 44 6f 63 6c 69 73 74 50 72 65 76 28 30 2c 0a  3DoclistPrev(0,.
c880: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
c890: 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 65 61 64  >aDoclist, pRead
c8a0: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20 26 70  er->nDoclist, &p
c8b0: 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63  , &pReader->iDoc
c8c0: 69 64 2c 0a 20 20 20 20 20 20 20 20 26 70 52 65  id,.        &pRe
c8d0: 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73  ader->nOffsetLis
c8e0: 74 2c 20 26 62 45 6f 66 0a 20 20 20 20 29 3b 0a  t, &bEof.    );.
c8f0: 20 20 20 20 69 66 28 20 62 45 6f 66 20 29 7b 0a      if( bEof ){.
c900: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
c910: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a  OffsetList = 0;.
c920: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c930: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
c940: 74 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  tList = p;.    }
c950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
c960: 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 52 65 61  ar *pEnd = &pRea
c970: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52  der->aDoclist[pR
c980: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d  eader->nDoclist]
c990: 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;..    /* Pointe
c9a0: 72 20 70 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  r p currently po
c9b0: 69 6e 74 73 20 61 74 20 74 68 65 20 66 69 72 73  ints at the firs
c9c0: 74 20 62 79 74 65 20 6f 66 20 61 6e 20 6f 66 66  t byte of an off
c9d0: 73 65 74 20 6c 69 73 74 2e 20 54 68 65 0a 20 20  set list. The.  
c9e0: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 62    ** following b
c9f0: 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73 20 69 74  lock advances it
ca00: 20 74 6f 20 70 6f 69 6e 74 20 6f 6e 65 20 62 79   to point one by
ca10: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
ca20: 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  of.    ** the sa
ca30: 6d 65 20 6f 66 66 73 65 74 20 6c 69 73 74 2e 20  me offset list. 
ca40: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  */.    while( 1 
ca50: 29 7b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54  ){.  .      /* T
ca60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e  he following lin
ca70: 65 20 6f 66 20 63 6f 64 65 20 28 61 6e 64 20 74  e of code (and t
ca80: 68 65 20 22 70 2b 2b 22 20 62 65 6c 6f 77 20 74  he "p++" below t
ca90: 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 29  he while() loop)
caa0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72   is.      ** nor
cab0: 6d 61 6c 6c 79 20 61 6c 6c 20 74 68 61 74 20 69  mally all that i
cac0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6d 6f  s required to mo
cad0: 76 65 20 70 6f 69 6e 74 65 72 20 70 20 74 6f 20  ve pointer p to 
cae0: 74 68 65 20 64 65 73 69 72 65 64 20 0a 20 20 20  the desired .   
caf0: 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2e 20     ** position. 
cb00: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
cb10: 20 69 66 20 74 68 69 73 20 6e 6f 64 65 20 69 73   if this node is
cb20: 20 62 65 69 6e 67 20 6c 6f 61 64 65 64 20 66 72   being loaded fr
cb30: 6f 6d 20 64 69 73 6b 0a 20 20 20 20 20 20 2a 2a  om disk.      **
cb40: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 61   incrementally a
cb50: 6e 64 20 70 6f 69 6e 74 65 72 20 22 70 22 20 6e  nd pointer "p" n
cb60: 6f 77 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ow points to the
cb70: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
cb80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f  .      ** the po
cb90: 70 75 6c 61 74 65 64 20 70 61 72 74 20 6f 66 20  pulated part of 
cba0: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 5d  pReader->aNode[]
cbb0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
cbc0: 20 77 68 69 6c 65 28 20 2a 70 20 7c 20 63 20 29   while( *p | c )
cbd0: 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30   c = *p++ & 0x80
cbe0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cbf0: 2a 70 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  *p==0 );.  .    
cc00: 20 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e 70    if( pReader->p
cc10: 42 6c 6f 62 3d 3d 30 20 7c 7c 20 70 3c 26 70 52  Blob==0 || p<&pR
cc20: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
cc30: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d  ader->nPopulate]
cc40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
cc50: 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
cc60: 65 72 49 6e 63 72 52 65 61 64 28 70 52 65 61 64  erIncrRead(pRead
cc70: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
cc80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
cc90: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
cca0: 20 20 20 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 20      p++;.  .    
ccb0: 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
ccc0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74  populate the out
ccd0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 77 69  put variables wi
cce0: 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  th a pointer to 
ccf0: 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  and the.    ** s
cd00: 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 76 69  ize of the previ
cd10: 6f 75 73 20 6f 66 66 73 65 74 2d 6c 69 73 74 2e  ous offset-list.
cd20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
cd30: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a  ppOffsetList ){.
cd40: 20 20 20 20 20 20 2a 70 70 4f 66 66 73 65 74 4c        *ppOffsetL
cd50: 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 70  ist = pReader->p
cd60: 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20 20  OffsetList;.    
cd70: 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20    *pnOffsetList 
cd80: 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 52 65 61  = (int)(p - pRea
cd90: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
cda0: 20 2d 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   - 1);.    }..  
cdb0: 20 20 2f 2a 20 4c 69 73 74 20 6d 61 79 20 68 61    /* List may ha
cdc0: 76 65 20 62 65 65 6e 20 65 64 69 74 65 64 20 69  ve been edited i
cdd0: 6e 20 70 6c 61 63 65 20 62 79 20 66 74 73 33 45  n place by fts3E
cde0: 76 61 6c 4e 65 61 72 54 72 69 6d 28 29 20 2a 2f  valNearTrim() */
cdf0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70 45  .    while( p<pE
ce00: 6e 64 20 26 26 20 2a 70 3d 3d 30 20 29 20 70 2b  nd && *p==0 ) p+
ce10: 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  +;.  .    /* If 
ce20: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
ce30: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
ce40: 20 64 6f 63 6c 69 73 74 2c 20 73 65 74 20 70 4f   doclist, set pO
ce50: 66 66 73 65 74 4c 69 73 74 20 74 6f 0a 20 20 20  ffsetList to.   
ce60: 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77   ** NULL. Otherw
ce70: 69 73 65 2c 20 73 65 74 20 46 74 73 33 53 65 67  ise, set Fts3Seg
ce80: 52 65 61 64 65 72 2e 69 44 6f 63 69 64 20 74 6f  Reader.iDocid to
ce90: 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20   the next docid 
cea0: 61 6e 64 0a 20 20 20 20 2a 2a 20 46 74 73 33 53  and.    ** Fts3S
ceb0: 65 67 52 65 61 64 65 72 2e 70 4f 66 66 73 65 74  egReader.pOffset
cec0: 4c 69 73 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  List to point to
ced0: 20 74 68 65 20 6e 65 78 74 20 6f 66 66 73 65 74   the next offset
cee0: 20 6c 69 73 74 20 62 65 66 6f 72 65 0a 20 20 20   list before.   
cef0: 20 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20   ** returning.. 
cf00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 3e     */.    if( p>
cf10: 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70  =pEnd ){.      p
cf20: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
cf30: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ist = 0;.    }el
cf40: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
cf50: 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75  ts3SegReaderRequ
cf60: 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 2c 20  ire(pReader, p, 
cf70: 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29  FTS3_VARINT_MAX)
cf80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
cf90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cfa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
cfb0: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
cfc0: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66     pReader->pOff
cfd0: 73 65 74 4c 69 73 74 20 3d 20 70 20 2b 20 73 71  setList = p + sq
cfe0: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
cff0: 6e 74 28 70 2c 20 26 69 44 65 6c 74 61 29 3b 0a  nt(p, &iDelta);.
d000: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
d010: 2d 3e 62 44 65 73 63 49 64 78 20 29 7b 0a 20 20  ->bDescIdx ){.  
d020: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
d030: 3e 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74  >iDocid -= iDelt
d040: 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  a;.        }else
d050: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 61  {.          pRea
d060: 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b 3d 20 69  der->iDocid += i
d070: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d  Delta;.        }
d080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d090: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
d0a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69 6e 74 20  ITE_OK;.}...int 
d0b0: 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f 76  sqlite3Fts3MsrOv
d0c0: 66 6c 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  fl(.  Fts3Cursor
d0d0: 20 2a 70 43 73 72 2c 20 0a 20 20 46 74 73 33 4d   *pCsr, .  Fts3M
d0e0: 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
d0f0: 4d 73 72 2c 0a 20 20 69 6e 74 20 2a 70 6e 4f 76  Msr,.  int *pnOv
d100: 66 6c 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  fl.){.  Fts3Tabl
d110: 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
d120: 65 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  e*)pCsr->base.pV
d130: 74 61 62 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c  tab;.  int nOvfl
d140: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a   = 0;.  int ii;.
d150: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d160: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 70 67 73 7a  E_OK;.  int pgsz
d170: 20 3d 20 70 2d 3e 6e 50 67 73 7a 3b 0a 0a 20 20   = p->nPgsz;..  
d180: 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73 34  assert( p->bFts4
d190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
d1a0: 73 7a 3e 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69  sz>0 );..  for(i
d1b0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
d1c0: 4f 4b 20 26 26 20 69 69 3c 70 4d 73 72 2d 3e 6e  OK && ii<pMsr->n
d1d0: 53 65 67 6d 65 6e 74 3b 20 69 69 2b 2b 29 7b 0a  Segment; ii++){.
d1e0: 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
d1f0: 72 20 2a 70 52 65 61 64 65 72 20 3d 20 70 4d 73  r *pReader = pMs
d200: 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 69 5d  r->apSegment[ii]
d210: 3b 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53  ;.    if( !fts3S
d220: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
d230: 67 28 70 52 65 61 64 65 72 29 20 0a 20 20 20 20  g(pReader) .    
d240: 20 26 26 20 21 66 74 73 33 53 65 67 52 65 61 64   && !fts3SegRead
d250: 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65  erIsRootOnly(pRe
d260: 61 64 65 72 29 20 0a 20 20 20 20 29 7b 0a 20 20  ader) .    ){.  
d270: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
d280: 34 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  4 jj;.      for(
d290: 6a 6a 3d 70 52 65 61 64 65 72 2d 3e 69 53 74 61  jj=pReader->iSta
d2a0: 72 74 42 6c 6f 63 6b 3b 20 6a 6a 3c 3d 70 52 65  rtBlock; jj<=pRe
d2b0: 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c  ader->iLeafEndBl
d2c0: 6f 63 6b 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  ock; jj++){.    
d2d0: 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20      int nBlob;. 
d2e0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d2f0: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
d300: 28 70 2c 20 6a 6a 2c 20 30 2c 20 26 6e 42 6c 6f  (p, jj, 0, &nBlo
d310: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
d320: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d330: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d340: 20 20 69 66 28 20 28 6e 42 6c 6f 62 2b 33 35 29    if( (nBlob+35)
d350: 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  >pgsz ){.       
d360: 20 20 20 6e 4f 76 66 6c 20 2b 3d 20 28 6e 42 6c     nOvfl += (nBl
d370: 6f 62 20 2b 20 33 34 29 2f 70 67 73 7a 3b 0a 20  ob + 34)/pgsz;. 
d380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d390: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e  .    }.  }.  *pn
d3a0: 4f 76 66 6c 20 3d 20 6e 4f 76 66 6c 3b 0a 20 20  Ovfl = nOvfl;.  
d3b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d3c0: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c  .** Free all all
d3d0: 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
d3e0: 74 65 64 20 77 69 74 68 20 74 68 65 20 69 74 65  ted with the ite
d3f0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
d400: 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61  the .** second a
d410: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
d420: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
d430: 65 61 64 65 72 46 72 65 65 28 46 74 73 33 53 65  eaderFree(Fts3Se
d440: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
d450: 29 7b 0a 20 20 69 66 28 20 70 52 65 61 64 65 72  ){.  if( pReader
d460: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 66 74 73   ){.    if( !fts
d470: 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64  3SegReaderIsPend
d480: 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a  ing(pReader) ){.
d490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
d4a0: 65 65 28 70 52 65 61 64 65 72 2d 3e 7a 54 65 72  ee(pReader->zTer
d4b0: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  m);.    }.    if
d4c0: 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72  ( !fts3SegReader
d4d0: 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65 61 64  IsRootOnly(pRead
d4e0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  er) ){.      sql
d4f0: 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65  ite3_free(pReade
d500: 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 7d  r->aNode);.    }
d510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
d520: 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 2d  b_close(pReader-
d530: 3e 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 20 20 73  >pBlob);.  }.  s
d540: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 61  qlite3_free(pRea
d550: 64 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  der);.}../*.** A
d560: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
d570: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 2e 0a  gReader object..
d580: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
d590: 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 0a  s3SegReaderNew(.
d5a0: 20 20 69 6e 74 20 69 41 67 65 2c 20 20 20 20 20    int iAge,     
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 22 61 67    /* Segment "ag
d5d0: 65 22 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 6f  e". */.  int bLo
d5e0: 6f 6b 75 70 2c 20 20 20 20 20 20 20 20 20 20 20  okup,           
d5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
d600: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
d610: 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ly */.  sqlite3_
d620: 69 6e 74 36 34 20 69 53 74 61 72 74 4c 65 61 66  int64 iStartLeaf
d630: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
d640: 20 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73   leaf to travers
d650: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
d660: 6e 74 36 34 20 69 45 6e 64 4c 65 61 66 2c 20 20  nt64 iEndLeaf,  
d670: 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20         /* Final 
d680: 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65  leaf to traverse
d690: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
d6a0: 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20  t64 iEndBlock,  
d6b0: 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 62        /* Final b
d6c0: 6c 6f 63 6b 20 6f 66 20 73 65 67 6d 65 6e 74 20  lock of segment 
d6d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
d6e0: 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  *zRoot,         
d6f0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
d700: 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e  ontaining root n
d710: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ode */.  int nRo
d720: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
d730: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
d740: 20 6f 66 20 62 75 66 66 65 72 20 63 6f 6e 74 61   of buffer conta
d750: 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
d760: 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
d770: 65 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20  er **ppReader   
d780: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c       /* OUT: All
d790: 6f 63 61 74 65 64 20 46 74 73 33 53 65 67 52 65  ocated Fts3SegRe
d7a0: 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ader */.){.  Fts
d7b0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
d7c0: 64 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  der;         /* 
d7d0: 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
d7e0: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
d7f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
d800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d810: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
d820: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65 67 6d 65  o allocate segme
d830: 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  nt root node */.
d840: 0a 20 20 61 73 73 65 72 74 28 20 7a 52 6f 6f 74  .  assert( zRoot
d850: 21 3d 30 20 7c 7c 20 6e 52 6f 6f 74 3d 3d 30 20  !=0 || nRoot==0 
d860: 29 3b 0a 23 69 66 64 65 66 20 43 4f 52 52 55 50  );.#ifdef CORRUP
d870: 54 5f 44 42 0a 20 20 61 73 73 65 72 74 28 20 7a  T_DB.  assert( z
d880: 52 6f 6f 74 21 3d 30 20 7c 7c 20 43 4f 52 52 55  Root!=0 || CORRU
d890: 50 54 5f 44 42 20 29 3b 0a 23 65 6e 64 69 66 0a  PT_DB );.#endif.
d8a0: 0a 20 20 69 66 28 20 69 53 74 61 72 74 4c 65 61  .  if( iStartLea
d8b0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
d8c0: 69 45 6e 64 4c 65 61 66 21 3d 30 20 29 20 72 65  iEndLeaf!=0 ) re
d8d0: 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54  turn FTS_CORRUPT
d8e0: 5f 56 54 41 42 3b 0a 20 20 20 20 6e 45 78 74 72  _VTAB;.    nExtr
d8f0: 61 20 3d 20 6e 52 6f 6f 74 20 2b 20 46 54 53 33  a = nRoot + FTS3
d900: 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 3b 0a 20  _NODE_PADDING;. 
d910: 20 7d 0a 0a 20 20 70 52 65 61 64 65 72 20 3d 20   }..  pReader = 
d920: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
d930: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
d940: 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65  sizeof(Fts3SegRe
d950: 61 64 65 72 29 20 2b 20 6e 45 78 74 72 61 29 3b  ader) + nExtra);
d960: 0a 20 20 69 66 28 20 21 70 52 65 61 64 65 72 20  .  if( !pReader 
d970: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d980: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d990: 20 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72    memset(pReader
d9a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
d9b0: 53 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 70  SegReader));.  p
d9c0: 52 65 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 69  Reader->iIdx = i
d9d0: 41 67 65 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e  Age;.  pReader->
d9e0: 62 4c 6f 6f 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75  bLookup = bLooku
d9f0: 70 21 3d 30 3b 0a 20 20 70 52 65 61 64 65 72 2d  p!=0;.  pReader-
da00: 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d 20 69  >iStartBlock = i
da10: 53 74 61 72 74 4c 65 61 66 3b 0a 20 20 70 52 65  StartLeaf;.  pRe
da20: 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c  ader->iLeafEndBl
da30: 6f 63 6b 20 3d 20 69 45 6e 64 4c 65 61 66 3b 0a  ock = iEndLeaf;.
da40: 20 20 70 52 65 61 64 65 72 2d 3e 69 45 6e 64 42    pReader->iEndB
da50: 6c 6f 63 6b 20 3d 20 69 45 6e 64 42 6c 6f 63 6b  lock = iEndBlock
da60: 3b 0a 0a 20 20 69 66 28 20 6e 45 78 74 72 61 20  ;..  if( nExtra 
da70: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 6e  ){.    /* The en
da80: 74 69 72 65 20 73 65 67 6d 65 6e 74 20 69 73 20  tire segment is 
da90: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
daa0: 6f 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  ot node. */.    
dab0: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d  pReader->aNode =
dac0: 20 28 63 68 61 72 20 2a 29 26 70 52 65 61 64 65   (char *)&pReade
dad0: 72 5b 31 5d 3b 0a 20 20 20 20 70 52 65 61 64 65  r[1];.    pReade
dae0: 72 2d 3e 72 6f 6f 74 4f 6e 6c 79 20 3d 20 31 3b  r->rootOnly = 1;
daf0: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e  .    pReader->nN
db00: 6f 64 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20  ode = nRoot;.   
db10: 20 69 66 28 20 6e 52 6f 6f 74 20 29 20 6d 65 6d   if( nRoot ) mem
db20: 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f  cpy(pReader->aNo
db30: 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74  de, zRoot, nRoot
db40: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  );.    memset(&p
db50: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e 52  Reader->aNode[nR
db60: 6f 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f  oot], 0, FTS3_NO
db70: 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d  DE_PADDING);.  }
db80: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 61 64 65  else{.    pReade
db90: 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b  r->iCurrentBlock
dba0: 20 3d 20 69 53 74 61 72 74 4c 65 61 66 2d 31 3b   = iStartLeaf-1;
dbb0: 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72  .  }.  *ppReader
dbc0: 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65   = pReader;.  re
dbd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dbe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
dbf0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75   a comparison fu
dc00: 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20 61  nction used as a
dc10: 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61 63   qsort() callbac
dc20: 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a  k when sorting.*
dc30: 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 65  * an array of pe
dc40: 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20 74  nding terms by t
dc50: 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72 73  erm. This occurs
dc60: 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75 73   as part of flus
dc70: 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  hing.** the cont
dc80: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64  ents of the pend
dc90: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
dca0: 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  able to the data
dcb0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
dcc0: 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45 43 4c  int SQLITE_CDECL
dcd0: 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d   fts3CompareElem
dce0: 42 79 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20  ByTerm(.  const 
dcf0: 76 6f 69 64 20 2a 6c 68 73 2c 0a 20 20 63 6f 6e  void *lhs,.  con
dd00: 73 74 20 76 6f 69 64 20 2a 72 68 73 0a 29 7b 0a  st void *rhs.){.
dd10: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 66 74 73    char *z1 = fts
dd20: 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48  3HashKey(*(Fts3H
dd30: 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b  ashElem **)lhs);
dd40: 0a 20 20 63 68 61 72 20 2a 7a 32 20 3d 20 66 74  .  char *z2 = ft
dd50: 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33  s3HashKey(*(Fts3
dd60: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29  HashElem **)rhs)
dd70: 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66 74 73  ;.  int n1 = fts
dd80: 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46  3HashKeysize(*(F
dd90: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c  ts3HashElem **)l
dda0: 68 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20  hs);.  int n2 = 
ddb0: 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28  fts3HashKeysize(
ddc0: 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  *(Fts3HashElem *
ddd0: 2a 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e  *)rhs);..  int n
dde0: 20 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a   = (n1<n2 ? n1 :
ddf0: 20 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20   n2);.  int c = 
de00: 6d 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e  memcmp(z1, z2, n
de10: 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  );.  if( c==0 ){
de20: 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32  .    c = n1 - n2
de30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
de40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
de50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
de60: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20   to allocate an 
de70: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 74 68  Fts3SegReader th
de80: 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f  at iterates thro
de90: 75 67 68 0a 2a 2a 20 61 20 73 75 62 73 65 74 20  ugh.** a subset 
dea0: 6f 66 20 74 68 65 20 74 65 72 6d 73 20 73 74 6f  of the terms sto
deb0: 72 65 64 20 69 6e 20 74 68 65 20 46 74 73 33 54  red in the Fts3T
dec0: 61 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d  able.pendingTerm
ded0: 73 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  s array..**.** I
dee0: 66 20 74 68 65 20 69 73 50 72 65 66 69 78 49 74  f the isPrefixIt
def0: 65 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  er parameter is 
df00: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72  zero, then the r
df10: 65 74 75 72 6e 65 64 20 53 65 67 52 65 61 64 65  eturned SegReade
df20: 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 74 68  r iterates.** th
df30: 72 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d 20  rough each term 
df40: 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  in the pending-t
df50: 65 72 6d 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20  erms table. Or, 
df60: 69 66 20 69 73 50 72 65 66 69 78 49 74 65 72 20  if isPrefixIter 
df70: 69 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  is.** non-zero, 
df80: 69 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f  it iterates thro
df90: 75 67 68 20 65 61 63 68 20 74 65 72 6d 20 61 6e  ugh each term an
dfa0: 64 20 69 74 73 20 70 72 65 66 69 78 65 73 2e 20  d its prefixes. 
dfb0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
dfc0: 2a 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74  ** the pending t
dfd0: 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20  erms hash table 
dfe0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72  contains the ter
dff0: 6d 73 20 22 73 71 6c 69 74 65 22 2c 20 22 6d 79  ms "sqlite", "my
e000: 73 71 6c 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72  sql" and.** "fir
e010: 65 62 69 72 64 22 2c 20 74 68 65 6e 20 74 68 65  ebird", then the
e020: 20 69 74 65 72 61 74 6f 72 20 76 69 73 69 74 73   iterator visits
e030: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27   the following '
e040: 74 65 72 6d 73 27 20 28 69 6e 20 74 68 65 20 6f  terms' (in the o
e050: 72 64 65 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a  rder.** shown):.
e060: 2a 2a 0a 2a 2a 20 20 20 66 20 66 69 20 66 69 72  **.**   f fi fir
e070: 20 66 69 72 65 20 66 69 72 65 62 20 66 69 72 65   fire fireb fire
e080: 62 69 20 66 69 72 65 62 69 72 20 66 69 72 65 62  bi firebir fireb
e090: 69 72 64 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79  ird.**   m my my
e0a0: 73 20 6d 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20  s mysq mysql.** 
e0b0: 20 20 73 20 73 71 20 73 71 6c 20 73 71 6c 69 20    s sq sql sqli 
e0c0: 73 71 6c 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a  sqlit sqlite.**.
e0d0: 2a 2a 20 57 68 65 72 65 61 73 20 69 66 20 69 73  ** Whereas if is
e0e0: 50 72 65 66 69 78 49 74 65 72 20 69 73 20 7a 65  PrefixIter is ze
e0f0: 72 6f 2c 20 74 68 65 20 74 65 72 6d 73 20 76 69  ro, the terms vi
e100: 73 69 74 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  sited are:.**.**
e110: 20 20 20 66 69 72 65 62 69 72 64 20 6d 79 73 71     firebird mysq
e120: 6c 20 73 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20  l sqlite.*/.int 
e130: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
e140: 61 64 65 72 50 65 6e 64 69 6e 67 28 0a 20 20 46  aderPending(.  F
e150: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e170: 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
e180: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
e190: 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  iIndex,         
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e1b0: 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64  ndex for p->aInd
e1c0: 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
e1d0: 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
e1e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20          /* Term 
e1f0: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f  to search for */
e200: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
e230: 66 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  ffer zTerm */.  
e240: 69 6e 74 20 62 50 72 65 66 69 78 2c 20 20 20 20  int bPrefix,    
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72  /* True for a pr
e270: 65 66 69 78 20 69 74 65 72 61 74 6f 72 20 2a 2f  efix iterator */
e280: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
e290: 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20   **ppReader     
e2a0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65     /* OUT: SegRe
e2b0: 61 64 65 72 20 66 6f 72 20 70 65 6e 64 69 6e 67  ader for pending
e2c0: 2d 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46  -terms */.){.  F
e2d0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
e2e0: 65 61 64 65 72 20 3d 20 30 3b 20 20 20 20 20 2f  eader = 0;     /
e2f0: 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  * Fts3SegReader 
e300: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e  object to return
e310: 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45 6c   */.  Fts3HashEl
e320: 65 6d 20 2a 70 45 3b 20 20 20 20 20 20 20 20 20  em *pE;         
e330: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
e340: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
e350: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61  Fts3HashElem **a
e360: 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  Elem = 0;       
e370: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 65 72 6d  /* Array of term
e380: 20 68 61 73 68 20 65 6e 74 72 69 65 73 20 74 6f   hash entries to
e390: 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   scan */.  int n
e3a0: 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  Elem = 0;       
e3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
e3c0: 7a 65 20 6f 66 20 61 72 72 61 79 20 61 74 20 61  ze of array at a
e3d0: 45 6c 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Elem */.  int rc
e3e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e400: 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74  urn Code */.  Ft
e410: 73 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a  s3Hash *pHash;..
e420: 20 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49    pHash = &p->aI
e430: 6e 64 65 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65  ndex[iIndex].hPe
e440: 6e 64 69 6e 67 3b 0a 20 20 69 66 28 20 62 50 72  nding;.  if( bPr
e450: 65 66 69 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  efix ){.    int 
e460: 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20  nAlloc = 0;     
e470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
e480: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 61  e of allocated a
e490: 72 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f  rray at aElem */
e4a0: 0a 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74 73  ..    for(pE=fts
e4b0: 33 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  3HashFirst(pHash
e4c0: 29 3b 20 70 45 3b 20 70 45 3d 66 74 73 33 48 61  ); pE; pE=fts3Ha
e4d0: 73 68 4e 65 78 74 28 70 45 29 29 7b 0a 20 20 20  shNext(pE)){.   
e4e0: 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20     char *zKey = 
e4f0: 28 63 68 61 72 20 2a 29 66 74 73 33 48 61 73 68  (char *)fts3Hash
e500: 4b 65 79 28 70 45 29 3b 0a 20 20 20 20 20 20 69  Key(pE);.      i
e510: 6e 74 20 6e 4b 65 79 20 3d 20 66 74 73 33 48 61  nt nKey = fts3Ha
e520: 73 68 4b 65 79 73 69 7a 65 28 70 45 29 3b 0a 20  shKeysize(pE);. 
e530: 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d       if( nTerm==
e540: 30 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72  0 || (nKey>=nTer
e550: 6d 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  m && 0==memcmp(z
e560: 4b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Key, zTerm, nTer
e570: 6d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  m)) ){.        i
e580: 66 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63  f( nElem==nAlloc
e590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74   ){.          Ft
e5a0: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c  s3HashElem **aEl
e5b0: 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  em2;.          n
e5c0: 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20  Alloc += 16;.   
e5d0: 20 20 20 20 20 20 20 61 45 6c 65 6d 32 20 3d 20         aElem2 = 
e5e0: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
e5f0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
e600: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
e610: 61 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69  aElem, nAlloc*si
e620: 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65  zeof(Fts3HashEle
e630: 6d 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20 29  m *).          )
e640: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e650: 21 61 45 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20  !aElem2 ){.     
e660: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e670: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
e680: 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b        nElem = 0;
e690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
e6a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
e6b0: 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 20            aElem 
e6c0: 3d 20 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20  = aElem2;.      
e6d0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 61 45 6c    }..        aEl
e6e0: 65 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45  em[nElem++] = pE
e6f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e700: 0a 20 20 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20  .    /* If more 
e710: 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61  than one term ma
e720: 74 63 68 65 73 20 74 68 65 20 70 72 65 66 69 78  tches the prefix
e730: 2c 20 73 6f 72 74 20 74 68 65 20 46 74 73 33 48  , sort the Fts3H
e740: 61 73 68 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f  ashElem.    ** o
e750: 62 6a 65 63 74 73 20 69 6e 20 74 65 72 6d 20 6f  bjects in term o
e760: 72 64 65 72 20 75 73 69 6e 67 20 71 73 6f 72 74  rder using qsort
e770: 28 29 2e 20 54 68 69 73 20 75 73 65 73 20 74 68  (). This uses th
e780: 65 20 73 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f  e same compariso
e790: 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63  n.    ** callbac
e7a0: 6b 20 61 73 20 69 73 20 75 73 65 64 20 77 68 65  k as is used whe
e7b0: 6e 20 66 6c 75 73 68 69 6e 67 20 74 65 72 6d 73  n flushing terms
e7c0: 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   to disk..    */
e7d0: 0a 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31  .    if( nElem>1
e7e0: 20 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74 28   ){.      qsort(
e7f0: 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69  aElem, nElem, si
e800: 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65  zeof(Fts3HashEle
e810: 6d 20 2a 29 2c 20 66 74 73 33 43 6f 6d 70 61 72  m *), fts3Compar
e820: 65 45 6c 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20  eElemByTerm);.  
e830: 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
e840: 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 69    /* The query i
e850: 73 20 61 20 73 69 6d 70 6c 65 20 74 65 72 6d 20  s a simple term 
e860: 6c 6f 6f 6b 75 70 20 74 68 61 74 20 6d 61 74 63  lookup that matc
e870: 68 65 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  hes at most one 
e880: 74 65 72 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74  term in.    ** t
e890: 68 65 20 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68  he index. All th
e8a0: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
e8b0: 73 20 61 20 73 74 72 61 69 67 68 74 20 68 61 73  s a straight has
e8c0: 68 2d 6c 6f 6f 6b 75 70 2e 20 0a 20 20 20 20 2a  h-lookup. .    *
e8d0: 2a 0a 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65  *.    ** Because
e8e0: 20 74 68 65 20 73 74 61 63 6b 20 61 64 64 72 65   the stack addre
e8f0: 73 73 20 6f 66 20 70 45 20 6d 61 79 20 62 65 20  ss of pE may be 
e900: 61 63 63 65 73 73 65 64 20 76 69 61 20 74 68 65  accessed via the
e910: 20 61 45 6c 65 6d 20 70 6f 69 6e 74 65 72 0a 20   aElem pointer. 
e920: 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 74 68 65     ** below, the
e930: 20 22 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a   "Fts3HashElem *
e940: 70 45 22 20 6d 75 73 74 20 62 65 20 64 65 63 6c  pE" must be decl
e950: 61 72 65 64 20 73 6f 20 74 68 61 74 20 69 74 20  ared so that it 
e960: 69 73 20 76 61 6c 69 64 0a 20 20 20 20 2a 2a 20  is valid.    ** 
e970: 77 69 74 68 69 6e 20 74 68 69 73 20 65 6e 74 69  within this enti
e980: 72 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74  re function, not
e990: 20 6a 75 73 74 20 74 68 69 73 20 22 65 6c 73 65   just this "else
e9a0: 7b 2e 2e 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20  {...}" block..  
e9b0: 20 20 2a 2f 0a 20 20 20 20 70 45 20 3d 20 66 74    */.    pE = ft
e9c0: 73 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28 70  s3HashFindElem(p
e9d0: 48 61 73 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Hash, zTerm, nTe
e9e0: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 45 20  rm);.    if( pE 
e9f0: 29 7b 0a 20 20 20 20 20 20 61 45 6c 65 6d 20 3d  ){.      aElem =
ea00: 20 26 70 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65   &pE;.      nEle
ea10: 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  m = 1;.    }.  }
ea20: 0a 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20  ..  if( nElem>0 
ea30: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
ea40: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65   = sizeof(Fts3Se
ea50: 67 52 65 61 64 65 72 29 20 2b 20 28 6e 45 6c 65  gReader) + (nEle
ea60: 6d 2b 31 29 2a 73 69 7a 65 6f 66 28 46 74 73 33  m+1)*sizeof(Fts3
ea70: 48 61 73 68 45 6c 65 6d 20 2a 29 3b 0a 20 20 20  HashElem *);.   
ea80: 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73 33   pReader = (Fts3
ea90: 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c 69  SegReader *)sqli
eaa0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
eab0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 52 65 61  );.    if( !pRea
eac0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  der ){.      rc 
ead0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
eae0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eaf0: 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c   memset(pReader,
eb00: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
eb10: 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78 20    pReader->iIdx 
eb20: 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20  = 0x7FFFFFFF;.  
eb30: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70 4e      pReader->ppN
eb40: 65 78 74 45 6c 65 6d 20 3d 20 28 46 74 73 33 48  extElem = (Fts3H
eb50: 61 73 68 45 6c 65 6d 20 2a 2a 29 26 70 52 65 61  ashElem **)&pRea
eb60: 64 65 72 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65  der[1];.      me
eb70: 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 70 70  mcpy(pReader->pp
eb80: 4e 65 78 74 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c  NextElem, aElem,
eb90: 20 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74   nElem*sizeof(Ft
eba0: 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a  s3HashElem *));.
ebb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
ebc0: 20 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20   bPrefix ){.    
ebd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 45 6c  sqlite3_free(aEl
ebe0: 65 6d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65  em);.  }.  *ppRe
ebf0: 61 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b 0a  ader = pReader;.
ec00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ec10: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
ec20: 65 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 65  e entries pointe
ec30: 64 20 74 6f 20 62 79 20 74 77 6f 20 46 74 73 33  d to by two Fts3
ec40: 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74  SegReader struct
ec50: 75 72 65 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72  ures. .** Compar
ec60: 69 73 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ison is as follo
ec70: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45  ws:.**.**   1) E
ec80: 4f 46 20 69 73 20 67 72 65 61 74 65 72 20 74 68  OF is greater th
ec90: 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  an not EOF..**.*
eca0: 2a 20 20 20 32 29 20 54 68 65 20 63 75 72 72 65  *   2) The curre
ecb0: 6e 74 20 74 65 72 6d 73 20 28 69 66 20 61 6e 79  nt terms (if any
ecc0: 29 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 75  ) are compared u
ecd0: 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49  sing memcmp(). I
ece0: 66 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 74 65  f one.**      te
ecf0: 72 6d 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  rm is a prefix o
ed00: 66 20 61 6e 6f 74 68 65 72 2c 20 74 68 65 20 6c  f another, the l
ed10: 6f 6e 67 65 72 20 74 65 72 6d 20 69 73 20 63 6f  onger term is co
ed20: 6e 73 69 64 65 72 65 64 20 74 68 65 0a 2a 2a 20  nsidered the.** 
ed30: 20 20 20 20 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a       larger..**.
ed40: 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65  **   3) By segme
ed50: 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72  nt age. An older
ed60: 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73   segment is cons
ed70: 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a  idered larger..*
ed80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ed90: 33 53 65 67 52 65 61 64 65 72 43 6d 70 28 46 74  3SegReaderCmp(Ft
eda0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68  s3SegReader *pLh
edb0: 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  s, Fts3SegReader
edc0: 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72   *pRhs){.  int r
edd0: 63 3b 0a 20 20 69 66 28 20 70 4c 68 73 2d 3e 61  c;.  if( pLhs->a
ede0: 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e  Node && pRhs->aN
edf0: 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
ee00: 63 32 20 3d 20 70 4c 68 73 2d 3e 6e 54 65 72 6d  c2 = pLhs->nTerm
ee10: 20 2d 20 70 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a   - pRhs->nTerm;.
ee20: 20 20 20 20 69 66 28 20 72 63 32 3c 30 20 29 7b      if( rc2<0 ){
ee30: 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63  .      rc = memc
ee40: 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20  mp(pLhs->zTerm, 
ee50: 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68  pRhs->zTerm, pLh
ee60: 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d  s->nTerm);.    }
ee70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
ee80: 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54   memcmp(pLhs->zT
ee90: 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d  erm, pRhs->zTerm
eea0: 2c 20 70 52 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a  , pRhs->nTerm);.
eeb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
eec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
eed0: 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
eee0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 28  else{.    rc = (
eef0: 70 4c 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20  pLhs->aNode==0) 
ef00: 2d 20 28 70 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d  - (pRhs->aNode==
ef10: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
ef20: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
ef30: 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68  pRhs->iIdx - pLh
ef40: 73 2d 3e 69 49 64 78 3b 0a 20 20 7d 0a 20 20 61  s->iIdx;.  }.  a
ef50: 73 73 65 72 74 28 20 72 63 21 3d 30 20 29 3b 0a  ssert( rc!=0 );.
ef60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ef70: 2f 2a 0a 2a 2a 20 41 20 64 69 66 66 65 72 65 6e  /*.** A differen
ef80: 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  t comparison fun
ef90: 63 74 69 6f 6e 20 66 6f 72 20 53 65 67 52 65 61  ction for SegRea
efa0: 64 65 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  der structures. 
efb0: 49 6e 20 74 68 69 73 0a 2a 2a 20 76 65 72 73 69  In this.** versi
efc0: 6f 6e 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  on, it is assume
efd0: 64 20 74 68 61 74 20 65 61 63 68 20 53 65 67 52  d that each SegR
efe0: 65 61 64 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  eader points to 
eff0: 61 6e 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 61  an entry in.** a
f000: 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 69 64 65   doclist for ide
f010: 6e 74 69 63 61 6c 20 74 65 72 6d 73 2e 20 43 6f  ntical terms. Co
f020: 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
f030: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
f040: 2a 2a 20 20 20 31 29 20 45 4f 46 20 28 65 6e 64  **   1) EOF (end
f050: 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 74   of doclist in t
f060: 68 69 73 20 63 61 73 65 29 20 69 73 20 67 72 65  his case) is gre
f070: 61 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f  ater than not EO
f080: 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79  F..**.**   2) By
f090: 20 63 75 72 72 65 6e 74 20 64 6f 63 69 64 2e 0a   current docid..
f0a0: 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20 73 65  **.**   3) By se
f0b0: 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c  gment age. An ol
f0c0: 64 65 72 20 73 65 67 6d 65 6e 74 20 69 73 20 63  der segment is c
f0d0: 6f 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65 72  onsidered larger
f0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f0f0: 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
f100: 6c 69 73 74 43 6d 70 28 46 74 73 33 53 65 67 52  listCmp(Fts3SegR
f110: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73  eader *pLhs, Fts
f120: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73  3SegReader *pRhs
f130: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70  ){.  int rc = (p
f140: 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Lhs->pOffsetList
f150: 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66  ==0)-(pRhs->pOff
f160: 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69  setList==0);.  i
f170: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
f180: 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64  if( pLhs->iDocid
f190: 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29  ==pRhs->iDocid )
f1a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68  {.      rc = pRh
f1b0: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e  s->iIdx - pLhs->
f1c0: 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iIdx;.    }else{
f1d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68  .      rc = (pLh
f1e0: 73 2d 3e 69 44 6f 63 69 64 20 3e 20 70 52 68 73  s->iDocid > pRhs
f1f0: 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20  ->iDocid) ? 1 : 
f200: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
f210: 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e  assert( pLhs->aN
f220: 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f  ode && pRhs->aNo
f230: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  de );.  return r
f240: 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
f250: 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
f260: 6c 69 73 74 43 6d 70 52 65 76 28 46 74 73 33 53  listCmpRev(Fts3S
f270: 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20  egReader *pLhs, 
f280: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
f290: 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Rhs){.  int rc =
f2a0: 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c   (pLhs->pOffsetL
f2b0: 69 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70  ist==0)-(pRhs->p
f2c0: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a  OffsetList==0);.
f2d0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
f2e0: 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f     if( pLhs->iDo
f2f0: 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69  cid==pRhs->iDoci
f300: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
f310: 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68  pRhs->iIdx - pLh
f320: 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c  s->iIdx;.    }el
f330: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  se{.      rc = (
f340: 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3c 20 70  pLhs->iDocid < p
f350: 52 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31  Rhs->iDocid) ? 1
f360: 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   : -1;.    }.  }
f370: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 68 73 2d  .  assert( pLhs-
f380: 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e  >aNode && pRhs->
f390: 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72  aNode );.  retur
f3a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
f3b0: 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20  ompare the term 
f3c0: 74 68 61 74 20 74 68 65 20 46 74 73 33 53 65 67  that the Fts3Seg
f3d0: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61  Reader object pa
f3e0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
f3f0: 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f  t argument.** po
f400: 69 6e 74 73 20 74 6f 20 77 69 74 68 20 74 68 65  ints to with the
f410: 20 74 65 72 6d 20 73 70 65 63 69 66 69 65 64 20   term specified 
f420: 62 79 20 61 72 67 75 6d 65 6e 74 73 20 7a 54 65  by arguments zTe
f430: 72 6d 20 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a  rm and nTerm. .*
f440: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 67  *.** If the pSeg
f450: 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 6c 72   iterator is alr
f460: 65 61 64 79 20 61 74 20 45 4f 46 2c 20 72 65 74  eady at EOF, ret
f470: 75 72 6e 20 30 2e 20 4f 74 68 65 72 77 69 73 65  urn 0. Otherwise
f480: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20  , return.** -ve 
f490: 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d  if the pSeg term
f4a0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 54   is less than zT
f4b0: 65 72 6d 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20  erm/nTerm, 0 if 
f4c0: 74 68 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72  the two terms ar
f4d0: 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b  e.** equal, or +
f4e0: 76 65 20 69 66 20 74 68 65 20 70 53 65 67 20 74  ve if the pSeg t
f4f0: 65 72 6d 20 69 73 20 67 72 65 61 74 65 72 20 74  erm is greater t
f500: 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e  han zTerm/nTerm.
f510: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
f520: 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d  ts3SegReaderTerm
f530: 43 6d 70 28 0a 20 20 46 74 73 33 53 65 67 52 65  Cmp(.  Fts3SegRe
f540: 61 64 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20  ader *pSeg,     
f550: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
f560: 74 20 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20  t reader object 
f570: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
f580: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
f590: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
f5a0: 63 6f 6d 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20  compare to */.  
f5b0: 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20  int nTerm       
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
f5e0: 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
f5f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  /.){.  int res =
f600: 20 30 3b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e   0;.  if( pSeg->
f610: 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  aNode ){.    if(
f620: 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65   pSeg->nTerm>nTe
f630: 72 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  rm ){.      res 
f640: 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a  = memcmp(pSeg->z
f650: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
f660: 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rm);.    }else{.
f670: 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
f680: 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20  mp(pSeg->zTerm, 
f690: 7a 54 65 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65  zTerm, pSeg->nTe
f6a0: 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rm);.    }.    i
f6b0: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f6c0: 20 20 20 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e     res = pSeg->n
f6d0: 54 65 72 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20  Term-nTerm;.    
f6e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
f6f0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  es;.}../*.** Arg
f700: 75 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e 74 20  ument apSegment 
f710: 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  is an array of n
f720: 53 65 67 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73  Segment elements
f730: 2e 20 49 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68  . It is known th
f740: 61 74 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  at.** the final 
f750: 28 6e 53 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65  (nSegment-nSuspe
f760: 63 74 29 20 6d 65 6d 62 65 72 73 20 61 72 65 20  ct) members are 
f770: 61 6c 72 65 61 64 79 20 69 6e 20 73 6f 72 74 65  already in sorte
f780: 64 20 6f 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f  d order.** (acco
f790: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
f7a0: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
f7b0: 20 70 72 6f 76 69 64 65 64 29 2e 20 54 68 69 73   provided). This
f7c0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c   function shuffl
f7d0: 65 73 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  es.** the array 
f7e0: 61 72 6f 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c  around until all
f7f0: 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
f800: 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f  sorted order..*/
f810: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f820: 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 0a  3SegReaderSort(.
f830: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
f840: 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20  **apSegment,    
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 73 6f 72   /* Array to sor
f870: 74 20 65 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a  t entries of */.
f880: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20    int nSegment, 
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53 65   /* Size of apSe
f8c0: 67 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  gment array */. 
f8d0: 20 69 6e 74 20 6e 53 75 73 70 65 63 74 2c 20 20   int nSuspect,  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 2f 2a 20 55 6e 73 6f 72 74 65 64 20 65 6e 74 72  /* Unsorted entr
f910: 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74  y count */.  int
f920: 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67   (*xCmp)(Fts3Seg
f930: 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65  Reader *, Fts3Se
f940: 67 52 65 61 64 65 72 20 2a 29 20 20 2f 2a 20 43  gReader *)  /* C
f950: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
f960: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  on */.){.  int i
f970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
f990: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
f9a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53  */..  assert( nS
f9b0: 75 73 70 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74  uspect<=nSegment
f9c0: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53 75 73 70   );..  if( nSusp
f9d0: 65 63 74 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20  ect==nSegment ) 
f9e0: 6e 53 75 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f  nSuspect--;.  fo
f9f0: 72 28 69 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20  r(i=nSuspect-1; 
fa00: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
fa10: 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a  int j;.    for(j
fa20: 3d 69 3b 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d  =i; j<(nSegment-
fa30: 31 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  1); j++){.      
fa40: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
fa50: 54 6d 70 3b 0a 20 20 20 20 20 20 69 66 28 20 78  Tmp;.      if( x
fa60: 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d  Cmp(apSegment[j]
fa70: 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d  , apSegment[j+1]
fa80: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )<0 ) break;.   
fa90: 20 20 20 70 54 6d 70 20 3d 20 61 70 53 65 67 6d     pTmp = apSegm
faa0: 65 6e 74 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20  ent[j+1];.      
fab0: 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d  apSegment[j+1] =
fac0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20   apSegment[j];. 
fad0: 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a       apSegment[j
fae0: 5d 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a  ] = pTmp;.    }.
faf0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
fb00: 42 55 47 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  BUG.  /* Check t
fb10: 68 61 74 20 74 68 65 20 6c 69 73 74 20 72 65 61  hat the list rea
fb20: 6c 6c 79 20 69 73 20 73 6f 72 74 65 64 20 6e 6f  lly is sorted no
fb30: 77 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  w. */.  for(i=0;
fb40: 20 69 3c 28 6e 53 75 73 70 65 63 74 2d 31 29 3b   i<(nSuspect-1);
fb50: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
fb60: 74 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65 6e  t( xCmp(apSegmen
fb70: 74 5b 69 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b  t[i], apSegment[
fb80: 69 2b 31 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23  i+1])<0 );.  }.#
fb90: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
fba0: 49 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64 20  Insert a record 
fbb0: 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d 65  into the %_segme
fbc0: 6e 74 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  nts table..*/.st
fbd0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72 69  atic int fts3Wri
fbe0: 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73  teSegment(.  Fts
fbf0: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc10: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
fc20: 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
fc30: 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20  3_int64 iBlock, 
fc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
fc50: 63 6b 20 69 64 20 66 6f 72 20 6e 65 77 20 62 6c  ck id for new bl
fc60: 6f 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ock */.  char *z
fc70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
fc90: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
fca0: 6e 74 61 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64  ntaining block d
fcb0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  ata */.  int n  
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fce0: 20 6f 66 20 62 75 66 66 65 72 20 7a 20 69 6e 20   of buffer z in 
fcf0: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  bytes */.){.  sq
fd00: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
fd10: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74  t;.  int rc = ft
fd20: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
fd30: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53  _INSERT_SEGMENTS
fd40: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
fd50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fd60: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
fd70: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
fd80: 74 2c 20 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20  t, 1, iBlock);. 
fd90: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
fda0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a  blob(pStmt, 2, z
fdb0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
fdc0: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
fdd0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
fde0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
fdf0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
fe00: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
fe10: 6c 6c 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  ll(pStmt, 2);.  
fe20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fe30: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
fe40: 20 6c 61 72 67 65 73 74 20 72 65 6c 61 74 69 76   largest relativ
fe50: 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 69  e level number i
fe60: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  n the table. If 
fe70: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 0a  successful, set.
fe80: 2a 2a 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 69  ** *pnMax to thi
fe90: 73 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  s value and retu
fea0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
feb0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
fec0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
fed0: 73 65 74 20 2a 70 6e 4d 61 78 20 74 6f 20 7a 65  set *pnMax to ze
fee0: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ro and return an
fef0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
ff00: 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
ff10: 65 33 46 74 73 33 4d 61 78 4c 65 76 65 6c 28 46  e3Fts3MaxLevel(F
ff20: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74  ts3Table *p, int
ff30: 20 2a 70 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20   *pnMax){.  int 
ff40: 72 63 3b 0a 20 20 69 6e 74 20 6d 78 4c 65 76 65  rc;.  int mxLeve
ff50: 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
ff60: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
ff70: 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  ;..  rc = fts3Sq
ff80: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
ff90: 45 43 54 5f 4d 58 4c 45 56 45 4c 2c 20 26 70 53  ECT_MXLEVEL, &pS
ffa0: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
ffb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ffc0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
ffd0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
ffe0: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
fff0: 20 6d 78 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74   mxLevel = sqlit
10000 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
10010 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
10020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10030 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
10040 7d 0a 20 20 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c  }.  *pnMax = mxL
10050 65 76 65 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72  evel;.  return r
10060 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73  c;.}../* .** Ins
10070 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ert a record int
10080 6f 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  o the %_segdir t
10090 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
100a0 69 6e 74 20 66 74 73 33 57 72 69 74 65 53 65 67  int fts3WriteSeg
100b0 64 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65  dir(.  Fts3Table
100c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
100d0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
100e0 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
100f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
10100 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  4 iLevel,       
10110 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
10120 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64 20 28   "level" field (
10130 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 29 20  absolute level) 
10140 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
10170 72 20 22 69 64 78 22 20 66 69 65 6c 64 20 2a 2f  r "idx" field */
10180 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
10190 20 69 53 74 61 72 74 42 6c 6f 63 6b 2c 20 20 20   iStartBlock,   
101a0 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
101b0 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 66 69  "start_block" fi
101c0 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
101d0 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42  _int64 iLeafEndB
101e0 6c 6f 63 6b 2c 20 20 20 20 2f 2a 20 56 61 6c 75  lock,    /* Valu
101f0 65 20 66 6f 72 20 22 6c 65 61 76 65 73 5f 65 6e  e for "leaves_en
10200 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a  d_block" field *
10210 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
10220 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20  4 iEndBlock,    
10230 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
10240 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
10250 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ld */.  sqlite3_
10260 69 6e 74 36 34 20 6e 4c 65 61 66 44 61 74 61 2c  int64 nLeafData,
10270 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
10280 20 6f 66 20 6c 65 61 66 20 64 61 74 61 20 69 6e   of leaf data in
10290 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 68   segment */.  ch
102a0 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102c0 20 42 6c 6f 62 20 76 61 6c 75 65 20 66 6f 72 20   Blob value for 
102d0 22 72 6f 6f 74 22 20 66 69 65 6c 64 20 2a 2f 0a  "root" field */.
102e0 20 20 69 6e 74 20 6e 52 6f 6f 74 20 20 20 20 20    int nRoot     
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
10310 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 7a  ytes in buffer z
10320 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  Root */.){.  sql
10330 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
10340 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
10350 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
10360 49 4e 53 45 52 54 5f 53 45 47 44 49 52 2c 20 26  INSERT_SEGDIR, &
10370 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
10380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
103a0 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
103b0 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  1, iLevel);.    
103c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
103d0 28 70 53 74 6d 74 2c 20 32 2c 20 69 49 64 78 29  (pStmt, 2, iIdx)
103e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
103f0 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
10400 33 2c 20 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b  3, iStartBlock);
10410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
10420 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 34  d_int64(pStmt, 4
10430 2c 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 29  , iLeafEndBlock)
10440 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 44  ;.    if( nLeafD
10450 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
10460 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
10470 36 34 28 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e  64(pStmt, 5, iEn
10480 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c  dBlock);.    }el
10490 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
104a0 7a 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zEnd = sqlite3_m
104b0 70 72 69 6e 74 66 28 22 25 6c 6c 64 20 25 6c 6c  printf("%lld %ll
104c0 64 22 2c 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 6e  d", iEndBlock, n
104d0 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20  LeafData);.     
104e0 20 69 66 28 20 21 7a 45 6e 64 20 29 20 72 65 74   if( !zEnd ) ret
104f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10510 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
10520 20 35 2c 20 7a 45 6e 64 2c 20 2d 31 2c 20 73 71   5, zEnd, -1, sq
10530 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
10540 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
10550 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
10560 36 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c  6, zRoot, nRoot,
10570 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
10580 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
10590 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63  p(pStmt);.    rc
105a0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
105b0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
105c0 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
105d0 53 74 6d 74 2c 20 36 29 3b 0a 20 20 7d 0a 20 20  Stmt, 6);.  }.  
105e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
105f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
10600 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f  ize of the commo
10610 6e 20 70 72 65 66 69 78 20 28 69 66 20 61 6e 79  n prefix (if any
10620 29 20 73 68 61 72 65 64 20 62 79 20 7a 50 72 65  ) shared by zPre
10630 76 20 61 6e 64 0a 2a 2a 20 7a 4e 65 78 74 2c 20  v and.** zNext, 
10640 69 6e 20 62 79 74 65 73 2e 20 46 6f 72 20 65 78  in bytes. For ex
10650 61 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a 2a 20 20 20  ample, .**.**   
10660 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
10670 73 73 28 22 61 62 63 22 2c 20 33 2c 20 22 61 62  ss("abc", 3, "ab
10680 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72  cdef", 6)   // r
10690 65 74 75 72 6e 73 20 33 0a 2a 2a 20 20 20 66 74  eturns 3.**   ft
106a0 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
106b0 28 22 61 62 58 22 2c 20 33 2c 20 22 61 62 63 64  ("abX", 3, "abcd
106c0 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74  ef", 6)   // ret
106d0 75 72 6e 73 20 32 0a 2a 2a 20 20 20 66 74 73 33  urns 2.**   fts3
106e0 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22  PrefixCompress("
106f0 61 62 58 22 2c 20 33 2c 20 22 58 62 63 64 65 66  abX", 3, "Xbcdef
10700 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72  ", 6)   // retur
10710 6e 73 20 30 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ns 0.*/.static i
10720 6e 74 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d  nt fts3PrefixCom
10730 70 72 65 73 73 28 0a 20 20 63 6f 6e 73 74 20 63  press(.  const c
10740 68 61 72 20 2a 7a 50 72 65 76 2c 20 20 20 20 20  har *zPrev,     
10750 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
10760 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  er containing pr
10770 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20  evious term */. 
10780 20 69 6e 74 20 6e 50 72 65 76 2c 20 20 20 20 20   int nPrev,     
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
107b0 65 72 20 7a 50 72 65 76 20 69 6e 20 62 79 74 65  er zPrev in byte
107c0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
107d0 72 20 2a 7a 4e 65 78 74 2c 20 20 20 20 20 20 20  r *zNext,       
107e0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
107f0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 65 78 74   containing next
10800 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   term */.  int n
10810 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
10820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10830 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 4e 65  ze of buffer zNe
10840 78 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  xt in bytes */.)
10850 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 55 4e 55  {.  int n;.  UNU
10860 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e  SED_PARAMETER(nN
10870 65 78 74 29 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  ext);.  for(n=0;
10880 20 6e 3c 6e 50 72 65 76 20 26 26 20 7a 50 72 65   n<nPrev && zPre
10890 76 5b 6e 5d 3d 3d 7a 4e 65 78 74 5b 6e 5d 3b 20  v[n]==zNext[n]; 
108a0 6e 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  n++);.  return n
108b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
108c0 65 72 6d 20 7a 54 65 72 6d 20 74 6f 20 74 68 65  erm zTerm to the
108d0 20 53 65 67 6d 65 6e 74 4e 6f 64 65 2e 20 49 74   SegmentNode. It
108e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
108f0 68 61 74 20 7a 54 65 72 6d 20 69 73 20 6c 61 72  hat zTerm is lar
10900 67 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e  ger.** (accordin
10910 67 20 74 6f 20 6d 65 6d 63 6d 70 29 20 74 68 61  g to memcmp) tha
10920 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  n the previous t
10930 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erm..*/.static i
10940 6e 74 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65  nt fts3NodeAddTe
10950 72 6d 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  rm(.  Fts3Table 
10960 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
10970 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
10980 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
10990 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a  .  SegmentNode *
109a0 2a 70 70 54 72 65 65 2c 20 20 20 20 20 20 20 20  *ppTree,        
109b0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65     /* IN/OUT: Se
109c0 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65  gmentNode handle
109d0 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f 70   */ .  int isCop
109e0 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  yTerm,          
109f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
10a00 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 69 73  f zTerm/nTerm is
10a10 20 74 72 61 6e 73 69 65 6e 74 20 2a 2f 0a 20 20   transient */.  
10a20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
10a30 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
10a40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
10a50 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
10a60 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  term */.  int nT
10a70 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
10a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10a90 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74  e of term in byt
10aa0 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 67 6d 65  es */.){.  Segme
10ab0 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 20 3d 20  ntNode *pTree = 
10ac0 2a 70 70 54 72 65 65 3b 0a 20 20 69 6e 74 20 72  *ppTree;.  int r
10ad0 63 3b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  c;.  SegmentNode
10ae0 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 46 69   *pNew;..  /* Fi
10af0 72 73 74 20 74 72 79 20 74 6f 20 61 70 70 65 6e  rst try to appen
10b00 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74 68  d the term to th
10b10 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20  e current node. 
10b20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
10b30 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 6f  .  ** this is po
10b40 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  ssible..  */.  i
10b50 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20  f( pTree ){.    
10b60 69 6e 74 20 6e 44 61 74 61 20 3d 20 70 54 72 65  int nData = pTre
10b70 65 2d 3e 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a  e->nData;     /*
10b80 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   Current size of
10b90 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a   node in bytes *
10ba0 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d  /.    int nReq =
10bb0 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
10bc0 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
10bd0 73 70 61 63 65 20 61 66 74 65 72 20 61 64 64 69  space after addi
10be0 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 20 20  ng zTerm */.    
10bf0 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20  int nPrefix;    
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c10 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10c20 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72   of prefix compr
10c30 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  ession */.    in
10c40 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20  t nSuffix;      
10c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10c60 75 66 66 69 78 20 6c 65 6e 67 74 68 20 2a 2f 0a  uffix length */.
10c70 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66  .    nPrefix = f
10c80 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
10c90 73 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20  s(pTree->zTerm, 
10ca0 70 54 72 65 65 2d 3e 6e 54 65 72 6d 2c 20 7a 54  pTree->nTerm, zT
10cb0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
10cc0 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
10cd0 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 20 20 6e  -nPrefix;..    n
10ce0 52 65 71 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Req += sqlite3Ft
10cf0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65  s3VarintLen(nPre
10d00 66 69 78 29 2b 73 71 6c 69 74 65 33 46 74 73 33  fix)+sqlite3Fts3
10d10 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69  VarintLen(nSuffi
10d20 78 29 2b 6e 53 75 66 66 69 78 3b 0a 20 20 20 20  x)+nSuffix;.    
10d30 69 66 28 20 6e 52 65 71 3c 3d 70 2d 3e 6e 4e 6f  if( nReq<=p->nNo
10d40 64 65 53 69 7a 65 20 7c 7c 20 21 70 54 72 65 65  deSize || !pTree
10d50 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20 20 20 20  ->zTerm ){..    
10d60 20 20 69 66 28 20 6e 52 65 71 3e 70 2d 3e 6e 4e    if( nReq>p->nN
10d70 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  odeSize ){.     
10d80 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 75 61 6c     /* An unusual
10d90 20 63 61 73 65 3a 20 74 68 69 73 20 69 73 20 74   case: this is t
10da0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f  he first term to
10db0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
10dc0 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 2a 2a   node.        **
10dd0 20 61 6e 64 20 74 68 65 20 73 74 61 74 69 63 20   and the static 
10de0 6e 6f 64 65 20 62 75 66 66 65 72 20 28 70 2d 3e  node buffer (p->
10df0 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73 29  nNodeSize bytes)
10e00 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 0a 20 20   is not large.  
10e10 20 20 20 20 20 20 2a 2a 20 65 6e 6f 75 67 68 2e        ** enough.
10e20 20 55 73 65 20 61 20 73 65 70 61 72 61 74 65 6c   Use a separatel
10e30 79 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65  y malloced buffe
10e40 72 20 69 6e 73 74 65 61 64 20 54 68 69 73 20 77  r instead This w
10e50 61 73 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  astes.        **
10e60 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79   p->nNodeSize by
10e70 74 65 73 2c 20 62 75 74 20 73 69 6e 63 65 20 74  tes, but since t
10e80 68 69 73 20 73 63 65 6e 61 72 69 6f 20 6f 6e 6c  his scenario onl
10e90 79 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68  y comes about wh
10ea0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
10eb0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
10ec0 69 6e 20 74 77 6f 20 74 65 72 6d 73 20 74 68 61  in two terms tha
10ed0 74 20 73 68 61 72 65 20 61 20 70 72 65 66 69 78  t share a prefix
10ee0 20 6f 66 20 61 6c 6d 6f 73 74 20 32 4b 42 2c 20   of almost 2KB, 
10ef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73  .        ** this
10f00 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64   is not expected
10f10 20 74 6f 20 62 65 20 61 20 73 65 72 69 6f 75 73   to be a serious
10f20 20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20 20 20 20   problem. .     
10f30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
10f40 73 65 72 74 28 20 70 54 72 65 65 2d 3e 61 44 61  sert( pTree->aDa
10f50 74 61 3d 3d 28 63 68 61 72 20 2a 29 26 70 54 72  ta==(char *)&pTr
10f60 65 65 5b 31 5d 20 29 3b 0a 20 20 20 20 20 20 20  ee[1] );.       
10f70 20 70 54 72 65 65 2d 3e 61 44 61 74 61 20 3d 20   pTree->aData = 
10f80 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
10f90 6d 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a 20 20  malloc(nReq);.  
10fa0 20 20 20 20 20 20 69 66 28 20 21 70 54 72 65 65        if( !pTree
10fb0 2d 3e 61 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ->aData ){.     
10fc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10fd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10fe0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
10ff0 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e 7a 54     if( pTree->zT
11000 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  erm ){.        /
11010 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72  * There is no pr
11020 65 66 69 78 2d 6c 65 6e 67 74 68 20 66 69 65 6c  efix-length fiel
11030 64 20 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d  d for first term
11040 20 69 6e 20 61 20 6e 6f 64 65 20 2a 2f 0a 20 20   in a node */.  
11050 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73        nData += s
11060 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
11070 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74  int(&pTree->aDat
11080 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66 69  a[nData], nPrefi
11090 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
110a0 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69     nData += sqli
110b0 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
110c0 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e  (&pTree->aData[n
110d0 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b  Data], nSuffix);
110e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
110f0 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74  Tree->aData[nDat
11100 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66  a], &zTerm[nPref
11110 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20  ix], nSuffix);. 
11120 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 44 61 74       pTree->nDat
11130 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 53 75 66  a = nData + nSuf
11140 66 69 78 3b 0a 20 20 20 20 20 20 70 54 72 65 65  fix;.      pTree
11150 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a 20 20 20  ->nEntry++;..   
11160 20 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72     if( isCopyTer
11170 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  m ){.        if(
11180 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c   pTree->nMalloc<
11190 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  nTerm ){.       
111a0 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20     char *zNew = 
111b0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
111c0 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20  pTree->zMalloc, 
111d0 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20  nTerm*2);.      
111e0 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b      if( !zNew ){
111f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
11200 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11210 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11220 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e          pTree->n
11230 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32  Malloc = nTerm*2
11240 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 65  ;.          pTre
11250 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65  e->zMalloc = zNe
11260 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
11270 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65 72       pTree->zTer
11280 6d 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c  m = pTree->zMall
11290 6f 63 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  oc;.        memc
112a0 70 79 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c  py(pTree->zTerm,
112b0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
112c0 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e          pTree->n
112d0 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  Term = nTerm;.  
112e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
112f0 20 20 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20     pTree->zTerm 
11300 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b  = (char *)zTerm;
11310 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e  .        pTree->
11320 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20  nTerm = nTerm;. 
11330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
11340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11350 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
11360 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
11370 74 6f 20 68 65 72 65 2c 20 69 74 20 77 61 73 20  to here, it was 
11380 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
11390 61 70 70 65 6e 64 20 7a 54 65 72 6d 20 74 6f 20  append zTerm to 
113a0 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
113b0 20 6e 6f 64 65 2e 20 43 72 65 61 74 65 20 61 20   node. Create a 
113c0 6e 65 77 20 6e 6f 64 65 20 28 61 20 72 69 67 68  new node (a righ
113d0 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 74 68 65  t-sibling of the
113e0 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 29 2e 0a   current node)..
113f0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
11400 74 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20 69  the first node i
11410 6e 20 74 68 65 20 74 72 65 65 2c 20 74 68 65 20  n the tree, the 
11420 74 65 72 6d 20 69 73 20 61 64 64 65 64 20 74 6f  term is added to
11430 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f   it..  **.  ** O
11440 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 74 65  therwise, the te
11450 72 6d 20 69 73 20 6e 6f 74 20 61 64 64 65 64 20  rm is not added 
11460 74 6f 20 74 68 65 20 6e 65 77 20 6e 6f 64 65 2c  to the new node,
11470 20 69 74 20 69 73 20 6c 65 66 74 20 65 6d 70 74   it is left empt
11480 79 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 77 2e 20  y for.  ** now. 
11490 49 6e 73 74 65 61 64 2c 20 74 68 65 20 74 65 72  Instead, the ter
114a0 6d 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e  m is inserted in
114b0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  to the parent of
114c0 20 70 54 72 65 65 2e 20 49 66 20 70 54 72 65 65   pTree. If pTree
114d0 20 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 20 70 61   .  ** has no pa
114e0 72 65 6e 74 2c 20 6f 6e 65 20 69 73 20 63 72 65  rent, one is cre
114f0 61 74 65 64 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  ated here..  */.
11500 20 20 70 4e 65 77 20 3d 20 28 53 65 67 6d 65 6e    pNew = (Segmen
11510 74 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65 33 5f  tNode *)sqlite3_
11520 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65  malloc(sizeof(Se
11530 67 6d 65 6e 74 4e 6f 64 65 29 20 2b 20 70 2d 3e  gmentNode) + p->
11540 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 69 66  nNodeSize);.  if
11550 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 72  ( !pNew ){.    r
11560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11570 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
11580 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
11590 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 29 3b 0a  (SegmentNode));.
115a0 20 20 70 4e 65 77 2d 3e 6e 44 61 74 61 20 3d 20    pNew->nData = 
115b0 31 20 2b 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  1 + FTS3_VARINT_
115c0 4d 41 58 3b 0a 20 20 70 4e 65 77 2d 3e 61 44 61  MAX;.  pNew->aDa
115d0 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e  ta = (char *)&pN
115e0 65 77 5b 31 5d 3b 0a 0a 20 20 69 66 28 20 70 54  ew[1];..  if( pT
115f0 72 65 65 20 29 7b 0a 20 20 20 20 53 65 67 6d 65  ree ){.    Segme
11600 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 20  ntNode *pParent 
11610 3d 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74  = pTree->pParent
11620 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e  ;.    rc = fts3N
11630 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70  odeAddTerm(p, &p
11640 50 61 72 65 6e 74 2c 20 69 73 43 6f 70 79 54 65  Parent, isCopyTe
11650 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
11660 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 65 65  );.    if( pTree
11670 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a  ->pParent==0 ){.
11680 20 20 20 20 20 20 70 54 72 65 65 2d 3e 70 50 61        pTree->pPa
11690 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a  rent = pParent;.
116a0 20 20 20 20 7d 0a 20 20 20 20 70 54 72 65 65 2d      }.    pTree-
116b0 3e 70 52 69 67 68 74 20 3d 20 70 4e 65 77 3b 0a  >pRight = pNew;.
116c0 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d      pNew->pLeftm
116d0 6f 73 74 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65  ost = pTree->pLe
116e0 66 74 6d 6f 73 74 3b 0a 20 20 20 20 70 4e 65 77  ftmost;.    pNew
116f0 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
11700 65 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a  ent;.    pNew->z
11710 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e  Malloc = pTree->
11720 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4e 65  zMalloc;.    pNe
11730 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 70 54 72  w->nMalloc = pTr
11740 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20 20 20  ee->nMalloc;.   
11750 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20   pTree->zMalloc 
11760 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11770 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73    pNew->pLeftmos
11780 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 63  t = pNew;.    rc
11790 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65   = fts3NodeAddTe
117a0 72 6d 28 70 2c 20 26 70 4e 65 77 2c 20 69 73 43  rm(p, &pNew, isC
117b0 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  opyTerm, zTerm, 
117c0 6e 54 65 72 6d 29 3b 20 0a 20 20 7d 0a 0a 20 20  nTerm); .  }..  
117d0 2a 70 70 54 72 65 65 20 3d 20 70 4e 65 77 3b 0a  *ppTree = pNew;.
117e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
117f0 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
11800 63 74 69 6f 6e 20 66 6f 72 20 66 74 73 33 4e 6f  ction for fts3No
11810 64 65 57 72 69 74 65 28 29 2e 0a 2a 2f 0a 73 74  deWrite()..*/.st
11820 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 72 65  atic int fts3Tre
11830 65 46 69 6e 69 73 68 4e 6f 64 65 28 0a 20 20 53  eFinishNode(.  S
11840 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65  egmentNode *pTre
11850 65 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67 68  e, .  int iHeigh
11860 74 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  t, .  sqlite3_in
11870 74 36 34 20 69 4c 65 66 74 43 68 69 6c 64 0a 29  t64 iLeftChild.)
11880 7b 0a 20 20 69 6e 74 20 6e 53 74 61 72 74 3b 0a  {.  int nStart;.
11890 20 20 61 73 73 65 72 74 28 20 69 48 65 69 67 68    assert( iHeigh
118a0 74 3e 3d 31 20 26 26 20 69 48 65 69 67 68 74 3c  t>=1 && iHeight<
118b0 31 32 38 20 29 3b 0a 20 20 6e 53 74 61 72 74 20  128 );.  nStart 
118c0 3d 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  = FTS3_VARINT_MA
118d0 58 20 2d 20 73 71 6c 69 74 65 33 46 74 73 33 56  X - sqlite3Fts3V
118e0 61 72 69 6e 74 4c 65 6e 28 69 4c 65 66 74 43 68  arintLen(iLeftCh
118f0 69 6c 64 29 3b 0a 20 20 70 54 72 65 65 2d 3e 61  ild);.  pTree->a
11900 44 61 74 61 5b 6e 53 74 61 72 74 5d 20 3d 20 28  Data[nStart] = (
11910 63 68 61 72 29 69 48 65 69 67 68 74 3b 0a 20 20  char)iHeight;.  
11920 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
11930 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61  rint(&pTree->aDa
11940 74 61 5b 6e 53 74 61 72 74 2b 31 5d 2c 20 69 4c  ta[nStart+1], iL
11950 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 72 65 74  eftChild);.  ret
11960 75 72 6e 20 6e 53 74 61 72 74 3b 0a 7d 0a 0a 2f  urn nStart;.}../
11970 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 62  *.** Write the b
11980 75 66 66 65 72 20 66 6f 72 20 74 68 65 20 73 65  uffer for the se
11990 67 6d 65 6e 74 20 6e 6f 64 65 20 70 54 72 65 65  gment node pTree
119a0 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
119b0 70 65 65 72 73 20 74 6f 20 74 68 65 0a 2a 2a 20  peers to the.** 
119c0 64 61 74 61 62 61 73 65 2e 20 54 68 65 6e 20 63  database. Then c
119d0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
119e0 6e 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  n recursively to
119f0 20 77 72 69 74 65 20 74 68 65 20 70 61 72 65 6e   write the paren
11a00 74 20 6f 66 20 0a 2a 2a 20 70 54 72 65 65 20 61  t of .** pTree a
11a10 6e 64 20 69 74 73 20 70 65 65 72 73 20 74 6f 20  nd its peers to 
11a20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
11a30 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
11a40 70 54 72 65 65 20 69 73 20 61 20 72 6f 6f 74 20  pTree is a root 
11a50 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 77 72 69  node, do not wri
11a60 74 65 20 69 74 20 74 6f 20 74 68 65 20 64 61 74  te it to the dat
11a70 61 62 61 73 65 2e 20 49 6e 73 74 65 61 64 2c 0a  abase. Instead,.
11a80 2a 2a 20 73 65 74 20 6f 75 74 70 75 74 20 76 61  ** set output va
11a90 72 69 61 62 6c 65 73 20 2a 70 61 52 6f 6f 74 20  riables *paRoot 
11aa0 61 6e 64 20 2a 70 6e 52 6f 6f 74 20 74 6f 20 63  and *pnRoot to c
11ab0 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 6f 74 20  ontain the root 
11ac0 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  node..**.** If s
11ad0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
11ae0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11af0 20 61 6e 64 20 6f 75 74 70 75 74 20 76 61 72 69   and output vari
11b00 61 62 6c 65 20 2a 70 69 4c 61 73 74 20 69 73 0a  able *piLast is.
11b10 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  ** set to the la
11b20 72 67 65 73 74 20 62 6c 6f 63 6b 69 64 20 77 72  rgest blockid wr
11b30 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
11b40 61 62 61 73 65 20 28 6f 72 20 7a 65 72 6f 20 69  abase (or zero i
11b50 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b 73 20 77  f no.** blocks w
11b60 65 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ere written to t
11b70 68 65 20 64 62 29 2e 20 4f 74 68 65 72 77 69 73  he db). Otherwis
11b80 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
11b90 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
11ba0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
11bb0 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65 57  ic int fts3NodeW
11bc0 72 69 74 65 28 0a 20 20 46 74 73 33 54 61 62 6c  rite(.  Fts3Tabl
11bd0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
11be0 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
11bf0 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
11c00 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  */.  SegmentNode
11c10 20 2a 70 54 72 65 65 2c 20 20 20 20 20 20 20 20   *pTree,        
11c20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 4e       /* SegmentN
11c30 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ode handle */.  
11c40 69 6e 74 20 69 48 65 69 67 68 74 2c 20 20 20 20  int iHeight,    
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 74 68 69  /* Height of thi
11c70 73 20 6e 6f 64 65 20 69 6e 20 74 72 65 65 20 2a  s node in tree *
11c80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
11c90 34 20 69 4c 65 61 66 2c 20 20 20 20 20 20 20 20  4 iLeaf,        
11ca0 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20      /* Block id 
11cb0 6f 66 20 66 69 72 73 74 20 6c 65 61 66 20 6e 6f  of first leaf no
11cc0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
11cd0 69 6e 74 36 34 20 69 46 72 65 65 2c 20 20 20 20  int64 iFree,    
11ce0 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b          /* Block
11cf0 20 69 64 20 6f 66 20 6e 65 78 74 20 66 72 65 65   id of next free
11d00 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65   slot in %_segme
11d10 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nts */.  sqlite3
11d20 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73 74 2c 20  _int64 *piLast, 
11d30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
11d40 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6c 61 73   Block id of las
11d50 74 20 65 6e 74 72 79 20 77 72 69 74 74 65 6e 20  t entry written 
11d60 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 52 6f  */.  char **paRo
11d70 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
11d80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 61 74       /* OUT: Dat
11d90 61 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20  a for root node 
11da0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 6f 6f 74  */.  int *pnRoot
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
11dd0 65 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65 20 69  e of root node i
11de0 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
11df0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11e00 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 54 72 65  OK;..  if( !pTre
11e10 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  e->pParent ){.  
11e20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f    /* Root node o
11e30 66 20 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20  f the tree. */. 
11e40 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d 20     int nStart = 
11e50 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f  fts3TreeFinishNo
11e60 64 65 28 70 54 72 65 65 2c 20 69 48 65 69 67 68  de(pTree, iHeigh
11e70 74 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 2a  t, iLeaf);.    *
11e80 70 69 4c 61 73 74 20 3d 20 69 46 72 65 65 2d 31  piLast = iFree-1
11e90 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f 74 20 3d 20  ;.    *pnRoot = 
11ea0 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 2d 20 6e  pTree->nData - n
11eb0 53 74 61 72 74 3b 0a 20 20 20 20 2a 70 61 52 6f  Start;.    *paRo
11ec0 6f 74 20 3d 20 26 70 54 72 65 65 2d 3e 61 44 61  ot = &pTree->aDa
11ed0 74 61 5b 6e 53 74 61 72 74 5d 3b 0a 20 20 7d 65  ta[nStart];.  }e
11ee0 6c 73 65 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74  lse{.    Segment
11ef0 4e 6f 64 65 20 2a 70 49 74 65 72 3b 0a 20 20 20  Node *pIter;.   
11f00 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11f10 4e 65 78 74 46 72 65 65 20 3d 20 69 46 72 65 65  NextFree = iFree
11f20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
11f30 74 36 34 20 69 4e 65 78 74 4c 65 61 66 20 3d 20  t64 iNextLeaf = 
11f40 69 4c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 70  iLeaf;.    for(p
11f50 49 74 65 72 3d 70 54 72 65 65 2d 3e 70 4c 65 66  Iter=pTree->pLef
11f60 74 6d 6f 73 74 3b 20 70 49 74 65 72 20 26 26 20  tmost; pIter && 
11f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
11f80 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 52 69 67  Iter=pIter->pRig
11f90 68 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ht){.      int n
11fa0 53 74 61 72 74 20 3d 20 66 74 73 33 54 72 65 65  Start = fts3Tree
11fb0 46 69 6e 69 73 68 4e 6f 64 65 28 70 49 74 65 72  FinishNode(pIter
11fc0 2c 20 69 48 65 69 67 68 74 2c 20 69 4e 65 78 74  , iHeight, iNext
11fd0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 6e 74  Leaf);.      int
11fe0 20 6e 57 72 69 74 65 20 3d 20 70 49 74 65 72 2d   nWrite = pIter-
11ff0 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74 3b  >nData - nStart;
12000 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 66  .  .      rc = f
12010 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
12020 70 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 26 70  p, iNextFree, &p
12030 49 74 65 72 2d 3e 61 44 61 74 61 5b 6e 53 74 61  Iter->aData[nSta
12040 72 74 5d 2c 20 6e 57 72 69 74 65 29 3b 0a 20 20  rt], nWrite);.  
12050 20 20 20 20 69 4e 65 78 74 46 72 65 65 2b 2b 3b      iNextFree++;
12060 0a 20 20 20 20 20 20 69 4e 65 78 74 4c 65 61 66  .      iNextLeaf
12070 20 2b 3d 20 28 70 49 74 65 72 2d 3e 6e 45 6e 74   += (pIter->nEnt
12080 72 79 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ry+1);.    }.   
12090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
120a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
120b0 72 74 28 20 69 4e 65 78 74 4c 65 61 66 3d 3d 69  rt( iNextLeaf==i
120c0 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 72 63  Free );.      rc
120d0 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65   = fts3NodeWrite
120e0 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20 70  (.          p, p
120f0 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 2c 20 69  Tree->pParent, i
12100 48 65 69 67 68 74 2b 31 2c 20 69 46 72 65 65 2c  Height+1, iFree,
12110 20 69 4e 65 78 74 46 72 65 65 2c 20 70 69 4c 61   iNextFree, piLa
12120 73 74 2c 20 70 61 52 6f 6f 74 2c 20 70 6e 52 6f  st, paRoot, pnRo
12130 6f 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ot.      );.    
12140 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
12150 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
12160 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  e all memory all
12170 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
12180 74 65 64 20 77 69 74 68 20 74 68 65 20 74 72 65  ted with the tre
12190 65 20 70 54 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  e pTree..*/.stat
121a0 69 63 20 76 6f 69 64 20 66 74 73 33 4e 6f 64 65  ic void fts3Node
121b0 46 72 65 65 28 53 65 67 6d 65 6e 74 4e 6f 64 65  Free(SegmentNode
121c0 20 2a 70 54 72 65 65 29 7b 0a 20 20 69 66 28 20   *pTree){.  if( 
121d0 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65 67  pTree ){.    Seg
121e0 6d 65 6e 74 4e 6f 64 65 20 2a 70 20 3d 20 70 54  mentNode *p = pT
121f0 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a  ree->pLeftmost;.
12200 20 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65      fts3NodeFree
12210 28 70 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  (p->pParent);.  
12220 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
12230 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20      SegmentNode 
12240 2a 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  *pRight = p->pRi
12250 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
12260 2d 3e 61 44 61 74 61 21 3d 28 63 68 61 72 20 2a  ->aData!=(char *
12270 29 26 70 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20  )&p[1] ){.      
12280 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12290 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
122a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
122b0 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e  pRight==0 || p->
122c0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  zMalloc==0 );.  
122d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
122e0 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20  (p->zMalloc);.  
122f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12300 28 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70  (p);.      p = p
12310 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Right;.    }.  }
12320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
12330 74 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d  term to the segm
12340 65 6e 74 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  ent being constr
12350 75 63 74 65 64 20 62 79 20 74 68 65 20 53 65 67  ucted by the Seg
12360 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63  mentWriter objec
12370 74 0a 2a 2a 20 2a 70 70 57 72 69 74 65 72 2e 20  t.** *ppWriter. 
12380 57 68 65 6e 20 61 64 64 69 6e 67 20 74 68 65 20  When adding the 
12390 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20 61 20  first term to a 
123a0 73 65 67 6d 65 6e 74 2c 20 2a 70 70 57 72 69 74  segment, *ppWrit
123b0 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  er should.** be 
123c0 70 61 73 73 65 64 20 4e 55 4c 4c 2e 20 54 68 69  passed NULL. Thi
123d0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
123e0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  allocate a new S
123f0 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a  egmentWriter obj
12400 65 63 74 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ect.** and retur
12410 6e 20 69 74 20 76 69 61 20 74 68 65 20 69 6e 70  n it via the inp
12420 75 74 2f 6f 75 74 70 75 74 20 76 61 72 69 61 62  ut/output variab
12430 6c 65 20 2a 70 70 57 72 69 74 65 72 20 69 6e 20  le *ppWriter in 
12440 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
12450 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
12460 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
12470 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
12480 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
12490 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
124a0 63 20 69 6e 74 20 66 74 73 33 53 65 67 57 72 69  c int fts3SegWri
124b0 74 65 72 41 64 64 28 0a 20 20 46 74 73 33 54 61  terAdd(.  Fts3Ta
124c0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
124d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
124e0 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
124f0 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72  e */.  SegmentWr
12500 69 74 65 72 20 2a 2a 70 70 57 72 69 74 65 72 2c  iter **ppWriter,
12510 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
12520 3a 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  : SegmentWriter 
12530 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74  handle */ .  int
12540 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20 20 20   isCopyTerm,    
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12560 54 72 75 65 20 69 66 20 62 75 66 66 65 72 20 7a  True if buffer z
12570 54 65 72 6d 20 6d 75 73 74 20 62 65 20 63 6f 70  Term must be cop
12580 69 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ied */.  const c
12590 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
125a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
125b0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
125c0 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f  ntaining term */
125d0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
12600 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
12610 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f   const char *aDo
12620 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  clist,          
12630 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
12640 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
12650 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e   doclist */.  in
12660 74 20 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  t nDoclist      
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12680 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
12690 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
126a0 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20    int nPrefix;  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
126d0 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79 74 65  m prefix in byte
126e0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66  s */.  int nSuff
126f0 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
12700 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
12710 66 20 74 65 72 6d 20 73 75 66 66 69 78 20 69 6e  f term suffix in
12720 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
12730 6e 52 65 71 3b 20 20 20 20 20 20 20 20 20 20 20  nReq;           
12740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12750 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
12760 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20  equired on leaf 
12770 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  page */.  int nD
12780 61 74 61 3b 0a 20 20 53 65 67 6d 65 6e 74 57 72  ata;.  SegmentWr
12790 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20  iter *pWriter = 
127a0 2a 70 70 57 72 69 74 65 72 3b 0a 0a 20 20 69 66  *ppWriter;..  if
127b0 28 20 21 70 57 72 69 74 65 72 20 29 7b 0a 20 20  ( !pWriter ){.  
127c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71    int rc;.    sq
127d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
127e0 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  t;..    /* Alloc
127f0 61 74 65 20 74 68 65 20 53 65 67 6d 65 6e 74 57  ate the SegmentW
12800 72 69 74 65 72 20 73 74 72 75 63 74 75 72 65 20  riter structure 
12810 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72 20 3d  */.    pWriter =
12820 20 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20   (SegmentWriter 
12830 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
12840 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57  (sizeof(SegmentW
12850 72 69 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28  riter));.    if(
12860 20 21 70 57 72 69 74 65 72 20 29 20 72 65 74 75   !pWriter ) retu
12870 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12880 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69  .    memset(pWri
12890 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  ter, 0, sizeof(S
128a0 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29 3b 0a  egmentWriter));.
128b0 20 20 20 20 2a 70 70 57 72 69 74 65 72 20 3d 20      *ppWriter = 
128c0 70 57 72 69 74 65 72 3b 0a 0a 20 20 20 20 2f 2a  pWriter;..    /*
128d0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   Allocate a buff
128e0 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61  er in which to a
128f0 63 63 75 6d 75 6c 61 74 65 20 64 61 74 61 20 2a  ccumulate data *
12900 2f 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61  /.    pWriter->a
12910 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73  Data = (char *)s
12920 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d  qlite3_malloc(p-
12930 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20  >nNodeSize);.   
12940 20 69 66 28 20 21 70 57 72 69 74 65 72 2d 3e 61   if( !pWriter->a
12950 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51  Data ) return SQ
12960 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12970 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d  pWriter->nSize =
12980 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 3b 0a 0a   p->nNodeSize;..
12990 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
129a0 6e 65 78 74 20 66 72 65 65 20 62 6c 6f 63 6b 69  next free blocki
129b0 64 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  d in the %_segme
129c0 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  nts table */.   
129d0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
129e0 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45  t(p, SQL_NEXT_SE
129f0 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70 53 74 6d  GMENTS_ID, &pStm
12a00 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
12a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
12a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
12a30 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
12a40 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
12a50 29 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74  ) ){.      pWrit
12a60 65 72 2d 3e 69 46 72 65 65 20 3d 20 73 71 6c 69  er->iFree = sqli
12a70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
12a80 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
12a90 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73    pWriter->iFirs
12aa0 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 46 72  t = pWriter->iFr
12ab0 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ee;.    }.    rc
12ac0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
12ad0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
12ae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
12b00 20 20 6e 44 61 74 61 20 3d 20 70 57 72 69 74 65    nData = pWrite
12b10 72 2d 3e 6e 44 61 74 61 3b 0a 0a 20 20 6e 50 72  r->nData;..  nPr
12b20 65 66 69 78 20 3d 20 66 74 73 33 50 72 65 66 69  efix = fts3Prefi
12b30 78 43 6f 6d 70 72 65 73 73 28 70 57 72 69 74 65  xCompress(pWrite
12b40 72 2d 3e 7a 54 65 72 6d 2c 20 70 57 72 69 74 65  r->zTerm, pWrite
12b50 72 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  r->nTerm, zTerm,
12b60 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66   nTerm);.  nSuff
12b70 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66  ix = nTerm-nPref
12b80 69 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  ix;..  /* Figure
12b90 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
12ba0 74 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  tes are required
12bb0 20 62 79 20 74 68 69 73 20 6e 65 77 20 65 6e 74   by this new ent
12bc0 72 79 20 2a 2f 0a 20 20 6e 52 65 71 20 3d 20 73  ry */.  nReq = s
12bd0 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
12be0 4c 65 6e 28 6e 50 72 65 66 69 78 29 20 2b 20 20  Len(nPrefix) +  
12bf0 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74    /* varint cont
12c00 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69  aining prefix si
12c10 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
12c20 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
12c30 53 75 66 66 69 78 29 20 2b 20 20 20 20 20 20 20  Suffix) +       
12c40 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74    /* varint cont
12c50 61 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69  aining suffix si
12c60 7a 65 20 2a 2f 0a 20 20 20 20 6e 53 75 66 66 69  ze */.    nSuffi
12c70 78 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  x +             
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78    /* Term suffix
12ca0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 46   */.    sqlite3F
12cb0 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f  ts3VarintLen(nDo
12cc0 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20 20 20  clist) +        
12cd0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
12ce0 73 74 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69  st */.    nDocli
12cf0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74    /* Doclist dat
12d20 61 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 44 61 74  a */..  if( nDat
12d30 61 3e 30 20 26 26 20 6e 44 61 74 61 2b 6e 52 65  a>0 && nData+nRe
12d40 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29  q>p->nNodeSize )
12d50 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  {.    int rc;.. 
12d60 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
12d70 74 20 6c 65 61 66 20 6e 6f 64 65 20 69 73 20 66  t leaf node is f
12d80 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 6f 75  ull. Write it ou
12d90 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
12da0 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  e. */.    rc = f
12db0 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
12dc0 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65  p, pWriter->iFre
12dd0 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44  e++, pWriter->aD
12de0 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  ata, nData);.   
12df0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12e00 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
12e10 20 20 20 20 70 2d 3e 6e 4c 65 61 66 41 64 64 2b      p->nLeafAdd+
12e20 2b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  +;..    /* Add t
12e30 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
12e40 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  to the interior 
12e50 6e 6f 64 65 20 74 72 65 65 2e 20 54 68 65 20 74  node tree. The t
12e60 65 72 6d 20 61 64 64 65 64 20 74 6f 0a 20 20 20  erm added to.   
12e70 20 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72   ** the interior
12e80 20 74 72 65 65 20 6d 75 73 74 3a 0a 20 20 20 20   tree must:.    
12e90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62  **.    **   a) b
12ea0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  e greater than t
12eb0 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
12ec0 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  on the leaf node
12ed0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20   just written.  
12ee0 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65    **      to the
12ef0 20 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c   database (still
12f00 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 57   available in pW
12f10 72 69 74 65 72 2d 3e 7a 54 65 72 6d 29 2c 20 61  riter->zTerm), a
12f20 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  nd.    **.    **
12f30 20 20 20 62 29 20 62 65 20 6c 65 73 73 20 74 68     b) be less th
12f40 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
12f50 68 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74 6f  he term about to
12f60 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
12f70 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20 20   new.    **     
12f80 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65 72   leaf node (zTer
12f90 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a  m/nTerm)..    **
12fa0 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72  .    ** In other
12fb0 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74 20   words, it must 
12fc0 62 65 20 74 68 65 20 70 72 65 66 69 78 20 6f 66  be the prefix of
12fd0 20 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c 6f   zTerm 1 byte lo
12fe0 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  nger than.    **
12ff0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66   the common pref
13000 69 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20 7a  ix (if any) of z
13010 54 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65 72  Term and pWriter
13020 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a  ->zTerm..    */.
13030 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
13040 66 69 78 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20  fix<nTerm );.   
13050 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64   rc = fts3NodeAd
13060 64 54 65 72 6d 28 70 2c 20 26 70 57 72 69 74 65  dTerm(p, &pWrite
13070 72 2d 3e 70 54 72 65 65 2c 20 69 73 43 6f 70 79  r->pTree, isCopy
13080 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 50 72  Term, zTerm, nPr
13090 65 66 69 78 2b 31 29 3b 0a 20 20 20 20 69 66 28  efix+1);.    if(
130a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
130b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
130c0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   nData = 0;.    
130d0 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d  pWriter->nTerm =
130e0 20 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66 69 78   0;..    nPrefix
130f0 20 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66 66 69   = 0;.    nSuffi
13100 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e  x = nTerm;.    n
13110 52 65 71 20 3d 20 31 20 2b 20 20 20 20 20 20 20  Req = 1 +       
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74         /* varint
13140 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66   containing pref
13150 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ix size */.     
13160 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
13170 6e 74 4c 65 6e 28 6e 54 65 72 6d 29 20 2b 20 20  ntLen(nTerm) +  
13180 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74         /* varint
13190 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66   containing suff
131a0 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ix size */.     
131b0 20 6e 54 65 72 6d 20 2b 20 20 20 20 20 20 20 20   nTerm +        
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131d0 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73         /* Term s
131e0 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 73  uffix */.      s
131f0 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
13200 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20  Len(nDoclist) + 
13210 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
13220 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  doclist */.     
13230 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20   nDoclist;      
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73         /* Doclis
13260 74 20 64 61 74 61 20 2a 2f 0a 20 20 7d 0a 0a 20  t data */.  }.. 
13270 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
13280 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
13290 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74   bytes written t
132a0 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
132b0 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 2a 2f 0a  e new entry. */.
132c0 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66    pWriter->nLeaf
132d0 44 61 74 61 20 2b 3d 20 6e 52 65 71 3b 0a 0a 20  Data += nReq;.. 
132e0 20 2f 2a 20 49 66 20 74 68 65 20 62 75 66 66 65   /* If the buffe
132f0 72 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f  r currently allo
13300 63 61 74 65 64 20 69 73 20 74 6f 6f 20 73 6d 61  cated is too sma
13310 6c 6c 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72  ll for this entr
13320 79 2c 20 72 65 61 6c 6c 6f 63 0a 20 20 2a 2a 20  y, realloc.  ** 
13330 74 68 65 20 62 75 66 66 65 72 20 74 6f 20 6d 61  the buffer to ma
13340 6b 65 20 69 74 20 6c 61 72 67 65 20 65 6e 6f 75  ke it large enou
13350 67 68 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  gh..  */.  if( n
13360 52 65 71 3e 70 57 72 69 74 65 72 2d 3e 6e 53 69  Req>pWriter->nSi
13370 7a 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ze ){.    char *
13380 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  aNew = sqlite3_r
13390 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e  ealloc(pWriter->
133a0 61 44 61 74 61 2c 20 6e 52 65 71 29 3b 0a 20 20  aData, nReq);.  
133b0 20 20 69 66 28 20 21 61 4e 65 77 20 29 20 72 65    if( !aNew ) re
133c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
133d0 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  M;.    pWriter->
133e0 61 44 61 74 61 20 3d 20 61 4e 65 77 3b 0a 20 20  aData = aNew;.  
133f0 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65    pWriter->nSize
13400 20 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a 20 20 61   = nReq;.  }.  a
13410 73 73 65 72 74 28 20 6e 44 61 74 61 2b 6e 52 65  ssert( nData+nRe
13420 71 3c 3d 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a  q<=pWriter->nSiz
13430 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  e );..  /* Appen
13440 64 20 74 68 65 20 70 72 65 66 69 78 2d 63 6f 6d  d the prefix-com
13450 70 72 65 73 73 65 64 20 74 65 72 6d 20 61 6e 64  pressed term and
13460 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20   doclist to the 
13470 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 6e 44 61  buffer. */.  nDa
13480 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ta += sqlite3Fts
13490 33 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69  3PutVarint(&pWri
134a0 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ter->aData[nData
134b0 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e  ], nPrefix);.  n
134c0 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46  Data += sqlite3F
134d0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57  ts3PutVarint(&pW
134e0 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61  riter->aData[nDa
134f0 74 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20  ta], nSuffix);. 
13500 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74 65 72   memcpy(&pWriter
13510 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
13520 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c  &zTerm[nPrefix],
13530 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 6e 44 61   nSuffix);.  nDa
13540 74 61 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20  ta += nSuffix;. 
13550 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65   nData += sqlite
13560 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
13570 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e  pWriter->aData[n
13580 44 61 74 61 5d 2c 20 6e 44 6f 63 6c 69 73 74 29  Data], nDoclist)
13590 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69  ;.  memcpy(&pWri
135a0 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ter->aData[nData
135b0 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  ], aDoclist, nDo
135c0 63 6c 69 73 74 29 3b 0a 20 20 70 57 72 69 74 65  clist);.  pWrite
135d0 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61  r->nData = nData
135e0 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20   + nDoclist;..  
135f0 2f 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  /* Save the curr
13600 65 6e 74 20 74 65 72 6d 20 73 6f 20 74 68 61 74  ent term so that
13610 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 20   it can be used 
13620 74 6f 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65  to prefix-compre
13630 73 73 20 74 68 65 20 6e 65 78 74 2e 0a 20 20 2a  ss the next..  *
13640 2a 20 49 66 20 74 68 65 20 69 73 43 6f 70 79 54  * If the isCopyT
13650 65 72 6d 20 70 61 72 61 6d 65 74 65 72 20 69 73  erm parameter is
13660 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
13670 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
13680 6f 20 62 79 0a 20 20 2a 2a 20 7a 54 65 72 6d 20  o by.  ** zTerm 
13690 69 73 20 74 72 61 6e 73 69 65 6e 74 2c 20 73 6f  is transient, so
136a0 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   take a copy of 
136b0 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 20 4f  the term data. O
136c0 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a 20  therwise, just. 
136d0 20 2a 2a 20 73 74 6f 72 65 20 61 20 63 6f 70 79   ** store a copy
136e0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2e   of the pointer.
136f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f  .  */.  if( isCo
13700 70 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66  pyTerm ){.    if
13710 28 20 6e 54 65 72 6d 3e 70 57 72 69 74 65 72 2d  ( nTerm>pWriter-
13720 3e 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >nMalloc ){.    
13730 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73    char *zNew = s
13740 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
13750 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c  Writer->zMalloc,
13760 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20   nTerm*2);.     
13770 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
13780 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13790 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
137a0 20 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65 72   }.      pWriter
137b0 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72  ->nMalloc = nTer
137c0 6d 2a 32 3b 0a 20 20 20 20 20 20 70 57 72 69 74  m*2;.      pWrit
137d0 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e  er->zMalloc = zN
137e0 65 77 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  ew;.      pWrite
137f0 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b  r->zTerm = zNew;
13800 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
13810 74 28 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  t( pWriter->zTer
13820 6d 3d 3d 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c  m==pWriter->zMal
13830 6c 6f 63 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  loc );.    memcp
13840 79 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d  y(pWriter->zTerm
13850 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
13860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
13870 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28  riter->zTerm = (
13880 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20  char *)zTerm;.  
13890 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65  }.  pWriter->nTe
138a0 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 72  rm = nTerm;..  r
138b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
138c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
138d0 61 6c 6c 20 64 61 74 61 20 61 73 73 6f 63 69 61  all data associa
138e0 74 65 64 20 77 69 74 68 20 74 68 65 20 53 65 67  ted with the Seg
138f0 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63  mentWriter objec
13900 74 20 70 57 72 69 74 65 72 20 74 6f 20 74 68 65  t pWriter to the
13910 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
13920 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
13930 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
13940 20 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20   all terms have 
13950 62 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  been added.** to
13960 20 74 68 65 20 73 65 67 6d 65 6e 74 20 75 73 69   the segment usi
13970 6e 67 20 66 74 73 33 53 65 67 57 72 69 74 65 72  ng fts3SegWriter
13980 41 64 64 28 29 2e 20 49 66 20 73 75 63 63 65 73  Add(). If succes
13990 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
139a0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
139b0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
139c0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
139d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
139e0 74 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73  ts3SegWriterFlus
139f0 68 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  h(.  Fts3Table *
13a00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13a10 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
13a20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
13a30 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
13a40 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
13a50 20 20 2f 2a 20 53 65 67 6d 65 6e 74 57 72 69 74    /* SegmentWrit
13a60 65 72 20 74 6f 20 66 6c 75 73 68 20 74 6f 20 74  er to flush to t
13a70 68 65 20 64 62 20 2a 2f 0a 20 20 73 71 6c 69 74  he db */.  sqlit
13a80 65 33 5f 69 6e 74 36 34 20 69 4c 65 76 65 6c 2c  e3_int64 iLevel,
13a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
13aa0 6c 75 65 20 66 6f 72 20 27 6c 65 76 65 6c 27 20  lue for 'level' 
13ab0 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64  column of %_segd
13ac0 69 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ir */.  int iIdx
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ae0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
13af0 20 66 6f 72 20 27 69 64 78 27 20 63 6f 6c 75 6d   for 'idx' colum
13b00 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f  n of %_segdir */
13b10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
13b40 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 57  code */.  if( pW
13b50 72 69 74 65 72 2d 3e 70 54 72 65 65 20 29 7b 0a  riter->pTree ){.
13b60 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
13b70 34 20 69 4c 61 73 74 20 3d 20 30 3b 20 20 20 20  4 iLast = 0;    
13b80 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 62 6c 6f    /* Largest blo
13b90 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74 6f  ck id written to
13ba0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
13bb0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
13bc0 4c 61 73 74 4c 65 61 66 3b 20 20 20 20 20 20 2f  LastLeaf;      /
13bd0 2a 20 4c 61 72 67 65 73 74 20 6c 65 61 66 20 62  * Largest leaf b
13be0 6c 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20  lock id written 
13bf0 74 6f 20 64 62 20 2a 2f 0a 20 20 20 20 63 68 61  to db */.    cha
13c00 72 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55 4c 4c 3b  r *zRoot = NULL;
13c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
13c20 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
13c30 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20  containing root 
13c40 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  node */.    int 
13c50 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20  nRoot = 0;      
13c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
13c70 65 20 6f 66 20 62 75 66 66 65 72 20 7a 52 6f 6f  e of buffer zRoo
13c80 74 20 2a 2f 0a 0a 20 20 20 20 69 4c 61 73 74 4c  t */..    iLastL
13c90 65 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e 69  eaf = pWriter->i
13ca0 46 72 65 65 3b 0a 20 20 20 20 72 63 20 3d 20 66  Free;.    rc = f
13cb0 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
13cc0 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65  p, pWriter->iFre
13cd0 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44  e++, pWriter->aD
13ce0 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44  ata, pWriter->nD
13cf0 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ata);.    if( rc
13d00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13d10 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f       rc = fts3No
13d20 64 65 57 72 69 74 65 28 70 2c 20 70 57 72 69 74  deWrite(p, pWrit
13d30 65 72 2d 3e 70 54 72 65 65 2c 20 31 2c 0a 20 20  er->pTree, 1,.  
13d40 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
13d50 3e 69 46 69 72 73 74 2c 20 70 57 72 69 74 65 72  >iFirst, pWriter
13d60 2d 3e 69 46 72 65 65 2c 20 26 69 4c 61 73 74 2c  ->iFree, &iLast,
13d70 20 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f 6f 74 29   &zRoot, &nRoot)
13d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13da0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
13db0 57 72 69 74 65 53 65 67 64 69 72 28 70 2c 20 69  WriteSegdir(p, i
13dc0 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 0a 20 20  Level, iIdx, .  
13dd0 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
13de0 3e 69 46 69 72 73 74 2c 20 69 4c 61 73 74 4c 65  >iFirst, iLastLe
13df0 61 66 2c 20 69 4c 61 73 74 2c 20 70 57 72 69 74  af, iLast, pWrit
13e00 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 2c 20 7a  er->nLeafData, z
13e10 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20  Root, nRoot);.  
13e20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
13e30 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 74   /* The entire t
13e40 72 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20  ree fits on the 
13e50 72 6f 6f 74 20 6e 6f 64 65 2e 20 57 72 69 74 65  root node. Write
13e60 20 69 74 20 74 6f 20 74 68 65 20 73 65 67 64 69   it to the segdi
13e70 72 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  r table. */.    
13e80 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
13e90 67 64 69 72 28 70 2c 20 69 4c 65 76 65 6c 2c 20  gdir(p, iLevel, 
13ea0 69 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 30  iIdx, .        0
13eb0 2c 20 30 2c 20 30 2c 20 70 57 72 69 74 65 72 2d  , 0, 0, pWriter-
13ec0 3e 6e 4c 65 61 66 44 61 74 61 2c 20 70 57 72 69  >nLeafData, pWri
13ed0 74 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69  ter->aData, pWri
13ee0 74 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 7d  ter->nData);.  }
13ef0 0a 20 20 70 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b  .  p->nLeafAdd++
13f00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13f10 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
13f20 61 6c 6c 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  all memory held 
13f30 62 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72  by the SegmentWr
13f40 69 74 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  iter object pass
13f50 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 66 69  ed as the .** fi
13f60 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
13f70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
13f80 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 53  3SegWriterFree(S
13f90 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57  egmentWriter *pW
13fa0 72 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57  riter){.  if( pW
13fb0 72 69 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  riter ){.    sql
13fc0 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
13fd0 72 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 73  r->aData);.    s
13fe0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
13ff0 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  ter->zMalloc);. 
14000 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28     fts3NodeFree(
14010 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 29 3b  pWriter->pTree);
14020 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14030 65 28 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  e(pWriter);.  }.
14040 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  }../*.** The fir
14050 73 74 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  st value in the 
14060 61 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69 73  apVal[] array is
14070 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
14080 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ain an integer..
14090 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
140a0 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
140b0 65 78 69 73 74 20 61 6e 79 20 64 6f 63 75 6d 65  exist any docume
140c0 6e 74 73 20 77 69 74 68 20 64 6f 63 69 64 20 76  nts with docid v
140d0 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 61 72  alues that.** ar
140e0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
140f0 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 20 69   that integer. i
14100 2e 65 2e 20 69 66 20 64 65 6c 65 74 69 6e 67 20  .e. if deleting 
14110 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
14120 68 20 64 6f 63 69 64 0a 2a 2a 20 70 52 6f 77 69  h docid.** pRowi
14130 64 20 77 6f 75 6c 64 20 6d 65 61 6e 20 74 68 65  d would mean the
14140 20 46 54 53 33 20 74 61 62 6c 65 20 77 65 72 65   FTS3 table were
14150 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
14160 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69   successful, *pi
14170 73 45 6d 70 74 79 20 69 73 20 73 65 74 20 74 6f  sEmpty is set to
14180 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
14190 6c 65 20 69 73 20 65 6d 70 74 79 20 65 78 63 65  le is empty exce
141a0 70 74 20 66 6f 72 0a 2a 2a 20 64 6f 63 75 6d 65  pt for.** docume
141b0 6e 74 20 70 52 6f 77 69 64 2c 20 6f 72 20 66 61  nt pRowid, or fa
141c0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2c 20 61  lse otherwise, a
141d0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
141e0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a  returned. If an.
141f0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  ** error occurs,
14200 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
14210 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
14220 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14230 20 66 74 73 33 49 73 45 6d 70 74 79 28 46 74 73   fts3IsEmpty(Fts
14240 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74  3Table *p, sqlit
14250 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64  e3_value *pRowid
14260 2c 20 69 6e 74 20 2a 70 69 73 45 6d 70 74 79 29  , int *pisEmpty)
14270 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
14280 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
14290 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e  c;.  if( p->zCon
142a0 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20 2f  tentTbl ){.    /
142b0 2a 20 49 66 20 75 73 69 6e 67 20 74 68 65 20 63  * If using the c
142c0 6f 6e 74 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f  ontent=xxx optio
142d0 6e 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74 61  n, assume the ta
142e0 62 6c 65 20 69 73 20 6e 65 76 65 72 20 65 6d 70  ble is never emp
142f0 74 79 20 2a 2f 0a 20 20 20 20 2a 70 69 73 45 6d  ty */.    *pisEm
14300 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  pty = 0;.    rc 
14310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
14320 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66  else{.    rc = f
14330 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
14340 4c 5f 49 53 5f 45 4d 50 54 59 2c 20 26 70 53 74  L_IS_EMPTY, &pSt
14350 6d 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20  mt, &pRowid);.  
14360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
14380 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
14390 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
143a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 73   ){.        *pis
143b0 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 5f  Empty = sqlite3_
143c0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
143d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
143e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
143f0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
14400 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
14410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
14420 65 74 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65  et *pnMax to the
14430 20 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74   largest segment
14440 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61   level in the da
14450 74 61 62 61 73 65 20 66 6f 72 20 74 68 65 20 69  tabase for the i
14460 6e 64 65 78 0a 2a 2a 20 69 49 6e 64 65 78 2e 0a  ndex.** iIndex..
14470 2a 2a 0a 2a 2a 20 53 65 67 6d 65 6e 74 20 6c 65  **.** Segment le
14480 76 65 6c 73 20 61 72 65 20 73 74 6f 72 65 64 20  vels are stored 
14490 69 6e 20 74 68 65 20 27 6c 65 76 65 6c 27 20 63  in the 'level' c
144a0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73  olumn of the %_s
144b0 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a  egdir table..**.
144c0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
144d0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
144e0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
144f0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6e 6f  error code if no
14500 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
14510 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c   fts3SegmentMaxL
14520 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c  evel(.  Fts3Tabl
14530 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61  e *p, .  int iLa
14540 6e 67 69 64 2c 0a 20 20 69 6e 74 20 69 49 6e 64  ngid,.  int iInd
14550 65 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69  ex, .  sqlite3_i
14560 6e 74 36 34 20 2a 70 6e 4d 61 78 0a 29 7b 0a 20  nt64 *pnMax.){. 
14570 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14580 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
14590 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
145a0 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d  >=0 && iIndex<p-
145b0 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 2f 2a  >nIndex );..  /*
145c0 20 53 65 74 20 70 53 74 6d 74 20 74 6f 20 74 68   Set pStmt to th
145d0 65 20 63 6f 6d 70 69 6c 65 64 20 76 65 72 73 69  e compiled versi
145e0 6f 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  on of:.  **.  **
145f0 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 6c 65     SELECT max(le
14600 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  vel) FROM %Q.'%q
14610 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c  _segdir' WHERE l
14620 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41  evel BETWEEN ? A
14630 4e 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  ND ?.  **.  ** (
14640 31 30 32 34 20 69 73 20 61 63 74 75 61 6c 6c 79  1024 is actually
14650 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 61   the value of ma
14660 63 72 6f 20 46 54 53 33 5f 53 45 47 44 49 52 5f  cro FTS3_SEGDIR_
14670 50 52 45 46 49 58 4c 45 56 45 4c 5f 53 54 52 29  PREFIXLEVEL_STR)
14680 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ..  */.  rc = ft
14690 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
146a0 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d  _SELECT_SEGDIR_M
146b0 41 58 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74  AX_LEVEL, &pStmt
146c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
146d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
146e0 72 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  rn rc;.  sqlite3
146f0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
14700 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74  t, 1, getAbsolut
14710 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
14720 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a  d, iIndex, 0));.
14730 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
14740 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a  nt64(pStmt, 2, .
14750 20 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74        getAbsolut
14760 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
14770 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f  d, iIndex, FTS3_
14780 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d  SEGDIR_MAXLEVEL-
14790 31 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 53 51  1).  );.  if( SQ
147a0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
147b0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
147c0 0a 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71  .    *pnMax = sq
147d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
147e0 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  64(pStmt, 0);.  
147f0 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
14800 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
14810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 69 41 62 73 4c 65  .}../*.** iAbsLe
14820 76 65 6c 20 69 73 20 61 6e 20 61 62 73 6f 6c 75  vel is an absolu
14830 74 65 20 6c 65 76 65 6c 20 74 68 61 74 20 6d 61  te level that ma
14840 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20  y be assumed to 
14850 65 78 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a 20  exist within.** 
14860 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68  the database. Th
14870 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
14880 6b 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  ks if it is the 
14890 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 20 6e 75  largest level nu
148a0 6d 62 65 72 0a 2a 2a 20 77 69 74 68 69 6e 20 69  mber.** within i
148b0 74 73 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69  ts index. Assumi
148c0 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ng no error occu
148d0 72 73 2c 20 2a 70 62 4d 61 78 20 69 73 20 73 65  rs, *pbMax is se
148e0 74 20 74 6f 20 31 20 69 66 0a 2a 2a 20 69 41 62  t to 1 if.** iAb
148f0 73 4c 65 76 65 6c 20 69 73 20 69 6e 64 65 65 64  sLevel is indeed
14900 20 74 68 65 20 6c 61 72 67 65 73 74 20 6c 65 76   the largest lev
14910 65 6c 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  el, or 0 otherwi
14920 73 65 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  se, and SQLITE_O
14930 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
14940 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
14950 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
14960 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
14970 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c  and the.** final
14980 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 4d 61 78   value of *pbMax
14990 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
149a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
149b0 33 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76  3SegmentIsMaxLev
149c0 65 6c 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  el(Fts3Table *p,
149d0 20 69 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20   i64 iAbsLevel, 
149e0 69 6e 74 20 2a 70 62 4d 61 78 29 7b 0a 0a 20 20  int *pbMax){..  
149f0 2f 2a 20 53 65 74 20 70 53 74 6d 74 20 74 6f 20  /* Set pStmt to 
14a00 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 76 65 72  the compiled ver
14a10 73 69 6f 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20  sion of:.  **.  
14a20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
14a30 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27  level) FROM %Q.'
14a40 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
14a50 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f   level BETWEEN ?
14a60 20 41 4e 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a   AND ?.  **.  **
14a70 20 28 31 30 32 34 20 69 73 20 61 63 74 75 61 6c   (1024 is actual
14a80 6c 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ly the value of 
14a90 6d 61 63 72 6f 20 46 54 53 33 5f 53 45 47 44 49  macro FTS3_SEGDI
14aa0 52 5f 50 52 45 46 49 58 4c 45 56 45 4c 5f 53 54  R_PREFIXLEVEL_ST
14ab0 52 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  R)..  */.  sqlit
14ac0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
14ad0 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53    int rc = fts3S
14ae0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
14af0 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f  LECT_SEGDIR_MAX_
14b00 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30  LEVEL, &pStmt, 0
14b10 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14b20 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
14b30 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  rc;.  sqlite3_bi
14b40 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
14b50 31 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b  1, iAbsLevel+1);
14b60 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
14b70 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20  int64(pStmt, 2, 
14b80 0a 20 20 20 20 20 20 28 28 69 41 62 73 4c 65 76  .      ((iAbsLev
14b90 65 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  el/FTS3_SEGDIR_M
14ba0 41 58 4c 45 56 45 4c 29 2b 31 29 20 2a 20 46 54  AXLEVEL)+1) * FT
14bb0 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
14bc0 45 4c 0a 20 20 29 3b 0a 0a 20 20 2a 70 62 4d 61  EL.  );..  *pbMa
14bd0 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c  x = 0;.  if( SQL
14be0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
14bf0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
14c00 20 20 20 20 2a 70 62 4d 61 78 20 3d 20 73 71 6c      *pbMax = sql
14c10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
14c20 28 70 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49  (pStmt, 0)==SQLI
14c30 54 45 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72  TE_NULL;.  }.  r
14c40 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65  eturn sqlite3_re
14c50 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  set(pStmt);.}../
14c60 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
14c70 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25  entries in the %
14c80 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
14c90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14ca0 74 68 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 6f  the segment.** o
14cb0 70 65 6e 65 64 20 77 69 74 68 20 73 65 67 2d 72  pened with seg-r
14cc0 65 61 64 65 72 20 70 53 65 67 2e 20 54 68 69 73  eader pSeg. This
14cd0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
14ce0 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 63 6f  ot affect the co
14cf0 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
14d00 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
14d10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
14d20 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74  ts3DeleteSegment
14d30 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
14d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14d50 20 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65      /* FTS table
14d60 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
14d70 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14d90 53 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74  Segment to delet
14da0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
14db0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
14dd0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66  urn code */.  if
14de0 28 20 70 53 65 67 2d 3e 69 53 74 61 72 74 42 6c  ( pSeg->iStartBl
14df0 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
14e00 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65  e3_stmt *pDelete
14e10 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20  ;        /* SQL 
14e20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c  statement to del
14e30 65 74 65 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  ete rows */.    
14e40 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
14e50 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
14e60 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26  EGMENTS_RANGE, &
14e70 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20  pDelete, 0);.   
14e80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14e90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
14ea0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
14eb0 44 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 2d  Delete, 1, pSeg-
14ec0 3e 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20  >iStartBlock);. 
14ed0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
14ee0 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c  d_int64(pDelete,
14ef0 20 32 2c 20 70 53 65 67 2d 3e 69 45 6e 64 42 6c   2, pSeg->iEndBl
14f00 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ock);.      sqli
14f10 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65  te3_step(pDelete
14f20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14f30 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c  lite3_reset(pDel
14f40 65 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ete);.    }.  }.
14f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14f60 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
14f70 69 6f 6e 20 69 73 20 75 73 65 64 20 61 66 74 65  ion is used afte
14f80 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69 70  r merging multip
14f90 6c 65 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f  le segments into
14fa0 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a   a single large.
14fb0 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 64 65  ** segment to de
14fc0 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c 20 6e 6f  lete the old, no
14fd0 77 20 72 65 64 75 6e 64 61 6e 74 2c 20 73 65 67  w redundant, seg
14fe0 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 53 70  ment b-trees. Sp
14ff0 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20 69  ecifically,.** i
15000 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29 20 44  t:.** .**   1) D
15010 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67  eletes all %_seg
15020 6d 65 6e 74 73 20 65 6e 74 72 69 65 73 20 66 6f  ments entries fo
15030 72 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61  r the segments a
15040 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
15050 2a 2a 20 20 20 20 20 20 65 61 63 68 20 6f 66 20  **      each of 
15060 74 68 65 20 53 65 67 52 65 61 64 65 72 20 6f 62  the SegReader ob
15070 6a 65 63 74 73 20 69 6e 20 74 68 65 20 61 72 72  jects in the arr
15080 61 79 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ay passed as the
15090 20 74 68 69 72 64 20 0a 2a 2a 20 20 20 20 20 20   third .**      
150a0 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a 2a  argument, and.**
150b0 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65 74 65 73  .**   2) deletes
150c0 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65 6e   all %_segdir en
150d0 74 72 69 65 73 20 77 69 74 68 20 6c 65 76 65 6c  tries with level
150e0 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c 6c 20   iLevel, or all 
150f0 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20 20 20  %_segdir.**     
15100 20 65 6e 74 72 69 65 73 20 72 65 67 61 72 64 6c   entries regardl
15110 65 73 73 20 6f 66 20 6c 65 76 65 6c 20 69 66 20  ess of level if 
15120 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a  (iLevel<0)..**.*
15130 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
15140 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
15150 73 73 66 75 6c 2c 20 6f 74 68 65 72 77 69 73 65  ssful, otherwise
15160 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
15170 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
15180 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 53   int fts3DeleteS
15190 65 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62  egdir(.  Fts3Tab
151a0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
151b0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
151c0 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
151d0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69   */.  int iLangi
151e0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
151f0 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
15200 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  e id */.  int iI
15210 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
15220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15230 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78  ex for p->aIndex
15240 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
15250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15260 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
15270 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69  f %_segdir entri
15280 65 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  es to delete */.
15290 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
152a0 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20  **apSegment,    
152b0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53 65    /* Array of Se
152c0 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20  gReader objects 
152d0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72  */.  int nReader
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
15300 61 72 72 61 79 20 61 70 53 65 67 6d 65 6e 74 20  array apSegment 
15310 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
15320 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15330 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15340 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
15350 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15370 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
15380 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
15390 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  mt *pDelete = 0;
153a0 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
153b0 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65  tement to delete
153c0 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 66 6f 72 28   rows */..  for(
153d0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
153e0 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64 65 72 3b  OK && i<nReader;
153f0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
15400 66 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e  fts3DeleteSegmen
15410 74 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69  t(p, apSegment[i
15420 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ]);.  }.  if( rc
15430 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15440 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15450 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  }..  assert( iLe
15460 76 65 6c 3e 3d 30 20 7c 7c 20 69 4c 65 76 65 6c  vel>=0 || iLevel
15470 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
15480 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 69 4c  _ALL );.  if( iL
15490 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
154a0 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  RSOR_ALL ){.    
154b0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
154c0 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
154d0 45 47 44 49 52 5f 52 41 4e 47 45 2c 20 26 70 44  EGDIR_RANGE, &pD
154e0 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69  elete, 0);.    i
154f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15510 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65  3_bind_int64(pDe
15520 6c 65 74 65 2c 20 31 2c 20 67 65 74 41 62 73 6f  lete, 1, getAbso
15530 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
15540 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29  ngid, iIndex, 0)
15550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15560 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
15570 65 74 65 2c 20 32 2c 20 0a 20 20 20 20 20 20 20  ete, 2, .       
15580 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65     getAbsoluteLe
15590 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
155a0 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47  iIndex, FTS3_SEG
155b0 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a  DIR_MAXLEVEL-1).
155c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
155d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
155e0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
155f0 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49  SQL_DELETE_SEGDI
15600 52 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c 65 74  R_LEVEL, &pDelet
15610 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
15620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15630 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
15640 6e 64 5f 69 6e 74 36 34 28 0a 20 20 20 20 20 20  nd_int64(.      
15650 20 20 20 20 70 44 65 6c 65 74 65 2c 20 31 2c 20      pDelete, 1, 
15660 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
15670 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
15680 64 65 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20 20  dex, iLevel).   
15690 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
156a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
156b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
156c0 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65  te3_step(pDelete
156d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
156e0 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74  te3_reset(pDelet
156f0 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
15700 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
15710 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
15720 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 66  n is called, buf
15730 66 65 72 20 2a 70 70 4c 69 73 74 20 28 73 69 7a  fer *ppList (siz
15740 65 20 2a 70 6e 4c 69 73 74 20 62 79 74 65 73 29  e *pnList bytes)
15750 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20   contains .** a 
15760 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68  position list th
15770 61 74 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e  at may (or may n
15780 6f 74 29 20 66 65 61 74 75 72 65 20 6d 75 6c 74  ot) feature mult
15790 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  iple columns. Th
157a0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
157b0 64 6a 75 73 74 73 20 74 68 65 20 70 6f 69 6e 74  djusts the point
157c0 65 72 20 2a 70 70 4c 69 73 74 20 61 6e 64 20 74  er *ppList and t
157d0 68 65 20 6c 65 6e 67 74 68 20 2a 70 6e 4c 69 73  he length *pnLis
157e0 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  t so that they.*
157f0 2a 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 73  * identify the s
15800 75 62 73 65 74 20 6f 66 20 74 68 65 20 70 6f 73  ubset of the pos
15810 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20  ition list that 
15820 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 63  corresponds to c
15830 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a  olumn iCol..**.*
15840 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
15850 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  o entries in the
15860 20 69 6e 70 75 74 20 70 6f 73 69 74 69 6f 6e 20   input position 
15870 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
15880 69 43 6f 6c 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  iCol, then.** *p
15890 6e 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20  nList is set to 
158a0 7a 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75  zero before retu
158b0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
158c0 70 61 72 61 6d 65 74 65 72 20 62 5a 65 72 6f 20  parameter bZero 
158d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
158e0 6e 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  n any part of th
158f0 65 20 69 6e 70 75 74 20 6c 69 73 74 20 66 6f 6c  e input list fol
15900 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e  lowing.** the en
15910 64 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  d of the output 
15920 6c 69 73 74 20 69 73 20 7a 65 72 6f 65 64 20 62  list is zeroed b
15930 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
15940 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15950 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72  fts3ColumnFilter
15960 28 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  (.  int iCol,   
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
15990 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20   filter on */.  
159a0 69 6e 74 20 62 5a 65 72 6f 2c 20 20 20 20 20 20  int bZero,      
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 2f 2a 20 5a 65 72 6f 20 6f 75 74 20 61 6e 79 74  /* Zero out anyt
159d0 68 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a  hing following *
159e0 70 70 4c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  ppList */.  char
159f0 20 2a 2a 70 70 4c 69 73 74 2c 20 20 20 20 20 20   **ppList,      
15a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15a10 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  N/OUT: Pointer t
15a20 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  o position list 
15a30 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74  */.  int *pnList
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a50 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
15a60 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 2a  Size of buffer *
15a70 70 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73 20  ppList in bytes 
15a80 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 4c  */.){.  char *pL
15a90 69 73 74 20 3d 20 2a 70 70 4c 69 73 74 3b 0a 20  ist = *ppList;. 
15aa0 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70 6e   int nList = *pn
15ab0 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 45  List;.  char *pE
15ac0 6e 64 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69 73  nd = &pList[nLis
15ad0 74 5d 3b 0a 20 20 69 6e 74 20 69 43 75 72 72 65  t];.  int iCurre
15ae0 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  nt = 0;.  char *
15af0 70 20 3d 20 70 4c 69 73 74 3b 0a 0a 20 20 61 73  p = pList;..  as
15b00 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
15b10 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
15b20 20 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 20     char c = 0;. 
15b30 20 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64     while( p<pEnd
15b40 20 26 26 20 28 63 20 7c 20 2a 70 29 26 30 78 46   && (c | *p)&0xF
15b50 45 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30  E ) c = *p++ & 0
15b60 78 38 30 3b 0a 20 20 0a 20 20 20 20 69 66 28 20  x80;.  .    if( 
15b70 69 43 6f 6c 3d 3d 69 43 75 72 72 65 6e 74 20 29  iCol==iCurrent )
15b80 7b 0a 20 20 20 20 20 20 6e 4c 69 73 74 20 3d 20  {.      nList = 
15b90 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29  (int)(p - pList)
15ba0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15bb0 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74 20     }..    nList 
15bc0 2d 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69  -= (int)(p - pLi
15bd0 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
15be0 20 70 3b 0a 20 20 20 20 69 66 28 20 6e 4c 69 73   p;.    if( nLis
15bf0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  t==0 ){.      br
15c00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
15c10 20 3d 20 26 70 4c 69 73 74 5b 31 5d 3b 0a 20 20   = &pList[1];.  
15c20 20 20 70 20 2b 3d 20 66 74 73 33 47 65 74 56 61    p += fts3GetVa
15c30 72 69 6e 74 33 32 28 70 2c 20 26 69 43 75 72 72  rint32(p, &iCurr
15c40 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ent);.  }..  if(
15c50 20 62 5a 65 72 6f 20 26 26 20 26 70 4c 69 73 74   bZero && &pList
15c60 5b 6e 4c 69 73 74 5d 21 3d 70 45 6e 64 20 29 7b  [nList]!=pEnd ){
15c70 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c 69  .    memset(&pLi
15c80 73 74 5b 6e 4c 69 73 74 5d 2c 20 30 2c 20 70 45  st[nList], 0, pE
15c90 6e 64 20 2d 20 26 70 4c 69 73 74 5b 6e 4c 69 73  nd - &pList[nLis
15ca0 74 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 69  t]);.  }.  *ppLi
15cb0 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 2a 70  st = pList;.  *p
15cc0 6e 4c 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 7d  nList = nList;.}
15cd0 0a 0a 2f 2a 0a 2a 2a 20 43 61 63 68 65 20 64 61  ../*.** Cache da
15ce0 74 61 20 69 6e 20 74 68 65 20 46 74 73 33 4d 75  ta in the Fts3Mu
15cf0 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61 42 75  ltiSegReader.aBu
15d00 66 66 65 72 5b 5d 20 62 75 66 66 65 72 20 28 6f  ffer[] buffer (o
15d10 76 65 72 77 72 69 74 69 6e 67 20 61 6e 79 0a 2a  verwriting any.*
15d20 2a 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 29  * existing data)
15d30 2e 20 47 72 6f 77 20 74 68 65 20 62 75 66 66 65  . Grow the buffe
15d40 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  r if required..*
15d50 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
15d60 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
15d70 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
15d80 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
15d90 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
15da0 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 72 65 73  ** trying to res
15db0 69 7a 65 20 74 68 65 20 62 75 66 66 65 72 2c 20  ize the buffer, 
15dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
15dd0 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  MEM..*/.static i
15de0 6e 74 20 66 74 73 33 4d 73 72 42 75 66 66 65 72  nt fts3MsrBuffer
15df0 44 61 74 61 28 0a 20 20 46 74 73 33 4d 75 6c 74  Data(.  Fts3Mult
15e00 69 53 65 67 52 65 61 64 65 72 20 2a 70 4d 73 72  iSegReader *pMsr
15e10 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69  ,       /* Multi
15e20 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 20  -segment-reader 
15e30 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72  handle */.  char
15e40 20 2a 70 4c 69 73 74 2c 0a 20 20 69 6e 74 20 6e   *pList,.  int n
15e50 4c 69 73 74 0a 29 7b 0a 20 20 69 66 28 20 6e 4c  List.){.  if( nL
15e60 69 73 74 3e 70 4d 73 72 2d 3e 6e 42 75 66 66 65  ist>pMsr->nBuffe
15e70 72 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  r ){.    char *p
15e80 4e 65 77 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 6e  New;.    pMsr->n
15e90 42 75 66 66 65 72 20 3d 20 6e 4c 69 73 74 2a 32  Buffer = nList*2
15ea0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68  ;.    pNew = (ch
15eb0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ar *)sqlite3_rea
15ec0 6c 6c 6f 63 28 70 4d 73 72 2d 3e 61 42 75 66 66  lloc(pMsr->aBuff
15ed0 65 72 2c 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65  er, pMsr->nBuffe
15ee0 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65  r);.    if( !pNe
15ef0 77 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  w ) return SQLIT
15f00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 4d 73  E_NOMEM;.    pMs
15f10 72 2d 3e 61 42 75 66 66 65 72 20 3d 20 70 4e 65  r->aBuffer = pNe
15f20 77 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 63 70 79  w;.  }..  memcpy
15f30 28 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20  (pMsr->aBuffer, 
15f40 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20  pList, nList);. 
15f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15f60 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  K;.}..int sqlite
15f70 33 46 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74  3Fts3MsrIncrNext
15f80 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
15f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15fa0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
15fb0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
15fc0 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
15fd0 64 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20  der *pMsr,      
15fe0 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e   /* Multi-segmen
15ff0 74 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20  t-reader handle 
16000 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
16010 36 34 20 2a 70 69 44 6f 63 69 64 2c 20 20 20 20  64 *piDocid,    
16020 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63       /* OUT: Doc
16030 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68  id value */.  ch
16040 61 72 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20  ar **paPoslist, 
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16060 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
16070 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
16080 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 6f 73 6c 69  /.  int *pnPosli
16090 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
160a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
160b0 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73   of position lis
160c0 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  t in bytes */.){
160d0 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20  .  int nMerge = 
160e0 70 4d 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 0a  pMsr->nAdvance;.
160f0 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
16100 2a 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 4d  **apSegment = pM
16110 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20  sr->apSegment;. 
16120 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73   int (*xCmp)(Fts
16130 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74  3SegReader *, Ft
16140 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d  s3SegReader *) =
16150 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49   (.    p->bDescI
16160 64 78 20 3f 20 66 74 73 33 53 65 67 52 65 61 64  dx ? fts3SegRead
16170 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20  erDoclistCmpRev 
16180 3a 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44  : fts3SegReaderD
16190 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a  oclistCmp.  );..
161a0 20 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 30 20    if( nMerge==0 
161b0 29 7b 0a 20 20 20 20 2a 70 61 50 6f 73 6c 69 73  ){.    *paPoslis
161c0 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  t = 0;.    retur
161d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
161e0 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
161f0 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
16200 72 20 2a 70 53 65 67 3b 0a 20 20 20 20 70 53 65  r *pSeg;.    pSe
16210 67 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d  g = pMsr->apSegm
16220 65 6e 74 5b 30 5d 3b 0a 0a 20 20 20 20 69 66 28  ent[0];..    if(
16230 20 70 53 65 67 2d 3e 70 4f 66 66 73 65 74 4c 69   pSeg->pOffsetLi
16240 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  st==0 ){.      *
16250 70 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20  paPoslist = 0;. 
16260 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
16280 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
16290 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  *pList;.      in
162a0 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  t nList;.      i
162b0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
162c0 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
162d0 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d   = apSegment[0]-
162e0 3e 69 44 6f 63 69 64 3b 0a 0a 20 20 20 20 20 20  >iDocid;..      
162f0 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
16300 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61  erNextDocid(p, a
16310 70 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c  pSegment[0], &pL
16320 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
16330 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20      j = 1;.     
16340 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
16350 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 26  TE_OK .        &
16360 26 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20  & j<nMerge.     
16370 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b     && apSegment[
16380 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a  j]->pOffsetList.
16390 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67          && apSeg
163a0 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d  ment[j]->iDocid=
163b0 3d 69 44 6f 63 69 64 0a 20 20 20 20 20 20 29 7b  =iDocid.      ){
163c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
163d0 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
163e0 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e  ocid(p, apSegmen
163f0 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t[j], 0, 0);.   
16400 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
16410 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
16420 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
16430 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 66 74 73  rn rc;.      fts
16440 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70  3SegReaderSort(p
16450 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20  Msr->apSegment, 
16460 6e 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29  nMerge, j, xCmp)
16470 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69  ;..      if( nLi
16480 73 74 3e 30 20 26 26 20 66 74 73 33 53 65 67 52  st>0 && fts3SegR
16490 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61  eaderIsPending(a
164a0 70 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a  pSegment[0]) ){.
164b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
164c0 33 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 70  3MsrBufferData(p
164d0 4d 73 72 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73  Msr, pList, nLis
164e0 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t+1);.        if
164f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16500 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
16510 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d       assert( (pM
16520 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 4c 69 73  sr->aBuffer[nLis
16530 74 5d 20 26 20 30 78 46 45 29 3d 3d 30 78 30 30  t] & 0xFE)==0x00
16540 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   );.        pLis
16550 74 20 3d 20 70 4d 73 72 2d 3e 61 42 75 66 66 65  t = pMsr->aBuffe
16560 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
16570 20 20 69 66 28 20 70 4d 73 72 2d 3e 69 43 6f 6c    if( pMsr->iCol
16580 46 69 6c 74 65 72 3e 3d 30 20 29 7b 0a 20 20 20  Filter>=0 ){.   
16590 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46       fts3ColumnF
165a0 69 6c 74 65 72 28 70 4d 73 72 2d 3e 69 43 6f 6c  ilter(pMsr->iCol
165b0 46 69 6c 74 65 72 2c 20 31 2c 20 26 70 4c 69 73  Filter, 1, &pLis
165c0 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
165d0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e    }..      if( n
165e0 4c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  List>0 ){.      
165f0 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 70    *paPoslist = p
16600 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 2a 70  List;.        *p
16610 69 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b  iDocid = iDocid;
16620 0a 20 20 20 20 20 20 20 20 2a 70 6e 50 6f 73 6c  .        *pnPosl
16630 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  ist = nList;.   
16640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16670 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
16680 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74   fts3SegReaderSt
16690 61 72 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  art(.  Fts3Table
166a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
166b0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
166c0 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
166d0 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
166e0 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20  Reader *pCsr,   
166f0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62      /* Cursor ob
16700 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
16710 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
16720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
16730 6d 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 28  m searched for (
16740 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
16750 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20  t nTerm         
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16770 20 4c 65 6e 67 74 68 20 6f 66 20 7a 54 65 72 6d   Length of zTerm
16780 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
16790 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
167a0 53 65 67 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67  Seg = pCsr->nSeg
167b0 6d 65 6e 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ment;..  /* If t
167c0 68 65 20 46 74 73 33 53 65 67 46 69 6c 74 65 72  he Fts3SegFilter
167d0 20 64 65 66 69 6e 65 73 20 61 20 73 70 65 63 69   defines a speci
167e0 66 69 63 20 74 65 72 6d 20 28 6f 72 20 74 65 72  fic term (or ter
167f0 6d 20 70 72 65 66 69 78 29 20 74 6f 20 73 65 61  m prefix) to sea
16800 72 63 68 20 0a 20 20 2a 2a 20 66 6f 72 2c 20 74  rch .  ** for, t
16810 68 65 6e 20 61 64 76 61 6e 63 65 20 65 61 63 68  hen advance each
16820 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
16830 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74  r until it point
16840 73 20 74 6f 20 61 20 74 65 72 6d 20 6f 66 0a 20  s to a term of. 
16850 20 2a 2a 20 65 71 75 61 6c 20 6f 72 20 67 72 65   ** equal or gre
16860 61 74 65 72 20 76 61 6c 75 65 20 74 68 61 6e 20  ater value than 
16870 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
16880 72 6d 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  rm. This prevent
16890 73 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 6e 6e 65  s many.  ** unne
168a0 63 65 73 73 61 72 79 20 6d 65 72 67 65 2f 73 6f  cessary merge/so
168b0 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f  rt operations fo
168c0 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  r the case where
168d0 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 0a   single segment.
168e0 20 20 2a 2a 20 62 2d 74 72 65 65 20 6c 65 61 66    ** b-tree leaf
168f0 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 20 6d   nodes contain m
16900 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 65 72  ore than one ter
16910 6d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  m..  */.  for(i=
16920 30 3b 20 70 43 73 72 2d 3e 62 52 65 73 74 61 72  0; pCsr->bRestar
16930 74 3d 3d 30 20 26 26 20 69 3c 70 43 73 72 2d 3e  t==0 && i<pCsr->
16940 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a  nSegment; i++){.
16950 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b      int res = 0;
16960 0a 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64  .    Fts3SegRead
16970 65 72 20 2a 70 53 65 67 20 3d 20 70 43 73 72 2d  er *pSeg = pCsr-
16980 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20  >apSegment[i];. 
16990 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e     do {.      in
169a0 74 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65  t rc = fts3SegRe
169b0 61 64 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67  aderNext(p, pSeg
169c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
169d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
169e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
169f0 77 68 69 6c 65 28 20 7a 54 65 72 6d 20 26 26 20  while( zTerm && 
16a00 28 72 65 73 20 3d 20 66 74 73 33 53 65 67 52 65  (res = fts3SegRe
16a10 61 64 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67  aderTermCmp(pSeg
16a20 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29  , zTerm, nTerm))
16a30 3c 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  <0 );..    if( p
16a40 53 65 67 2d 3e 62 4c 6f 6f 6b 75 70 20 26 26 20  Seg->bLookup && 
16a50 72 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  res!=0 ){.      
16a60 66 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74  fts3SegReaderSet
16a70 45 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 7d  Eof(pSeg);.    }
16a80 0a 20 20 7d 0a 20 20 66 74 73 33 53 65 67 52 65  .  }.  fts3SegRe
16a90 61 64 65 72 53 6f 72 74 28 70 43 73 72 2d 3e 61  aderSort(pCsr->a
16aa0 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 2c 20  pSegment, nSeg, 
16ab0 6e 53 65 67 2c 20 66 74 73 33 53 65 67 52 65 61  nSeg, fts3SegRea
16ac0 64 65 72 43 6d 70 29 3b 0a 0a 20 20 72 65 74 75  derCmp);..  retu
16ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16ae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
16af0 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a  SegReaderStart(.
16b00 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
16b30 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
16b40 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
16b50 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f  r *pCsr,       /
16b60 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
16b70 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
16b80 65 72 20 2a 70 46 69 6c 74 65 72 20 20 20 20 20  er *pFilter     
16b90 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
16ba0 69 6f 6e 73 20 6f 6e 20 72 61 6e 67 65 20 6f 66  ions on range of
16bb0 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 29 7b   iteration */.){
16bc0 0a 20 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72  .  pCsr->pFilter
16bd0 20 3d 20 70 46 69 6c 74 65 72 3b 0a 20 20 72 65   = pFilter;.  re
16be0 74 75 72 6e 20 66 74 73 33 53 65 67 52 65 61 64  turn fts3SegRead
16bf0 65 72 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c  erStart(p, pCsr,
16c00 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c   pFilter->zTerm,
16c10 20 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29   pFilter->nTerm)
16c20 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
16c30 46 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72 74  Fts3MsrIncrStart
16c40 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
16c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16c60 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
16c70 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
16c80 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
16c90 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  der *pCsr,      
16ca0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63   /* Cursor objec
16cb0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  t */.  int iCol,
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
16ce0 20 74 6f 20 6d 61 74 63 68 20 6f 6e 2e 20 2a 2f   to match on. */
16cf0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16d00 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
16d10 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 69 74     /* Term to it
16d20 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 20  erate through a 
16d30 64 6f 63 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20  doclist for */. 
16d40 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20   int nTerm      
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16d70 74 65 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a  tes in zTerm */.
16d80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
16d90 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 53 65 67  t rc;.  int nSeg
16da0 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65  ment = pCsr->nSe
16db0 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78  gment;.  int (*x
16dc0 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64  Cmp)(Fts3SegRead
16dd0 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61  er *, Fts3SegRea
16de0 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70  der *) = (.    p
16df0 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73  ->bDescIdx ? fts
16e00 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
16e10 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65  tCmpRev : fts3Se
16e20 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
16e30 70 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  p.  );..  assert
16e40 28 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 3d  ( pCsr->pFilter=
16e50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
16e60 7a 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 3e 30  zTerm && nTerm>0
16e70 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   );..  /* Advanc
16e80 65 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69  e each segment i
16e90 74 65 72 61 74 6f 72 20 75 6e 74 69 6c 20 69 74  terator until it
16ea0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
16eb0 65 72 6d 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e  erm zTerm/nTerm.
16ec0 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53   */.  rc = fts3S
16ed0 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c  egReaderStart(p,
16ee0 20 70 43 73 72 2c 20 7a 54 65 72 6d 2c 20 6e 54   pCsr, zTerm, nT
16ef0 65 72 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  erm);.  if( rc!=
16f00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
16f10 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 65 74  rn rc;..  /* Det
16f20 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
16f30 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20  of the segments 
16f40 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 20 74  actually point t
16f50 6f 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a  o zTerm/nTerm. *
16f60 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
16f70 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
16f80 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
16f90 20 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61   *pSeg = pCsr->a
16fa0 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20  pSegment[i];.   
16fb0 20 69 66 28 20 21 70 53 65 67 2d 3e 61 4e 6f 64   if( !pSeg->aNod
16fc0 65 20 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64  e || fts3SegRead
16fd0 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20  erTermCmp(pSeg, 
16fe0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 20 29 7b  zTerm, nTerm) ){
16ff0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17000 20 20 7d 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e    }.  }.  pCsr->
17010 6e 41 64 76 61 6e 63 65 20 3d 20 69 3b 0a 0a 20  nAdvance = i;.. 
17020 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68   /* Advance each
17030 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73   of the segments
17040 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
17050 20 66 69 72 73 74 20 64 6f 63 69 64 2e 20 2a 2f   first docid. */
17060 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
17070 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b  sr->nAdvance; i+
17080 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  +){.    rc = fts
17090 33 53 65 67 52 65 61 64 65 72 46 69 72 73 74 44  3SegReaderFirstD
170a0 6f 63 69 64 28 70 2c 20 70 43 73 72 2d 3e 61 70  ocid(p, pCsr->ap
170b0 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Segment[i]);.   
170c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
170d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
170e0 20 20 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61    }.  fts3SegRea
170f0 64 65 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70  derSort(pCsr->ap
17100 53 65 67 6d 65 6e 74 2c 20 69 2c 20 69 2c 20 78  Segment, i, i, x
17110 43 6d 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Cmp);..  assert(
17120 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3c   iCol<0 || iCol<
17130 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  p->nColumn );.  
17140 70 43 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72  pCsr->iColFilter
17150 20 3d 20 69 43 6f 6c 3b 0a 0a 20 20 72 65 74 75   = iCol;..  retu
17160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17170 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17180 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
17190 6e 20 61 20 4d 75 6c 74 69 53 65 67 52 65 61 64  n a MultiSegRead
171a0 65 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  er that has been
171b0 20 73 74 61 72 74 65 64 20 75 73 69 6e 67 0a 2a   started using.*
171c0 2a 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72  * sqlite3Fts3Msr
171d0 49 6e 63 72 53 74 61 72 74 28 29 2e 20 4f 6e 65  IncrStart(). One
171e0 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
171f0 6f 20 4d 73 72 49 6e 63 72 4e 65 78 74 28 29 20  o MsrIncrNext() 
17200 6d 61 79 20 61 6c 73 6f 0a 2a 2a 20 68 61 76 65  may also.** have
17210 20 62 65 65 6e 20 6d 61 64 65 2e 20 43 61 6c 6c   been made. Call
17220 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
17230 6e 20 70 75 74 73 20 74 68 65 20 4d 75 6c 74 69  n puts the Multi
17240 53 65 67 52 65 61 64 65 72 20 69 6e 20 73 75 63  SegReader in suc
17250 68 0a 2a 2a 20 61 20 73 74 61 74 65 20 74 68 61  h.** a state tha
17260 74 20 69 66 20 74 68 65 20 6e 65 78 74 20 74 77  t if the next tw
17270 6f 20 63 61 6c 6c 73 20 61 72 65 3a 0a 2a 2a 0a  o calls are:.**.
17280 2a 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  **   sqlite3Fts3
17290 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 29  SegReaderStart()
172a0 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73  .**   sqlite3Fts
172b0 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 29  3SegReaderStep()
172c0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
172d0 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 66  entire doclist f
172e0 6f 72 20 74 68 65 20 74 65 72 6d 20 69 73 20 61  or the term is a
172f0 76 61 69 6c 61 62 6c 65 20 69 6e 20 0a 2a 2a 20  vailable in .** 
17300 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61  MultiSegReader.a
17310 44 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74  Doclist/nDoclist
17320 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17330 46 74 73 33 4d 73 72 49 6e 63 72 52 65 73 74 61  Fts3MsrIncrResta
17340 72 74 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52  rt(Fts3MultiSegR
17350 65 61 64 65 72 20 2a 70 43 73 72 29 7b 0a 20 20  eader *pCsr){.  
17360 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
17390 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
173a0 6e 74 2d 72 65 61 64 65 72 73 20 2a 2f 0a 0a 20  nt-readers */.. 
173b0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 7a   assert( pCsr->z
173c0 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Term==0 );.  ass
173d0 65 72 74 28 20 70 43 73 72 2d 3e 6e 54 65 72 6d  ert( pCsr->nTerm
173e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
173f0 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 3d   pCsr->aDoclist=
17400 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17410 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 3d 3d  pCsr->nDoclist==
17420 30 20 29 3b 0a 0a 20 20 70 43 73 72 2d 3e 6e 41  0 );..  pCsr->nA
17430 64 76 61 6e 63 65 20 3d 20 30 3b 0a 20 20 70 43  dvance = 0;.  pC
17440 73 72 2d 3e 62 52 65 73 74 61 72 74 20 3d 20 31  sr->bRestart = 1
17450 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
17460 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69  Csr->nSegment; i
17470 2b 2b 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 61  ++){.    pCsr->a
17480 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 70 4f 66  pSegment[i]->pOf
17490 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20  fsetList = 0;.  
174a0 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e    pCsr->apSegmen
174b0 74 5b 69 5d 2d 3e 6e 4f 66 66 73 65 74 4c 69 73  t[i]->nOffsetLis
174c0 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d  t = 0;.    pCsr-
174d0 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 69  >apSegment[i]->i
174e0 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Docid = 0;.  }..
174f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17500 4f 4b 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69  OK;.}...int sqli
17510 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
17520 53 74 65 70 28 0a 20 20 46 74 73 33 54 61 62 6c  Step(.  Fts3Tabl
17530 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
17540 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
17550 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
17560 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
17570 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20  gReader *pCsr   
17580 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
17590 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
175a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
175b0 3b 0a 0a 20 20 69 6e 74 20 69 73 49 67 6e 6f 72  ;..  int isIgnor
175c0 65 45 6d 70 74 79 20 3d 20 20 28 70 43 73 72 2d  eEmpty =  (pCsr-
175d0 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
175e0 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49  & FTS3_SEGMENT_I
175f0 47 4e 4f 52 45 5f 45 4d 50 54 59 29 3b 0a 20 20  GNORE_EMPTY);.  
17600 69 6e 74 20 69 73 52 65 71 75 69 72 65 50 6f 73  int isRequirePos
17610 20 3d 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c   =   (pCsr->pFil
17620 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
17630 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52  3_SEGMENT_REQUIR
17640 45 5f 50 4f 53 29 3b 0a 20 20 69 6e 74 20 69 73  E_POS);.  int is
17650 43 6f 6c 46 69 6c 74 65 72 20 3d 20 20 20 20 28  ColFilter =    (
17660 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66  pCsr->pFilter->f
17670 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d  lags & FTS3_SEGM
17680 45 4e 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45  ENT_COLUMN_FILTE
17690 52 29 3b 0a 20 20 69 6e 74 20 69 73 50 72 65 66  R);.  int isPref
176a0 69 78 20 3d 20 20 20 20 20 20 20 28 70 43 73 72  ix =       (pCsr
176b0 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
176c0 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
176d0 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 69  PREFIX);.  int i
176e0 73 53 63 61 6e 20 3d 20 20 20 20 20 20 20 20 20  sScan =         
176f0 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
17700 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
17710 4d 45 4e 54 5f 53 43 41 4e 29 3b 0a 20 20 69 6e  MENT_SCAN);.  in
17720 74 20 69 73 46 69 72 73 74 20 3d 20 20 20 20 20  t isFirst =     
17730 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65     (pCsr->pFilte
17740 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f  r->flags & FTS3_
17750 53 45 47 4d 45 4e 54 5f 46 49 52 53 54 29 3b 0a  SEGMENT_FIRST);.
17760 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
17770 20 2a 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70   **apSegment = p
17780 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a  Csr->apSegment;.
17790 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
177a0 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b   pCsr->nSegment;
177b0 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72  .  Fts3SegFilter
177c0 20 2a 70 46 69 6c 74 65 72 20 3d 20 70 43 73 72   *pFilter = pCsr
177d0 2d 3e 70 46 69 6c 74 65 72 3b 0a 20 20 69 6e 74  ->pFilter;.  int
177e0 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67   (*xCmp)(Fts3Seg
177f0 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65  Reader *, Fts3Se
17800 67 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20  gReader *) = (. 
17810 20 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f     p->bDescIdx ?
17820 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
17830 63 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74  clistCmpRev : ft
17840 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69  s3SegReaderDocli
17850 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66  stCmp.  );..  if
17860 28 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  ( pCsr->nSegment
17870 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
17880 49 54 45 5f 4f 4b 3b 0a 0a 20 20 64 6f 20 7b 0a  ITE_OK;..  do {.
17890 20 20 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 0a      int nMerge;.
178a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 0a 20 20      int i;.  .  
178b0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65    /* Advance the
178c0 20 66 69 72 73 74 20 70 43 73 72 2d 3e 6e 41 64   first pCsr->nAd
178d0 76 61 6e 63 65 20 65 6e 74 72 69 65 73 20 69 6e  vance entries in
178e0 20 74 68 65 20 61 70 53 65 67 6d 65 6e 74 5b 5d   the apSegment[]
178f0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 66 6f   array.    ** fo
17900 72 77 61 72 64 2e 20 54 68 65 6e 20 73 6f 72 74  rward. Then sort
17910 20 74 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64   the list in ord
17920 65 72 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  er of current te
17930 72 6d 20 61 67 61 69 6e 2e 20 20 0a 20 20 20 20  rm again.  .    
17940 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
17950 69 3c 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65  i<pCsr->nAdvance
17960 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  ; i++){.      Ft
17970 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
17980 67 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d  g = apSegment[i]
17990 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67  ;.      if( pSeg
179a0 2d 3e 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20  ->bLookup ){.   
179b0 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
179c0 65 72 53 65 74 45 6f 66 28 70 53 65 67 29 3b 0a  erSetEof(pSeg);.
179d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
179e0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
179f0 67 52 65 61 64 65 72 4e 65 78 74 28 70 2c 20 70  gReaderNext(p, p
17a00 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Seg, 0);.      }
17a10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17a20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17a30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17a40 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
17a50 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65  t(apSegment, nSe
17a60 67 6d 65 6e 74 2c 20 70 43 73 72 2d 3e 6e 41 64  gment, pCsr->nAd
17a70 76 61 6e 63 65 2c 20 66 74 73 33 53 65 67 52 65  vance, fts3SegRe
17a80 61 64 65 72 43 6d 70 29 3b 0a 20 20 20 20 70 43  aderCmp);.    pC
17a90 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30  sr->nAdvance = 0
17aa0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c  ;..    /* If all
17ab0 20 74 68 65 20 73 65 67 2d 72 65 61 64 65 72 73   the seg-readers
17ac0 20 61 72 65 20 61 74 20 45 4f 46 2c 20 77 65 27   are at EOF, we'
17ad0 72 65 20 66 69 6e 69 73 68 65 64 2e 20 72 65 74  re finished. ret
17ae0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a  urn SQLITE_OK. *
17af0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  /.    assert( rc
17b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
17b10 20 20 20 69 66 28 20 61 70 53 65 67 6d 65 6e 74     if( apSegment
17b20 5b 30 5d 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 20  [0]->aNode==0 ) 
17b30 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 73 72  break;..    pCsr
17b40 2d 3e 6e 54 65 72 6d 20 3d 20 61 70 53 65 67 6d  ->nTerm = apSegm
17b50 65 6e 74 5b 30 5d 2d 3e 6e 54 65 72 6d 3b 0a 20  ent[0]->nTerm;. 
17b60 20 20 20 70 43 73 72 2d 3e 7a 54 65 72 6d 20 3d     pCsr->zTerm =
17b70 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 7a   apSegment[0]->z
17b80 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Term;..    /* If
17b90 20 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69   this is a prefi
17ba0 78 2d 73 65 61 72 63 68 2c 20 61 6e 64 20 69 66  x-search, and if
17bb0 20 74 68 65 20 74 65 72 6d 20 74 68 61 74 20 61   the term that a
17bc0 70 53 65 67 6d 65 6e 74 5b 30 5d 20 70 6f 69 6e  pSegment[0] poin
17bd0 74 73 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 65  ts.    ** to doe
17be0 73 20 6e 6f 74 20 73 68 61 72 65 20 61 20 73 75  s not share a su
17bf0 66 66 69 78 20 77 69 74 68 20 70 46 69 6c 74 65  ffix with pFilte
17c00 72 2d 3e 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20  r->zTerm/nTerm, 
17c10 74 68 65 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  then all .    **
17c20 20 72 65 71 75 69 72 65 64 20 63 61 6c 6c 62 61   required callba
17c30 63 6b 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  cks have been ma
17c40 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
17c50 20 65 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20   exit early..   
17c60 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c   **.    ** Simil
17c70 61 72 6c 79 2c 20 69 66 20 74 68 69 73 20 69 73  arly, if this is
17c80 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e   a search for an
17c90 20 65 78 61 63 74 20 6d 61 74 63 68 2c 20 61 6e   exact match, an
17ca0 64 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  d the first term
17cb0 0a 20 20 20 20 2a 2a 20 6f 66 20 73 65 67 6d 65  .    ** of segme
17cc0 6e 74 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20  nt apSegment[0] 
17cd0 69 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20  is not a match, 
17ce0 65 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20  exit early..    
17cf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 74  */.    if( pFilt
17d00 65 72 2d 3e 7a 54 65 72 6d 20 26 26 20 21 69 73  er->zTerm && !is
17d10 53 63 61 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  Scan ){.      if
17d20 28 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3c 70 46  ( pCsr->nTerm<pF
17d30 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 20 0a 20 20  ilter->nTerm .  
17d40 20 20 20 20 20 7c 7c 20 28 21 69 73 50 72 65 66       || (!isPref
17d50 69 78 20 26 26 20 70 43 73 72 2d 3e 6e 54 65 72  ix && pCsr->nTer
17d60 6d 3e 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d  m>pFilter->nTerm
17d70 29 0a 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63  ).       || memc
17d80 6d 70 28 70 43 73 72 2d 3e 7a 54 65 72 6d 2c 20  mp(pCsr->zTerm, 
17d90 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20  pFilter->zTerm, 
17da0 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 20  pFilter->nTerm) 
17db0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
17dc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
17dd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4d 65 72  .    }..    nMer
17de0 67 65 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c  ge = 1;.    whil
17df0 65 28 20 6e 4d 65 72 67 65 3c 6e 53 65 67 6d 65  e( nMerge<nSegme
17e00 6e 74 20 0a 20 20 20 20 20 20 20 20 26 26 20 61  nt .        && a
17e10 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d  pSegment[nMerge]
17e20 2d 3e 61 4e 6f 64 65 0a 20 20 20 20 20 20 20 20  ->aNode.        
17e30 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65  && apSegment[nMe
17e40 72 67 65 5d 2d 3e 6e 54 65 72 6d 3d 3d 70 43 73  rge]->nTerm==pCs
17e50 72 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20  r->nTerm .      
17e60 20 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70    && 0==memcmp(p
17e70 43 73 72 2d 3e 7a 54 65 72 6d 2c 20 61 70 53 65  Csr->zTerm, apSe
17e80 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 7a  gment[nMerge]->z
17e90 54 65 72 6d 2c 20 70 43 73 72 2d 3e 6e 54 65 72  Term, pCsr->nTer
17ea0 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  m).    ){.      
17eb0 6e 4d 65 72 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a  nMerge++;.    }.
17ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 49  .    assert( isI
17ed0 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20 28 69  gnoreEmpty || (i
17ee0 73 52 65 71 75 69 72 65 50 6f 73 20 26 26 20 21  sRequirePos && !
17ef0 69 73 43 6f 6c 46 69 6c 74 65 72 29 20 29 3b 0a  isColFilter) );.
17f00 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d      if( nMerge==
17f10 31 20 0a 20 20 20 20 20 26 26 20 21 69 73 49 67  1 .     && !isIg
17f20 6e 6f 72 65 45 6d 70 74 79 20 0a 20 20 20 20 20  noreEmpty .     
17f30 26 26 20 21 69 73 46 69 72 73 74 20 0a 20 20 20  && !isFirst .   
17f40 20 20 26 26 20 28 70 2d 3e 62 44 65 73 63 49 64    && (p->bDescId
17f50 78 3d 3d 30 20 7c 7c 20 66 74 73 33 53 65 67 52  x==0 || fts3SegR
17f60 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61  eaderIsPending(a
17f70 70 53 65 67 6d 65 6e 74 5b 30 5d 29 3d 3d 30 29  pSegment[0])==0)
17f80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
17f90 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 61  sr->nDoclist = a
17fa0 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 44 6f  pSegment[0]->nDo
17fb0 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28  clist;.      if(
17fc0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
17fd0 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e  Pending(apSegmen
17fe0 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t[0]) ){.       
17ff0 20 72 63 20 3d 20 66 74 73 33 4d 73 72 42 75 66   rc = fts3MsrBuf
18000 66 65 72 44 61 74 61 28 70 43 73 72 2c 20 61 70  ferData(pCsr, ap
18010 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63  Segment[0]->aDoc
18020 6c 69 73 74 2c 20 70 43 73 72 2d 3e 6e 44 6f 63  list, pCsr->nDoc
18030 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  list);.        p
18040 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20  Csr->aDoclist = 
18050 70 43 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20  pCsr->aBuffer;. 
18060 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18070 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69      pCsr->aDocli
18080 73 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  st = apSegment[0
18090 5d 2d 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20  ]->aDoclist;.   
180a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
180b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
180c0 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
180d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
180e0 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20   int nDoclist = 
180f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
18100 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
18110 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
18120 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20 30  _int64 iPrev = 0
18130 3b 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  ;    /* Previous
18140 20 64 6f 63 69 64 20 73 74 6f 72 65 64 20 69 6e   docid stored in
18150 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 20   doclist */..   
18160 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
18170 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 69  t term of the fi
18180 72 73 74 20 6e 4d 65 72 67 65 20 65 6e 74 72 69  rst nMerge entri
18190 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 0a  es in the array.
181a0 20 20 20 20 20 20 2a 2a 20 6f 66 20 46 74 73 33        ** of Fts3
181b0 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
181c0 73 20 69 73 20 74 68 65 20 73 61 6d 65 2e 20 54  s is the same. T
181d0 68 65 20 64 6f 63 6c 69 73 74 73 20 6d 75 73 74  he doclists must
181e0 20 62 65 20 6d 65 72 67 65 64 0a 20 20 20 20 20   be merged.     
181f0 20 2a 2a 20 61 6e 64 20 61 20 73 69 6e 67 6c 65   ** and a single
18200 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 77   term returned w
18210 69 74 68 20 74 68 65 20 6d 65 72 67 65 64 20 64  ith the merged d
18220 6f 63 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f  oclist..      */
18230 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
18240 69 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a  i<nMerge; i++){.
18250 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52          fts3SegR
18260 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28  eaderFirstDocid(
18270 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29  p, apSegment[i])
18280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18290 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
182a0 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  t(apSegment, nMe
182b0 72 67 65 2c 20 6e 4d 65 72 67 65 2c 20 78 43 6d  rge, nMerge, xCm
182c0 70 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  p);.      while(
182d0 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 70   apSegment[0]->p
182e0 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20 20  OffsetList ){.  
182f0 20 20 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20        int j;    
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18310 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
18320 6d 65 6e 74 73 20 74 68 61 74 20 73 68 61 72 65  ments that share
18330 20 61 20 64 6f 63 69 64 20 2a 2f 0a 20 20 20 20   a docid */.    
18340 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20      char *pList 
18350 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
18360 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
18370 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
18380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
18390 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70  nt64 iDocid = ap
183a0 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63  Segment[0]->iDoc
183b0 69 64 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33  id;.        fts3
183c0 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63  SegReaderNextDoc
183d0 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b  id(p, apSegment[
183e0 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  0], &pList, &nLi
183f0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  st);.        j =
18400 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   1;.        whil
18410 65 28 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20  e( j<nMerge.    
18420 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67          && apSeg
18430 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74  ment[j]->pOffset
18440 4c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  List.           
18450 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d   && apSegment[j]
18460 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64  ->iDocid==iDocid
18470 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
18480 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
18490 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20  derNextDocid(p, 
184a0 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c  apSegment[j], 0,
184b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   0);.          j
184c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ++;.        }.. 
184d0 20 20 20 20 20 20 20 69 66 28 20 69 73 43 6f 6c         if( isCol
184e0 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
184f0 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69      fts3ColumnFi
18500 6c 74 65 72 28 70 46 69 6c 74 65 72 2d 3e 69 43  lter(pFilter->iC
18510 6f 6c 2c 20 30 2c 20 26 70 4c 69 73 74 2c 20 26  ol, 0, &pList, &
18520 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nList);.        
18530 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  }..        if( !
18540 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c  isIgnoreEmpty ||
18550 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 0a 20 20 20   nList>0 ){..   
18560 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c         /* Calcul
18570 61 74 65 20 74 68 65 20 27 64 6f 63 69 64 27 20  ate the 'docid' 
18580 64 65 6c 74 61 20 76 61 6c 75 65 20 74 6f 20 77  delta value to w
18590 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6d 65  rite into the me
185a0 72 67 65 64 20 0a 20 20 20 20 20 20 20 20 20 20  rged .          
185b0 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20  ** doclist. */. 
185c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
185d0 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20  _int64 iDelta;. 
185e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
185f0 62 44 65 73 63 49 64 78 20 26 26 20 6e 44 6f 63  bDescIdx && nDoc
18600 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  list>0 ){.      
18610 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69        iDelta = i
18620 50 72 65 76 20 2d 20 69 44 6f 63 69 64 3b 0a 20  Prev - iDocid;. 
18630 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
18640 20 20 20 20 20 20 20 20 20 20 20 20 69 44 65 6c              iDel
18650 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 69 50  ta = iDocid - iP
18660 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rev;.          }
18670 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
18680 44 65 6c 74 61 3c 3d 30 20 26 26 20 28 6e 44 6f  Delta<=0 && (nDo
18690 63 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65 6c 74  clist>0 || iDelt
186a0 61 21 3d 69 44 6f 63 69 64 29 20 29 7b 0a 20 20  a!=iDocid) ){.  
186b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
186c0 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
186d0 42 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  B;.          }. 
186e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
186f0 20 6e 44 6f 63 6c 69 73 74 3e 30 20 7c 7c 20 69   nDoclist>0 || i
18700 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64 20 29 3b  Delta==iDocid );
18710 0a 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ..          nByt
18720 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56  e = sqlite3Fts3V
18730 61 72 69 6e 74 4c 65 6e 28 69 44 65 6c 74 61 29  arintLen(iDelta)
18740 20 2b 20 28 69 73 52 65 71 75 69 72 65 50 6f 73   + (isRequirePos
18750 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20  ?nList+1:0);.   
18760 20 20 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c         if( nDocl
18770 69 73 74 2b 6e 42 79 74 65 3e 70 43 73 72 2d 3e  ist+nByte>pCsr->
18780 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  nBuffer ){.     
18790 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65         char *aNe
187a0 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  w;.            p
187b0 43 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 28  Csr->nBuffer = (
187c0 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74 65 29 2a  nDoclist+nByte)*
187d0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  2;.            a
187e0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
187f0 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 42 75 66  alloc(pCsr->aBuf
18800 66 65 72 2c 20 70 43 73 72 2d 3e 6e 42 75 66 66  fer, pCsr->nBuff
18810 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
18820 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
18830 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18840 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
18850 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
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 20 3d 20 61 4e 65 77 3b  >aBuffer = aNew;
18880 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
18890 20 20 20 20 20 20 20 20 69 66 28 20 69 73 46 69          if( isFi
188a0 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rst ){.         
188b0 20 20 20 63 68 61 72 20 2a 61 20 3d 20 26 70 43     char *a = &pC
188c0 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63  sr->aBuffer[nDoc
188d0 6c 69 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20  list];.         
188e0 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20     int nWrite;. 
188f0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
18900 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
18910 73 71 6c 69 74 65 33 46 74 73 33 46 69 72 73 74  sqlite3Fts3First
18920 46 69 6c 74 65 72 28 69 44 65 6c 74 61 2c 20 70  Filter(iDelta, p
18930 4c 69 73 74 2c 20 6e 4c 69 73 74 2c 20 61 29 3b  List, nList, a);
18940 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
18950 20 6e 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20   nWrite ){.     
18960 20 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d           iPrev =
18970 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20   iDocid;.       
18980 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20         nDoclist 
18990 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  += nWrite;.     
189a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
189b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189c0 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b        nDoclist +
189d0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
189e0 56 61 72 69 6e 74 28 26 70 43 73 72 2d 3e 61 42  Varint(&pCsr->aB
189f0 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c  uffer[nDoclist],
18a00 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20   iDelta);.      
18a10 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 44        iPrev = iD
18a20 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  ocid;.          
18a30 20 20 69 66 28 20 69 73 52 65 71 75 69 72 65 50    if( isRequireP
18a40 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  os ){.          
18a50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 73 72      memcpy(&pCsr
18a60 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69  ->aBuffer[nDocli
18a70 73 74 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73  st], pList, nLis
18a80 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
18a90 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c    nDoclist += nL
18aa0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
18ab0 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72     pCsr->aBuffer
18ac0 5b 6e 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27  [nDoclist++] = '
18ad0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
18ae0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
18af0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
18b00 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
18b10 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e  ort(apSegment, n
18b20 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b  Merge, j, xCmp);
18b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18b40 66 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b  f( nDoclist>0 ){
18b50 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61  .        pCsr->a
18b60 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
18b70 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20  aBuffer;.       
18b80 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20   pCsr->nDoclist 
18b90 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  = nDoclist;.    
18ba0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18bb0 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROW;.      }.   
18bc0 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64   }.    pCsr->nAd
18bd0 76 61 6e 63 65 20 3d 20 6e 4d 65 72 67 65 3b 0a  vance = nMerge;.
18be0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
18bf0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 72 65  LITE_OK );..  re
18c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76 6f 69  turn rc;.}...voi
18c10 64 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  d sqlite3Fts3Seg
18c20 52 65 61 64 65 72 46 69 6e 69 73 68 28 0a 20 20  ReaderFinish(.  
18c30 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
18c40 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 2f  er *pCsr       /
18c50 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
18c60 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 73 72  */.){.  if( pCsr
18c70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
18c80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
18c90 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b  sr->nSegment; i+
18ca0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
18cb0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
18cc0 65 65 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  ee(pCsr->apSegme
18cd0 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  nt[i]);.    }.  
18ce0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
18cf0 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 29 3b  Csr->apSegment);
18d00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18d10 65 28 70 43 73 72 2d 3e 61 42 75 66 66 65 72 29  e(pCsr->aBuffer)
18d20 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 65  ;..    pCsr->nSe
18d30 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  gment = 0;.    p
18d40 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d  Csr->apSegment =
18d50 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 42   0;.    pCsr->aB
18d60 75 66 66 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d  uffer = 0;.  }.}
18d70 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
18d80 68 65 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  he "end_block" f
18d90 69 65 6c 64 2c 20 73 65 6c 65 63 74 65 64 20 62  ield, selected b
18da0 79 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66  y column iCol of
18db0 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20   the SELECT .** 
18dc0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
18dd0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
18de0 67 75 6d 65 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 54  gument. .**.** T
18df0 68 65 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  he "end_block" f
18e00 69 65 6c 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ield may contain
18e10 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67   either an integ
18e20 65 72 2c 20 6f 72 20 61 20 74 65 78 74 20 66 69  er, or a text fi
18e30 65 6c 64 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  eld.** containin
18e40 67 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  g the text repre
18e50 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 77 6f  sentation of two
18e60 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
18e70 74 65 67 65 72 73 20 73 65 70 61 72 61 74 65 64  tegers separated
18e80 20 0a 2a 2a 20 62 79 20 6f 6e 65 20 6f 72 20 6d   .** by one or m
18e90 6f 72 65 20 73 70 61 63 65 20 28 30 78 32 30 29  ore space (0x20)
18ea0 20 63 68 61 72 61 63 74 65 72 73 2e 20 49 6e 20   characters. In 
18eb0 74 68 65 20 66 69 72 73 74 20 63 61 73 65 2c 20  the first case, 
18ec0 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20  set *piEndBlock 
18ed0 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 74 65 67  .** to the integ
18ee0 65 72 20 76 61 6c 75 65 20 61 6e 64 20 2a 70 6e  er value and *pn
18ef0 42 79 74 65 20 74 6f 20 7a 65 72 6f 20 62 65 66  Byte to zero bef
18f00 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
18f10 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 0a 2a  n the second, .*
18f20 2a 20 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63  * set *piEndBloc
18f30 6b 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 76  k to the first v
18f40 61 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79 74 65  alue and *pnByte
18f50 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a   to the second..
18f60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18f70 74 73 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46  ts3ReadEndBlockF
18f80 69 65 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  ield(.  sqlite3_
18f90 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 0a 20 20  stmt *pStmt, .  
18fa0 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 36 34  int iCol, .  i64
18fb0 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 2c 0a 20 20   *piEndBlock,.  
18fc0 69 36 34 20 2a 70 6e 42 79 74 65 0a 29 7b 0a 20  i64 *pnByte.){. 
18fd0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
18fe0 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 73 71  char *zText = sq
18ff0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
19000 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  t(pStmt, iCol);.
19010 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
19020 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
19030 74 20 69 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20  t iMul = 1;.    
19040 69 36 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20  i64 iVal = 0;.  
19050 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74    for(i=0; zText
19060 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 54 65 78  [i]>='0' && zTex
19070 74 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b  t[i]<='9'; i++){
19080 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 56  .      iVal = iV
19090 61 6c 2a 31 30 20 2b 20 28 7a 54 65 78 74 5b 69  al*10 + (zText[i
190a0 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 7d 0a  ] - '0');.    }.
190b0 20 20 20 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20      *piEndBlock 
190c0 3d 20 69 56 61 6c 3b 0a 20 20 20 20 77 68 69 6c  = iVal;.    whil
190d0 65 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 20 27  e( zText[i]==' '
190e0 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 56 61 6c   ) i++;.    iVal
190f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 54   = 0;.    if( zT
19100 65 78 74 5b 69 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ext[i]=='-' ){. 
19110 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
19120 69 4d 75 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  iMul = -1;.    }
19130 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f  .    for(/* no-o
19140 70 20 2a 2f 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d  p */; zText[i]>=
19150 27 30 27 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c  '0' && zText[i]<
19160 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ='9'; i++){.    
19170 20 20 69 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30    iVal = iVal*10
19180 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27   + (zText[i] - '
19190 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  0');.    }.    *
191a0 70 6e 42 79 74 65 20 3d 20 28 69 56 61 6c 20 2a  pnByte = (iVal *
191b0 20 28 69 36 34 29 69 4d 75 6c 29 3b 0a 20 20 7d   (i64)iMul);.  }
191c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 65 67  .}.../*.** A seg
191d0 6d 65 6e 74 20 6f 66 20 73 69 7a 65 20 6e 42 79  ment of size nBy
191e0 74 65 20 62 79 74 65 73 20 68 61 73 20 6a 75 73  te bytes has jus
191f0 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
19200 6f 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  o absolute level
19210 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 2e 20 50  .** iAbsLevel. P
19220 72 6f 6d 6f 74 65 20 61 6e 79 20 73 65 67 6d 65  romote any segme
19230 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nts that should 
19240 62 65 20 70 72 6f 6d 6f 74 65 64 20 61 73 20 61  be promoted as a
19250 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
19260 69 63 20 69 6e 74 20 66 74 73 33 50 72 6f 6d 6f  ic int fts3Promo
19270 74 65 53 65 67 6d 65 6e 74 73 28 0a 20 20 46 74  teSegments(.  Ft
19280 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
192a0 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c   FTS table handl
192b0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
192c0 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20  nt64 iAbsLevel, 
192d0 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
192e0 74 65 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70  te level just up
192f0 64 61 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  dated */.  sqlit
19300 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 20  e3_int64 nByte  
19310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
19320 7a 65 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e  ze of new segmen
19330 74 20 61 74 20 69 41 62 73 4c 65 76 65 6c 20 2a  t at iAbsLevel *
19340 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
19350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
19360 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 61 6e 67  ite3_stmt *pRang
19370 65 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  e;..  rc = fts3S
19380 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
19390 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45  LECT_LEVEL_RANGE
193a0 32 2c 20 26 70 52 61 6e 67 65 2c 20 30 29 3b 0a  2, &pRange, 0);.
193b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
193c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
193d0 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  bOk = 0;.    i64
193e0 20 69 4c 61 73 74 20 3d 20 28 69 41 62 73 4c 65   iLast = (iAbsLe
193f0 76 65 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f  vel/FTS3_SEGDIR_
19400 4d 41 58 4c 45 56 45 4c 20 2b 20 31 29 20 2a 20  MAXLEVEL + 1) * 
19410 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
19420 45 56 45 4c 20 2d 20 31 3b 0a 20 20 20 20 69 36  EVEL - 1;.    i6
19430 34 20 6e 4c 69 6d 69 74 20 3d 20 28 6e 42 79 74  4 nLimit = (nByt
19440 65 2a 33 29 2f 32 3b 0a 0a 20 20 20 20 2f 2a 20  e*3)/2;..    /* 
19450 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
19460 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
19470 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 63  %_segdir table c
19480 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
19490 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73  .    ** segments
194a0 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20 6f   in this index o
194b0 6e 20 6c 65 76 65 6c 73 20 67 72 65 61 74 65 72  n levels greater
194c0 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e   than iAbsLevel.
194d0 20 49 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   If there is.   
194e0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
194f0 20 73 75 63 68 20 73 65 67 6d 65 6e 74 2c 20 61   such segment, a
19500 6e 64 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  nd it is possibl
19510 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
19520 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  hat all .    ** 
19530 73 75 63 68 20 73 65 67 6d 65 6e 74 73 20 61 72  such segments ar
19540 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  e smaller than n
19550 4c 69 6d 69 74 20 62 79 74 65 73 20 69 6e 20 73  Limit bytes in s
19560 69 7a 65 2c 20 74 68 65 79 20 77 69 6c 6c 20 62  ize, they will b
19570 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f 6d 6f 74  e .    ** promot
19580 65 64 20 74 6f 20 6c 65 76 65 6c 20 69 41 62 73  ed to level iAbs
19590 4c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 73  Level.  */.    s
195a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
195b0 34 28 70 52 61 6e 67 65 2c 20 31 2c 20 69 41 62  4(pRange, 1, iAb
195c0 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73  sLevel+1);.    s
195d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
195e0 34 28 70 52 61 6e 67 65 2c 20 32 2c 20 69 4c 61  4(pRange, 2, iLa
195f0 73 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  st);.    while( 
19600 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
19610 74 65 33 5f 73 74 65 70 28 70 52 61 6e 67 65 29  te3_step(pRange)
19620 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 53   ){.      i64 nS
19630 69 7a 65 20 3d 20 30 2c 20 64 75 6d 6d 79 3b 0a  ize = 0, dummy;.
19640 20 20 20 20 20 20 66 74 73 33 52 65 61 64 45 6e        fts3ReadEn
19650 64 42 6c 6f 63 6b 46 69 65 6c 64 28 70 52 61 6e  dBlockField(pRan
19660 67 65 2c 20 32 2c 20 26 64 75 6d 6d 79 2c 20 26  ge, 2, &dummy, &
19670 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
19680 28 20 6e 53 69 7a 65 3c 3d 30 20 7c 7c 20 6e 53  ( nSize<=0 || nS
19690 69 7a 65 3e 6e 4c 69 6d 69 74 20 29 7b 0a 20 20  ize>nLimit ){.  
196a0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 53 69 7a        /* If nSiz
196b0 65 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 25  e==0, then the %
196c0 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63  _segdir.end_bloc
196d0 6b 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74  k field does not
196e0 20 6e 6f 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   not .        **
196f0 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 7a 65 20   contain a size 
19700 76 61 6c 75 65 2e 20 54 68 69 73 20 68 61 70 70  value. This happ
19710 65 6e 73 20 69 66 20 69 74 20 77 61 73 20 77 72  ens if it was wr
19720 69 74 74 65 6e 20 62 79 20 61 6e 0a 20 20 20 20  itten by an.    
19730 20 20 20 20 2a 2a 20 6f 6c 64 20 76 65 72 73 69      ** old versi
19740 6f 6e 20 6f 66 20 46 54 53 2e 20 49 6e 20 74 68  on of FTS. In th
19750 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
19760 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  t possible to de
19770 74 65 72 6d 69 6e 65 0a 20 20 20 20 20 20 20 20  termine.        
19780 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ** the size of t
19790 68 65 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20  he segment, and 
197a0 73 6f 20 73 65 67 6d 65 6e 74 20 70 72 6f 6d 6f  so segment promo
197b0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 20 20  tion does not.  
197c0 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 20 70 6c        ** take pl
197d0 61 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ace.  */.       
197e0 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20   bOk = 0;.      
197f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19800 0a 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a  .      bOk = 1;.
19810 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
19820 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 61  qlite3_reset(pRa
19830 6e 67 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 62  nge);..    if( b
19840 4f 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  Ok ){.      int 
19850 69 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  iIdx = 0;.      
19860 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55  sqlite3_stmt *pU
19870 70 64 61 74 65 31 20 3d 20 30 3b 0a 20 20 20 20  pdate1 = 0;.    
19880 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19890 70 55 70 64 61 74 65 32 20 3d 20 30 3b 0a 0a 20  pUpdate2 = 0;.. 
198a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
198b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
198c0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
198d0 6d 74 28 70 2c 20 53 51 4c 5f 55 50 44 41 54 45  mt(p, SQL_UPDATE
198e0 5f 4c 45 56 45 4c 5f 49 44 58 2c 20 26 70 55 70  _LEVEL_IDX, &pUp
198f0 64 61 74 65 31 2c 20 30 29 3b 0a 20 20 20 20 20  date1, 0);.     
19900 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19920 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53        rc = fts3S
19930 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 55 50  qlStmt(p, SQL_UP
19940 44 41 54 45 5f 4c 45 56 45 4c 2c 20 26 70 55 70  DATE_LEVEL, &pUp
19950 64 61 74 65 32 2c 20 30 29 3b 0a 20 20 20 20 20  date2, 0);.     
19960 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
19970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
19980 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
19990 74 68 72 6f 75 67 68 20 61 6c 6c 20 25 5f 73 65  through all %_se
199a0 67 64 69 72 20 65 6e 74 72 69 65 73 20 66 6f 72  gdir entries for
199b0 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69   segments in thi
199c0 73 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 20  s index with.   
199d0 20 20 20 20 20 2a 2a 20 6c 65 76 65 6c 73 20 65       ** levels e
199e0 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
199f0 65 72 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65  er than iAbsLeve
19a00 6c 2e 20 41 73 20 65 61 63 68 20 65 6e 74 72 79  l. As each entry
19a10 20 69 73 20 76 69 73 69 74 65 64 2c 0a 20 20 20   is visited,.   
19a20 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65 64 20       ** updated 
19a30 69 74 20 74 6f 20 73 65 74 20 28 6c 65 76 65 6c  it to set (level
19a40 20 3d 20 2d 31 29 20 61 6e 64 20 28 69 64 78 20   = -1) and (idx 
19a50 3d 20 4e 29 2c 20 77 68 65 72 65 20 4e 20 69 73  = N), where N is
19a60 20 30 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   0 for the.     
19a70 20 20 20 2a 2a 20 6f 6c 64 65 73 74 20 73 65 67     ** oldest seg
19a80 6d 65 6e 74 20 69 6e 20 74 68 65 20 72 61 6e 67  ment in the rang
19a90 65 2c 20 31 20 66 6f 72 20 74 68 65 20 6e 65 78  e, 1 for the nex
19aa0 74 20 6f 6c 64 65 73 74 2c 20 61 6e 64 20 73 6f  t oldest, and so
19ab0 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   on..        **.
19ac0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 74          ** In ot
19ad0 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 76 65 20  her words, move 
19ae0 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 62 65 69  all segments bei
19af0 6e 67 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 6c  ng promoted to l
19b00 65 76 65 6c 20 2d 31 2c 0a 20 20 20 20 20 20 20  evel -1,.       
19b10 20 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20   ** setting the 
19b20 22 69 64 78 22 20 66 69 65 6c 64 73 20 61 73 20  "idx" fields as 
19b30 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 6b  appropriate to k
19b40 65 65 70 20 74 68 65 6d 20 69 6e 20 74 68 65 20  eep them in the 
19b50 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  same.        ** 
19b60 6f 72 64 65 72 2e 20 54 68 65 20 63 6f 6e 74 65  order. The conte
19b70 6e 74 73 20 6f 66 20 6c 65 76 65 6c 20 2d 31 20  nts of level -1 
19b80 28 77 68 69 63 68 20 69 73 20 6e 65 76 65 72 20  (which is never 
19b90 75 73 65 64 2c 20 65 78 63 65 70 74 0a 20 20 20  used, except.   
19ba0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e       ** transien
19bb0 74 6c 79 20 68 65 72 65 29 2c 20 77 69 6c 6c 20  tly here), will 
19bc0 62 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  be moved back to
19bd0 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
19be0 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
19bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
19c00 5f 69 6e 74 36 34 28 70 52 61 6e 67 65 2c 20 31  _int64(pRange, 1
19c10 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
19c20 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
19c30 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
19c40 5f 73 74 65 70 28 70 52 61 6e 67 65 29 20 29 7b  _step(pRange) ){
19c50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19c60 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64  e3_bind_int(pUpd
19c70 61 74 65 31 2c 20 31 2c 20 69 49 64 78 2b 2b 29  ate1, 1, iIdx++)
19c80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19c90 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70  te3_bind_int(pUp
19ca0 64 61 74 65 31 2c 20 32 2c 20 73 71 6c 69 74 65  date1, 2, sqlite
19cb0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 52 61  3_column_int(pRa
19cc0 6e 67 65 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  nge, 0));.      
19cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
19ce0 5f 69 6e 74 28 70 55 70 64 61 74 65 31 2c 20 33  _int(pUpdate1, 3
19cf0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
19d00 5f 69 6e 74 28 70 52 61 6e 67 65 2c 20 31 29 29  _int(pRange, 1))
19d10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19d20 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65  te3_step(pUpdate
19d30 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
19d40 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
19d50 28 70 55 70 64 61 74 65 31 29 3b 0a 20 20 20 20  (pUpdate1);.    
19d60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19d70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
19d90 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a 20 20  eset(pRange);.  
19da0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19db0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19dd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19df0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
19e00 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a 20 20  eset(pRange);.  
19e10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
19e20 4d 6f 76 65 20 6c 65 76 65 6c 20 2d 31 20 74 6f  Move level -1 to
19e30 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
19e40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
19e50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
19e70 69 6e 64 5f 69 6e 74 36 34 28 70 55 70 64 61 74  ind_int64(pUpdat
19e80 65 32 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c  e2, 1, iAbsLevel
19e90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19ea0 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 32  e3_step(pUpdate2
19eb0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19ec0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55  sqlite3_reset(pU
19ed0 70 64 61 74 65 32 29 3b 0a 20 20 20 20 20 20 7d  pdate2);.      }
19ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72  .    }.  }...  r
19ef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19f00 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 6c 65 76  ** Merge all lev
19f10 65 6c 20 69 4c 65 76 65 6c 20 73 65 67 6d 65 6e  el iLevel segmen
19f20 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
19f30 73 65 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  se into a single
19f40 20 0a 2a 2a 20 69 4c 65 76 65 6c 2b 31 20 73 65   .** iLevel+1 se
19f50 67 6d 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 4c  gment. Or, if iL
19f60 65 76 65 6c 3c 30 2c 20 6d 65 72 67 65 20 61 6c  evel<0, merge al
19f70 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f 20  l segments into 
19f80 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 73 65 67 6d  a.** single segm
19f90 65 6e 74 20 77 69 74 68 20 61 20 6c 65 76 65 6c  ent with a level
19fa0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75   equal to the nu
19fb0 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72 67 65 73  merically larges
19fc0 74 20 6c 65 76 65 6c 20 0a 2a 2a 20 63 75 72 72  t level .** curr
19fd0 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e  ently present in
19fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
19ff0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
1a000 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1a010 77 69 74 68 20 69 4c 65 76 65 6c 3c 30 2c 20 62  with iLevel<0, b
1a020 75 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ut there is only
1a030 20 6f 6e 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20   one.** segment 
1a040 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
1a050 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1a060 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
1a070 74 65 6c 79 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  tely. .** Otherw
1a080 69 73 65 2c 20 69 66 20 73 75 63 63 65 73 73 66  ise, if successf
1a090 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
1a0a0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1a0b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 0a   error occurs, .
1a0c0 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
1a0d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1a0e0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1a0f0 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65  nt fts3SegmentMe
1a100 72 67 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65  rge(.  Fts3Table
1a110 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e   *p, .  int iLan
1a120 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
1a130 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
1a140 61 67 65 20 69 64 20 74 6f 20 6d 65 72 67 65 20  age id to merge 
1a150 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  */.  int iIndex,
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1a180 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 74 6f 20   p->aIndex[] to 
1a190 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  merge */.  int i
1a1a0 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 20  Level           
1a1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
1a1c0 76 65 6c 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  vel to merge */.
1a1d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1a200 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ode */.  int iId
1a210 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
1a220 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1a230 78 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74  x of new segment
1a240 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1a250 74 36 34 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20  t64 iNewLevel = 
1a260 30 3b 20 20 20 20 2f 2a 20 4c 65 76 65 6c 2f 69  0;    /* Level/i
1a270 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 6e  ndex to create n
1a280 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20 2a 2f  ew segment at */
1a290 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  .  SegmentWriter
1a2a0 20 2a 70 57 72 69 74 65 72 20 3d 20 30 3b 20 20   *pWriter = 0;  
1a2b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 77 72     /* Used to wr
1a2c0 69 74 65 20 74 68 65 20 6e 65 77 2c 20 6d 65 72  ite the new, mer
1a2d0 67 65 64 2c 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  ged, segment */.
1a2e0 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20    Fts3SegFilter 
1a2f0 66 69 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20  filter;         
1a300 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 65 72    /* Segment ter
1a310 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64 69 74 69  m filter conditi
1a320 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74  on */.  Fts3Mult
1a330 69 53 65 67 52 65 61 64 65 72 20 63 73 72 3b 20  iSegReader csr; 
1a340 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1a350 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
1a360 6f 75 67 68 20 6c 65 76 65 6c 28 73 29 20 2a 2f  ough level(s) */
1a370 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72 65 45 6d  .  int bIgnoreEm
1a380 70 74 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pty = 0;        
1a390 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 67     /* True to ig
1a3a0 6e 6f 72 65 20 65 6d 70 74 79 20 73 65 67 6d 65  nore empty segme
1a3b0 6e 74 73 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61  nts */.  i64 iMa
1a3c0 78 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20  xLevel = 0;     
1a3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20           /* Max 
1a3e0 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 66 6f 72  level number for
1a3f0 20 74 68 69 73 20 69 6e 64 65 78 2f 6c 61 6e 67   this index/lang
1a400 69 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  id */..  assert(
1a410 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
1a420 47 43 55 52 53 4f 52 5f 41 4c 4c 0a 20 20 20 20  GCURSOR_ALL.    
1a430 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46 54     || iLevel==FT
1a440 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e  S3_SEGCURSOR_PEN
1a450 44 49 4e 47 0a 20 20 20 20 20 20 20 7c 7c 20 69  DING.       || i
1a460 4c 65 76 65 6c 3e 3d 30 0a 20 20 29 3b 0a 20 20  Level>=0.  );.  
1a470 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46  assert( iLevel<F
1a480 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
1a490 56 45 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VEL );.  assert(
1a4a0 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49   iIndex>=0 && iI
1a4b0 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29  ndex<p->nIndex )
1a4c0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1a4d0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
1a4e0 72 73 6f 72 28 70 2c 20 69 4c 61 6e 67 69 64 2c  rsor(p, iLangid,
1a4f0 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c   iIndex, iLevel,
1a500 20 30 2c 20 30 2c 20 31 2c 20 30 2c 20 26 63 73   0, 0, 1, 0, &cs
1a510 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1a520 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 73 72 2e 6e  LITE_OK || csr.n
1a530 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20 67 6f 74  Segment==0 ) got
1a540 6f 20 66 69 6e 69 73 68 65 64 3b 0a 0a 20 20 69  o finished;..  i
1a550 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f  f( iLevel!=FTS3_
1a560 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e  SEGCURSOR_PENDIN
1a570 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  G ){.    rc = ft
1a580 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65  s3SegmentMaxLeve
1a590 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
1a5a0 6e 64 65 78 2c 20 26 69 4d 61 78 4c 65 76 65 6c  ndex, &iMaxLevel
1a5b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1a5c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a5d0 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20  finished;.  }.. 
1a5e0 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53   if( iLevel==FTS
1a5f0 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20  3_SEGCURSOR_ALL 
1a600 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1a610 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67 65 20  all is to merge 
1a620 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
1a630 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
1a640 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a 2a 20  a single.    ** 
1a650 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 6c 65 76  segment. The lev
1a660 65 6c 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65  el of the new se
1a670 67 6d 65 6e 74 20 69 73 20 65 71 75 61 6c 20 74  gment is equal t
1a680 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  o the numericall
1a690 79 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65 73  y.    ** greates
1a6a0 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20  t segment level 
1a6b0 63 75 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e  currently presen
1a6c0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
1a6d0 65 20 66 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  e for this.    *
1a6e0 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 69 64 78  * index. The idx
1a6f0 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65 67 6d   of the new segm
1a700 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20 30 2e  ent is always 0.
1a710 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 73 72    */.    if( csr
1a720 2e 6e 53 65 67 6d 65 6e 74 3d 3d 31 20 26 26 20  .nSegment==1 && 
1a730 30 3d 3d 66 74 73 33 53 65 67 52 65 61 64 65 72  0==fts3SegReader
1a740 49 73 50 65 6e 64 69 6e 67 28 63 73 72 2e 61 70  IsPending(csr.ap
1a750 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20  Segment[0]) ){. 
1a760 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a770 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 67 6f 74  _DONE;.      got
1a780 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  o finished;.    
1a790 7d 0a 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 20  }.    iNewLevel 
1a7a0 3d 20 69 4d 61 78 4c 65 76 65 6c 3b 0a 20 20 20  = iMaxLevel;.   
1a7b0 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20   bIgnoreEmpty = 
1a7c0 31 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1;..  }else{.   
1a7d0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
1a7e0 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65   to merge all se
1a7f0 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20  gments at level 
1a800 69 4c 65 76 65 6c 2e 20 66 69 6e 64 20 74 68 65  iLevel. find the
1a810 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 61 76 61   next.    ** ava
1a820 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69  ilable segment i
1a830 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c  ndex at level iL
1a840 65 76 65 6c 2b 31 2e 20 54 68 65 20 63 61 6c 6c  evel+1. The call
1a850 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74 73 33 41   to.    ** fts3A
1a860 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
1a870 28 29 20 77 69 6c 6c 20 6d 65 72 67 65 20 74 68  () will merge th
1a880 65 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65  e segments at le
1a890 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20 74 6f 20  vel iLevel+1 to 
1a8a0 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65  .    ** a single
1a8b0 20 69 4c 65 76 65 6c 2b 32 20 73 65 67 6d 65 6e   iLevel+2 segmen
1a8c0 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  t if necessary. 
1a8d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1a8e0 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50  FTS3_SEGCURSOR_P
1a8f0 45 4e 44 49 4e 47 3d 3d 2d 31 20 29 3b 0a 20 20  ENDING==-1 );.  
1a900 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65    iNewLevel = ge
1a910 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
1a920 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
1a930 78 2c 20 69 4c 65 76 65 6c 2b 31 29 3b 0a 20 20  x, iLevel+1);.  
1a940 20 20 72 63 20 3d 20 66 74 73 33 41 6c 6c 6f 63    rc = fts3Alloc
1a950 61 74 65 53 65 67 64 69 72 49 64 78 28 70 2c 20  ateSegdirIdx(p, 
1a960 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
1a970 20 69 4c 65 76 65 6c 2b 31 2c 20 26 69 49 64 78   iLevel+1, &iIdx
1a980 29 3b 0a 20 20 20 20 62 49 67 6e 6f 72 65 45 6d  );.    bIgnoreEm
1a990 70 74 79 20 3d 20 28 69 4c 65 76 65 6c 21 3d 46  pty = (iLevel!=F
1a9a0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45  TS3_SEGCURSOR_PE
1a9b0 4e 44 49 4e 47 29 20 26 26 20 28 69 4e 65 77 4c  NDING) && (iNewL
1a9c0 65 76 65 6c 3e 69 4d 61 78 4c 65 76 65 6c 29 3b  evel>iMaxLevel);
1a9d0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1a9e0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a9f0 66 69 6e 69 73 68 65 64 3b 0a 0a 20 20 61 73 73  finished;..  ass
1aa00 65 72 74 28 20 63 73 72 2e 6e 53 65 67 6d 65 6e  ert( csr.nSegmen
1aa10 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1aa20 20 69 4e 65 77 4c 65 76 65 6c 3e 3d 67 65 74 41   iNewLevel>=getA
1aa30 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20  bsoluteLevel(p, 
1aa40 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
1aa50 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
1aa60 20 69 4e 65 77 4c 65 76 65 6c 3c 67 65 74 41 62   iNewLevel<getAb
1aa70 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
1aa80 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 46  Langid, iIndex,F
1aa90 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
1aaa0 56 45 4c 29 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  VEL) );..  memse
1aab0 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69  t(&filter, 0, si
1aac0 7a 65 6f 66 28 46 74 73 33 53 65 67 46 69 6c 74  zeof(Fts3SegFilt
1aad0 65 72 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e 66  er));.  filter.f
1aae0 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d  lags = FTS3_SEGM
1aaf0 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b  ENT_REQUIRE_POS;
1ab00 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
1ab10 7c 3d 20 28 62 49 67 6e 6f 72 65 45 6d 70 74 79  |= (bIgnoreEmpty
1ab20 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   ? FTS3_SEGMENT_
1ab30 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 3a 20 30  IGNORE_EMPTY : 0
1ab40 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1ab50 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
1ab60 74 61 72 74 28 70 2c 20 26 63 73 72 2c 20 26 66  tart(p, &csr, &f
1ab70 69 6c 74 65 72 29 3b 0a 20 20 77 68 69 6c 65 28  ilter);.  while(
1ab80 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 29   SQLITE_OK==rc )
1ab90 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1aba0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
1abb0 74 65 70 28 70 2c 20 26 63 73 72 29 3b 0a 20 20  tep(p, &csr);.  
1abc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1abd0 5f 52 4f 57 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ROW ) break;.  
1abe0 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57 72    rc = fts3SegWr
1abf0 69 74 65 72 41 64 64 28 70 2c 20 26 70 57 72 69  iterAdd(p, &pWri
1ac00 74 65 72 2c 20 31 2c 20 0a 20 20 20 20 20 20 20  ter, 1, .       
1ac10 20 63 73 72 2e 7a 54 65 72 6d 2c 20 63 73 72 2e   csr.zTerm, csr.
1ac20 6e 54 65 72 6d 2c 20 63 73 72 2e 61 44 6f 63 6c  nTerm, csr.aDocl
1ac30 69 73 74 2c 20 63 73 72 2e 6e 44 6f 63 6c 69 73  ist, csr.nDoclis
1ac40 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
1ac50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1ac60 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 61  to finished;.  a
1ac70 73 73 65 72 74 28 20 70 57 72 69 74 65 72 20 7c  ssert( pWriter |
1ac80 7c 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 29  | bIgnoreEmpty )
1ac90 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 21  ;..  if( iLevel!
1aca0 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
1acb0 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 72  PENDING ){.    r
1acc0 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 53 65  c = fts3DeleteSe
1acd0 67 64 69 72 28 0a 20 20 20 20 20 20 20 20 70 2c  gdir(.        p,
1ace0 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
1acf0 2c 20 69 4c 65 76 65 6c 2c 20 63 73 72 2e 61 70  , iLevel, csr.ap
1ad00 53 65 67 6d 65 6e 74 2c 20 63 73 72 2e 6e 53 65  Segment, csr.nSe
1ad10 67 6d 65 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  gment.    );.   
1ad20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ad30 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
1ad40 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57  ed;.  }.  if( pW
1ad50 72 69 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  riter ){.    rc 
1ad60 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46  = fts3SegWriterF
1ad70 6c 75 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c  lush(p, pWriter,
1ad80 20 69 4e 65 77 4c 65 76 65 6c 2c 20 69 49 64 78   iNewLevel, iIdx
1ad90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ada0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1adb0 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46 54    if( iLevel==FT
1adc0 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e  S3_SEGCURSOR_PEN
1add0 44 49 4e 47 20 7c 7c 20 69 4e 65 77 4c 65 76 65  DING || iNewLeve
1ade0 6c 3c 69 4d 61 78 4c 65 76 65 6c 20 29 7b 0a 20  l<iMaxLevel ){. 
1adf0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
1ae00 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74 73 28  PromoteSegments(
1ae10 70 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20 70 57  p, iNewLevel, pW
1ae20 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61  riter->nLeafData
1ae30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ae40 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a  .  }.. finished:
1ae50 0a 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72  .  fts3SegWriter
1ae60 46 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20  Free(pWriter);. 
1ae70 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
1ae80 65 61 64 65 72 46 69 6e 69 73 68 28 26 63 73 72  eaderFinish(&csr
1ae90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1aea0 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68  }.../* .** Flush
1aeb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1aec0 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 74 6f   pendingTerms to
1aed0 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65 6e 74   level 0 segment
1aee0 73 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s. .*/.int sqlit
1aef0 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72  e3Fts3PendingTer
1af00 6d 73 46 6c 75 73 68 28 46 74 73 33 54 61 62 6c  msFlush(Fts3Tabl
1af10 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
1af20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1af30 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 0a 20  nt i;.        . 
1af40 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
1af50 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e  LITE_OK && i<p->
1af60 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20  nIndex; i++){.  
1af70 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65    rc = fts3Segme
1af80 6e 74 4d 65 72 67 65 28 70 2c 20 70 2d 3e 69 50  ntMerge(p, p->iP
1af90 72 65 76 4c 61 6e 67 69 64 2c 20 69 2c 20 46 54  revLangid, i, FT
1afa0 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e  S3_SEGCURSOR_PEN
1afb0 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 72  DING);.    if( r
1afc0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1afd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1afe0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
1aff0 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c  s3PendingTermsCl
1b000 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44 65  ear(p);..  /* De
1b010 74 65 72 6d 69 6e 65 20 74 68 65 20 61 75 74 6f  termine the auto
1b020 2d 69 6e 63 72 2d 6d 65 72 67 65 20 73 65 74 74  -incr-merge sett
1b030 69 6e 67 20 69 66 20 75 6e 6b 6e 6f 77 6e 2e 20  ing if unknown. 
1b040 20 49 66 20 65 6e 61 62 6c 65 64 2c 0a 20 20 2a   If enabled,.  *
1b050 2a 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * estimate the n
1b060 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 62 6c  umber of leaf bl
1b070 6f 63 6b 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ocks of content 
1b080 74 6f 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  to be written.  
1b090 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1b0a0 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 62 48 61  ITE_OK && p->bHa
1b0b0 73 53 74 61 74 0a 20 20 20 26 26 20 70 2d 3e 6e  sStat.   && p->n
1b0c0 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 30  Autoincrmerge==0
1b0d0 78 66 66 20 26 26 20 70 2d 3e 6e 4c 65 61 66 41  xff && p->nLeafA
1b0e0 64 64 3e 30 0a 20 20 29 7b 0a 20 20 20 20 73 71  dd>0.  ){.    sq
1b0f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1b100 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
1b110 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
1b120 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c 20  QL_SELECT_STAT, 
1b130 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
1b140 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b150 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1b160 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
1b170 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 41  t, 1, FTS_STAT_A
1b180 55 54 4f 49 4e 43 52 4d 45 52 47 45 29 3b 0a 20  UTOINCRMERGE);. 
1b190 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b1a0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
1b1b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b1c0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
1b1d0 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d     p->nAutoincrm
1b1e0 65 72 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  erge = sqlite3_c
1b1f0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
1b200 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1b210 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
1b220 67 65 3d 3d 31 20 29 20 70 2d 3e 6e 41 75 74 6f  ge==1 ) p->nAuto
1b230 69 6e 63 72 6d 65 72 67 65 20 3d 20 38 3b 0a 20  incrmerge = 8;. 
1b240 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1b250 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1b260 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 41 75  {.        p->nAu
1b270 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 30 3b  toincrmerge = 0;
1b280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1b290 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
1b2a0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
1b2b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b2c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f 64 65  .}../*.** Encode
1b2d0 20 4e 20 69 6e 74 65 67 65 72 73 20 61 73 20 76   N integers as v
1b2e0 61 72 69 6e 74 73 20 69 6e 74 6f 20 61 20 62 6c  arints into a bl
1b2f0 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ob..*/.static vo
1b300 69 64 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74  id fts3EncodeInt
1b310 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e 2c 20  Array(.  int N, 
1b320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b330 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74  he number of int
1b340 65 67 65 72 73 20 74 6f 20 65 6e 63 6f 64 65 20  egers to encode 
1b350 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20 20 20  */.  u32 *a,    
1b360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1b370 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f  nteger values */
1b380 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 20  .  char *zBuf,  
1b390 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1b3a0 68 65 20 42 4c 4f 42 20 68 65 72 65 20 2a 2f 0a  he BLOB here */.
1b3b0 20 20 69 6e 74 20 2a 70 4e 42 75 66 20 20 20 20    int *pNBuf    
1b3c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75       /* Write nu
1b3d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 66  mber of bytes if
1b3e0 20 7a 42 75 66 5b 5d 20 75 73 65 64 20 68 65 72   zBuf[] used her
1b3f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  e */.){.  int i,
1b400 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b   j;.  for(i=j=0;
1b410 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
1b420 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  j += sqlite3Fts3
1b430 50 75 74 56 61 72 69 6e 74 28 26 7a 42 75 66 5b  PutVarint(&zBuf[
1b440 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  j], (sqlite3_int
1b450 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  64)a[i]);.  }.  
1b460 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d 0a 0a 2f  *pNBuf = j;.}../
1b470 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 62 6c  *.** Decode a bl
1b480 6f 62 20 6f 66 20 76 61 72 69 6e 74 73 20 69 6e  ob of varints in
1b490 74 6f 20 4e 20 69 6e 74 65 67 65 72 73 0a 2a 2f  to N integers.*/
1b4a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b4b0 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28  3DecodeIntArray(
1b4c0 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
1b4d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
1b4e0 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ber of integers 
1b4f0 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75  to decode */.  u
1b500 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20 20 20  32 *a,          
1b510 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
1b520 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f  nteger values */
1b530 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b540 42 75 66 2c 20 20 2f 2a 20 54 68 65 20 42 4c 4f  Buf,  /* The BLO
1b550 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  B containing the
1b560 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20 20 69 6e   varints */.  in
1b570 74 20 6e 42 75 66 20 20 20 20 20 20 20 20 20 20  t nBuf          
1b580 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   /* size of the 
1b590 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  BLOB */.){.  int
1b5a0 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 42   i = 0;.  if( nB
1b5b0 75 66 20 26 26 20 28 7a 42 75 66 5b 6e 42 75 66  uf && (zBuf[nBuf
1b5c0 2d 31 5d 26 30 78 38 30 29 3d 3d 30 20 29 7b 0a  -1]&0x80)==0 ){.
1b5d0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66      int j;.    f
1b5e0 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 20 26 26  or(i=j=0; i<N &&
1b5f0 20 6a 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20   j<nBuf; i++){. 
1b600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
1b610 36 34 20 78 3b 0a 20 20 20 20 20 20 6a 20 2b 3d  64 x;.      j +=
1b620 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
1b630 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20  arint(&zBuf[j], 
1b640 26 78 29 3b 0a 20 20 20 20 20 20 61 5b 69 5d 20  &x);.      a[i] 
1b650 3d 20 28 75 33 32 29 28 78 20 26 20 30 78 66 66  = (u32)(x & 0xff
1b660 66 66 66 66 66 66 29 3b 0a 20 20 20 20 7d 0a 20  ffffff);.    }. 
1b670 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3c 4e 20   }.  while( i<N 
1b680 29 20 61 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 7d 0a  ) a[i++] = 0;.}.
1b690 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68  ./*.** Insert th
1b6a0 65 20 73 69 7a 65 73 20 28 69 6e 20 74 6f 6b 65  e sizes (in toke
1b6b0 6e 73 29 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ns) for each col
1b6c0 75 6d 6e 20 6f 66 20 74 68 65 20 64 6f 63 75 6d  umn of the docum
1b6d0 65 6e 74 0a 2a 2a 20 77 69 74 68 20 64 6f 63 69  ent.** with doci
1b6e0 64 20 65 71 75 61 6c 20 74 6f 20 70 2d 3e 69 50  d equal to p->iP
1b6f0 72 65 76 44 6f 63 69 64 2e 20 20 54 68 65 20 73  revDocid.  The s
1b700 69 7a 65 73 20 61 72 65 20 65 6e 63 6f 64 65 64  izes are encoded
1b710 20 61 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 6f 66   as.** a blob of
1b720 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61   varints..*/.sta
1b730 74 69 63 20 76 6f 69 64 20 66 74 73 33 49 6e 73  tic void fts3Ins
1b740 65 72 74 44 6f 63 73 69 7a 65 28 0a 20 20 69 6e  ertDocsize(.  in
1b750 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20  t *pRC,         
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b770 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1b780 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20    /* Table into 
1b7b0 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20  which to insert 
1b7c0 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 20 20 20  */.  u32 *aSz   
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
1b7f0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 69 6e   each column, in
1b800 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20   tokens */.){.  
1b810 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20  char *pBlob;    
1b820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b830 42 4c 4f 42 20 65 6e 63 6f 64 69 6e 67 20 6f 66  BLOB encoding of
1b840 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 69   the document si
1b850 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  ze */.  int nBlo
1b860 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1b870 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1b880 74 65 73 20 69 6e 20 74 68 65 20 42 4c 4f 42 20  tes in the BLOB 
1b890 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
1b8a0 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a  t *pStmt;     /*
1b8b0 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   Statement used 
1b8c0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 65 6e  to insert the en
1b8d0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
1b8e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b8f0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1b900 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
1b910 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
1b920 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
1b930 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
1b940 5f 6d 61 6c 6c 6f 63 28 20 31 30 2a 70 2d 3e 6e  _malloc( 10*p->n
1b950 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20  Column );.  if( 
1b960 70 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20  pBlob==0 ){.    
1b970 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRC = SQLITE_NO
1b980 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  MEM;.    return;
1b990 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64  .  }.  fts3Encod
1b9a0 65 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e 43 6f  eIntArray(p->nCo
1b9b0 6c 75 6d 6e 2c 20 61 53 7a 2c 20 70 42 6c 6f 62  lumn, aSz, pBlob
1b9c0 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20  , &nBlob);.  rc 
1b9d0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
1b9e0 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43   SQL_REPLACE_DOC
1b9f0 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30 29  SIZE, &pStmt, 0)
1ba00 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1ba10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1ba20 42 6c 6f 62 29 3b 0a 20 20 20 20 2a 70 52 43 20  Blob);.    *pRC 
1ba30 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
1ba40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1ba50 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
1ba60 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63  , 1, p->iPrevDoc
1ba70 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  id);.  sqlite3_b
1ba80 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
1ba90 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  2, pBlob, nBlob,
1baa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
1bab0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
1bac0 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20  Stmt);.  *pRC = 
1bad0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
1bae0 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tmt);.}../*.** R
1baf0 65 63 6f 72 64 20 30 20 6f 66 20 74 68 65 20 25  ecord 0 of the %
1bb00 5f 73 74 61 74 20 74 61 62 6c 65 20 63 6f 6e 74  _stat table cont
1bb10 61 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73  ains a blob cons
1bb20 69 73 74 69 6e 67 20 6f 66 20 4e 20 76 61 72 69  isting of N vari
1bb30 6e 74 73 2c 0a 2a 2a 20 77 68 65 72 65 20 4e 20  nts,.** where N 
1bb40 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1bb50 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f   user defined co
1bb60 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 66 74 73  lumns in the fts
1bb70 33 20 74 61 62 6c 65 20 70 6c 75 73 0a 2a 2a 20  3 table plus.** 
1bb80 74 77 6f 2e 20 49 66 20 6e 43 6f 6c 20 69 73 20  two. If nCol is 
1bb90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
1bba0 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er defined colum
1bbb0 6e 73 2c 20 74 68 65 6e 20 76 61 6c 75 65 73 20  ns, then values 
1bbc0 6f 66 20 74 68 65 20 0a 2a 2a 20 76 61 72 69 6e  of the .** varin
1bbd0 74 73 20 61 72 65 20 73 65 74 20 61 73 20 66 6f  ts are set as fo
1bbe0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 56  llows:.**.**   V
1bbf0 61 72 69 6e 74 20 30 3a 20 20 20 20 20 20 20 54  arint 0:       T
1bc00 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72  otal number of r
1bc10 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1bc20 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74  ..**.**   Varint
1bc30 20 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72 20 65 61   1..nCol: For ea
1bc40 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 74  ch column, the t
1bc50 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74  otal number of t
1bc60 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e 0a  okens stored in.
1bc70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1bc80 20 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e 20       the column 
1bc90 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  for all rows of 
1bca0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
1bcb0 20 20 20 56 61 72 69 6e 74 20 31 2b 6e 43 6f 6c     Varint 1+nCol
1bcc0 3a 20 20 54 68 65 20 74 6f 74 61 6c 20 73 69 7a  :  The total siz
1bcd0 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 6f 66 20  e, in bytes, of 
1bce0 61 6c 6c 20 74 65 78 74 20 76 61 6c 75 65 73 20  all text values 
1bcf0 69 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20  in all.**       
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
1bd10 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20  mns of all rows 
1bd20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
1bd30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bd40 66 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f 74  fts3UpdateDocTot
1bd50 61 6c 73 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c  als(.  int *pRC,
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
1bd80 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46  sult code */.  F
1bd90 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bdb0 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75 70  * Table being up
1bdc0 64 61 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a  dated */.  u32 *
1bdd0 61 53 7a 49 6e 73 2c 20 20 20 20 20 20 20 20 20  aSzIns,         
1bde0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1bdf0 7a 65 20 69 6e 63 72 65 61 73 65 73 20 2a 2f 0a  ze increases */.
1be00 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 2c 20 20    u32 *aSzDel,  
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be20 20 20 2f 2a 20 53 69 7a 65 20 64 65 63 72 65 61    /* Size decrea
1be30 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68  ses */.  int nCh
1be40 6e 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ng              
1be50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e           /* Chan
1be60 67 65 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ge in the number
1be70 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f   of documents */
1be80 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f  .){.  char *pBlo
1be90 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
1bea0 2a 20 53 74 6f 72 61 67 65 20 66 6f 72 20 42 4c  * Storage for BL
1beb0 4f 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  OB written into 
1bec0 25 5f 73 74 61 74 20 2a 2f 0a 20 20 69 6e 74 20  %_stat */.  int 
1bed0 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
1bee0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1bef0 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e 74  BLOB written int
1bf00 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 75 33  o %_stat */.  u3
1bf10 32 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  2 *a;           
1bf20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1bf30 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
1bf40 20 62 65 63 6f 6d 65 73 20 74 68 65 20 42 4c 4f   becomes the BLO
1bf50 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  B */.  sqlite3_s
1bf60 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
1bf70 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72  /* Statement for
1bf80 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69   reading and wri
1bf90 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ting */.  int i;
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfb0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1bfc0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfe0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1bff0 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
1c000 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 69 6e  s */..  const in
1c010 74 20 6e 53 74 61 74 20 3d 20 70 2d 3e 6e 43 6f  t nStat = p->nCo
1c020 6c 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66 28 20 2a  lumn+2;..  if( *
1c030 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
1c040 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  a = sqlite3_mall
1c050 6f 63 28 20 28 73 69 7a 65 6f 66 28 75 33 32 29  oc( (sizeof(u32)
1c060 2b 31 30 29 2a 6e 53 74 61 74 20 29 3b 0a 20 20  +10)*nStat );.  
1c070 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
1c080 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRC = SQLITE_NO
1c090 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  MEM;.    return;
1c0a0 0a 20 20 7d 0a 20 20 70 42 6c 6f 62 20 3d 20 28  .  }.  pBlob = (
1c0b0 63 68 61 72 2a 29 26 61 5b 6e 53 74 61 74 5d 3b  char*)&a[nStat];
1c0c0 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
1c0d0 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
1c0e0 54 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20  T_STAT, &pStmt, 
1c0f0 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
1c100 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c110 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20  (a);.    *pRC = 
1c120 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
1c130 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69    }.  sqlite3_bi
1c140 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
1c150 20 46 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54   FTS_STAT_DOCTOT
1c160 41 4c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  AL);.  if( sqlit
1c170 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
1c180 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1c190 20 20 66 74 73 33 44 65 63 6f 64 65 49 6e 74 41    fts3DecodeIntA
1c1a0 72 72 61 79 28 6e 53 74 61 74 2c 20 61 2c 0a 20  rray(nStat, a,. 
1c1b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c1c0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
1c1d0 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
1c1e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1c1f0 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 29 3b  ytes(pStmt, 0));
1c200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
1c210 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
1c220 66 28 75 33 32 29 2a 28 6e 53 74 61 74 29 20 29  f(u32)*(nStat) )
1c230 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1c240 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1c250 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1c270 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
1c280 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
1c290 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1c2a0 69 66 28 20 6e 43 68 6e 67 3c 30 20 26 26 20 61  if( nChng<0 && a
1c2b0 5b 30 5d 3c 28 75 33 32 29 28 2d 6e 43 68 6e 67  [0]<(u32)(-nChng
1c2c0 29 20 29 7b 0a 20 20 20 20 61 5b 30 5d 20 3d 20  ) ){.    a[0] = 
1c2d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1c2e0 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e 67 3b 0a 20  a[0] += nChng;. 
1c2f0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1c300 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b 20 69 2b  p->nColumn+1; i+
1c310 2b 29 7b 0a 20 20 20 20 75 33 32 20 78 20 3d 20  +){.    u32 x = 
1c320 61 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20  a[i+1];.    if( 
1c330 78 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c 20 61 53  x+aSzIns[i] < aS
1c340 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  zDel[i] ){.     
1c350 20 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   x = 0;.    }els
1c360 65 7b 0a 20 20 20 20 20 20 78 20 3d 20 78 20 2b  e{.      x = x +
1c370 20 61 53 7a 49 6e 73 5b 69 5d 20 2d 20 61 53 7a   aSzIns[i] - aSz
1c380 44 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  Del[i];.    }.  
1c390 20 20 61 5b 69 2b 31 5d 20 3d 20 78 3b 0a 20 20    a[i+1] = x;.  
1c3a0 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 65 49 6e  }.  fts3EncodeIn
1c3b0 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61 2c  tArray(nStat, a,
1c3c0 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b   pBlob, &nBlob);
1c3d0 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
1c3e0 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41  tmt(p, SQL_REPLA
1c3f0 43 45 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c  CE_STAT, &pStmt,
1c400 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
1c410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1c420 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d  e(a);.    *pRC =
1c430 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
1c440 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  .  }.  sqlite3_b
1c450 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  ind_int(pStmt, 1
1c460 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f  , FTS_STAT_DOCTO
1c470 54 41 4c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TAL);.  sqlite3_
1c480 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
1c490 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62   2, pBlob, nBlob
1c4a0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
1c4b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
1c4c0 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20  (pStmt);.  *pRC 
1c4d0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1c4e0 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65  pStmt);.  sqlite
1c4f0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
1c500 74 2c 20 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 2);.  sqlite3
1c510 5f 66 72 65 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(a);.}../*.
1c520 2a 2a 20 4d 65 72 67 65 20 74 68 65 20 65 6e 74  ** Merge the ent
1c530 69 72 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  ire database so 
1c540 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6f 6e  that there is on
1c550 65 20 73 65 67 6d 65 6e 74 20 66 6f 72 20 65 61  e segment for ea
1c560 63 68 20 0a 2a 2a 20 69 49 6e 64 65 78 2f 69 4c  ch .** iIndex/iL
1c570 61 6e 67 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  angid combinatio
1c580 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c590 20 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28   fts3DoOptimize(
1c5a0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e  Fts3Table *p, in
1c5b0 74 20 62 52 65 74 75 72 6e 44 6f 6e 65 29 7b 0a  t bReturnDone){.
1c5c0 20 20 69 6e 74 20 62 53 65 65 6e 44 6f 6e 65 20    int bSeenDone 
1c5d0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1c5e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c5f0 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 0a  AllLangid = 0;..
1c600 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
1c610 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
1c620 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41  _ALL_LANGID, &pA
1c630 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20  llLangid, 0);.  
1c640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c650 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
1c660 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
1c670 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69  nd_int(pAllLangi
1c680 64 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 4c 61  d, 1, p->iPrevLa
1c690 6e 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ngid);.    sqlit
1c6a0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c  e3_bind_int(pAll
1c6b0 4c 61 6e 67 69 64 2c 20 32 2c 20 70 2d 3e 6e 49  Langid, 2, p->nI
1c6c0 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69 6c 65  ndex);.    while
1c6d0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1c6e0 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51 4c 49  AllLangid)==SQLI
1c6f0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
1c700 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
1c710 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74   iLangid = sqlit
1c720 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41  e3_column_int(pA
1c730 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20  llLangid, 0);.  
1c740 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
1c750 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
1c760 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b  p->nIndex; i++){
1c770 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
1c780 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70  s3SegmentMerge(p
1c790 2c 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 46 54  , iLangid, i, FT
1c7a0 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
1c7b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c7c0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1c7d0 7b 0a 20 20 20 20 20 20 20 20 20 20 62 53 65 65  {.          bSee
1c7e0 6e 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  nDone = 1;.     
1c7f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c800 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
1c810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c820 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
1c830 65 73 65 74 28 70 41 6c 6c 4c 61 6e 67 69 64 29  eset(pAllLangid)
1c840 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c850 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
1c860 63 32 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  c2;.  }..  sqlit
1c870 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c  e3Fts3SegmentsCl
1c880 6f 73 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ose(p);.  sqlite
1c890 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
1c8a0 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20 72 65  sClear(p);..  re
1c8b0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
1c8c0 5f 4f 4b 20 26 26 20 62 52 65 74 75 72 6e 44 6f  _OK && bReturnDo
1c8d0 6e 65 20 26 26 20 62 53 65 65 6e 44 6f 6e 65 29  ne && bSeenDone)
1c8e0 20 3f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3a   ? SQLITE_DONE :
1c8f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1c900 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1c910 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 75  alled when the u
1c920 73 65 72 20 65 78 65 63 75 74 65 73 20 74 68 65  ser executes the
1c930 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
1c940 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
1c950 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 62 6c  INSERT INTO <tbl
1c960 3e 28 3c 74 62 6c 3e 29 20 56 41 4c 55 45 53 28  >(<tbl>) VALUES(
1c970 27 72 65 62 75 69 6c 64 27 29 3b 0a 2a 2a 0a 2a  'rebuild');.**.*
1c980 2a 20 54 68 65 20 65 6e 74 69 72 65 20 46 54 53  * The entire FTS
1c990 20 69 6e 64 65 78 20 69 73 20 64 69 73 63 61 72   index is discar
1c9a0 64 65 64 20 61 6e 64 20 72 65 62 75 69 6c 74 2e  ded and rebuilt.
1c9b0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   If the table is
1c9c0 20 6f 6e 65 20 0a 2a 2a 20 63 72 65 61 74 65 64   one .** created
1c9d0 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65   using the conte
1c9e0 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 74  nt=xxx option, t
1c9f0 68 65 6e 20 74 68 65 20 6e 65 77 20 69 6e 64 65  hen the new inde
1ca00 78 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  x is based on.**
1ca10 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
1ca20 74 65 6e 74 73 20 6f 66 20 74 68 65 20 78 78 78  tents of the xxx
1ca30 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
1ca40 65 2c 20 69 74 20 69 73 20 72 65 62 75 69 6c 74  e, it is rebuilt
1ca50 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
1ca60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1ca70 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
1ca80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ca90 66 74 73 33 44 6f 52 65 62 75 69 6c 64 28 46 74  fts3DoRebuild(Ft
1caa0 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
1cab0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cad0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1cae0 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c  ..  rc = fts3Del
1caf0 65 74 65 41 6c 6c 28 70 2c 20 30 29 3b 0a 20 20  eteAll(p, 0);.  
1cb00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cb10 4b 20 29 7b 0a 20 20 20 20 75 33 32 20 2a 61 53  K ){.    u32 *aS
1cb20 7a 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a  z = 0;.    u32 *
1cb30 61 53 7a 49 6e 73 20 3d 20 30 3b 0a 20 20 20 20  aSzIns = 0;.    
1cb40 75 33 32 20 2a 61 53 7a 44 65 6c 20 3d 20 30 3b  u32 *aSzDel = 0;
1cb50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
1cb60 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1cb70 20 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 30    int nEntry = 0
1cb80 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73  ;..    /* Compos
1cb90 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 6e  e and prepare an
1cba0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
1cbb0 6f 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  o loop through t
1cbc0 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
1cbd0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
1cbe0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1cbf0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 25 73 22  intf("SELECT %s"
1cc00 20 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c   , p->zReadExprl
1cc10 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ist);.    if( !z
1cc20 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Sql ){.      rc 
1cc30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1cc40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cc50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1cc60 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
1cc70 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
1cc80 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1cc90 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1cca0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1ccb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ccc0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
1ccd0 3d 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2a 20  = sizeof(u32) * 
1cce0 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 33  (p->nColumn+1)*3
1ccf0 3b 0a 20 20 20 20 20 20 61 53 7a 20 3d 20 28 75  ;.      aSz = (u
1cd00 33 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  32 *)sqlite3_mal
1cd10 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  loc(nByte);.    
1cd20 20 20 69 66 28 20 61 53 7a 3d 3d 30 20 29 7b 0a    if( aSz==0 ){.
1cd30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1cd40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1cd50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cd60 6d 65 6d 73 65 74 28 61 53 7a 2c 20 30 2c 20 6e  memset(aSz, 0, n
1cd70 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 61  Byte);.        a
1cd80 53 7a 49 6e 73 20 3d 20 26 61 53 7a 5b 70 2d 3e  SzIns = &aSz[p->
1cd90 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20  nColumn+1];.    
1cda0 20 20 20 20 61 53 7a 44 65 6c 20 3d 20 26 61 53      aSzDel = &aS
1cdb0 7a 49 6e 73 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  zIns[p->nColumn+
1cdc0 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1];.      }.    
1cdd0 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  }..    while( rc
1cde0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
1cdf0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
1ce00 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
1ce10 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
1ce20 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  ;.      int iLan
1ce30 67 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d  gid = langidFrom
1ce40 53 65 6c 65 63 74 28 70 2c 20 70 53 74 6d 74 29  Select(p, pStmt)
1ce50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
1ce60 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63  3PendingTermsDoc
1ce70 69 64 28 70 2c 20 30 2c 20 69 4c 61 6e 67 69 64  id(p, 0, iLangid
1ce80 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1ce90 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29  _int64(pStmt, 0)
1cea0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
1ceb0 61 53 7a 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  aSz, 0, sizeof(a
1cec0 53 7a 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 6f  Sz[0]) * (p->nCo
1ced0 6c 75 6d 6e 2b 31 29 29 3b 0a 20 20 20 20 20 20  lumn+1));.      
1cee0 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d  for(iCol=0; rc==
1cef0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f  SQLITE_OK && iCo
1cf00 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43  l<p->nColumn; iC
1cf10 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
1cf20 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78  f( p->abNotindex
1cf30 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20  ed[iCol]==0 ){. 
1cf40 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
1cf50 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
1cf60 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
1cf70 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
1cf80 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  t, iCol+1);.    
1cf90 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50        rc = fts3P
1cfa0 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70  endingTermsAdd(p
1cfb0 2c 20 69 4c 61 6e 67 69 64 2c 20 7a 2c 20 69 43  , iLangid, z, iC
1cfc0 6f 6c 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b  ol, &aSz[iCol]);
1cfd0 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a 5b 70  .          aSz[p
1cfe0 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71  ->nColumn] += sq
1cff0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1d000 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31  es(pStmt, iCol+1
1d010 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d020 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1d030 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
1d040 0a 20 20 20 20 20 20 20 20 66 74 73 33 49 6e 73  .        fts3Ins
1d050 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20  ertDocsize(&rc, 
1d060 70 2c 20 61 53 7a 29 3b 0a 20 20 20 20 20 20 7d  p, aSz);.      }
1d070 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d090 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1d0a0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1d0b0 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a       pStmt = 0;.
1d0c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d0d0 20 20 20 20 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20       nEntry++;. 
1d0e0 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
1d0f0 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c  0; iCol<=p->nCol
1d100 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  umn; iCol++){.  
1d110 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73 5b 69          aSzIns[i
1d120 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c  Col] += aSz[iCol
1d130 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
1d140 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1d150 66 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20  f( p->bFts4 ){. 
1d160 20 20 20 20 20 66 74 73 33 55 70 64 61 74 65 44       fts3UpdateD
1d170 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c  ocTotals(&rc, p,
1d180 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c   aSzIns, aSzDel,
1d190 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 7d 0a   nEntry);.    }.
1d1a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d1b0 28 61 53 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20  (aSz);..    if( 
1d1c0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 69  pStmt ){.      i
1d1d0 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1d1e0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1d1f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1d200 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d210 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1d220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d230 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d240 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1d250 6e 63 74 69 6f 6e 20 6f 70 65 6e 73 20 61 20 63  nction opens a c
1d260 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 72 65  ursor used to re
1d270 61 64 20 74 68 65 20 69 6e 70 75 74 20 64 61 74  ad the input dat
1d280 61 20 66 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 63  a for an .** inc
1d290 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
1d2a0 70 65 72 61 74 69 6f 6e 2e 20 53 70 65 63 69 66  peration. Specif
1d2b0 69 63 61 6c 6c 79 2c 20 69 74 20 6f 70 65 6e 73  ically, it opens
1d2c0 20 61 20 63 75 72 73 6f 72 20 74 6f 20 73 63 61   a cursor to sca
1d2d0 6e 0a 2a 2a 20 74 68 65 20 6f 6c 64 65 73 74 20  n.** the oldest 
1d2e0 6e 53 65 67 20 73 65 67 6d 65 6e 74 73 20 28 69  nSeg segments (i
1d2f0 64 78 3d 30 20 74 68 72 6f 75 67 68 20 69 64 78  dx=0 through idx
1d300 3d 28 6e 53 65 67 2d 31 29 29 20 69 6e 20 61 62  =(nSeg-1)) in ab
1d310 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65 6c  solute .** level
1d320 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2f 0a 73   iAbsLevel..*/.s
1d330 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
1d340 63 72 6d 65 72 67 65 43 73 72 28 0a 20 20 46 74  crmergeCsr(.  Ft
1d350 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d370 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
1d380 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
1d390 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c  int64 iAbsLevel,
1d3a0 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c          /* Absol
1d3b0 75 74 65 20 6c 65 76 65 6c 20 74 6f 20 6f 70 65  ute level to ope
1d3c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 2c  n */.  int nSeg,
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d3f0 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
1d400 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 33 4d  merge */.  Fts3M
1d410 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
1d420 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr        /* Cu
1d430 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 70  rsor object to p
1d440 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
1d450 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d470 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
1d480 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
1d490 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20   *pStmt = 0;    
1d4a0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
1d4b0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 25 5f   used to read %_
1d4c0 73 65 67 64 69 72 20 65 6e 74 72 79 20 2a 2f 20  segdir entry */ 
1d4d0 20 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20   .  int nByte;  
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4f0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 6c      /* Bytes all
1d500 6f 63 61 74 65 64 20 61 74 20 70 43 73 72 2d 3e  ocated at pCsr->
1d510 61 70 53 65 67 6d 65 6e 74 5b 5d 20 2a 2f 0a 0a  apSegment[] */..
1d520 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
1d530 61 63 65 20 66 6f 72 20 74 68 65 20 46 74 73 33  ace for the Fts3
1d540 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61  MultiSegReader.a
1d550 43 73 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Csr[] array */. 
1d560 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c   memset(pCsr, 0,
1d570 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b   sizeof(*pCsr));
1d580 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
1d590 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  f(Fts3SegReader 
1d5a0 2a 29 20 2a 20 6e 53 65 67 3b 0a 20 20 70 43 73  *) * nSeg;.  pCs
1d5b0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 28  r->apSegment = (
1d5c0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
1d5d0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
1d5e0 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
1d5f0 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3d 3d  Csr->apSegment==
1d600 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1d610 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
1d620 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
1d630 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c  pCsr->apSegment,
1d640 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
1d650 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
1d660 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c  (p, SQL_SELECT_L
1d670 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  EVEL, &pStmt, 0)
1d680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1d6b0 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc2;.    sqlite3
1d6c0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
1d6d0 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29  t, 1, iAbsLevel)
1d6e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1d6f0 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20  sr->nSegment==0 
1d700 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1d710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d720 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1d730 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1d740 20 26 26 20 69 3c 6e 53 65 67 3b 20 69 2b 2b 29   && i<nSeg; i++)
1d750 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1d760 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
1d770 72 4e 65 77 28 69 2c 20 30 2c 0a 20 20 20 20 20  rNew(i, 0,.     
1d780 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1d790 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1d7a0 20 31 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73   1),        /* s
1d7b0 65 67 64 69 72 2e 73 74 61 72 74 5f 62 6c 6f 63  egdir.start_bloc
1d7c0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  k */.          s
1d7d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1d7e0 74 36 34 28 70 53 74 6d 74 2c 20 32 29 2c 20 20  t64(pStmt, 2),  
1d7f0 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e        /* segdir.
1d800 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
1d810 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1d820 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1d830 36 34 28 70 53 74 6d 74 2c 20 33 29 2c 20 20 20  64(pStmt, 3),   
1d840 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 65       /* segdir.e
1d850 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
1d860 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1d870 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
1d880 20 34 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   4),         /* 
1d890 73 65 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20  segdir.root */. 
1d8a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d8b0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
1d8c0 74 6d 74 2c 20 34 29 2c 20 20 20 20 20 20 20 20  tmt, 4),        
1d8d0 2f 2a 20 73 65 67 64 69 72 2e 72 6f 6f 74 20 2a  /* segdir.root *
1d8e0 2f 0a 20 20 20 20 20 20 20 20 20 20 26 70 43 73  /.          &pCs
1d8f0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 0a  r->apSegment[i].
1d900 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
1d910 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  Csr->nSegment++;
1d920 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
1d930 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1d940 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
1d950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1d960 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
1d970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79  return rc;.}..ty
1d980 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 63  pedef struct Inc
1d990 72 6d 65 72 67 65 57 72 69 74 65 72 20 49 6e 63  rmergeWriter Inc
1d9a0 72 6d 65 72 67 65 57 72 69 74 65 72 3b 0a 74 79  rmergeWriter;.ty
1d9b0 70 65 64 65 66 20 73 74 72 75 63 74 20 4e 6f 64  pedef struct Nod
1d9c0 65 57 72 69 74 65 72 20 4e 6f 64 65 57 72 69 74  eWriter NodeWrit
1d9d0 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1d9e0 63 74 20 42 6c 6f 62 20 42 6c 6f 62 3b 0a 74 79  ct Blob Blob;.ty
1d9f0 70 65 64 65 66 20 73 74 72 75 63 74 20 4e 6f 64  pedef struct Nod
1da00 65 52 65 61 64 65 72 20 4e 6f 64 65 52 65 61 64  eReader NodeRead
1da10 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  er;../*.** An in
1da20 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1da30 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1da40 65 20 69 73 20 75 73 65 64 20 61 73 20 61 20 64  e is used as a d
1da50 79 6e 61 6d 69 63 20 62 75 66 66 65 72 0a 2a 2a  ynamic buffer.**
1da60 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6e 6f 64   to build up nod
1da70 65 73 20 6f 72 20 6f 74 68 65 72 20 62 6c 6f 62  es or other blob
1da80 73 20 6f 66 20 64 61 74 61 20 69 6e 2e 0a 2a 2a  s of data in..**
1da90 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  .** The function
1daa0 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28   blobGrowBuffer(
1dab0 29 20 69 73 20 75 73 65 64 20 74 6f 20 65 78 74  ) is used to ext
1dac0 65 6e 64 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  end the allocati
1dad0 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 6c  on..*/.struct Bl
1dae0 6f 62 20 7b 0a 20 20 63 68 61 72 20 2a 61 3b 20  ob {.  char *a; 
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1db10 72 20 74 6f 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  r to allocation 
1db20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db50 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 6f 66  f valid bytes of
1db60 20 64 61 74 61 20 69 6e 20 61 5b 5d 20 2a 2f 0a   data in a[] */.
1db70 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20    int nAlloc;   
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db90 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1dba0 69 7a 65 20 6f 66 20 61 5b 5d 20 28 6e 41 6c 6c  ize of a[] (nAll
1dbb0 6f 63 3e 3d 6e 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  oc>=n) */.};../*
1dbc0 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
1dbd0 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  re is used to bu
1dbe0 69 6c 64 20 75 70 20 62 75 66 66 65 72 73 20 63  ild up buffers c
1dbf0 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e  ontaining segmen
1dc00 74 20 62 2d 74 72 65 65 20 0a 2a 2a 20 6e 6f 64  t b-tree .** nod
1dc10 65 73 20 28 62 6c 6f 63 6b 73 29 2e 0a 2a 2f 0a  es (blocks)..*/.
1dc20 73 74 72 75 63 74 20 4e 6f 64 65 57 72 69 74 65  struct NodeWrite
1dc30 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  r {.  sqlite3_in
1dc40 74 36 34 20 69 42 6c 6f 63 6b 3b 20 20 20 20 20  t64 iBlock;     
1dc50 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1dc60 20 62 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 42   block id */.  B
1dc70 6c 6f 62 20 6b 65 79 3b 20 20 20 20 20 20 20 20  lob key;        
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dc90 2a 20 4c 61 73 74 20 6b 65 79 20 77 72 69 74 74  * Last key writt
1dca0 65 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  en to the curren
1dcb0 74 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 42 6c 6f  t block */.  Blo
1dcc0 62 20 62 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  b block;        
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dce0 43 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 6d  Current block im
1dcf0 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  age */.};../*.**
1dd00 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68   An object of th
1dd10 69 73 20 74 79 70 65 20 63 6f 6e 74 61 69 6e 73  is type contains
1dd20 20 74 68 65 20 73 74 61 74 65 20 72 65 71 75 69   the state requi
1dd30 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 72  red to create or
1dd40 20 61 70 70 65 6e 64 0a 2a 2a 20 74 6f 20 61 6e   append.** to an
1dd50 20 61 70 70 65 6e 64 61 62 6c 65 20 62 2d 74 72   appendable b-tr
1dd60 65 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ee segment..*/.s
1dd70 74 72 75 63 74 20 49 6e 63 72 6d 65 72 67 65 57  truct IncrmergeW
1dd80 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c  riter {.  int nL
1dd90 65 61 66 45 73 74 3b 20 20 20 20 20 20 20 20 20  eafEst;         
1dda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1ddb0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1ddc0 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 2a 2f 0a   leaf blocks */.
1ddd0 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20    int nWork;    
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1de00 65 61 66 20 70 61 67 65 73 20 66 6c 75 73 68 65  eaf pages flushe
1de10 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
1de20 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 3b 20  nt64 iAbsLevel; 
1de30 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
1de40 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75  te level of inpu
1de50 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1de60 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 2f 2a 20 49 6e 64 65 78 20 6f 66 20 2a 6f 75 74  /* Index of *out
1de90 70 75 74 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20  put* segment in 
1dea0 69 41 62 73 4c 65 76 65 6c 2b 31 20 2a 2f 0a 20  iAbsLevel+1 */. 
1deb0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1dec0 53 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  Start;          
1ded0 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72   /* Block number
1dee0 20 6f 66 20 66 69 72 73 74 20 61 6c 6c 6f 63 61   of first alloca
1def0 74 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73  ted block */.  s
1df00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
1df10 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
1df20 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f  * Block number o
1df30 66 20 6c 61 73 74 20 61 6c 6c 6f 63 61 74 65 64  f last allocated
1df40 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69   block */.  sqli
1df50 74 65 33 5f 69 6e 74 36 34 20 6e 4c 65 61 66 44  te3_int64 nLeafD
1df60 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ata;        /* B
1df70 79 74 65 73 20 6f 66 20 6c 65 61 66 20 70 61 67  ytes of leaf pag
1df80 65 20 64 61 74 61 20 73 6f 20 66 61 72 20 2a 2f  e data so far */
1df90 0a 20 20 75 38 20 62 4e 6f 4c 65 61 66 44 61 74  .  u8 bNoLeafDat
1dfa0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1dfb0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
1dfc0 74 6f 72 65 20 30 20 66 6f 72 20 73 65 67 6d 65  tore 0 for segme
1dfd0 6e 74 20 73 69 7a 65 20 2a 2f 0a 20 20 4e 6f 64  nt size */.  Nod
1dfe0 65 57 72 69 74 65 72 20 61 4e 6f 64 65 57 72 69  eWriter aNodeWri
1dff0 74 65 72 5b 46 54 53 5f 4d 41 58 5f 41 50 50 45  ter[FTS_MAX_APPE
1e000 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 5d 3b 0a  NDABLE_HEIGHT];.
1e010 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  };../*.** An obj
1e020 65 63 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ect of the follo
1e030 77 69 6e 67 20 74 79 70 65 20 69 73 20 75 73 65  wing type is use
1e040 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  d to read data f
1e050 72 6f 6d 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  rom a single.** 
1e060 46 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65  FTS segment node
1e070 2e 20 53 65 65 20 74 68 65 20 66 6f 6c 6c 6f 77  . See the follow
1e080 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
1e090 2a 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61  *.**     nodeRea
1e0a0 64 65 72 49 6e 69 74 28 29 0a 2a 2a 20 20 20 20  derInit().**    
1e0b0 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
1e0c0 29 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61  ).**     nodeRea
1e0d0 64 65 72 52 65 6c 65 61 73 65 28 29 0a 2a 2f 0a  derRelease().*/.
1e0e0 73 74 72 75 63 74 20 4e 6f 64 65 52 65 61 64 65  struct NodeReade
1e0f0 72 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r {.  const char
1e100 20 2a 61 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 6e   *aNode;.  int n
1e110 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Node;.  int iOff
1e120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e130 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1e140 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
1e150 20 61 4e 6f 64 65 5b 5d 20 2a 2f 0a 0a 20 20 2f   aNode[] */..  /
1e160 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
1e170 65 73 2e 20 43 6f 6e 74 61 69 6e 69 6e 67 20 74  es. Containing t
1e180 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
1e190 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71 6c 69  entry. */.  sqli
1e1a0 74 65 33 5f 69 6e 74 36 34 20 69 43 68 69 6c 64  te3_int64 iChild
1e1b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
1e1c0 6f 69 6e 74 65 72 20 74 6f 20 63 68 69 6c 64 20  ointer to child 
1e1d0 6e 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 74  node */.  Blob t
1e1e0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
1e1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1e200 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 63  rent term */.  c
1e210 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c  onst char *aDocl
1e220 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1e230 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  * Pointer to doc
1e240 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  list */.  int nD
1e250 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
1e260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1e270 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  e of doclist in 
1e280 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  bytes */.};../*.
1e290 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f  ** If *pRc is no
1e2a0 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  t SQLITE_OK when
1e2b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1e2c0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
1e2d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
1e2e0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 61 6c  rwise, if the al
1e2f0 6c 6f 63 61 74 69 6f 6e 20 61 74 20 70 42 6c 6f  location at pBlo
1e300 62 2d 3e 61 20 69 73 20 6e 6f 74 20 61 6c 72 65  b->a is not alre
1e310 61 64 79 20 61 74 20 6c 65 61 73 74 20 6e 4d 69  ady at least nMi
1e320 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  n.** bytes in si
1e330 7a 65 2c 20 65 78 74 65 6e 64 20 28 72 65 61 6c  ze, extend (real
1e340 6c 6f 63 29 20 69 74 20 74 6f 20 62 65 20 73 6f  loc) it to be so
1e350 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
1e360 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
1e370 73 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c 49  set *pRc to SQLI
1e380 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 6c 65 61  TE_NOMEM and lea
1e390 76 65 20 70 42 6c 6f 62 2d 3e 61 0a 2a 2a 20 75  ve pBlob->a.** u
1e3a0 6e 6d 6f 64 69 66 69 65 64 2e 20 4f 74 68 65 72  nmodified. Other
1e3b0 77 69 73 65 2c 20 69 66 20 74 68 65 20 61 6c 6c  wise, if the all
1e3c0 6f 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73  ocation succeeds
1e3d0 2c 20 75 70 64 61 74 65 20 70 42 6c 6f 62 2d 3e  , update pBlob->
1e3e0 6e 41 6c 6c 6f 63 0a 2a 2a 20 74 6f 20 72 65 66  nAlloc.** to ref
1e3f0 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a  lect the new siz
1e400 65 20 6f 66 20 74 68 65 20 70 42 6c 6f 62 2d 3e  e of the pBlob->
1e410 61 5b 5d 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  a[] buffer..*/.s
1e420 74 61 74 69 63 20 76 6f 69 64 20 62 6c 6f 62 47  tatic void blobG
1e430 72 6f 77 42 75 66 66 65 72 28 42 6c 6f 62 20 2a  rowBuffer(Blob *
1e440 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 4d 69 6e 2c  pBlob, int nMin,
1e450 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 66   int *pRc){.  if
1e460 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
1e470 4b 20 26 26 20 6e 4d 69 6e 3e 70 42 6c 6f 62 2d  K && nMin>pBlob-
1e480 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  >nAlloc ){.    i
1e490 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 69 6e  nt nAlloc = nMin
1e4a0 3b 0a 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20  ;.    char *a = 
1e4b0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1e4c0 72 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2d 3e 61  realloc(pBlob->a
1e4d0 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  , nAlloc);.    i
1e4e0 66 28 20 61 20 29 7b 0a 20 20 20 20 20 20 70 42  f( a ){.      pB
1e4f0 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41  lob->nAlloc = nA
1e500 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 70 42 6c 6f  lloc;.      pBlo
1e510 62 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65  b->a = a;.    }e
1e520 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
1e530 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1e540 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1e550 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 64  ** Attempt to ad
1e560 76 61 6e 63 65 20 74 68 65 20 6e 6f 64 65 2d 72  vance the node-r
1e570 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73  eader object pas
1e580 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1e590 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20   argument to.** 
1e5a0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 6f  the next entry o
1e5b0 6e 20 74 68 65 20 6e 6f 64 65 2e 20 0a 2a 2a 0a  n the node. .**.
1e5c0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
1e5d0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
1e5e0 72 6f 72 20 6f 63 63 75 72 73 20 28 53 51 4c 49  ror occurs (SQLI
1e5f0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 70 6f 73 73  TE_NOMEM is poss
1e600 69 62 6c 65 29 2e 20 0a 2a 2a 20 4f 74 68 65 72  ible). .** Other
1e610 77 69 73 65 20 72 65 74 75 72 6e 20 53 51 4c 49  wise return SQLI
1e620 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
1e630 69 73 20 6e 6f 20 6e 65 78 74 20 65 6e 74 72 79  is no next entry
1e640 20 6f 6e 20 74 68 65 20 6e 6f 64 65 0a 2a 2a 20   on the node.** 
1e650 28 65 2e 67 2e 20 62 65 63 61 75 73 65 20 74 68  (e.g. because th
1e660 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  e current entry 
1e670 69 73 20 74 68 65 20 6c 61 73 74 29 20 73 65 74  is the last) set
1e680 20 4e 6f 64 65 52 65 61 64 65 72 2d 3e 61 4e 6f   NodeReader->aNo
1e690 64 65 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 20 74 6f  de to.** NULL to
1e6a0 20 69 6e 64 69 63 61 74 65 20 45 4f 46 2e 20 4f   indicate EOF. O
1e6b0 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
1e6c0 74 65 20 74 68 65 20 4e 6f 64 65 52 65 61 64 65  te the NodeReade
1e6d0 72 20 73 74 72 75 63 74 75 72 65 20 6f 75 74 70  r structure outp
1e6e0 75 74 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73  ut .** variables
1e6f0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
1e700 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
1e710 74 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74  t nodeReaderNext
1e720 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 29 7b  (NodeReader *p){
1e730 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20  .  int bFirst = 
1e740 28 70 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 29 3b 20  (p->term.n==0); 
1e750 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66     /* True for f
1e760 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  irst term on the
1e770 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   node */.  int n
1e780 50 72 65 66 69 78 20 3d 20 30 3b 20 20 20 20 20  Prefix = 0;     
1e790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1e7a0 74 65 73 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d  tes to copy from
1e7b0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   previous term *
1e7c0 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 20  /.  int nSuffix 
1e7d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1e7e0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
1e7f0 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20 70 72  append to the pr
1e800 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63  efix */.  int rc
1e810 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e830 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
1e840 73 73 65 72 74 28 20 70 2d 3e 61 4e 6f 64 65 20  ssert( p->aNode 
1e850 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 43 68 69  );.  if( p->iChi
1e860 6c 64 20 26 26 20 62 46 69 72 73 74 3d 3d 30 20  ld && bFirst==0 
1e870 29 20 70 2d 3e 69 43 68 69 6c 64 2b 2b 3b 0a 20  ) p->iChild++;. 
1e880 20 69 66 28 20 70 2d 3e 69 4f 66 66 3e 3d 70 2d   if( p->iOff>=p-
1e890 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 2f 2a  >nNode ){.    /*
1e8a0 20 45 4f 46 20 2a 2f 0a 20 20 20 20 70 2d 3e 61   EOF */.    p->a
1e8b0 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Node = 0;.  }els
1e8c0 65 7b 0a 20 20 20 20 69 66 28 20 62 46 69 72 73  e{.    if( bFirs
1e8d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  t==0 ){.      p-
1e8e0 3e 69 4f 66 66 20 2b 3d 20 66 74 73 33 47 65 74  >iOff += fts3Get
1e8f0 56 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f  Varint32(&p->aNo
1e900 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 6e 50  de[p->iOff], &nP
1e910 72 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20  refix);.    }.  
1e920 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73    p->iOff += fts
1e930 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 2d  3GetVarint32(&p-
1e940 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c  >aNode[p->iOff],
1e950 20 26 6e 53 75 66 66 69 78 29 3b 0a 0a 20 20 20   &nSuffix);..   
1e960 20 69 66 28 20 6e 50 72 65 66 69 78 3e 70 2d 3e   if( nPrefix>p->
1e970 69 4f 66 66 20 7c 7c 20 6e 53 75 66 66 69 78 3e  iOff || nSuffix>
1e980 70 2d 3e 6e 4e 6f 64 65 2d 70 2d 3e 69 4f 66 66  p->nNode-p->iOff
1e990 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e9a0 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
1e9b0 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f  B;.    }.    blo
1e9c0 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 2d 3e  bGrowBuffer(&p->
1e9d0 74 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 6e 53  term, nPrefix+nS
1e9e0 75 66 66 69 78 2c 20 26 72 63 29 3b 0a 20 20 20  uffix, &rc);.   
1e9f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ea00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
1ea10 70 79 28 26 70 2d 3e 74 65 72 6d 2e 61 5b 6e 50  py(&p->term.a[nP
1ea20 72 65 66 69 78 5d 2c 20 26 70 2d 3e 61 4e 6f 64  refix], &p->aNod
1ea30 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 6e 53 75 66  e[p->iOff], nSuf
1ea40 66 69 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74  fix);.      p->t
1ea50 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 66 69 78 2b  erm.n = nPrefix+
1ea60 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70  nSuffix;.      p
1ea70 2d 3e 69 4f 66 66 20 2b 3d 20 6e 53 75 66 66 69  ->iOff += nSuffi
1ea80 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  x;.      if( p->
1ea90 69 43 68 69 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  iChild==0 ){.   
1eaa0 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20       p->iOff += 
1eab0 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
1eac0 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66  &p->aNode[p->iOf
1ead0 66 5d 2c 20 26 70 2d 3e 6e 44 6f 63 6c 69 73 74  f], &p->nDoclist
1eae0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1eaf0 70 2d 3e 6e 4e 6f 64 65 2d 70 2d 3e 69 4f 66 66  p->nNode-p->iOff
1eb00 29 3c 70 2d 3e 6e 44 6f 63 6c 69 73 74 20 29 7b  )<p->nDoclist ){
1eb10 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1eb20 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  n FTS_CORRUPT_VT
1eb30 41 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  AB;.        }.  
1eb40 20 20 20 20 20 20 70 2d 3e 61 44 6f 63 6c 69 73        p->aDoclis
1eb50 74 20 3d 20 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d  t = &p->aNode[p-
1eb60 3e 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20  >iOff];.        
1eb70 70 2d 3e 69 4f 66 66 20 2b 3d 20 70 2d 3e 6e 44  p->iOff += p->nD
1eb80 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  oclist;.      }.
1eb90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1eba0 65 72 74 28 20 70 2d 3e 69 4f 66 66 3c 3d 70 2d  ert( p->iOff<=p-
1ebb0 3e 6e 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75  >nNode );.  retu
1ebc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ebd0 52 65 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e 61  Release all dyna
1ebe0 6d 69 63 20 72 65 73 6f 75 72 63 65 73 20 68 65  mic resources he
1ebf0 6c 64 20 62 79 20 6e 6f 64 65 2d 72 65 61 64 65  ld by node-reade
1ec00 72 20 6f 62 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a  r object *p..*/.
1ec10 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65  static void node
1ec20 52 65 61 64 65 72 52 65 6c 65 61 73 65 28 4e 6f  ReaderRelease(No
1ec30 64 65 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20  deReader *p){.  
1ec40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1ec50 74 65 72 6d 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  term.a);.}../*.*
1ec60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  * Initialize a n
1ec70 6f 64 65 2d 72 65 61 64 65 72 20 6f 62 6a 65 63  ode-reader objec
1ec80 74 20 74 6f 20 72 65 61 64 20 74 68 65 20 6e 6f  t to read the no
1ec90 64 65 20 69 6e 20 62 75 66 66 65 72 20 61 4e 6f  de in buffer aNo
1eca0 64 65 2f 6e 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  de/nNode..**.** 
1ecb0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
1ecc0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ecd0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 4e 6f 64  rned and the Nod
1ece0 65 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 73  eReader object s
1ecf0 65 74 20 74 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20  et to .** point 
1ed00 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
1ed10 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 28  ry on the node (
1ed20 69 66 20 61 6e 79 29 2e 20 4f 74 68 65 72 77 69  if any). Otherwi
1ed30 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  se, an SQLite.**
1ed40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ed50 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1ed60 69 63 20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65  ic int nodeReade
1ed70 72 49 6e 69 74 28 4e 6f 64 65 52 65 61 64 65 72  rInit(NodeReader
1ed80 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1ed90 2a 61 4e 6f 64 65 2c 20 69 6e 74 20 6e 4e 6f 64  *aNode, int nNod
1eda0 65 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  e){.  memset(p, 
1edb0 30 2c 20 73 69 7a 65 6f 66 28 4e 6f 64 65 52 65  0, sizeof(NodeRe
1edc0 61 64 65 72 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f  ader));.  p->aNo
1edd0 64 65 20 3d 20 61 4e 6f 64 65 3b 0a 20 20 70 2d  de = aNode;.  p-
1ede0 3e 6e 4e 6f 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a  >nNode = nNode;.
1edf0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1ee00 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6c 65   if this is a le
1ee10 61 66 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61  af or an interna
1ee20 6c 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28  l node. */.  if(
1ee30 20 70 2d 3e 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a   p->aNode[0] ){.
1ee40 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74 65 72 6e      /* An intern
1ee50 61 6c 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  al node. */.    
1ee60 70 2d 3e 69 4f 66 66 20 3d 20 31 20 2b 20 73 71  p->iOff = 1 + sq
1ee70 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
1ee80 6e 74 28 26 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c  nt(&p->aNode[1],
1ee90 20 26 70 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20   &p->iChild);.  
1eea0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 4f  }else{.    p->iO
1eeb0 66 66 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72  ff = 1;.  }..  r
1eec0 65 74 75 72 6e 20 6e 6f 64 65 52 65 61 64 65 72  eturn nodeReader
1eed0 4e 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Next(p);.}../*.*
1eee0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1eef0 69 73 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20  is called while 
1ef00 77 72 69 74 69 6e 67 20 61 6e 20 46 54 53 20 73  writing an FTS s
1ef10 65 67 6d 65 6e 74 20 65 61 63 68 20 74 69 6d 65  egment each time
1ef20 20 61 20 6c 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64   a leaf o.** nod
1ef30 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 6e  e is finished an
1ef40 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  d written to dis
1ef50 6b 2e 20 54 68 65 20 6b 65 79 20 28 7a 54 65 72  k. The key (zTer
1ef60 6d 2f 6e 54 65 72 6d 29 20 69 73 20 67 75 61 72  m/nTerm) is guar
1ef70 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
1ef80 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1ef90 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
1efa0 74 68 65 20 6e 6f 64 65 20 6a 75 73 74 20 77 72  the node just wr
1efb0 69 74 74 65 6e 2c 20 62 75 74 20 73 6d 61 6c 6c  itten, but small
1efc0 65 72 0a 2a 2a 20 74 68 61 6e 20 6f 72 20 65 71  er.** than or eq
1efd0 75 61 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74  ual to the first
1efe0 20 6b 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62   key that will b
1eff0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1f000 20 6e 65 78 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f   next leaf.** no
1f010 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c  de..**.** The bl
1f020 6f 63 6b 20 69 64 20 6f 66 20 74 68 65 20 6c 65  ock id of the le
1f030 61 66 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69  af node just wri
1f040 74 74 65 6e 20 74 6f 20 64 69 73 6b 20 6d 61 79  tten to disk may
1f050 20 62 65 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20   be found in.** 
1f060 28 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57  (pWriter->aNodeW
1f070 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29  riter[0].iBlock)
1f080 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1f090 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1f0a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1f0b0 33 49 6e 63 72 6d 65 72 67 65 50 75 73 68 28 0a  3IncrmergePush(.
1f0c0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
1f0f0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72  handle */.  Incr
1f100 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72  mergeWriter *pWr
1f110 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57  iter,       /* W
1f120 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1f130 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1f140 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
1f150 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 77 72 69    /* Term to wri
1f160 74 65 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20 6e  te to internal n
1f170 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ode */.  int nTe
1f180 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
1f190 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1f1a0 73 20 61 74 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b  s at zTerm */.){
1f1b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1f1c0 20 69 50 74 72 20 3d 20 70 57 72 69 74 65 72 2d   iPtr = pWriter-
1f1d0 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e  >aNodeWriter[0].
1f1e0 69 42 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 69 4c  iBlock;.  int iL
1f1f0 61 79 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  ayer;..  assert(
1f200 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 20 20 66 6f   nTerm>0 );.  fo
1f210 72 28 69 4c 61 79 65 72 3d 31 3b 20 41 4c 57 41  r(iLayer=1; ALWA
1f220 59 53 28 69 4c 61 79 65 72 3c 46 54 53 5f 4d 41  YS(iLayer<FTS_MA
1f230 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49  X_APPENDABLE_HEI
1f240 47 48 54 29 3b 20 69 4c 61 79 65 72 2b 2b 29 7b  GHT); iLayer++){
1f250 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
1f260 36 34 20 69 4e 65 78 74 50 74 72 20 3d 20 30 3b  64 iNextPtr = 0;
1f270 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20  .    NodeWriter 
1f280 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65  *pNode = &pWrite
1f290 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69  r->aNodeWriter[i
1f2a0 4c 61 79 65 72 5d 3b 0a 20 20 20 20 69 6e 74 20  Layer];.    int 
1f2b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f2c0 20 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b      int nPrefix;
1f2d0 0a 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78  .    int nSuffix
1f2e0 3b 0a 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65  ;.    int nSpace
1f2f0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ;..    /* Figure
1f300 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
1f310 61 63 65 20 74 68 65 20 6b 65 79 20 77 69 6c 6c  ace the key will
1f320 20 63 6f 6e 73 75 6d 65 20 69 66 20 69 74 20 69   consume if it i
1f330 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
1f340 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1f350 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c  node of layer iL
1f360 61 79 65 72 2e 20 44 75 65 20 74 6f 20 74 68 65  ayer. Due to the
1f370 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73   prefix compress
1f380 69 6f 6e 2c 20 0a 20 20 20 20 2a 2a 20 74 68 65  ion, .    ** the
1f390 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
1f3a0 63 68 61 6e 67 65 73 20 64 65 70 65 6e 64 69 6e  changes dependin
1f3b0 67 20 6f 6e 20 77 68 69 63 68 20 6e 6f 64 65 20  g on which node 
1f3c0 74 68 65 20 6b 65 79 20 69 73 20 74 6f 0a 20 20  the key is to.  
1f3d0 20 20 2a 2a 20 62 65 20 61 64 64 65 64 20 74 6f    ** be added to
1f3e0 2e 20 20 2a 2f 0a 20 20 20 20 6e 50 72 65 66 69  .  */.    nPrefi
1f3f0 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f  x = fts3PrefixCo
1f400 6d 70 72 65 73 73 28 70 4e 6f 64 65 2d 3e 6b 65  mpress(pNode->ke
1f410 79 2e 61 2c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e  y.a, pNode->key.
1f420 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  n, zTerm, nTerm)
1f430 3b 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20  ;.    nSuffix = 
1f440 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b  nTerm - nPrefix;
1f450 0a 20 20 20 20 6e 53 70 61 63 65 20 20 3d 20 73  .    nSpace  = s
1f460 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
1f470 4c 65 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20 20  Len(nPrefix);.  
1f480 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69    nSpace += sqli
1f490 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
1f4a0 28 6e 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66  (nSuffix) + nSuf
1f4b0 66 69 78 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  fix;..    if( pN
1f4c0 6f 64 65 2d 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c  ode->key.n==0 ||
1f4d0 20 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e   (pNode->block.n
1f4e0 20 2b 20 6e 53 70 61 63 65 29 3c 3d 70 2d 3e 6e   + nSpace)<=p->n
1f4f0 4e 6f 64 65 53 69 7a 65 20 29 7b 20 0a 20 20 20  NodeSize ){ .   
1f500 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72     /* If the cur
1f510 72 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79  rent node of lay
1f520 65 72 20 69 4c 61 79 65 72 20 63 6f 6e 74 61 69  er iLayer contai
1f530 6e 73 20 7a 65 72 6f 20 6b 65 79 73 2c 20 6f 72  ns zero keys, or
1f540 20 69 66 20 61 64 64 69 6e 67 0a 20 20 20 20 20   if adding.     
1f550 20 2a 2a 20 74 68 65 20 6b 65 79 20 74 6f 20 69   ** the key to i
1f560 74 20 77 69 6c 6c 20 6e 6f 74 20 63 61 75 73 65  t will not cause
1f570 20 69 74 20 74 6f 20 67 72 6f 77 20 74 6f 20 6c   it to grow to l
1f580 61 72 67 65 72 20 74 68 61 6e 20 6e 4e 6f 64 65  arger than nNode
1f590 53 69 7a 65 20 0a 20 20 20 20 20 20 2a 2a 20 62  Size .      ** b
1f5a0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 77 72  ytes in size, wr
1f5b0 69 74 65 20 74 68 65 20 6b 65 79 20 68 65 72 65  ite the key here
1f5c0 2e 20 20 2a 2f 0a 0a 20 20 20 20 20 20 42 6c 6f  .  */..      Blo
1f5d0 62 20 2a 70 42 6c 6b 20 3d 20 26 70 4e 6f 64 65  b *pBlk = &pNode
1f5e0 2d 3e 62 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 69  ->block;.      i
1f5f0 66 28 20 70 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b  f( pBlk->n==0 ){
1f600 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 47 72 6f  .        blobGro
1f610 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 2d  wBuffer(pBlk, p-
1f620 3e 6e 4e 6f 64 65 53 69 7a 65 2c 20 26 72 63 29  >nNodeSize, &rc)
1f630 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f650 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 61           pBlk->a
1f660 5b 30 5d 20 3d 20 28 63 68 61 72 29 69 4c 61 79  [0] = (char)iLay
1f670 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  er;.          pB
1f680 6c 6b 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69  lk->n = 1 + sqli
1f690 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
1f6a0 28 26 70 42 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50  (&pBlk->a[1], iP
1f6b0 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tr);.        }. 
1f6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f       }.      blo
1f6d0 62 47 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6b  bGrowBuffer(pBlk
1f6e0 2c 20 70 42 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61  , pBlk->n + nSpa
1f6f0 63 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ce, &rc);.      
1f700 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26  blobGrowBuffer(&
1f710 70 4e 6f 64 65 2d 3e 6b 65 79 2c 20 6e 54 65 72  pNode->key, nTer
1f720 6d 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 20 20  m, &rc);..      
1f730 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f740 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
1f750 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b   pNode->key.n ){
1f760 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d  .          pBlk-
1f770 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1f780 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 6c 6b  3PutVarint(&pBlk
1f790 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50  ->a[pBlk->n], nP
1f7a0 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20  refix);.        
1f7b0 7d 0a 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e  }.        pBlk->
1f7c0 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  n += sqlite3Fts3
1f7d0 50 75 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d  PutVarint(&pBlk-
1f7e0 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75  >a[pBlk->n], nSu
1f7f0 66 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  ffix);.        m
1f800 65 6d 63 70 79 28 26 70 42 6c 6b 2d 3e 61 5b 70  emcpy(&pBlk->a[p
1f810 42 6c 6b 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b  Blk->n], &zTerm[
1f820 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69  nPrefix], nSuffi
1f830 78 29 3b 0a 20 20 20 20 20 20 20 20 70 42 6c 6b  x);.        pBlk
1f840 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a  ->n += nSuffix;.
1f850 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f860 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54  pNode->key.a, zT
1f870 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
1f880 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e       pNode->key.
1f890 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  n = nTerm;.     
1f8a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1f8b0 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
1f8c0 2c 20 66 6c 75 73 68 20 74 68 65 20 63 75 72 72  , flush the curr
1f8d0 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65  ent node of laye
1f8e0 72 20 69 4c 61 79 65 72 20 74 6f 20 64 69 73 6b  r iLayer to disk
1f8f0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ..      ** Then 
1f900 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 2c 20  allocate a new, 
1f910 65 6d 70 74 79 20 73 69 62 6c 69 6e 67 20 6e 6f  empty sibling no
1f920 64 65 2e 20 54 68 65 20 6b 65 79 20 77 69 6c 6c  de. The key will
1f930 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20   be written.    
1f940 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 70 61    ** into the pa
1f950 72 65 6e 74 20 6f 66 20 74 68 69 73 20 6e 6f 64  rent of this nod
1f960 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
1f970 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
1f980 74 28 70 2c 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f  t(p, pNode->iBlo
1f990 63 6b 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  ck, pNode->block
1f9a0 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  .a, pNode->block
1f9b0 2e 6e 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  .n);..      asse
1f9c0 72 74 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  rt( pNode->block
1f9d0 2e 6e 41 6c 6c 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64  .nAlloc>=p->nNod
1f9e0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 70  eSize );.      p
1f9f0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d  Node->block.a[0]
1fa00 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b   = (char)iLayer;
1fa10 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c  .      pNode->bl
1fa20 6f 63 6b 2e 6e 20 3d 20 31 20 2b 20 73 71 6c 69  ock.n = 1 + sqli
1fa30 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
1fa40 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  (&pNode->block.a
1fa50 5b 31 5d 2c 20 69 50 74 72 2b 31 29 3b 0a 0a 20  [1], iPtr+1);.. 
1fa60 20 20 20 20 20 69 4e 65 78 74 50 74 72 20 3d 20       iNextPtr = 
1fa70 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 3b 0a 20  pNode->iBlock;. 
1fa80 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f       pNode->iBlo
1fa90 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 6f 64  ck++;.      pNod
1faa0 65 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20  e->key.n = 0;.  
1fab0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1fac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e  =SQLITE_OK || iN
1fad0 65 78 74 50 74 72 3d 3d 30 20 29 20 72 65 74 75  extPtr==0 ) retu
1fae0 72 6e 20 72 63 3b 0a 20 20 20 20 69 50 74 72 20  rn rc;.    iPtr 
1faf0 3d 20 69 4e 65 78 74 50 74 72 3b 0a 20 20 7d 0a  = iNextPtr;.  }.
1fb00 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1fb10 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1fb20 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 74 65  *.** Append a te
1fb30 72 6d 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  rm and (optional
1fb40 6c 79 29 20 64 6f 63 6c 69 73 74 20 74 6f 20 74  ly) doclist to t
1fb50 68 65 20 46 54 53 20 73 65 67 6d 65 6e 74 20 6e  he FTS segment n
1fb60 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ode currently.**
1fb70 20 73 74 6f 72 65 64 20 69 6e 20 62 6c 6f 62 20   stored in blob 
1fb80 2a 70 4e 6f 64 65 2e 20 54 68 65 20 6e 6f 64 65  *pNode. The node
1fb90 20 6e 65 65 64 20 6e 6f 74 20 63 6f 6e 74 61 69   need not contai
1fba0 6e 20 61 6e 79 20 74 65 72 6d 73 2c 20 62 75 74  n any terms, but
1fbb0 20 74 68 65 0a 2a 2a 20 68 65 61 64 65 72 20 6d   the.** header m
1fbc0 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  ust be written b
1fbd0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1fbe0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1fbf0 2a 0a 2a 2a 20 41 20 6e 6f 64 65 20 68 65 61 64  *.** A node head
1fc00 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20 30  er is a single 0
1fc10 78 30 30 20 62 79 74 65 20 66 6f 72 20 61 20 6c  x00 byte for a l
1fc20 65 61 66 20 6e 6f 64 65 2c 20 6f 72 20 61 20 68  eaf node, or a h
1fc30 65 69 67 68 74 20 76 61 72 69 6e 74 0a 2a 2a 20  eight varint.** 
1fc40 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20  followed by the 
1fc50 6c 65 66 74 2d 68 61 6e 64 2d 63 68 69 6c 64 20  left-hand-child 
1fc60 76 61 72 69 6e 74 20 66 6f 72 20 61 6e 20 69 6e  varint for an in
1fc70 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a  ternal node..**.
1fc80 2a 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  ** The term to b
1fc90 65 20 61 70 70 65 6e 64 65 64 20 69 73 20 70 61  e appended is pa
1fca0 73 73 65 64 20 76 69 61 20 61 72 67 75 6d 65 6e  ssed via argumen
1fcb0 74 73 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20  ts zTerm/nTerm. 
1fcc0 46 6f 72 20 61 20 0a 2a 2a 20 6c 65 61 66 20 6e  For a .** leaf n
1fcd0 6f 64 65 2c 20 74 68 65 20 64 6f 63 6c 69 73 74  ode, the doclist
1fce0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61 44   is passed as aD
1fcf0 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e  oclist/nDoclist.
1fd00 20 46 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c   For an internal
1fd10 0a 2a 2a 20 6e 6f 64 65 2c 20 62 6f 74 68 20 61  .** node, both a
1fd20 44 6f 63 6c 69 73 74 20 61 6e 64 20 6e 44 6f 63  Doclist and nDoc
1fd30 6c 69 73 74 20 6d 75 73 74 20 62 65 20 70 61 73  list must be pas
1fd40 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  sed 0..**.** If 
1fd50 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1fd60 76 61 6c 75 65 20 69 6e 20 62 6c 6f 62 20 70 50  value in blob pP
1fd70 72 65 76 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  rev is zero, the
1fd80 6e 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  n this is the fi
1fd90 72 73 74 0a 2a 2a 20 74 65 72 6d 20 77 72 69 74  rst.** term writ
1fda0 74 65 6e 20 74 6f 20 74 68 65 20 6e 6f 64 65 2e  ten to the node.
1fdb0 20 4f 74 68 65 72 77 69 73 65 2c 20 70 50 72 65   Otherwise, pPre
1fdc0 76 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70  v contains a cop
1fdd0 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 72 65  y of the .** pre
1fde0 76 69 6f 75 73 20 74 65 72 6d 2e 20 42 65 66 6f  vious term. Befo
1fdf0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1fe00 20 72 65 74 75 72 6e 73 2c 20 69 74 20 69 73 20   returns, it is 
1fe10 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
1fe20 69 6e 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  in a.** copy of 
1fe30 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a  zTerm/nTerm..**.
1fe40 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1fe50 20 74 68 61 74 20 74 68 65 20 62 75 66 66 65 72   that the buffer
1fe60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1fe70 20 70 4e 6f 64 65 20 69 73 20 61 6c 72 65 61 64   pNode is alread
1fe80 79 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  y large.** enoug
1fe90 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65  h to accommodate
1fea0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 20   the new entry. 
1feb0 54 68 65 20 62 75 66 66 65 72 20 61 73 73 6f 63  The buffer assoc
1fec0 69 61 74 65 64 20 77 69 74 68 20 70 50 72 65 76  iated with pPrev
1fed0 0a 2a 2a 20 69 73 20 65 78 74 65 6e 64 65 64 20  .** is extended 
1fee0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1fef0 20 69 66 20 72 65 71 75 72 69 72 65 64 2e 0a 2a   if requrired..*
1ff00 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1ff10 20 28 69 2e 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69   (i.e. OOM condi
1ff20 74 69 6f 6e 29 20 6f 63 63 75 72 73 2c 20 61 6e  tion) occurs, an
1ff30 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1ff40 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  de is.** returne
1ff50 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
1ff60 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1ff70 69 63 20 69 6e 74 20 66 74 73 33 41 70 70 65 6e  ic int fts3Appen
1ff80 64 54 6f 4e 6f 64 65 28 0a 20 20 42 6c 6f 62 20  dToNode(.  Blob 
1ff90 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
1ffa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1ffb0 72 72 65 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65  rrent node image
1ffc0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f   to append to */
1ffd0 0a 20 20 42 6c 6f 62 20 2a 70 50 72 65 76 2c 20  .  Blob *pPrev, 
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
20000 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73  taining previous
20010 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 2a 2f   term written */
20020 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20030 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
20040 20 20 20 2f 2a 20 4e 65 77 20 74 65 72 6d 20 74     /* New term t
20050 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
20060 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   nTerm,         
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20080 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e  Size of zTerm in
20090 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73   bytes */.  cons
200a0 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74  t char *aDoclist
200b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
200c0 6f 63 6c 69 73 74 20 28 6f 72 20 4e 55 4c 4c 29  oclist (or NULL)
200d0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
200e0 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20 20 20  nt nDoclist     
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20100 2a 20 53 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69  * Size of aDocli
20110 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 20 0a  st in bytes */ .
20120 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20130 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
20140 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20150 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 69  ode */.  int bFi
20160 72 73 74 20 3d 20 28 70 50 72 65 76 2d 3e 6e 3d  rst = (pPrev->n=
20170 3d 30 29 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  =0);     /* True
20180 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
20190 66 69 72 73 74 20 74 65 72 6d 20 77 72 69 74 74  first term writt
201a0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  en */.  int nPre
201b0 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
201c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
201d0 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78 20 69  of term prefix i
201e0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
201f0 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20   nSuffix;       
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20210 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66  Size of term suf
20220 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fix in bytes */.
20230 0a 20 20 2f 2a 20 4e 6f 64 65 20 6d 75 73 74 20  .  /* Node must 
20240 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
20250 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 72 65  n started. There
20260 20 6d 75 73 74 20 62 65 20 61 20 64 6f 63 6c 69   must be a docli
20270 73 74 20 66 6f 72 20 61 0a 20 20 2a 2a 20 6c 65  st for a.  ** le
20280 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 74 68 65  af node, and the
20290 72 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61  re must not be a
202a0 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 61 6e 20   doclist for an 
202b0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 20  internal node.  
202c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f  */.  assert( pNo
202d0 64 65 2d 3e 6e 3e 30 20 29 3b 0a 20 20 61 73 73  de->n>0 );.  ass
202e0 65 72 74 28 20 28 70 4e 6f 64 65 2d 3e 61 5b 30  ert( (pNode->a[0
202f0 5d 3d 3d 27 5c 30 27 29 3d 3d 28 61 44 6f 63 6c  ]=='\0')==(aDocl
20300 69 73 74 21 3d 30 29 20 29 3b 0a 0a 20 20 62 6c  ist!=0) );..  bl
20310 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 50 72  obGrowBuffer(pPr
20320 65 76 2c 20 6e 54 65 72 6d 2c 20 26 72 63 29 3b  ev, nTerm, &rc);
20330 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
20340 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
20350 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66  ;..  nPrefix = f
20360 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
20370 73 28 70 50 72 65 76 2d 3e 61 2c 20 70 50 72 65  s(pPrev->a, pPre
20380 76 2d 3e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  v->n, zTerm, nTe
20390 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d  rm);.  nSuffix =
203a0 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
203b0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 72 65 76  ;.  memcpy(pPrev
203c0 2d 3e 61 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  ->a, zTerm, nTer
203d0 6d 29 3b 0a 20 20 70 50 72 65 76 2d 3e 6e 20 3d  m);.  pPrev->n =
203e0 20 6e 54 65 72 6d 3b 0a 0a 20 20 69 66 28 20 62   nTerm;..  if( b
203f0 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
20400 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69  pNode->n += sqli
20410 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
20420 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65  (&pNode->a[pNode
20430 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a  ->n], nPrefix);.
20440 20 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b    }.  pNode->n +
20450 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
20460 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61  Varint(&pNode->a
20470 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66  [pNode->n], nSuf
20480 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  fix);.  memcpy(&
20490 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e  pNode->a[pNode->
204a0 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66  n], &zTerm[nPref
204b0 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20  ix], nSuffix);. 
204c0 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75   pNode->n += nSu
204d0 66 66 69 78 3b 0a 0a 20 20 69 66 28 20 61 44 6f  ffix;..  if( aDo
204e0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 6f  clist ){.    pNo
204f0 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  de->n += sqlite3
20500 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
20510 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e  Node->a[pNode->n
20520 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  ], nDoclist);.  
20530 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64 65 2d    memcpy(&pNode-
20540 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44  >a[pNode->n], aD
20550 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
20560 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20  );.    pNode->n 
20570 2b 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d  += nDoclist;.  }
20580 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64  ..  assert( pNod
20590 65 2d 3e 6e 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c  e->n<=pNode->nAl
205a0 6c 6f 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  loc );..  return
205b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
205c0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20  *.** Append the 
205d0 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 6e 64  current term and
205e0 20 64 6f 63 6c 69 73 74 20 70 6f 69 6e 74 65 64   doclist pointed
205f0 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20 70 43   to by cursor pC
20600 73 72 20 74 6f 20 74 68 65 0a 2a 2a 20 61 70 70  sr to the.** app
20610 65 6e 64 61 62 6c 65 20 62 2d 74 72 65 65 20 73  endable b-tree s
20620 65 67 6d 65 6e 74 20 6f 70 65 6e 65 64 20 66 6f  egment opened fo
20630 72 20 77 72 69 74 69 6e 67 20 62 79 20 70 57 72  r writing by pWr
20640 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  iter..**.** Retu
20650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
20660 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
20670 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
20680 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
20690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
206a0 33 49 6e 63 72 6d 65 72 67 65 41 70 70 65 6e 64  3IncrmergeAppend
206b0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
206c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
206d0 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
206e0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e  e handle */.  In
206f0 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70  crmergeWriter *p
20700 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a  Writer,       /*
20710 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
20720 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
20730 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20  Reader *pCsr    
20740 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 63 6f      /* Cursor co
20750 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 61 6e  ntaining term an
20760 64 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a  d doclist */.){.
20770 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
20780 65 72 6d 20 3d 20 70 43 73 72 2d 3e 7a 54 65 72  erm = pCsr->zTer
20790 6d 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d  m;.  int nTerm =
207a0 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20   pCsr->nTerm;.  
207b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63  const char *aDoc
207c0 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 44 6f  list = pCsr->aDo
207d0 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 44 6f  clist;.  int nDo
207e0 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 6e 44  clist = pCsr->nD
207f0 6f 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20 72 63  oclist;.  int rc
20800 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
20810 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
20820 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
20830 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  nSpace;         
20840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
20850 61 6c 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  al space in byte
20860 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65  s required on le
20870 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  af */.  int nPre
20880 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
20890 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
208a0 20 70 72 65 66 69 78 20 73 68 61 72 65 64 20 77   prefix shared w
208b0 69 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72  ith previous ter
208c0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66  m */.  int nSuff
208d0 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
208e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
208f0 73 75 66 66 69 78 20 28 6e 54 65 72 6d 20 2d 20  suffix (nTerm - 
20900 6e 50 72 65 66 69 78 29 20 2a 2f 0a 20 20 4e 6f  nPrefix) */.  No
20910 64 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 3b  deWriter *pLeaf;
20920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
20930 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 77 72  bject used to wr
20940 69 74 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a  ite leaf nodes *
20950 2f 0a 0a 20 20 70 4c 65 61 66 20 3d 20 26 70 57  /..  pLeaf = &pW
20960 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
20970 65 72 5b 30 5d 3b 0a 20 20 6e 50 72 65 66 69 78  er[0];.  nPrefix
20980 20 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d   = fts3PrefixCom
20990 70 72 65 73 73 28 70 4c 65 61 66 2d 3e 6b 65 79  press(pLeaf->key
209a0 2e 61 2c 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e  .a, pLeaf->key.n
209b0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
209c0 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65  .  nSuffix = nTe
209d0 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 0a 20  rm - nPrefix;.. 
209e0 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c 69 74   nSpace  = sqlit
209f0 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
20a00 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 53 70 61  nPrefix);.  nSpa
20a10 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ce += sqlite3Fts
20a20 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66  3VarintLen(nSuff
20a30 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20  ix) + nSuffix;. 
20a40 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74   nSpace += sqlit
20a50 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
20a60 6e 44 6f 63 6c 69 73 74 29 20 2b 20 6e 44 6f 63  nDoclist) + nDoc
20a70 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  list;..  /* If t
20a80 68 65 20 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b  he current block
20a90 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 61   is not empty, a
20aa0 6e 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 69  nd if adding thi
20ab0 73 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 0a 20  s term/doclist. 
20ac0 20 2a 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65   ** to the curre
20ad0 6e 74 20 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d  nt block would m
20ae0 61 6b 65 20 69 74 20 6c 61 72 67 65 72 20 74 68  ake it larger th
20af0 61 6e 20 46 74 73 33 54 61 62 6c 65 2e 6e 4e 6f  an Fts3Table.nNo
20b00 64 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  deSize.  ** byte
20b10 73 2c 20 77 72 69 74 65 20 74 68 69 73 20 62 6c  s, write this bl
20b20 6f 63 6b 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ock out to the d
20b30 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 69 66  atabase. */.  if
20b40 28 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e  ( pLeaf->block.n
20b50 3e 30 20 26 26 20 28 70 4c 65 61 66 2d 3e 62 6c  >0 && (pLeaf->bl
20b60 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 29 3e  ock.n + nSpace)>
20b70 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a  p->nNodeSize ){.
20b80 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
20b90 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 65  teSegment(p, pLe
20ba0 61 66 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4c 65 61  af->iBlock, pLea
20bb0 66 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61  f->block.a, pLea
20bc0 66 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20  f->block.n);.   
20bd0 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b   pWriter->nWork+
20be0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  +;..    /* Add t
20bf0 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
20c00 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  to the parent no
20c10 64 65 2e 20 54 68 65 20 74 65 72 6d 20 61 64 64  de. The term add
20c20 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  ed to the .    *
20c30 2a 20 70 61 72 65 6e 74 20 6d 75 73 74 3a 0a 20  * parent must:. 
20c40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61     **.    **   a
20c50 29 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  ) be greater tha
20c60 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65  n the largest te
20c70 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e  rm on the leaf n
20c80 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ode just written
20c90 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  .    **      to 
20ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 73 74  the database (st
20cb0 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ill available in
20cc0 20 70 4c 65 61 66 2d 3e 6b 65 79 29 2c 20 61 6e   pLeaf->key), an
20cd0 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  d.    **.    ** 
20ce0 20 20 62 29 20 62 65 20 6c 65 73 73 20 74 68 61    b) be less tha
20cf0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
20d00 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74 6f 20  e term about to 
20d10 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
20d20 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  new.    **      
20d30 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d  leaf node (zTerm
20d40 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a  /nTerm)..    **.
20d50 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
20d60 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74 20 62  words, it must b
20d70 65 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  e the prefix of 
20d80 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e  zTerm 1 byte lon
20d90 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ger than.    ** 
20da0 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
20db0 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20 7a 54  x (if any) of zT
20dc0 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65 72 2d  erm and pWriter-
20dd0 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20  >zTerm..    */. 
20de0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20df0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20e00 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65   = fts3Incrmerge
20e10 50 75 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c  Push(p, pWriter,
20e20 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b   zTerm, nPrefix+
20e30 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
20e40 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
20e50 20 6e 65 78 74 20 6f 75 74 70 75 74 20 62 6c 6f   next output blo
20e60 63 6b 20 2a 2f 0a 20 20 20 20 70 4c 65 61 66 2d  ck */.    pLeaf-
20e70 3e 69 42 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70  >iBlock++;.    p
20e80 4c 65 61 66 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b  Leaf->key.n = 0;
20e90 0a 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63  .    pLeaf->bloc
20ea0 6b 2e 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 53  k.n = 0;..    nS
20eb0 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20  uffix = nTerm;. 
20ec0 20 20 20 6e 53 70 61 63 65 20 20 3d 20 31 3b 0a     nSpace  = 1;.
20ed0 20 20 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71      nSpace += sq
20ee0 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
20ef0 65 6e 28 6e 53 75 66 66 69 78 29 20 2b 20 6e 53  en(nSuffix) + nS
20f00 75 66 66 69 78 3b 0a 20 20 20 20 6e 53 70 61 63  uffix;.    nSpac
20f10 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  e += sqlite3Fts3
20f20 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69  VarintLen(nDocli
20f30 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a  st) + nDoclist;.
20f40 20 20 7d 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e    }..  pWriter->
20f50 6e 4c 65 61 66 44 61 74 61 20 2b 3d 20 6e 53 70  nLeafData += nSp
20f60 61 63 65 3b 0a 20 20 62 6c 6f 62 47 72 6f 77 42  ace;.  blobGrowB
20f70 75 66 66 65 72 28 26 70 4c 65 61 66 2d 3e 62 6c  uffer(&pLeaf->bl
20f80 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62 6c 6f 63  ock, pLeaf->bloc
20f90 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 2c 20 26 72  k.n + nSpace, &r
20fa0 63 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  c);.  if( rc==SQ
20fb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
20fc0 66 28 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e  f( pLeaf->block.
20fd0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
20fe0 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31  eaf->block.n = 1
20ff0 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 2d 3e 62  ;.      pLeaf->b
21000 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 27 5c 30 27  lock.a[0] = '\0'
21010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
21020 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64   fts3AppendToNod
21030 65 28 0a 20 20 20 20 20 20 20 20 26 70 4c 65 61  e(.        &pLea
21040 66 2d 3e 62 6c 6f 63 6b 2c 20 26 70 4c 65 61 66  f->block, &pLeaf
21050 2d 3e 6b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54  ->key, zTerm, nT
21060 65 72 6d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e  erm, aDoclist, n
21070 44 6f 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20  Doclist.    );. 
21080 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
21090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
210a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
210b0 64 20 74 6f 20 72 65 6c 65 61 73 65 20 61 6c 6c  d to release all
210c0 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
210d0 65 73 20 68 65 6c 64 20 62 79 20 74 68 65 0a 2a  es held by the.*
210e0 2a 20 6d 65 72 67 65 2d 77 72 69 74 65 72 20 6f  * merge-writer o
210f0 62 6a 65 63 74 20 70 57 72 69 74 65 72 2c 20 61  bject pWriter, a
21100 6e 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 68  nd if no error h
21110 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 6f 20  as occurred, to 
21120 66 6c 75 73 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74  flush.** all out
21130 73 74 61 6e 64 69 6e 67 20 6e 6f 64 65 20 62 75  standing node bu
21140 66 66 65 72 73 20 68 65 6c 64 20 62 79 20 70 57  ffers held by pW
21150 72 69 74 65 72 20 74 6f 20 64 69 73 6b 2e 0a 2a  riter to disk..*
21160 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
21170 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  not SQLITE_OK wh
21180 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
21190 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
211a0 20 6e 6f 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   no attempt.** i
211b0 73 20 6d 61 64 65 20 74 6f 20 77 72 69 74 65 20  s made to write 
211c0 61 6e 79 20 64 61 74 61 20 74 6f 20 64 69 73 6b  any data to disk
211d0 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 69 73 20  . Instead, this 
211e0 66 75 6e 63 74 69 6f 6e 20 73 65 72 76 65 73 20  function serves 
211f0 6f 6e 6c 79 0a 2a 2a 20 74 6f 20 72 65 6c 65 61  only.** to relea
21200 73 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  se outstanding r
21210 65 73 6f 75 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  esources..**.** 
21220 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 2a 70  Otherwise, if *p
21230 52 63 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  Rc is initially 
21240 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 61 6e  SQLITE_OK and an
21250 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
21260 69 6c 65 0a 2a 2a 20 66 6c 75 73 68 69 6e 67 20  ile.** flushing 
21270 62 75 66 66 65 72 73 20 74 6f 20 64 69 73 6b 2c  buffers to disk,
21280 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
21290 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
212a0 63 6f 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 72  code before.** r
212b0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
212c0 74 69 63 20 76 6f 69 64 20 66 74 73 33 49 6e 63  tic void fts3Inc
212d0 72 6d 65 72 67 65 52 65 6c 65 61 73 65 28 0a 20  rmergeRelease(. 
212e0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
21310 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d  andle */.  Incrm
21320 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69  ergeWriter *pWri
21330 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 65  ter,       /* Me
21340 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63  rge-writer objec
21350 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20  t */.  int *pRc 
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
21380 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
21390 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
213c0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
213d0 6e 6f 6e 2d 72 6f 6f 74 20 6c 61 79 65 72 73 20  non-root layers 
213e0 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 6f 74 3b 20  */.  int iRoot; 
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21400 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
21410 20 72 6f 6f 74 20 69 6e 20 70 57 72 69 74 65 72   root in pWriter
21420 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 20 2a 2f  ->aNodeWriter */
21430 0a 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70  .  NodeWriter *p
21440 52 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  Root;           
21450 20 20 20 2f 2a 20 4e 6f 64 65 57 72 69 74 65 72     /* NodeWriter
21460 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a   for root node *
21470 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52  /.  int rc = *pR
21480 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
21490 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
214a0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 69  e */..  /* Set i
214b0 52 6f 6f 74 20 74 6f 20 74 68 65 20 69 6e 64 65  Root to the inde
214c0 78 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e  x in pWriter->aN
214d0 6f 64 65 57 72 69 74 65 72 5b 5d 20 6f 66 20 74  odeWriter[] of t
214e0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
214f0 74 20 0a 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64  t .  ** root nod
21500 65 2e 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  e. If the segmen
21510 74 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  t fits entirely 
21520 6f 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65 61 66  on a single leaf
21530 20 6e 6f 64 65 2c 20 69 52 6f 6f 74 0a 20 20 2a   node, iRoot.  *
21540 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  * will be set to
21550 20 30 2e 20 49 66 20 74 68 65 20 72 6f 6f 74 20   0. If the root 
21560 6e 6f 64 65 20 69 73 20 74 68 65 20 70 61 72 65  node is the pare
21570 6e 74 20 6f 66 20 74 68 65 20 6c 65 61 76 65 73  nt of the leaves
21580 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c  , iRoot.  ** wil
21590 6c 20 62 65 20 31 2e 20 41 6e 64 20 73 6f 20 6f  l be 1. And so o
215a0 6e 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 52 6f  n.  */.  for(iRo
215b0 6f 74 3d 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  ot=FTS_MAX_APPEN
215c0 44 41 42 4c 45 5f 48 45 49 47 48 54 2d 31 3b 20  DABLE_HEIGHT-1; 
215d0 69 52 6f 6f 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d  iRoot>=0; iRoot-
215e0 2d 29 7b 0a 20 20 20 20 4e 6f 64 65 57 72 69 74  -){.    NodeWrit
215f0 65 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72  er *pNode = &pWr
21600 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
21610 72 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 69 66  r[iRoot];.    if
21620 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e  ( pNode->block.n
21630 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >0 ) break;.    
21640 61 73 73 65 72 74 28 20 2a 70 52 63 20 7c 7c 20  assert( *pRc || 
21650 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c  pNode->block.nAl
21660 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  loc==0 );.    as
21670 73 65 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e  sert( *pRc || pN
21680 6f 64 65 2d 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d  ode->key.nAlloc=
21690 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
216a0 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c  3_free(pNode->bl
216b0 6f 63 6b 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69  ock.a);.    sqli
216c0 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e  te3_free(pNode->
216d0 6b 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f  key.a);.  }..  /
216e0 2a 20 45 6d 70 74 79 20 6f 75 74 70 75 74 20 73  * Empty output s
216f0 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  egment. This is 
21700 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
21710 28 20 69 52 6f 6f 74 3c 30 20 29 20 72 65 74 75  ( iRoot<0 ) retu
21720 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e  rn;..  /* The en
21730 74 69 72 65 20 6f 75 74 70 75 74 20 73 65 67 6d  tire output segm
21740 65 6e 74 20 66 69 74 73 20 6f 6e 20 61 20 73 69  ent fits on a si
21750 6e 67 6c 65 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61  ngle node. Norma
21760 6c 6c 79 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  lly, this means.
21770 20 20 2a 2a 20 74 68 65 20 6e 6f 64 65 20 77 6f    ** the node wo
21780 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 61 73  uld be stored as
21790 20 61 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22   a blob in the "
217a0 72 6f 6f 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  root" column of 
217b0 74 68 65 20 25 5f 73 65 67 64 69 72 0a 20 20 2a  the %_segdir.  *
217c0 2a 20 74 61 62 6c 65 2e 20 48 6f 77 65 76 65 72  * table. However
217d0 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 65  , this is not pe
217e0 72 6d 69 74 74 65 64 20 69 6e 20 74 68 69 73 20  rmitted in this 
217f0 63 61 73 65 2e 20 54 68 65 20 70 72 6f 62 6c 65  case. The proble
21800 6d 20 69 73 20 74 68 61 74 20 0a 20 20 2a 2a 20  m is that .  ** 
21810 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64  space has alread
21820 79 20 62 65 65 6e 20 72 65 73 65 72 76 65 64 20  y been reserved 
21830 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  in the %_segment
21840 73 20 74 61 62 6c 65 2c 20 61 6e 64 20 73 6f 20  s table, and so 
21850 74 68 65 20 0a 20 20 2a 2a 20 73 74 61 72 74 5f  the .  ** start_
21860 62 6c 6f 63 6b 20 61 6e 64 20 65 6e 64 5f 62 6c  block and end_bl
21870 6f 63 6b 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ock fields of th
21880 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
21890 20 6d 75 73 74 20 62 65 20 70 6f 70 75 6c 61 74   must be populat
218a0 65 64 2e 20 0a 20 20 2a 2a 20 41 6e 64 2c 20 62  ed. .  ** And, b
218b0 79 20 64 65 73 69 67 6e 20 6f 72 20 62 79 20 61  y design or by a
218c0 63 63 69 64 65 6e 74 2c 20 72 65 6c 65 61 73 65  ccident, release
218d0 64 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 46 54  d versions of FT
218e0 53 20 63 61 6e 6e 6f 74 20 68 61 6e 64 6c 65 20  S cannot handle 
218f0 0a 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74  .  ** segments t
21900 68 61 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  hat fit entirely
21910 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   on the root nod
21920 65 20 77 69 74 68 20 73 74 61 72 74 5f 62 6c 6f  e with start_blo
21930 63 6b 21 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ck!=0..  **.  **
21940 20 49 6e 73 74 65 61 64 2c 20 63 72 65 61 74 65   Instead, create
21950 20 61 20 73 79 6e 74 68 65 74 69 63 20 72 6f 6f   a synthetic roo
21960 74 20 6e 6f 64 65 20 74 68 61 74 20 63 6f 6e 74  t node that cont
21970 61 69 6e 73 20 6e 6f 74 68 69 6e 67 20 62 75 74  ains nothing but
21980 20 61 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72   a .  ** pointer
21990 20 74 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 63   to the single c
219a0 6f 6e 74 65 6e 74 20 6e 6f 64 65 2e 20 53 6f 20  ontent node. So 
219b0 74 68 61 74 20 74 68 65 20 73 65 67 6d 65 6e 74  that the segment
219c0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 20   consists of a. 
219d0 20 2a 2a 20 73 69 6e 67 6c 65 20 6c 65 61 66 20   ** single leaf 
219e0 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  and a single int
219f0 65 72 69 6f 72 20 28 72 6f 6f 74 29 20 6e 6f 64  erior (root) nod
21a00 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64  e..  **.  ** Tod
21a10 6f 3a 20 42 65 74 74 65 72 20 6d 69 67 68 74 20  o: Better might 
21a20 62 65 20 74 6f 20 64 65 66 65 72 20 61 6c 6c 6f  be to defer allo
21a30 63 61 74 69 6e 67 20 73 70 61 63 65 20 69 6e 20  cating space in 
21a40 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a  the %_segments .
21a50 20 20 2a 2a 20 74 61 62 6c 65 20 75 6e 74 69 6c    ** table until
21a60 20 77 65 20 61 72 65 20 73 75 72 65 20 69 74 20   we are sure it 
21a70 69 73 20 6e 65 65 64 65 64 2e 0a 20 20 2a 2f 0a  is needed..  */.
21a80 20 20 69 66 28 20 69 52 6f 6f 74 3d 3d 30 20 29    if( iRoot==0 )
21a90 7b 0a 20 20 20 20 42 6c 6f 62 20 2a 70 42 6c 6f  {.    Blob *pBlo
21aa0 63 6b 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  ck = &pWriter->a
21ab0 4e 6f 64 65 57 72 69 74 65 72 5b 31 5d 2e 62 6c  NodeWriter[1].bl
21ac0 6f 63 6b 3b 0a 20 20 20 20 62 6c 6f 62 47 72 6f  ock;.    blobGro
21ad0 77 42 75 66 66 65 72 28 70 42 6c 6f 63 6b 2c 20  wBuffer(pBlock, 
21ae0 31 20 2b 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  1 + FTS3_VARINT_
21af0 4d 41 58 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  MAX, &rc);.    i
21b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21b10 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b   ){.      pBlock
21b20 2d 3e 61 5b 30 5d 20 3d 20 30 78 30 31 3b 0a 20  ->a[0] = 0x01;. 
21b30 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d       pBlock->n =
21b40 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33   1 + sqlite3Fts3
21b50 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20  PutVarint(.     
21b60 20 20 20 20 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b       &pBlock->a[
21b70 31 5d 2c 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f  1], pWriter->aNo
21b80 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f  deWriter[0].iBlo
21b90 63 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ck.      );.    
21ba0 7d 0a 20 20 20 20 69 52 6f 6f 74 20 3d 20 31 3b  }.    iRoot = 1;
21bb0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 26  .  }.  pRoot = &
21bc0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
21bd0 69 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20  iter[iRoot];..  
21be0 2f 2a 20 46 6c 75 73 68 20 61 6c 6c 20 63 75 72  /* Flush all cur
21bf0 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69  rently outstandi
21c00 6e 67 20 6e 6f 64 65 73 20 74 6f 20 64 69 73 6b  ng nodes to disk
21c10 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
21c20 69 3c 69 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20  i<iRoot; i++){. 
21c30 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70     NodeWriter *p
21c40 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
21c50 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b  >aNodeWriter[i];
21c60 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  .    if( pNode->
21c70 62 6c 6f 63 6b 2e 6e 3e 30 20 26 26 20 72 63 3d  block.n>0 && rc=
21c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21c90 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
21ca0 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4e 6f  teSegment(p, pNo
21cb0 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64  de->iBlock, pNod
21cc0 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64  e->block.a, pNod
21cd0 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20  e->block.n);.   
21ce0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
21cf0 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  ree(pNode->block
21d00 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  .a);.    sqlite3
21d10 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79  _free(pNode->key
21d20 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  .a);.  }..  /* W
21d30 72 69 74 65 20 74 68 65 20 25 5f 73 65 67 64 69  rite the %_segdi
21d40 72 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69  r record. */.  i
21d50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21d60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
21d70 33 57 72 69 74 65 53 65 67 64 69 72 28 70 2c 20  3WriteSegdir(p, 
21d80 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72  .        pWriter
21d90 2d 3e 69 41 62 73 4c 65 76 65 6c 2b 31 2c 20 20  ->iAbsLevel+1,  
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21db0 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20 20  level */.       
21dc0 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20   pWriter->iIdx, 
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21de0 20 20 20 20 20 2f 2a 20 69 64 78 20 2a 2f 0a 20       /* idx */. 
21df0 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
21e00 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
21e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 74             /* st
21e20 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  art_block */.   
21e30 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e       pWriter->aN
21e40 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c  odeWriter[0].iBl
21e50 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 6c 65 61 76  ock,     /* leav
21e60 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a  es_end_block */.
21e70 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
21e80 3e 69 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  >iEnd,          
21e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65              /* e
21ea0 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
21eb0 20 20 20 20 28 70 57 72 69 74 65 72 2d 3e 62 4e      (pWriter->bN
21ec0 6f 4c 65 61 66 44 61 74 61 3d 3d 30 20 3f 20 70  oLeafData==0 ? p
21ed0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74  Writer->nLeafDat
21ee0 61 20 3a 20 30 29 2c 20 20 20 2f 2a 20 65 6e 64  a : 0),   /* end
21ef0 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _block */.      
21f00 20 20 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61    pRoot->block.a
21f10 2c 20 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 6e  , pRoot->block.n
21f20 20 20 20 20 20 20 2f 2a 20 72 6f 6f 74 20 2a 2f        /* root */
21f30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 73 71  .    );.  }.  sq
21f40 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 6f 74  lite3_free(pRoot
21f50 2d 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 73 71  ->block.a);.  sq
21f60 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 6f 74  lite3_free(pRoot
21f70 2d 3e 6b 65 79 2e 61 29 3b 0a 0a 20 20 2a 70 52  ->key.a);..  *pR
21f80 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c = rc;.}../*.**
21f90 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72   Compare the ter
21fa0 6d 20 69 6e 20 62 75 66 66 65 72 20 7a 4c 68 73  m in buffer zLhs
21fb0 20 28 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20   (size in bytes 
21fc0 6e 4c 68 73 29 20 77 69 74 68 20 74 68 61 74 20  nLhs) with that 
21fd0 69 6e 0a 2a 2a 20 7a 52 68 73 20 28 73 69 7a 65  in.** zRhs (size
21fe0 20 69 6e 20 62 79 74 65 73 20 6e 52 68 73 29 20   in bytes nRhs) 
21ff0 75 73 69 6e 67 20 6d 65 6d 63 6d 70 2e 20 49 66  using memcmp. If
22000 20 6f 6e 65 20 74 65 72 6d 20 69 73 20 61 20 70   one term is a p
22010 72 65 66 69 78 20 6f 66 0a 2a 2a 20 74 68 65 20  refix of.** the 
22020 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e  other, it is con
22030 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 73 6d  sidered to be sm
22040 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f  aller than the o
22050 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ther..**.** Retu
22060 72 6e 20 2d 76 65 20 69 66 20 7a 4c 68 73 20 69  rn -ve if zLhs i
22070 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a  s smaller than z
22080 52 68 73 2c 20 30 20 69 66 20 69 74 20 69 73 20  Rhs, 0 if it is 
22090 65 71 75 61 6c 2c 20 6f 72 20 2b 76 65 0a 2a 2a  equal, or +ve.**
220a0 20 69 66 20 69 74 20 69 73 20 67 72 65 61 74 65   if it is greate
220b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
220c0 20 66 74 73 33 54 65 72 6d 43 6d 70 28 0a 20 20   fts3TermCmp(.  
220d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 68 73  const char *zLhs
220e0 2c 20 69 6e 74 20 6e 4c 68 73 2c 20 20 20 20 20  , int nLhs,     
220f0 2f 2a 20 4c 48 53 20 6f 66 20 63 6f 6d 70 61 72  /* LHS of compar
22100 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ison */.  const 
22110 63 68 61 72 20 2a 7a 52 68 73 2c 20 69 6e 74 20  char *zRhs, int 
22120 6e 52 68 73 20 20 20 20 20 20 2f 2a 20 52 48 53  nRhs      /* RHS
22130 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a   of comparison *
22140 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  /.){.  int nCmp 
22150 3d 20 4d 49 4e 28 6e 4c 68 73 2c 20 6e 52 68 73  = MIN(nLhs, nRhs
22160 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  );.  int res;.. 
22170 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 4c   res = memcmp(zL
22180 68 73 2c 20 7a 52 68 73 2c 20 6e 43 6d 70 29 3b  hs, zRhs, nCmp);
22190 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20  .  if( res==0 ) 
221a0 72 65 73 20 3d 20 6e 4c 68 73 20 2d 20 6e 52 68  res = nLhs - nRh
221b0 73 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73  s;..  return res
221c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  ;.}.../*.** Quer
221d0 79 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  y to see if the 
221e0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25 5f 73  entry in the %_s
221f0 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 77 69  egments table wi
22200 74 68 20 62 6c 6f 63 6b 69 64 20 69 45 6e 64 20  th blockid iEnd 
22210 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20  is .** NULL. If 
22220 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
22230 61 6e 64 20 74 68 65 20 65 6e 74 72 79 20 69 73  and the entry is
22240 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62 52 65   NULL, set *pbRe
22250 73 20 31 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  s 1 before.** re
22260 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69  turning. Otherwi
22270 73 65 2c 20 73 65 74 20 2a 70 62 52 65 73 20 74  se, set *pbRes t
22280 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  o 0. .**.** Or, 
22290 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
222a0 72 73 20 77 68 69 6c 65 20 71 75 65 72 79 69 6e  rs while queryin
222b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
222c0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
222d0 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
222e0 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   The final value
222f0 20 6f 66 20 2a 70 62 52 65 73 20 69 73 20 75 6e   of *pbRes is un
22300 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
22310 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
22320 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
22330 20 69 66 20 61 20 73 65 67 6d 65 6e 74 20 69 73   if a segment is
22340 20 61 6e 20 22 61 70 70 65 6e 64 61 62 6c 65 22   an "appendable"
22350 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 69 74 0a   segment. If it.
22360 2a 2a 20 69 73 2c 20 74 68 65 6e 20 61 20 4e 55  ** is, then a NU
22370 4c 4c 20 65 6e 74 72 79 20 68 61 73 20 62 65 65  LL entry has bee
22380 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
22390 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
223a0 61 62 6c 65 0a 2a 2a 20 77 69 74 68 20 62 6c 6f  able.** with blo
223b0 63 6b 69 64 20 25 5f 73 65 67 64 69 72 2e 65 6e  ckid %_segdir.en
223c0 64 5f 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  d_block..*/.stat
223d0 69 63 20 69 6e 74 20 66 74 73 33 49 73 41 70 70  ic int fts3IsApp
223e0 65 6e 64 61 62 6c 65 28 46 74 73 33 54 61 62 6c  endable(Fts3Tabl
223f0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
22400 74 36 34 20 69 45 6e 64 2c 20 69 6e 74 20 2a 70  t64 iEnd, int *p
22410 62 52 65 73 29 7b 0a 20 20 69 6e 74 20 62 52 65  bRes){.  int bRe
22420 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
22430 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
22440 6c 74 20 74 6f 20 73 65 74 20 2a 70 62 52 65 73  lt to set *pbRes
22450 20 74 6f 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   to */.  sqlite3
22460 5f 73 74 6d 74 20 2a 70 43 68 65 63 6b 20 3d 20  _stmt *pCheck = 
22470 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74  0;       /* Stat
22480 65 6d 65 6e 74 20 74 6f 20 71 75 65 72 79 20 64  ement to query d
22490 61 74 61 62 61 73 65 20 77 69 74 68 20 2a 2f 0a  atabase with */.
224a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
224d0 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33   */..  rc = fts3
224e0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
224f0 45 47 4d 45 4e 54 5f 49 53 5f 41 50 50 45 4e 44  EGMENT_IS_APPEND
22500 41 42 4c 45 2c 20 26 70 43 68 65 63 6b 2c 20 30  ABLE, &pCheck, 0
22510 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
22530 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
22540 28 70 43 68 65 63 6b 2c 20 31 2c 20 69 45 6e 64  (pCheck, 1, iEnd
22550 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
22560 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
22570 74 65 70 28 70 43 68 65 63 6b 29 20 29 20 62 52  tep(pCheck) ) bR
22580 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
22590 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
225a0 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20  Check);.  }.  . 
225b0 20 2a 70 62 52 65 73 20 3d 20 62 52 65 73 3b 0a   *pbRes = bRes;.
225c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
225d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
225e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
225f0 65 6e 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  en initializing 
22600 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d  an incremental-m
22610 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  erge operation..
22620 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 69 66 20  ** It checks if 
22630 74 68 65 20 65 78 69 73 74 69 6e 67 20 73 65 67  the existing seg
22640 6d 65 6e 74 20 77 69 74 68 20 69 6e 64 65 78 20  ment with index 
22650 76 61 6c 75 65 20 69 49 64 78 20 61 74 20 61 62  value iIdx at ab
22660 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 0a 2a 2a  solute level .**
22670 20 28 69 41 62 73 4c 65 76 65 6c 2b 31 29 20 63   (iAbsLevel+1) c
22680 61 6e 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  an be appended t
22690 6f 20 62 79 20 74 68 65 20 69 6e 63 72 65 6d 65  o by the increme
226a0 6e 74 61 6c 20 6d 65 72 67 65 2e 20 49 66 20 69  ntal merge. If i
226b0 74 20 63 61 6e 2c 20 74 68 65 0a 2a 2a 20 6d 65  t can, the.** me
226c0 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63  rge-writer objec
226d0 74 20 2a 70 57 72 69 74 65 72 20 69 73 20 69 6e  t *pWriter is in
226e0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 77 72 69  itialized to wri
226f0 74 65 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  te to it..**.** 
22700 41 6e 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d  An existing segm
22710 65 6e 74 20 63 61 6e 20 62 65 20 61 70 70 65 6e  ent can be appen
22720 64 65 64 20 74 6f 20 62 79 20 61 6e 20 69 6e 63  ded to by an inc
22730 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 69  remental merge i
22740 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20  f:.**.**   * It 
22750 77 61 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 72  was initially cr
22760 65 61 74 65 64 20 61 73 20 61 6e 20 61 70 70 65  eated as an appe
22770 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 28  ndable segment (
22780 77 69 74 68 20 61 6c 6c 20 72 65 71 75 69 72 65  with all require
22790 64 0a 2a 2a 20 20 20 20 20 73 70 61 63 65 20 70  d.**     space p
227a0 72 65 2d 61 6c 6c 6f 63 61 74 65 64 29 2c 20 61  re-allocated), a
227b0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  nd.**.**   * The
227c0 20 66 69 72 73 74 20 6b 65 79 20 72 65 61 64 20   first key read 
227d0 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 28  from the input (
227e0 61 72 67 75 6d 65 6e 74 73 20 7a 4b 65 79 20 61  arguments zKey a
227f0 6e 64 20 6e 4b 65 79 29 20 69 73 20 0a 2a 2a 20  nd nKey) is .** 
22800 20 20 20 20 67 72 65 61 74 65 72 20 74 68 61 6e      greater than
22810 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
22820 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
22830 64 20 69 6e 20 74 68 65 20 70 6f 74 65 6e 74 69  d in the potenti
22840 61 6c 0a 2a 2a 20 20 20 20 20 6f 75 74 70 75 74  al.**     output
22850 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
22860 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
22870 6d 65 72 67 65 4c 6f 61 64 28 0a 20 20 46 74 73  mergeLoad(.  Fts
22880 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
228a0 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  Fts3 table handl
228b0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
228c0 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20  nt64 iAbsLevel, 
228d0 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
228e0 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75  te level of inpu
228f0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
22900 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 61 6e 64  /* Index of cand
22930 69 64 61 74 65 20 6f 75 74 70 75 74 20 73 65 67  idate output seg
22940 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
22950 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20  char *zKey,     
22960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
22970 73 74 20 6b 65 79 20 74 6f 20 77 72 69 74 65 20  st key to write 
22980 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
229b0 66 20 62 79 74 65 73 20 69 6e 20 6e 4b 65 79 20  f bytes in nKey 
229c0 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72  */.  IncrmergeWr
229d0 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20  iter *pWriter   
229e0 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
229f0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
22a00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22a30 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
22a40 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d  _stmt *pSelect =
22a50 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 45 4c 45   0;      /* SELE
22a60 43 54 20 74 6f 20 72 65 61 64 20 25 5f 73 65 67  CT to read %_seg
22a70 64 69 72 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20  dir entry */..  
22a80 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
22a90 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53  (p, SQL_SELECT_S
22aa0 45 47 44 49 52 2c 20 26 70 53 65 6c 65 63 74 2c  EGDIR, &pSelect,
22ab0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
22ac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22ad0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53  sqlite3_int64 iS
22ae0 74 61 72 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  tart = 0;     /*
22af0 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64   Value of %_segd
22b00 69 72 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a  ir.start_block *
22b10 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
22b20 74 36 34 20 69 4c 65 61 66 45 6e 64 20 3d 20 30  t64 iLeafEnd = 0
22b30 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20  ;   /* Value of 
22b40 25 5f 73 65 67 64 69 72 2e 6c 65 61 76 65 73 5f  %_segdir.leaves_
22b50 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  end_block */.   
22b60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
22b70 45 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  End = 0;       /
22b80 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67  * Value of %_seg
22b90 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f  dir.end_block */
22ba0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
22bb0 2a 61 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20  *aRoot = 0;     
22bc0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
22bd0 20 25 5f 73 65 67 64 69 72 2e 72 6f 6f 74 20 62   %_segdir.root b
22be0 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  uffer */.    int
22bf0 20 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20   nRoot = 0;     
22c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
22c10 7a 65 20 6f 66 20 61 52 6f 6f 74 5b 5d 20 69 6e  ze of aRoot[] in
22c20 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e   bytes */.    in
22c30 74 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20  t rc2;          
22c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22c50 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
22c60 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20  sqlite3_reset() 
22c70 2a 2f 0a 20 20 20 20 69 6e 74 20 62 41 70 70 65  */.    int bAppe
22c80 6e 64 61 62 6c 65 20 3d 20 30 3b 20 20 20 20 20  ndable = 0;     
22c90 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
22ca0 72 75 65 20 69 66 20 73 65 67 6d 65 6e 74 20 69  rue if segment i
22cb0 73 20 61 70 70 65 6e 64 61 62 6c 65 20 2a 2f 0a  s appendable */.
22cc0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
22cd0 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20   %_segdir entry 
22ce0 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78 20 61  for index iIdx a
22cf0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 28 69  bsolute level (i
22d00 41 62 73 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 20  AbsLevel+1) */. 
22d10 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
22d20 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31  int64(pSelect, 1
22d30 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a  , iAbsLevel+1);.
22d40 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
22d50 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c 20 32 2c  _int(pSelect, 2,
22d60 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   iIdx);.    if( 
22d70 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
22d80 6c 65 63 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  lect)==SQLITE_RO
22d90 57 20 29 7b 0a 20 20 20 20 20 20 69 53 74 61 72  W ){.      iStar
22da0 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
22db0 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74  mn_int64(pSelect
22dc0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 4c 65 61  , 1);.      iLea
22dd0 66 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  fEnd = sqlite3_c
22de0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c  olumn_int64(pSel
22df0 65 63 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 66  ect, 2);.      f
22e00 74 73 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46  ts3ReadEndBlockF
22e10 69 65 6c 64 28 70 53 65 6c 65 63 74 2c 20 33 2c  ield(pSelect, 3,
22e20 20 26 69 45 6e 64 2c 20 26 70 57 72 69 74 65 72   &iEnd, &pWriter
22e30 2d 3e 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20  ->nLeafData);.  
22e40 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
22e50 3e 6e 4c 65 61 66 44 61 74 61 3c 30 20 29 7b 0a  >nLeafData<0 ){.
22e60 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
22e70 3e 6e 4c 65 61 66 44 61 74 61 20 3d 20 70 57 72  >nLeafData = pWr
22e80 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20  iter->nLeafData 
22e90 2a 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  * -1;.      }.  
22ea0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 4e 6f      pWriter->bNo
22eb0 4c 65 61 66 44 61 74 61 20 3d 20 28 70 57 72 69  LeafData = (pWri
22ec0 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 3d 3d  ter->nLeafData==
22ed0 30 29 3b 0a 20 20 20 20 20 20 6e 52 6f 6f 74 20  0);.      nRoot 
22ee0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
22ef0 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20  _bytes(pSelect, 
22f00 34 29 3b 0a 20 20 20 20 20 20 61 52 6f 6f 74 20  4);.      aRoot 
22f10 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
22f20 5f 62 6c 6f 62 28 70 53 65 6c 65 63 74 2c 20 34  _blob(pSelect, 4
22f30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22f40 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
22f50 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
22f60 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
22f70 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 7a   Check for the z
22f80 65 72 6f 2d 6c 65 6e 67 74 68 20 6d 61 72 6b 65  ero-length marke
22f90 72 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  r in the %_segme
22fa0 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  nts table */.   
22fb0 20 72 63 20 3d 20 66 74 73 33 49 73 41 70 70 65   rc = fts3IsAppe
22fc0 6e 64 61 62 6c 65 28 70 2c 20 69 45 6e 64 2c 20  ndable(p, iEnd, 
22fd0 26 62 41 70 70 65 6e 64 61 62 6c 65 29 3b 0a 0a  &bAppendable);..
22fe0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
22ff0 74 20 7a 4b 65 79 2f 6e 4b 65 79 20 69 73 20 6c  t zKey/nKey is l
23000 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
23010 61 72 67 65 73 74 20 6b 65 79 20 74 68 65 20 63  argest key the c
23020 61 6e 64 69 64 61 74 65 20 2a 2f 0a 20 20 20 20  andidate */.    
23030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23040 4b 20 26 26 20 62 41 70 70 65 6e 64 61 62 6c 65  K && bAppendable
23050 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
23060 61 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  aLeaf = 0;.     
23070 20 69 6e 74 20 6e 4c 65 61 66 20 3d 20 30 3b 0a   int nLeaf = 0;.
23080 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23090 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
230a0 28 70 2c 20 69 4c 65 61 66 45 6e 64 2c 20 26 61  (p, iLeafEnd, &a
230b0 4c 65 61 66 2c 20 26 6e 4c 65 61 66 2c 20 30 29  Leaf, &nLeaf, 0)
230c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
230d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
230e0 20 20 20 20 20 4e 6f 64 65 52 65 61 64 65 72 20       NodeReader 
230f0 72 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20  reader;.        
23100 66 6f 72 28 72 63 20 3d 20 6e 6f 64 65 52 65 61  for(rc = nodeRea
23110 64 65 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c  derInit(&reader,
23120 20 61 4c 65 61 66 2c 20 6e 4c 65 61 66 29 3b 0a   aLeaf, nLeaf);.
23130 20 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d              rc==
23140 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 61  SQLITE_OK && rea
23150 64 65 72 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 20  der.aNode;.     
23160 20 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65         rc = node
23170 52 65 61 64 65 72 4e 65 78 74 28 26 72 65 61 64  ReaderNext(&read
23180 65 72 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  er).        ){. 
23190 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
231a0 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 20 29 3b   reader.aNode );
231b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
231c0 20 20 20 69 66 28 20 66 74 73 33 54 65 72 6d 43     if( fts3TermC
231d0 6d 70 28 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 72  mp(zKey, nKey, r
231e0 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65  eader.term.a, re
231f0 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3c 3d 30 20  ader.term.n)<=0 
23200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 41 70  ){.          bAp
23210 70 65 6e 64 61 62 6c 65 20 3d 20 30 3b 0a 20 20  pendable = 0;.  
23220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23230 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61 73  nodeReaderReleas
23240 65 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20  e(&reader);.    
23250 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
23260 33 5f 66 72 65 65 28 61 4c 65 61 66 29 3b 0a 20  3_free(aLeaf);. 
23270 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
23280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
23290 41 70 70 65 6e 64 61 62 6c 65 20 29 7b 0a 20 20  Appendable ){.  
232a0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
232b0 73 69 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  sible to append 
232c0 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 2e  to this segment.
232d0 20 53 65 74 20 75 70 20 74 68 65 20 49 6e 63 72   Set up the Incr
232e0 6d 65 72 67 65 57 72 69 74 65 72 0a 20 20 20 20  mergeWriter.    
232f0 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 6f 20 64    ** object to d
23300 6f 20 73 6f 2e 20 20 2a 2f 0a 20 20 20 20 20 20  o so.  */.      
23310 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
23320 20 6e 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29   nHeight = (int)
23330 61 52 6f 6f 74 5b 30 5d 3b 0a 20 20 20 20 20 20  aRoot[0];.      
23340 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64  NodeWriter *pNod
23350 65 3b 0a 0a 20 20 20 20 20 20 70 57 72 69 74 65  e;..      pWrite
23360 72 2d 3e 6e 4c 65 61 66 45 73 74 20 3d 20 28 69  r->nLeafEst = (i
23370 6e 74 29 28 28 69 45 6e 64 20 2d 20 69 53 74 61  nt)((iEnd - iSta
23380 72 74 29 20 2b 20 31 29 2f 46 54 53 5f 4d 41 58  rt) + 1)/FTS_MAX
23390 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47  _APPENDABLE_HEIG
233a0 48 54 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  HT;.      pWrite
233b0 72 2d 3e 69 53 74 61 72 74 20 3d 20 69 53 74 61  r->iStart = iSta
233c0 72 74 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  rt;.      pWrite
233d0 72 2d 3e 69 45 6e 64 20 3d 20 69 45 6e 64 3b 0a  r->iEnd = iEnd;.
233e0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
233f0 41 62 73 4c 65 76 65 6c 20 3d 20 69 41 62 73 4c  AbsLevel = iAbsL
23400 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 57 72 69  evel;.      pWri
23410 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78  ter->iIdx = iIdx
23420 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6e  ;..      for(i=n
23430 48 65 69 67 68 74 2b 31 3b 20 69 3c 46 54 53 5f  Height+1; i<FTS_
23440 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48  MAX_APPENDABLE_H
23450 45 49 47 48 54 3b 20 69 2b 2b 29 7b 0a 20 20 20  EIGHT; i++){.   
23460 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e       pWriter->aN
23470 6f 64 65 57 72 69 74 65 72 5b 69 5d 2e 69 42 6c  odeWriter[i].iBl
23480 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e 69  ock = pWriter->i
23490 53 74 61 72 74 20 2b 20 69 2a 70 57 72 69 74 65  Start + i*pWrite
234a0 72 2d 3e 6e 4c 65 61 66 45 73 74 3b 0a 20 20 20  r->nLeafEst;.   
234b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4e 6f 64     }..      pNod
234c0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e  e = &pWriter->aN
234d0 6f 64 65 57 72 69 74 65 72 5b 6e 48 65 69 67 68  odeWriter[nHeigh
234e0 74 5d 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  t];.      pNode-
234f0 3e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65  >iBlock = pWrite
23500 72 2d 3e 69 53 74 61 72 74 20 2b 20 70 57 72 69  r->iStart + pWri
23510 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 2a 6e 48  ter->nLeafEst*nH
23520 65 69 67 68 74 3b 0a 20 20 20 20 20 20 62 6c 6f  eight;.      blo
23530 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f  bGrowBuffer(&pNo
23540 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e  de->block, MAX(n
23550 52 6f 6f 74 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69  Root, p->nNodeSi
23560 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ze), &rc);.     
23570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OK ){.        me
23590 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63  mcpy(pNode->bloc
235a0 6b 2e 61 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f  k.a, aRoot, nRoo
235b0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  t);.        pNod
235c0 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e 52 6f  e->block.n = nRo
235d0 6f 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ot;.      }..   
235e0 20 20 20 66 6f 72 28 69 3d 6e 48 65 69 67 68 74     for(i=nHeight
235f0 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51  ; i>=0 && rc==SQ
23600 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20  LITE_OK; i--){. 
23610 20 20 20 20 20 20 20 4e 6f 64 65 52 65 61 64 65         NodeReade
23620 72 20 72 65 61 64 65 72 3b 0a 20 20 20 20 20 20  r reader;.      
23630 20 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74    pNode = &pWrit
23640 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
23650 69 5d 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  i];..        rc 
23660 3d 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74  = nodeReaderInit
23670 28 26 72 65 61 64 65 72 2c 20 70 4e 6f 64 65 2d  (&reader, pNode-
23680 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d  >block.a, pNode-
23690 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 20  >block.n);.     
236a0 20 20 20 77 68 69 6c 65 28 20 72 65 61 64 65 72     while( reader
236b0 2e 61 4e 6f 64 65 20 26 26 20 72 63 3d 3d 53 51  .aNode && rc==SQ
236c0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 6e  LITE_OK ) rc = n
236d0 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28 26 72  odeReaderNext(&r
236e0 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20  eader);.        
236f0 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26  blobGrowBuffer(&
23700 70 4e 6f 64 65 2d 3e 6b 65 79 2c 20 72 65 61 64  pNode->key, read
23710 65 72 2e 74 65 72 6d 2e 6e 2c 20 26 72 63 29 3b  er.term.n, &rc);
23720 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
23730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23740 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
23750 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20 72 65 61  Node->key.a, rea
23760 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64  der.term.a, read
23770 65 72 2e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  er.term.n);.    
23780 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79        pNode->key
23790 2e 6e 20 3d 20 72 65 61 64 65 72 2e 74 65 72 6d  .n = reader.term
237a0 2e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  .n;.          if
237b0 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i>0 ){.       
237c0 20 20 20 20 20 63 68 61 72 20 2a 61 42 6c 6f 63       char *aBloc
237d0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
237e0 20 20 20 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20     int nBlock = 
237f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
23800 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
23810 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 2d 31  >aNodeWriter[i-1
23820 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
23830 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 72  Node->iBlock = r
23840 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20  eader.iChild;.  
23850 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
23860 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
23870 6f 63 6b 28 70 2c 20 72 65 61 64 65 72 2e 69 43  ock(p, reader.iC
23880 68 69 6c 64 2c 20 26 61 42 6c 6f 63 6b 2c 20 26  hild, &aBlock, &
23890 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20  nBlock, 0);.    
238a0 20 20 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77          blobGrow
238b0 42 75 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e 62  Buffer(&pNode->b
238c0 6c 6f 63 6b 2c 20 4d 41 58 28 6e 42 6c 6f 63 6b  lock, MAX(nBlock
238d0 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 2c  , p->nNodeSize),
238e0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20   &rc);.         
238f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23910 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f        memcpy(pNo
23920 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 61 42 6c  de->block.a, aBl
23930 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20  ock, nBlock);.  
23940 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64              pNod
23950 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e 42 6c  e->block.n = nBl
23960 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ock;.           
23970 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
23980 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 6c 6f  qlite3_free(aBlo
23990 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ck);.          }
239a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
239b0 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c     nodeReaderRel
239c0 65 61 73 65 28 26 72 65 61 64 65 72 29 3b 0a 20  ease(&reader);. 
239d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
239e0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
239f0 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a  reset(pSelect);.
23a00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23a10 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
23a20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
23a30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  rc;.}../*.** Det
23a40 65 72 6d 69 6e 65 20 74 68 65 20 6c 61 72 67 65  ermine the large
23a50 73 74 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78  st segment index
23a60 20 76 61 6c 75 65 20 74 68 61 74 20 65 78 69 73   value that exis
23a70 74 73 20 77 69 74 68 69 6e 20 61 62 73 6f 6c 75  ts within absolu
23a80 74 65 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73  te.** level iAbs
23a90 4c 65 76 65 6c 2b 31 2e 20 49 66 20 6e 6f 20 65  Level+1. If no e
23aa0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
23ab0 20 2a 70 69 49 64 78 20 74 6f 20 74 68 69 73 20   *piIdx to this 
23ac0 76 61 6c 75 65 20 70 6c 75 73 0a 2a 2a 20 6f 6e  value plus.** on
23ad0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
23ae0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72  ng SQLITE_OK. Or
23af0 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  , if there are n
23b00 6f 20 73 65 67 6d 65 6e 74 73 20 61 74 20 61 6c  o segments at al
23b10 6c 20 0a 2a 2a 20 77 69 74 68 69 6e 20 6c 65 76  l .** within lev
23b20 65 6c 20 69 41 62 73 4c 65 76 65 6c 2c 20 73 65  el iAbsLevel, se
23b30 74 20 2a 70 69 49 64 78 20 74 6f 20 7a 65 72 6f  t *piIdx to zero
23b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
23b50 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
23b60 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
23b70 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e  or code. The fin
23b80 61 6c 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 2a  al value of.** *
23b90 70 69 49 64 78 20 69 73 20 75 6e 64 65 66 69 6e  piIdx is undefin
23ba0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
23bb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
23bc0 74 73 33 49 6e 63 72 6d 65 72 67 65 4f 75 74 70  ts3IncrmergeOutp
23bd0 75 74 49 64 78 28 20 0a 20 20 46 74 73 33 54 61  utIdx( .  Fts3Ta
23be0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
23bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
23c00 20 54 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   Table handle */
23c10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
23c20 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
23c30 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 69     /* Absolute i
23c40 6e 64 65 78 20 6f 66 20 69 6e 70 75 74 20 73 65  ndex of input se
23c50 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  gments */.  int 
23c60 2a 70 69 49 64 78 20 20 20 20 20 20 20 20 20 20  *piIdx          
23c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23c80 55 54 3a 20 4e 65 78 74 20 66 72 65 65 20 69 6e  UT: Next free in
23c90 64 65 78 20 61 74 20 69 41 62 73 4c 65 76 65 6c  dex at iAbsLevel
23ca0 2b 31 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  +1 */.){.  int r
23cb0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  c;.  sqlite3_stm
23cc0 74 20 2a 70 4f 75 74 70 75 74 49 64 78 20 3d 20  t *pOutputIdx = 
23cd0 30 3b 20 20 20 2f 2a 20 53 51 4c 20 75 73 65 64  0;   /* SQL used
23ce0 20 74 6f 20 66 69 6e 64 20 6f 75 74 70 75 74 20   to find output 
23cf0 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 72 63 20 3d  index */..  rc =
23d00 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
23d10 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
23d20 5f 49 4e 44 45 58 2c 20 26 70 4f 75 74 70 75 74  _INDEX, &pOutput
23d30 49 64 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  Idx, 0);.  if( r
23d40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23d50 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23d60 5f 69 6e 74 36 34 28 70 4f 75 74 70 75 74 49 64  _int64(pOutputId
23d70 78 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 2b  x, 1, iAbsLevel+
23d80 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
23d90 73 74 65 70 28 70 4f 75 74 70 75 74 49 64 78 29  step(pOutputIdx)
23da0 3b 0a 20 20 20 20 2a 70 69 49 64 78 20 3d 20 73  ;.    *piIdx = s
23db0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
23dc0 74 28 70 4f 75 74 70 75 74 49 64 78 2c 20 30 29  t(pOutputIdx, 0)
23dd0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
23de0 65 33 5f 72 65 73 65 74 28 70 4f 75 74 70 75 74  e3_reset(pOutput
23df0 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Idx);.  }..  ret
23e00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
23e10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 61 70  * Allocate an ap
23e20 70 65 6e 64 61 62 6c 65 20 6f 75 74 70 75 74 20  pendable output 
23e30 73 65 67 6d 65 6e 74 20 6f 6e 20 61 62 73 6f 6c  segment on absol
23e40 75 74 65 20 6c 65 76 65 6c 20 69 41 62 73 4c 65  ute level iAbsLe
23e50 76 65 6c 2b 31 0a 2a 2a 20 77 69 74 68 20 69 64  vel+1.** with id
23e60 78 20 76 61 6c 75 65 20 69 49 64 78 2e 0a 2a 2a  x value iIdx..**
23e70 0a 2a 2a 20 49 6e 20 74 68 65 20 25 5f 73 65 67  .** In the %_seg
23e80 64 69 72 20 74 61 62 6c 65 2c 20 61 20 73 65 67  dir table, a seg
23e90 6d 65 6e 74 20 69 73 20 64 65 66 69 6e 65 64 20  ment is defined 
23ea0 62 79 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  by the values in
23eb0 20 74 68 72 65 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   three.** column
23ec0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 74 61  s:.**.**     sta
23ed0 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20  rt_block.**     
23ee0 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
23ef0 0a 2a 2a 20 20 20 20 20 65 6e 64 5f 62 6c 6f 63  .**     end_bloc
23f00 6b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  k.**.** When an 
23f10 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65  appendable segme
23f20 6e 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  nt is allocated,
23f30 20 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64   it is estimated
23f40 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6d 61 78   that the.** max
23f50 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6c  imum number of l
23f60 65 61 66 20 62 6c 6f 63 6b 73 20 74 68 61 74 20  eaf blocks that 
23f70 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64 20  may be required 
23f80 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
23f90 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6c  e.** number of l
23fa0 65 61 66 20 62 6c 6f 63 6b 73 20 63 6f 6e 73 75  eaf blocks consu
23fb0 6d 65 64 20 62 79 20 74 68 65 20 69 6e 70 75 74  med by the input
23fc0 20 73 65 67 6d 65 6e 74 73 2c 20 70 6c 75 73 20   segments, plus 
23fd0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
23fe0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2c   input segments,
23ff0 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74   multiplied by t
24000 77 6f 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69  wo. This value i
24010 73 20 73 74 6f 72 65 64 20 69 6e 20 73 74 61 63  s stored in stac
24020 6b 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  k .** variable n
24030 4c 65 61 66 45 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  LeafEst..**.** A
24040 20 74 6f 74 61 6c 20 6f 66 20 31 36 2a 6e 4c 65   total of 16*nLe
24050 61 66 45 73 74 20 62 6c 6f 63 6b 73 20 61 72 65  afEst blocks are
24060 20 61 6c 6c 6f 63 61 74 65 64 20 77 68 65 6e 20   allocated when 
24070 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65  an appendable se
24080 67 6d 65 6e 74 0a 2a 2a 20 69 73 20 63 72 65 61  gment.** is crea
24090 74 65 64 20 28 28 31 20 2b 20 65 6e 64 5f 62 6c  ted ((1 + end_bl
240a0 6f 63 6b 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63  ock - start_bloc
240b0 6b 29 3d 3d 31 36 2a 6e 4c 65 61 66 45 73 74 29  k)==16*nLeafEst)
240c0 2e 20 54 68 65 20 63 6f 6e 74 69 67 75 6f 75 73  . The contiguous
240d0 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 6c 65 61  .** array of lea
240e0 66 20 6e 6f 64 65 73 20 73 74 61 72 74 73 20 61  f nodes starts a
240f0 74 20 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63  t the first bloc
24100 6b 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 65  k allocated. The
24110 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 69 6e 74   array.** of int
24120 65 72 69 6f 72 20 6e 6f 64 65 73 20 74 68 61 74  erior nodes that
24130 20 61 72 65 20 70 61 72 65 6e 74 73 20 6f 66 20   are parents of 
24140 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 73  the leaf nodes s
24150 74 61 72 74 20 61 74 20 62 6c 6f 63 6b 0a 2a 2a  tart at block.**
24160 20 28 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2b 20   (start_block + 
24170 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b 20 2d  (1 + end_block -
24180 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 20 2f 20   start_block) / 
24190 31 36 29 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a  16). And so on..
241a0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 63 74  **.** In the act
241b0 75 61 6c 20 63 6f 64 65 20 62 65 6c 6f 77 2c 20  ual code below, 
241c0 74 68 65 20 76 61 6c 75 65 20 22 31 36 22 20 69  the value "16" i
241d0 73 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20  s replaced with 
241e0 74 68 65 20 0a 2a 2a 20 70 72 65 2d 70 72 6f 63  the .** pre-proc
241f0 65 73 73 6f 72 20 6d 61 63 72 6f 20 46 54 53 5f  essor macro FTS_
24200 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48  MAX_APPENDABLE_H
24210 45 49 47 48 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  EIGHT..*/.static
24220 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72   int fts3Incrmer
24230 67 65 57 72 69 74 65 72 28 20 0a 20 20 46 74 73  geWriter( .  Fts
24240 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24260 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  Fts3 table handl
24270 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
24280 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20  nt64 iAbsLevel, 
24290 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
242a0 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75  te level of inpu
242b0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
242c0 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20  /* Index of new 
242f0 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  output segment *
24300 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
24310 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20  Reader *pCsr,   
24320 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 68      /* Cursor th
24330 61 74 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20  at data will be 
24340 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 49  read from */.  I
24350 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a  ncrmergeWriter *
24360 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20 2f  pWriter        /
24370 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
24380 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
24390 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
243b0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
243c0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
243f0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
24400 20 6e 4c 65 61 66 45 73 74 20 3d 20 30 3b 20 20   nLeafEst = 0;  
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24420 42 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64  Blocks allocated
24430 20 66 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 20   for leaf nodes 
24440 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
24450 74 20 2a 70 4c 65 61 66 45 73 74 20 3d 20 30 3b  t *pLeafEst = 0;
24460 20 20 20 20 20 2f 2a 20 53 51 4c 20 75 73 65 64       /* SQL used
24470 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6e 4c   to determine nL
24480 65 61 66 45 73 74 20 2a 2f 0a 20 20 73 71 6c 69  eafEst */.  sqli
24490 74 65 33 5f 73 74 6d 74 20 2a 70 46 69 72 73 74  te3_stmt *pFirst
244a0 42 6c 6f 63 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  Block = 0;  /* S
244b0 51 4c 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  QL used to deter
244c0 6d 69 6e 65 20 66 69 72 73 74 20 62 6c 6f 63 6b  mine first block
244d0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   */..  /* Calcul
244e0 61 74 65 20 6e 4c 65 61 66 45 73 74 2e 20 2a 2f  ate nLeafEst. */
244f0 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
24500 74 6d 74 28 70 2c 20 53 51 4c 5f 4d 41 58 5f 4c  tmt(p, SQL_MAX_L
24510 45 41 46 5f 4e 4f 44 45 5f 45 53 54 49 4d 41 54  EAF_NODE_ESTIMAT
24520 45 2c 20 26 70 4c 65 61 66 45 73 74 2c 20 30 29  E, &pLeafEst, 0)
24530 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
24540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
24550 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
24560 70 4c 65 61 66 45 73 74 2c 20 31 2c 20 69 41 62  pLeafEst, 1, iAb
24570 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c  sLevel);.    sql
24580 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
24590 70 4c 65 61 66 45 73 74 2c 20 32 2c 20 70 43 73  pLeafEst, 2, pCs
245a0 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20  r->nSegment);.  
245b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
245c0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
245d0 4c 65 61 66 45 73 74 29 20 29 7b 0a 20 20 20 20  LeafEst) ){.    
245e0 20 20 6e 4c 65 61 66 45 73 74 20 3d 20 73 71 6c    nLeafEst = sql
245f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
24600 70 4c 65 61 66 45 73 74 2c 20 30 29 3b 0a 20 20  pLeafEst, 0);.  
24610 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
24620 69 74 65 33 5f 72 65 73 65 74 28 70 4c 65 61 66  ite3_reset(pLeaf
24630 45 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Est);.  }.  if( 
24640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
24650 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
24660 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 66   Calculate the f
24670 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20 75 73  irst block to us
24680 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
24690 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 72 63 20  segment */.  rc 
246a0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
246b0 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e   SQL_NEXT_SEGMEN
246c0 54 53 5f 49 44 2c 20 26 70 46 69 72 73 74 42 6c  TS_ID, &pFirstBl
246d0 6f 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ock, 0);.  if( r
246e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
246f0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
24700 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
24710 28 70 46 69 72 73 74 42 6c 6f 63 6b 29 20 29 7b  (pFirstBlock) ){
24720 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
24730 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
24740 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46  _column_int64(pF
24750 69 72 73 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20  irstBlock, 0);. 
24760 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45       pWriter->iE
24770 6e 64 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53  nd = pWriter->iS
24780 74 61 72 74 20 2d 20 31 3b 0a 20 20 20 20 20 20  tart - 1;.      
24790 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 20 2b 3d  pWriter->iEnd +=
247a0 20 6e 4c 65 61 66 45 73 74 20 2a 20 46 54 53 5f   nLeafEst * FTS_
247b0 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48  MAX_APPENDABLE_H
247c0 45 49 47 48 54 3b 0a 20 20 20 20 7d 0a 20 20 20  EIGHT;.    }.   
247d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
247e0 73 65 74 28 70 46 69 72 73 74 42 6c 6f 63 6b 29  set(pFirstBlock)
247f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
24800 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
24810 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 73  rn rc;..  /* Ins
24820 65 72 74 20 74 68 65 20 6d 61 72 6b 65 72 20 69  ert the marker i
24830 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  n the %_segments
24840 20 74 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 73   table to make s
24850 75 72 65 20 6e 6f 62 6f 64 79 20 74 72 69 65 73  ure nobody tries
24860 0a 20 20 2a 2a 20 74 6f 20 73 74 65 61 6c 20 74  .  ** to steal t
24870 68 65 20 73 70 61 63 65 20 6a 75 73 74 20 61 6c  he space just al
24880 6c 6f 63 61 74 65 64 2e 20 54 68 69 73 20 69 73  located. This is
24890 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 69 64   also used to id
248a0 65 6e 74 69 66 79 20 0a 20 20 2a 2a 20 61 70 70  entify .  ** app
248b0 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 73  endable segments
248c0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  .  */.  rc = fts
248d0 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c  3WriteSegment(p,
248e0 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 2c 20   pWriter->iEnd, 
248f0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
24900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
24910 75 72 6e 20 72 63 3b 0a 0a 20 20 70 57 72 69 74  urn rc;..  pWrit
24920 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20  er->iAbsLevel = 
24930 69 41 62 73 4c 65 76 65 6c 3b 0a 20 20 70 57 72  iAbsLevel;.  pWr
24940 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 3d  iter->nLeafEst =
24950 20 6e 4c 65 61 66 45 73 74 3b 0a 20 20 70 57 72   nLeafEst;.  pWr
24960 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64  iter->iIdx = iId
24970 78 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  x;..  /* Set up 
24980 74 68 65 20 61 72 72 61 79 20 6f 66 20 4e 6f 64  the array of Nod
24990 65 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20  eWriter objects 
249a0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
249b0 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
249c0 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b  LE_HEIGHT; i++){
249d0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e  .    pWriter->aN
249e0 6f 64 65 57 72 69 74 65 72 5b 69 5d 2e 69 42 6c  odeWriter[i].iBl
249f0 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e 69  ock = pWriter->i
24a00 53 74 61 72 74 20 2b 20 69 2a 70 57 72 69 74 65  Start + i*pWrite
24a10 72 2d 3e 6e 4c 65 61 66 45 73 74 3b 0a 20 20 7d  r->nLeafEst;.  }
24a20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24a30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
24a40 6d 6f 76 65 20 61 6e 20 65 6e 74 72 79 20 66 72  move an entry fr
24a50 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  om the %_segdir 
24a60 74 61 62 6c 65 2e 20 54 68 69 73 20 69 6e 76 6f  table. This invo
24a70 6c 76 65 73 20 72 75 6e 6e 69 6e 67 20 74 68 65  lves running the
24a80 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
24a90 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a  wo statements:.*
24aa0 2a 0a 2a 2a 20 20 20 44 45 4c 45 54 45 20 46 52  *.**   DELETE FR
24ab0 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48 45 52  OM %_segdir WHER
24ac0 45 20 6c 65 76 65 6c 20 3d 20 3a 69 41 62 73 4c  E level = :iAbsL
24ad0 65 76 65 6c 20 41 4e 44 20 69 64 78 20 3d 20 3a  evel AND idx = :
24ae0 69 49 64 78 0a 2a 2a 20 20 20 55 50 44 41 54 45  iIdx.**   UPDATE
24af0 20 25 5f 73 65 67 64 69 72 20 53 45 54 20 69 64   %_segdir SET id
24b00 78 20 3d 20 69 64 78 20 2d 20 31 20 57 48 45 52  x = idx - 1 WHER
24b10 45 20 6c 65 76 65 6c 20 3d 20 3a 69 41 62 73 4c  E level = :iAbsL
24b20 65 76 65 6c 20 41 4e 44 20 69 64 78 20 3e 20 3a  evel AND idx > :
24b30 69 49 64 78 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44  iIdx.**.** The D
24b40 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
24b50 72 65 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63  removes the spec
24b60 69 66 69 63 20 25 5f 73 65 67 64 69 72 20 6c 65  ific %_segdir le
24b70 76 65 6c 2e 20 54 68 65 20 55 50 44 41 54 45 20  vel. The UPDATE 
24b80 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 65 6e  .** statement en
24b90 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 72  sures that the r
24ba0 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74  emaining segment
24bb0 73 20 68 61 76 65 20 63 6f 6e 74 69 67 75 6f 75  s have contiguou
24bc0 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  sly allocated.**
24bd0 20 69 64 78 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a   idx values..*/.
24be0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 52  static int fts3R
24bf0 65 6d 6f 76 65 53 65 67 64 69 72 45 6e 74 72 79  emoveSegdirEntry
24c00 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
24c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24c20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
24c30 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
24c40 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73  lite3_int64 iAbs
24c50 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a  Level,        /*
24c60 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   Absolute level 
24c70 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a  to delete from *
24c80 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 20 20 20  /.  int iIdx    
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ca0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
24cb0 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20 74  %_segdir entry t
24cc0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a 20  o delete */.){. 
24cd0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
24d00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
24d10 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
24d20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 73       /* DELETE s
24d30 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72  tatement */..  r
24d40 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
24d50 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
24d60 47 44 49 52 5f 45 4e 54 52 59 2c 20 26 70 44 65  GDIR_ENTRY, &pDe
24d70 6c 65 74 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  lete, 0);.  if( 
24d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24d90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
24da0 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c  d_int64(pDelete,
24db0 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a   1, iAbsLevel);.
24dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
24dd0 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c 20 32 2c  _int(pDelete, 2,
24de0 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69   iIdx);.    sqli
24df0 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65  te3_step(pDelete
24e00 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
24e10 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74  te3_reset(pDelet
24e20 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
24e30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
24e40 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
24e50 6e 74 73 20 68 61 76 65 20 6a 75 73 74 20 62 65  nts have just be
24e60 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
24e70 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69  absolute level i
24e80 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a 20 55 70 64  AbsLevel..** Upd
24e90 61 74 65 20 74 68 65 20 27 69 64 78 27 20 76 61  ate the 'idx' va
24ea0 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6d 61  lues of the rema
24eb0 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 69  ining segments i
24ec0 6e 20 74 68 65 20 6c 65 76 65 6c 20 73 6f 20 74  n the level so t
24ed0 68 61 74 0a 2a 2a 20 74 68 65 20 69 64 78 20 76  hat.** the idx v
24ee0 61 6c 75 65 73 20 61 72 65 20 61 20 63 6f 6e 74  alues are a cont
24ef0 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20  iguous sequence 
24f00 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 30 2e  starting from 0.
24f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
24f20 74 73 33 52 65 70 61 63 6b 53 65 67 64 69 72 4c  ts3RepackSegdirL
24f30 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c  evel(.  Fts3Tabl
24f40 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
24f50 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
24f60 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
24f70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
24f80 69 41 62 73 4c 65 76 65 6c 20 20 20 20 20 20 20  iAbsLevel       
24f90 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
24fa0 76 65 6c 20 74 6f 20 72 65 70 61 63 6b 20 2a 2f  vel to repack */
24fb0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24fe0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  code */.  int *a
24ff0 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
25000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
25010 61 79 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20  ay of remaining 
25020 69 64 78 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  idx values */.  
25030 69 6e 74 20 6e 49 64 78 20 3d 20 30 3b 20 20 20  int nIdx = 0;   
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 2f 2a 20 56 61 6c 69 64 20 65 6e 74 72 69 65 73  /* Valid entries
25060 20 69 6e 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20   in aIdx[] */.  
25070 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20  int nAlloc = 0; 
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25090 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
250a0 65 20 6f 66 20 61 49 64 78 5b 5d 20 2a 2f 0a 20  e of aIdx[] */. 
250b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
250e0 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  iable */.  sqlit
250f0 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
25100 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
25110 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 74  lect statement t
25120 6f 20 72 65 61 64 20 69 64 78 20 76 61 6c 75 65  o read idx value
25130 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
25140 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d 20 30  tmt *pUpdate = 0
25150 3b 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;      /* Update
25160 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 6d 6f   statement to mo
25170 64 69 66 79 20 69 64 78 20 76 61 6c 75 65 73 20  dify idx values 
25180 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  */..  rc = fts3S
25190 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
251a0 4c 45 43 54 5f 49 4e 44 45 58 45 53 2c 20 26 70  LECT_INDEXES, &p
251b0 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
251c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
251d0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
251e0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
251f0 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20  _int64(pSelect, 
25200 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20  1, iAbsLevel);. 
25210 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
25220 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
25230 65 70 28 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  ep(pSelect) ){. 
25240 20 20 20 20 20 69 66 28 20 6e 49 64 78 3e 3d 6e       if( nIdx>=n
25250 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
25260 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20   int *aNew;.    
25270 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36      nAlloc += 16
25280 3b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 20 3d  ;.        aNew =
25290 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
252a0 28 61 49 64 78 2c 20 6e 41 6c 6c 6f 63 2a 73 69  (aIdx, nAlloc*si
252b0 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
252c0 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
252d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
252e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
252f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25310 20 61 49 64 78 20 3d 20 61 4e 65 77 3b 0a 20 20   aIdx = aNew;.  
25320 20 20 20 20 7d 0a 20 20 20 20 20 20 61 49 64 78      }.      aIdx
25330 5b 6e 49 64 78 2b 2b 5d 20 3d 20 73 71 6c 69 74  [nIdx++] = sqlit
25340 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
25350 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d  elect, 0);.    }
25360 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
25370 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
25380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25390 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
253a0 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rc2;.  }..  if( 
253b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
253c0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
253d0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 48 49  lStmt(p, SQL_SHI
253e0 46 54 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 2c  FT_SEGDIR_ENTRY,
253f0 20 26 70 55 70 64 61 74 65 2c 20 30 29 3b 0a 20   &pUpdate, 0);. 
25400 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
25410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
25420 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
25430 28 70 55 70 64 61 74 65 2c 20 32 2c 20 69 41 62  (pUpdate, 2, iAb
25440 73 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20  sLevel);.  }..  
25450 61 73 73 65 72 74 28 20 70 2d 3e 62 49 67 6e 6f  assert( p->bIgno
25460 72 65 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  reSavepoint==0 )
25470 3b 0a 20 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61  ;.  p->bIgnoreSa
25480 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 66  vepoint = 1;.  f
25490 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
254a0 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 49 64 78 3b  TE_OK && i<nIdx;
254b0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
254c0 49 64 78 5b 69 5d 21 3d 69 20 29 7b 0a 20 20 20  Idx[i]!=i ){.   
254d0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
254e0 69 6e 74 28 70 55 70 64 61 74 65 2c 20 33 2c 20  int(pUpdate, 3, 
254f0 61 49 64 78 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aIdx[i]);.      
25500 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
25510 28 70 55 70 64 61 74 65 2c 20 31 2c 20 69 29 3b  (pUpdate, 1, i);
25520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
25530 74 65 70 28 70 55 70 64 61 74 65 29 3b 0a 20 20  tep(pUpdate);.  
25540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25550 5f 72 65 73 65 74 28 70 55 70 64 61 74 65 29 3b  _reset(pUpdate);
25560 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
25570 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74  bIgnoreSavepoint
25580 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
25590 5f 66 72 65 65 28 61 49 64 78 29 3b 0a 20 20 72  _free(aIdx);.  r
255a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
255b0 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 74 61  tic void fts3Sta
255c0 72 74 4e 6f 64 65 28 42 6c 6f 62 20 2a 70 4e 6f  rtNode(Blob *pNo
255d0 64 65 2c 20 69 6e 74 20 69 48 65 69 67 68 74 2c  de, int iHeight,
255e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
255f0 43 68 69 6c 64 29 7b 0a 20 20 70 4e 6f 64 65 2d  Child){.  pNode-
25600 3e 61 5b 30 5d 20 3d 20 28 63 68 61 72 29 69 48  >a[0] = (char)iH
25610 65 69 67 68 74 3b 0a 20 20 69 66 28 20 69 43 68  eight;.  if( iCh
25620 69 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ild ){.    asser
25630 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63  t( pNode->nAlloc
25640 3e 3d 31 2b 73 71 6c 69 74 65 33 46 74 73 33 56  >=1+sqlite3Fts3V
25650 61 72 69 6e 74 4c 65 6e 28 69 43 68 69 6c 64 29  arintLen(iChild)
25660 20 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e   );.    pNode->n
25670 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74   = 1 + sqlite3Ft
25680 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f  s3PutVarint(&pNo
25690 64 65 2d 3e 61 5b 31 5d 2c 20 69 43 68 69 6c 64  de->a[1], iChild
256a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
256b0 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e  assert( pNode->n
256c0 41 6c 6c 6f 63 3e 3d 31 20 29 3b 0a 20 20 20 20  Alloc>=1 );.    
256d0 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31 3b 0a 20 20  pNode->n = 1;.  
256e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  }.}../*.** The f
256f0 69 72 73 74 20 74 77 6f 20 61 72 67 75 6d 65 6e  irst two argumen
25700 74 73 20 61 72 65 20 61 20 70 6f 69 6e 74 65 72  ts are a pointer
25710 20 74 6f 20 61 6e 64 20 74 68 65 20 73 69 7a 65   to and the size
25720 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20 62 2d   of a segment b-
25730 74 72 65 65 0a 2a 2a 20 6e 6f 64 65 2e 20 54 68  tree.** node. Th
25740 65 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 61 20  e node may be a 
25750 6c 65 61 66 20 6f 72 20 61 6e 20 69 6e 74 65 72  leaf or an inter
25760 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  nal node..**.** 
25770 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72  This function cr
25780 65 61 74 65 73 20 61 20 6e 65 77 20 6e 6f 64 65  eates a new node
25790 20 69 6d 61 67 65 20 69 6e 20 62 6c 6f 62 20 6f   image in blob o
257a0 62 6a 65 63 74 20 2a 70 4e 65 77 20 62 79 20 63  bject *pNew by c
257b0 6f 70 79 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 65  opying.** all te
257c0 72 6d 73 20 74 68 61 74 20 61 72 65 20 67 72 65  rms that are gre
257d0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
257e0 61 6c 20 74 6f 20 7a 54 65 72 6d 2f 6e 54 65 72  al to zTerm/nTer
257f0 6d 20 28 66 6f 72 20 6c 65 61 66 20 6e 6f 64 65  m (for leaf node
25800 73 29 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  s).** or greater
25810 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72   than zTerm/nTer
25820 6d 20 28 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  m (for internal 
25830 6e 6f 64 65 73 29 20 66 72 6f 6d 20 61 4e 6f 64  nodes) from aNod
25840 65 2f 6e 4e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  e/nNode..*/.stat
25850 69 63 20 69 6e 74 20 66 74 73 33 54 72 75 6e 63  ic int fts3Trunc
25860 61 74 65 4e 6f 64 65 28 0a 20 20 63 6f 6e 73 74  ateNode(.  const
25870 20 63 68 61 72 20 2a 61 4e 6f 64 65 2c 20 20 20   char *aNode,   
25880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
25890 72 72 65 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65  rrent node image
258a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 2c   */.  int nNode,
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
258d0 20 61 4e 6f 64 65 20 69 6e 20 62 79 74 65 73 20   aNode in bytes 
258e0 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 4e 65 77 2c  */.  Blob *pNew,
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25900 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69       /* OUT: Wri
25910 74 65 20 6e 65 77 20 6e 6f 64 65 20 69 6d 61 67  te new node imag
25920 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
25930 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  t char *zTerm,  
25940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
25950 6d 69 74 20 61 6c 6c 20 74 65 72 6d 73 20 73 6d  mit all terms sm
25960 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
25970 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
25980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25990 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
259a0 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
259b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
259c0 34 20 2a 70 69 42 6c 6f 63 6b 20 20 20 20 20 20  4 *piBlock      
259d0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63      /* OUT: Bloc
259e0 6b 20 6e 75 6d 62 65 72 20 69 6e 20 6e 65 78 74  k number in next
259f0 20 6c 61 79 65 72 20 64 6f 77 6e 20 2a 2f 0a 29   layer down */.)
25a00 7b 0a 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72  {.  NodeReader r
25a10 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20 20  eader;          
25a20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20 6f 62      /* Reader ob
25a30 6a 65 63 74 20 2a 2f 0a 20 20 42 6c 6f 62 20 70  ject */.  Blob p
25a40 72 65 76 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  rev = {0, 0, 0};
25a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
25a60 76 69 6f 75 73 20 74 65 72 6d 20 77 72 69 74 74  vious term writt
25a70 65 6e 20 74 6f 20 6e 65 77 20 6e 6f 64 65 20 2a  en to new node *
25a80 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
25a90 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
25aa0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
25ab0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 65 61  de */.  int bLea
25ac0 66 20 3d 20 61 4e 6f 64 65 5b 30 5d 3d 3d 27 5c  f = aNode[0]=='\
25ad0 30 27 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  0';     /* True 
25ae0 66 6f 72 20 61 20 6c 65 61 66 20 6e 6f 64 65 20  for a leaf node 
25af0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
25b00 65 20 72 65 71 75 69 72 65 64 20 6f 75 74 70 75  e required outpu
25b10 74 20 73 70 61 63 65 20 2a 2f 0a 20 20 62 6c 6f  t space */.  blo
25b20 62 47 72 6f 77 42 75 66 66 65 72 28 70 4e 65 77  bGrowBuffer(pNew
25b30 2c 20 6e 4e 6f 64 65 2c 20 26 72 63 29 3b 0a 20  , nNode, &rc);. 
25b40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25b50 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
25b60 20 20 70 4e 65 77 2d 3e 6e 20 3d 20 30 3b 0a 0a    pNew->n = 0;..
25b70 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 6e 65    /* Populate ne
25b80 77 20 6e 6f 64 65 20 62 75 66 66 65 72 20 2a 2f  w node buffer */
25b90 0a 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f 64 65  .  for(rc = node
25ba0 52 65 61 64 65 72 49 6e 69 74 28 26 72 65 61 64  ReaderInit(&read
25bb0 65 72 2c 20 61 4e 6f 64 65 2c 20 6e 4e 6f 64 65  er, aNode, nNode
25bc0 29 3b 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ); .      rc==SQ
25bd0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 61 64 65  LITE_OK && reade
25be0 72 2e 61 4e 6f 64 65 3b 20 0a 20 20 20 20 20 20  r.aNode; .      
25bf0 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e  rc = nodeReaderN
25c00 65 78 74 28 26 72 65 61 64 65 72 29 0a 20 20 29  ext(&reader).  )
25c10 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  {.    if( pNew->
25c20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
25c30 74 20 72 65 73 20 3d 20 66 74 73 33 54 65 72 6d  t res = fts3Term
25c40 43 6d 70 28 72 65 61 64 65 72 2e 74 65 72 6d 2e  Cmp(reader.term.
25c50 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e  a, reader.term.n
25c60 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
25c70 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
25c80 20 7c 7c 20 28 62 4c 65 61 66 3d 3d 30 20 26 26   || (bLeaf==0 &&
25c90 20 72 65 73 3d 3d 30 29 20 29 20 63 6f 6e 74 69   res==0) ) conti
25ca0 6e 75 65 3b 0a 20 20 20 20 20 20 66 74 73 33 53  nue;.      fts3S
25cb0 74 61 72 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28  tartNode(pNew, (
25cc0 69 6e 74 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65  int)aNode[0], re
25cd0 61 64 65 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20  ader.iChild);.  
25ce0 20 20 20 20 2a 70 69 42 6c 6f 63 6b 20 3d 20 72      *piBlock = r
25cf0 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20  eader.iChild;.  
25d00 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 73    }.    rc = fts
25d10 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20  3AppendToNode(. 
25d20 20 20 20 20 20 20 20 70 4e 65 77 2c 20 26 70 72         pNew, &pr
25d30 65 76 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e  ev, reader.term.
25d40 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e  a, reader.term.n
25d50 2c 0a 20 20 20 20 20 20 20 20 72 65 61 64 65 72  ,.        reader
25d60 2e 61 44 6f 63 6c 69 73 74 2c 20 72 65 61 64 65  .aDoclist, reade
25d70 72 2e 6e 44 6f 63 6c 69 73 74 0a 20 20 20 20 29  r.nDoclist.    )
25d80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
25d90 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
25da0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d  .  }.  if( pNew-
25db0 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  >n==0 ){.    fts
25dc0 33 53 74 61 72 74 4e 6f 64 65 28 70 4e 65 77 2c  3StartNode(pNew,
25dd0 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30 5d 2c 20   (int)aNode[0], 
25de0 72 65 61 64 65 72 2e 69 43 68 69 6c 64 29 3b 0a  reader.iChild);.
25df0 20 20 20 20 2a 70 69 42 6c 6f 63 6b 20 3d 20 72      *piBlock = r
25e00 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20  eader.iChild;.  
25e10 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  }.  assert( pNew
25e20 2d 3e 6e 3c 3d 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  ->n<=pNew->nAllo
25e30 63 20 29 3b 0a 0a 20 20 6e 6f 64 65 52 65 61 64  c );..  nodeRead
25e40 65 72 52 65 6c 65 61 73 65 28 26 72 65 61 64 65  erRelease(&reade
25e50 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
25e60 65 65 28 70 72 65 76 2e 61 29 3b 0a 20 20 72 65  ee(prev.a);.  re
25e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25e80 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72  * Remove all ter
25e90 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ms smaller than 
25ea0 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 66 72 6f 6d  zTerm/nTerm from
25eb0 20 73 65 67 6d 65 6e 74 20 69 49 64 78 20 69 6e   segment iIdx in
25ec0 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65   absolute .** le
25ed0 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20 54  vel iAbsLevel. T
25ee0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
25ef0 64 65 6c 65 74 69 6e 67 20 65 6e 74 72 69 65 73  deleting entries
25f00 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 6d   from the %_segm
25f10 65 6e 74 73 0a 2a 2a 20 74 61 62 6c 65 2c 20 61  ents.** table, a
25f20 6e 64 20 6d 6f 64 69 66 79 69 6e 67 20 65 78 69  nd modifying exi
25f30 73 74 69 6e 67 20 65 6e 74 72 69 65 73 20 69 6e  sting entries in
25f40 20 62 6f 74 68 20 74 68 65 20 25 5f 73 65 67 6d   both the %_segm
25f50 65 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69  ents and %_segdi
25f60 72 0a 2a 2a 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  r.** tables..**.
25f70 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
25f80 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
25f90 73 65 67 6d 65 6e 74 20 69 73 20 75 70 64 61 74  segment is updat
25fa0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
25fb0 20 4f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   Or an.** SQLite
25fc0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
25fd0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
25fe0 20 69 6e 74 20 66 74 73 33 54 72 75 6e 63 61 74   int fts3Truncat
25ff0 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33  eSegment(.  Fts3
26000 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
26010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26020 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
26030 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
26040 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20  t64 iAbsLevel,  
26050 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74        /* Absolut
26060 65 20 6c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65  e level of segme
26070 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a  nt to modify */.
26080 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 20 2f 2a 20 49 6e 64 65 78 20 77 69 74 68 69    /* Index withi
260b0 6e 20 6c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65  n level of segme
260c0 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a  nt to modify */.
260d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
260e0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
260f0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 65 72 6d    /* Remove term
26100 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
26110 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  his */.  int nTe
26120 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
26130 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26140 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75  r of bytes in bu
26150 66 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b  ffer zTerm */.){
26160 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26170 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
26180 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
26190 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 72 6f 6f 74  e */.  Blob root
261a0 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20   = {0,0,0};     
261b0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 72 6f         /* New ro
261c0 6f 74 20 70 61 67 65 20 69 6d 61 67 65 20 2a 2f  ot page image */
261d0 0a 20 20 42 6c 6f 62 20 62 6c 6f 63 6b 20 3d 20  .  Blob block = 
261e0 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20 20  {0,0,0};        
261f0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
26200 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  d for any other 
26210 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74  block */.  sqlit
26220 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 20  e3_int64 iBlock 
26230 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 6c  = 0;       /* Bl
26240 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 73 71 6c 69  ock id */.  sqli
26250 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 77 53 74  te3_int64 iNewSt
26260 61 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  art = 0;    /* N
26270 65 77 20 76 61 6c 75 65 20 66 6f 72 20 69 53 74  ew value for iSt
26280 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71  artBlock */.  sq
26290 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 6c 64  lite3_int64 iOld
262a0 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a  Start = 0;    /*
262b0 20 4f 6c 64 20 76 61 6c 75 65 20 66 6f 72 20 69   Old value for i
262c0 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20  StartBlock */.  
262d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 46  sqlite3_stmt *pF
262e0 65 74 63 68 20 3d 20 30 3b 20 20 20 20 20 20 20  etch = 0;       
262f0 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65  /* Statement use
26300 64 20 74 6f 20 66 65 74 63 68 20 73 65 67 64 69  d to fetch segdi
26310 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  r */..  rc = fts
26320 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
26330 53 45 4c 45 43 54 5f 53 45 47 44 49 52 2c 20 26  SELECT_SEGDIR, &
26340 70 46 65 74 63 68 2c 20 30 29 3b 0a 20 20 69 66  pFetch, 0);.  if
26350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26360 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 20  ){.    int rc2; 
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26380 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
26390 72 65 73 65 74 28 29 20 72 65 74 75 72 6e 20 63  reset() return c
263a0 6f 64 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ode */.    sqlit
263b0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 46  e3_bind_int64(pF
263c0 65 74 63 68 2c 20 31 2c 20 69 41 62 73 4c 65 76  etch, 1, iAbsLev
263d0 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
263e0 5f 62 69 6e 64 5f 69 6e 74 28 70 46 65 74 63 68  _bind_int(pFetch
263f0 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20  , 2, iIdx);.    
26400 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
26410 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 46 65  sqlite3_step(pFe
26420 74 63 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  tch) ){.      co
26430 6e 73 74 20 63 68 61 72 20 2a 61 52 6f 6f 74 20  nst char *aRoot 
26440 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
26450 5f 62 6c 6f 62 28 70 46 65 74 63 68 2c 20 34 29  _blob(pFetch, 4)
26460 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 6f 6f  ;.      int nRoo
26470 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
26480 6d 6e 5f 62 79 74 65 73 28 70 46 65 74 63 68 2c  mn_bytes(pFetch,
26490 20 34 29 3b 0a 20 20 20 20 20 20 69 4f 6c 64 53   4);.      iOldS
264a0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  tart = sqlite3_c
264b0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46 65 74  olumn_int64(pFet
264c0 63 68 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63  ch, 1);.      rc
264d0 20 3d 20 66 74 73 33 54 72 75 6e 63 61 74 65 4e   = fts3TruncateN
264e0 6f 64 65 28 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74  ode(aRoot, nRoot
264f0 2c 20 26 72 6f 6f 74 2c 20 7a 54 65 72 6d 2c 20  , &root, zTerm, 
26500 6e 54 65 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b  nTerm, &iBlock);
26510 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
26520 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
26530 46 65 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20  Fetch);.    if( 
26540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
26550 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20  rc = rc2;.  }.. 
26560 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
26570 54 45 5f 4f 4b 20 26 26 20 69 42 6c 6f 63 6b 20  TE_OK && iBlock 
26580 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61 42 6c  ){.    char *aBl
26590 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ock = 0;.    int
265a0 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20   nBlock = 0;.   
265b0 20 69 4e 65 77 53 74 61 72 74 20 3d 20 69 42 6c   iNewStart = iBl
265c0 6f 63 6b 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ock;..    rc = s
265d0 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
265e0 6f 63 6b 28 70 2c 20 69 42 6c 6f 63 6b 2c 20 26  ock(p, iBlock, &
265f0 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c  aBlock, &nBlock,
26600 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
26610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26620 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 72 75      rc = fts3Tru
26630 6e 63 61 74 65 4e 6f 64 65 28 61 42 6c 6f 63 6b  ncateNode(aBlock
26640 2c 20 6e 42 6c 6f 63 6b 2c 20 26 62 6c 6f 63 6b  , nBlock, &block
26650 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
26660 26 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  &iBlock);.    }.
26670 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
26690 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
266a0 6d 65 6e 74 28 70 2c 20 69 4e 65 77 53 74 61 72  ment(p, iNewStar
266b0 74 2c 20 62 6c 6f 63 6b 2e 61 2c 20 62 6c 6f 63  t, block.a, bloc
266c0 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  k.n);.    }.    
266d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 6c  sqlite3_free(aBl
266e0 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ock);.  }..  /* 
266f0 56 61 72 69 61 62 6c 65 20 69 4e 65 77 53 74 61  Variable iNewSta
26700 72 74 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  rt now contains 
26710 74 68 65 20 66 69 72 73 74 20 76 61 6c 69 64 20  the first valid 
26720 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20  leaf node. */.  
26730 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26740 4b 20 26 26 20 69 4e 65 77 53 74 61 72 74 20 29  K && iNewStart )
26750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
26760 6d 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20  mt *pDel = 0;.  
26770 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
26780 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45  mt(p, SQL_DELETE
26790 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c  _SEGMENTS_RANGE,
267a0 20 26 70 44 65 6c 2c 20 30 29 3b 0a 20 20 20 20   &pDel, 0);.    
267b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
267c0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
267d0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44  e3_bind_int64(pD
267e0 65 6c 2c 20 31 2c 20 69 4f 6c 64 53 74 61 72 74  el, 1, iOldStart
267f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26800 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
26810 2c 20 32 2c 20 69 4e 65 77 53 74 61 72 74 2d 31  , 2, iNewStart-1
26820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26830 5f 73 74 65 70 28 70 44 65 6c 29 3b 0a 20 20 20  _step(pDel);.   
26840 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
26850 72 65 73 65 74 28 70 44 65 6c 29 3b 0a 20 20 20  reset(pDel);.   
26860 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
26870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26880 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
26890 2a 70 43 68 6f 6d 70 20 3d 20 30 3b 0a 20 20 20  *pChomp = 0;.   
268a0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
268b0 74 28 70 2c 20 53 51 4c 5f 43 48 4f 4d 50 5f 53  t(p, SQL_CHOMP_S
268c0 45 47 44 49 52 2c 20 26 70 43 68 6f 6d 70 2c 20  EGDIR, &pChomp, 
268d0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
268e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
268f0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
26900 69 6e 74 36 34 28 70 43 68 6f 6d 70 2c 20 31 2c  int64(pChomp, 1,
26910 20 69 4e 65 77 53 74 61 72 74 29 3b 0a 20 20 20   iNewStart);.   
26920 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
26930 62 6c 6f 62 28 70 43 68 6f 6d 70 2c 20 32 2c 20  blob(pChomp, 2, 
26940 72 6f 6f 74 2e 61 2c 20 72 6f 6f 74 2e 6e 2c 20  root.a, root.n, 
26950 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
26960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
26970 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d 70 2c  nd_int64(pChomp,
26980 20 33 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a   3, iAbsLevel);.
26990 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
269a0 6e 64 5f 69 6e 74 28 70 43 68 6f 6d 70 2c 20 34  nd_int(pChomp, 4
269b0 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20 73  , iIdx);.      s
269c0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 68 6f  qlite3_step(pCho
269d0 6d 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mp);.      rc = 
269e0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
269f0 68 6f 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  homp);.      sql
26a00 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
26a10 43 68 6f 6d 70 2c 20 32 29 3b 0a 20 20 20 20 7d  Chomp, 2);.    }
26a20 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
26a30 66 72 65 65 28 72 6f 6f 74 2e 61 29 3b 0a 20 20  free(root.a);.  
26a40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62 6c 6f  sqlite3_free(blo
26a50 63 6b 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  ck.a);.  return 
26a60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26a70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26a80 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e  lled after an in
26a90 63 72 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f  crmental-merge o
26aa0 70 65 72 61 74 69 6f 6e 20 68 61 73 20 72 75 6e  peration has run
26ab0 20 74 6f 0a 2a 2a 20 6d 65 72 67 65 20 28 6f 72   to.** merge (or
26ac0 20 70 61 72 74 69 61 6c 6c 79 20 6d 65 72 67 65   partially merge
26ad0 29 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  ) two or more se
26ae0 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f  gments from abso
26af0 6c 75 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41  lute level.** iA
26b00 62 73 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 45  bsLevel..**.** E
26b10 61 63 68 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ach input segmen
26b20 74 20 69 73 20 65 69 74 68 65 72 20 72 65 6d 6f  t is either remo
26b30 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 20  ved from the db 
26b40 63 6f 6d 70 6c 65 74 65 6c 79 20 28 69 66 20 61  completely (if a
26b50 6c 6c 20 6f 66 0a 2a 2a 20 69 74 73 20 64 61 74  ll of.** its dat
26b60 61 20 77 61 73 20 63 6f 70 69 65 64 20 74 6f 20  a was copied to 
26b70 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
26b80 6e 74 20 62 79 20 74 68 65 20 69 6e 63 72 6d 65  nt by the incrme
26b90 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 29 0a 2a  rge operation).*
26ba0 2a 20 6f 72 20 6d 6f 64 69 66 69 65 64 20 69 6e  * or modified in
26bb0 20 70 6c 61 63 65 20 73 6f 20 74 68 61 74 20 69   place so that i
26bc0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74  t no longer cont
26bd0 61 69 6e 73 20 74 68 6f 73 65 20 65 6e 74 72 69  ains those entri
26be0 65 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20  es that.** have 
26bf0 62 65 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20  been duplicated 
26c00 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  in the output se
26c10 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
26c20 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72   int fts3Incrmer
26c30 67 65 43 68 6f 6d 70 28 0a 20 20 46 74 73 33 54  geChomp(.  Fts3T
26c40 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
26c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
26c60 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  S table handle *
26c70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
26c80 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
26c90 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
26ca0 6c 65 76 65 6c 20 63 6f 6e 74 61 69 6e 69 6e 67  level containing
26cb0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
26cc0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
26cd0 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f  r *pCsr,       /
26ce0 2a 20 43 68 6f 6d 70 20 61 6c 6c 20 73 65 67 6d  * Chomp all segm
26cf0 65 6e 74 73 20 6f 70 65 6e 65 64 20 62 79 20 74  ents opened by t
26d00 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
26d10 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20  int *pnRem      
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
26d40 6d 65 6e 74 73 20 6e 6f 74 20 64 65 6c 65 74 65  ments not delete
26d50 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
26d60 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 30 3b  .  int nRem = 0;
26d70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26d80 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d  TE_OK;..  for(i=
26d90 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d 31  pCsr->nSegment-1
26da0 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51  ; i>=0 && rc==SQ
26db0 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20  LITE_OK; i--){. 
26dc0 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
26dd0 20 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pSeg = 0;.    
26de0 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20 46  int j;..    /* F
26df0 69 6e 64 20 74 68 65 20 46 74 73 33 53 65 67 52  ind the Fts3SegR
26e00 65 61 64 65 72 20 6f 62 6a 65 63 74 20 77 69 74  eader object wit
26e10 68 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e  h Fts3SegReader.
26e20 69 49 64 78 3d 3d 69 2e 20 49 74 20 69 73 20 68  iIdx==i. It is h
26e30 69 64 69 6e 67 0a 20 20 20 20 2a 2a 20 73 6f 6d  iding.    ** som
26e40 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 70 43  ewhere in the pC
26e50 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20  sr->apSegment[] 
26e60 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 66  array.  */.    f
26e70 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
26e80 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29  <pCsr->nSegment)
26e90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53  ; j++){.      pS
26ea0 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67  eg = pCsr->apSeg
26eb0 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  ment[j];.      i
26ec0 66 28 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69  f( pSeg->iIdx==i
26ed0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
26ee0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 43      assert( j<pC
26ef0 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 26 26 20  sr->nSegment && 
26f00 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29 3b  pSeg->iIdx==i );
26f10 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ..    if( pSeg->
26f20 61 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  aNode==0 ){.    
26f30 20 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20    /* Seg-reader 
26f40 69 73 20 61 74 20 45 4f 46 2e 20 52 65 6d 6f 76  is at EOF. Remov
26f50 65 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70  e the entire inp
26f60 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  ut segment. */. 
26f70 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65       rc = fts3De
26f80 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  leteSegment(p, p
26f90 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Seg);.      if( 
26fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26fb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
26fc0 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e  s3RemoveSegdirEn
26fd0 74 72 79 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  try(p, iAbsLevel
26fe0 2c 20 70 53 65 67 2d 3e 69 49 64 78 29 3b 0a 20  , pSeg->iIdx);. 
26ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e       }.      *pn
27000 52 65 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Rem = 0;.    }el
27010 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
27020 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
27030 67 65 20 64 69 64 20 6e 6f 74 20 63 6f 70 79 20  ge did not copy 
27040 61 6c 6c 20 74 68 65 20 64 61 74 61 20 66 72 6f  all the data fro
27050 6d 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  m this .      **
27060 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20   segment to the 
27070 75 70 70 65 72 20 6c 65 76 65 6c 2e 20 54 68 65  upper level. The
27080 20 73 65 67 6d 65 6e 74 20 69 73 20 6d 6f 64 69   segment is modi
27090 66 69 65 64 20 69 6e 20 70 6c 61 63 65 0a 20 20  fied in place.  
270a0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69      ** so that i
270b0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b 65  t contains no ke
270c0 79 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ys smaller than 
270d0 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 20  zTerm/nTerm. */ 
270e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
270f0 72 20 2a 7a 54 65 72 6d 20 3d 20 70 53 65 67 2d  r *zTerm = pSeg-
27100 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  >zTerm;.      in
27110 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e  t nTerm = pSeg->
27120 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 72 63 20  nTerm;.      rc 
27130 3d 20 66 74 73 33 54 72 75 6e 63 61 74 65 53 65  = fts3TruncateSe
27140 67 6d 65 6e 74 28 70 2c 20 69 41 62 73 4c 65 76  gment(p, iAbsLev
27150 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78 2c 20  el, pSeg->iIdx, 
27160 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
27170 20 20 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20 20       nRem++;.   
27180 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
27190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
271a0 52 65 6d 21 3d 70 43 73 72 2d 3e 6e 53 65 67 6d  Rem!=pCsr->nSegm
271b0 65 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ent ){.    rc = 
271c0 66 74 73 33 52 65 70 61 63 6b 53 65 67 64 69 72  fts3RepackSegdir
271d0 4c 65 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76  Level(p, iAbsLev
271e0 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52  el);.  }..  *pnR
271f0 65 6d 20 3d 20 6e 52 65 6d 3b 0a 20 20 72 65 74  em = nRem;.  ret
27200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27210 20 53 74 6f 72 65 20 61 6e 20 69 6e 63 72 2d 6d   Store an incr-m
27220 65 72 67 65 20 68 69 6e 74 20 69 6e 20 74 68 65  erge hint in the
27230 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
27240 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
27250 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28  rmergeHintStore(
27260 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c  Fts3Table *p, Bl
27270 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71  ob *pHint){.  sq
27280 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 70  lite3_stmt *pRep
27290 6c 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lace = 0;.  int 
272a0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
272b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
272c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
272d0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
272e0 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45  t(p, SQL_REPLACE
272f0 5f 53 54 41 54 2c 20 26 70 52 65 70 6c 61 63 65  _STAT, &pReplace
27300 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
27310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27320 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
27330 74 28 70 52 65 70 6c 61 63 65 2c 20 31 2c 20 46  t(pReplace, 1, F
27340 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47  TS_STAT_INCRMERG
27350 45 48 49 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  EHINT);.    sqli
27360 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 52  te3_bind_blob(pR
27370 65 70 6c 61 63 65 2c 20 32 2c 20 70 48 69 6e 74  eplace, 2, pHint
27380 2d 3e 61 2c 20 70 48 69 6e 74 2d 3e 6e 2c 20 53  ->a, pHint->n, S
27390 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
273a0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
273b0 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 72  pReplace);.    r
273c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
273d0 74 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20  t(pReplace);.   
273e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
273f0 6c 6c 28 70 52 65 70 6c 61 63 65 2c 20 32 29 3b  ll(pReplace, 2);
27400 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
27410 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  c;.}../*.** Load
27420 20 61 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20 68   an incr-merge h
27430 69 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  int from the dat
27440 61 62 61 73 65 2e 20 54 68 65 20 69 6e 63 72 2d  abase. The incr-
27450 6d 65 72 67 65 20 68 69 6e 74 2c 20 69 66 20 6f  merge hint, if o
27460 6e 65 20 0a 2a 2a 20 65 78 69 73 74 73 2c 20 69  ne .** exists, i
27470 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
27480 72 6f 77 69 64 3d 3d 31 20 72 6f 77 20 6f 66 20  rowid==1 row of 
27490 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65  the %_stat table
274a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
274b0 73 73 66 75 6c 2c 20 70 6f 70 75 6c 61 74 65 20  ssful, populate 
274c0 62 6c 6f 62 20 2a 70 48 69 6e 74 20 77 69 74 68  blob *pHint with
274d0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
274e0 66 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 0a  from the %_stat.
274f0 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 72 65 74  ** table and ret
27500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
27510 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
27520 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
27530 74 75 72 6e 20 61 6e 0a 2a 2a 20 53 51 4c 69 74  turn an.** SQLit
27540 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
27550 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
27560 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 4c 6f 61  IncrmergeHintLoa
27570 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  d(Fts3Table *p, 
27580 42 6c 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20  Blob *pHint){.  
27590 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
275a0 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 69 6e 74  elect = 0;.  int
275b0 20 72 63 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e   rc;..  pHint->n
275c0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 66 74 73   = 0;.  rc = fts
275d0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
275e0 53 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53  SELECT_STAT, &pS
275f0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
27600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27610 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
27620 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
27630 69 6e 74 28 70 53 65 6c 65 63 74 2c 20 31 2c 20  int(pSelect, 1, 
27640 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52  FTS_STAT_INCRMER
27650 47 45 48 49 4e 54 29 3b 0a 20 20 20 20 69 66 28  GEHINT);.    if(
27660 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
27670 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
27680 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  t) ){.      cons
27690 74 20 63 68 61 72 20 2a 61 48 69 6e 74 20 3d 20  t char *aHint = 
276a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
276b0 6c 6f 62 28 70 53 65 6c 65 63 74 2c 20 30 29 3b  lob(pSelect, 0);
276c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74  .      int nHint
276d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
276e0 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74 2c  n_bytes(pSelect,
276f0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61   0);.      if( a
27700 48 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Hint ){.        
27710 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70  blobGrowBuffer(p
27720 48 69 6e 74 2c 20 6e 48 69 6e 74 2c 20 26 72 63  Hint, nHint, &rc
27730 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27750 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
27760 28 70 48 69 6e 74 2d 3e 61 2c 20 61 48 69 6e 74  (pHint->a, aHint
27770 2c 20 6e 48 69 6e 74 29 3b 0a 20 20 20 20 20 20  , nHint);.      
27780 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 6e      pHint->n = n
27790 48 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Hint;.        }.
277a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
277b0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
277c0 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a  reset(pSelect);.
277d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
277e0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
277f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
27800 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
27810 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49  *pRc is not SQLI
27820 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
27830 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
27840 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
27850 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
27860 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79   append an entry
27870 20 74 6f 20 74 68 65 20 68 69 6e 74 20 73 74 6f   to the hint sto
27880 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 48 69  red in blob *pHi
27890 6e 74 2e 20 45 61 63 68 20 65 6e 74 72 79 0a 2a  nt. Each entry.*
278a0 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  * consists of tw
278b0 6f 20 76 61 72 69 6e 74 73 2c 20 74 68 65 20 61  o varints, the a
278c0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75  bsolute level nu
278d0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75  mber of the inpu
278e0 74 20 73 65 67 6d 65 6e 74 73 20 0a 2a 2a 20 61  t segments .** a
278f0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
27900 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2e   input segments.
27910 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
27920 73 66 75 6c 2c 20 6c 65 61 76 65 20 2a 70 52 63  sful, leave *pRc
27930 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
27940 4b 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 49 66  K and return. If
27950 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
27960 2c 0a 2a 2a 20 73 65 74 20 2a 70 52 63 20 74 6f  ,.** set *pRc to
27970 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
27980 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74   code before ret
27990 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
279a0 63 20 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d  c void fts3Incrm
279b0 65 72 67 65 48 69 6e 74 50 75 73 68 28 0a 20 20  ergeHintPush(.  
279c0 42 6c 6f 62 20 2a 70 48 69 6e 74 2c 20 20 20 20  Blob *pHint,    
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279e0 2f 2a 20 48 69 6e 74 20 62 6c 6f 62 20 74 6f 20  /* Hint blob to 
279f0 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 69  append to */.  i
27a00 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
27a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27a20 2a 20 46 69 72 73 74 20 76 61 72 69 6e 74 20 74  * First varint t
27a30 6f 20 73 74 6f 72 65 20 69 6e 20 68 69 6e 74 20  o store in hint 
27a40 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c  */.  int nInput,
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 76       /* Second v
27a70 61 72 69 6e 74 20 74 6f 20 73 74 6f 72 65 20 69  arint to store i
27a80 6e 20 68 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  n hint */.  int 
27a90 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27ab0 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
27ac0 65 20 2a 2f 0a 29 7b 0a 20 20 62 6c 6f 62 47 72  e */.){.  blobGr
27ad0 6f 77 42 75 66 66 65 72 28 70 48 69 6e 74 2c 20  owBuffer(pHint, 
27ae0 70 48 69 6e 74 2d 3e 6e 20 2b 20 32 2a 46 54 53  pHint->n + 2*FTS
27af0 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2c 20 70 52  3_VARINT_MAX, pR
27b00 63 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  c);.  if( *pRc==
27b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27b20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c   pHint->n += sql
27b30 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
27b40 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70 48 69 6e  t(&pHint->a[pHin
27b50 74 2d 3e 6e 5d 2c 20 69 41 62 73 4c 65 76 65 6c  t->n], iAbsLevel
27b60 29 3b 0a 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20  );.    pHint->n 
27b70 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
27b80 74 56 61 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e  tVarint(&pHint->
27b90 61 5b 70 48 69 6e 74 2d 3e 6e 5d 2c 20 28 69 36  a[pHint->n], (i6
27ba0 34 29 6e 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 7d  4)nInput);.  }.}
27bb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
27bc0 20 6c 61 73 74 20 65 6e 74 72 79 20 28 6d 6f 73   last entry (mos
27bd0 74 20 72 65 63 65 6e 74 6c 79 20 70 75 73 68 65  t recently pushe
27be0 64 29 20 66 72 6f 6d 20 74 68 65 20 68 69 6e 74  d) from the hint
27bf0 20 62 6c 6f 62 20 2a 70 48 69 6e 74 0a 2a 2a 20   blob *pHint.** 
27c00 61 6e 64 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  and then remove 
27c10 74 68 65 20 65 6e 74 72 79 2e 20 57 72 69 74 65  the entry. Write
27c20 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20   the two values 
27c30 72 65 61 64 20 74 6f 20 2a 70 69 41 62 73 4c 65  read to *piAbsLe
27c40 76 65 6c 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 49  vel and .** *pnI
27c50 6e 70 75 74 20 62 65 66 6f 72 65 20 72 65 74 75  nput before retu
27c60 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
27c70 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
27c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27c90 4b 2e 20 49 66 20 74 68 65 20 68 69 6e 74 20 62  K. If the hint b
27ca0 6c 6f 62 20 69 6e 20 2a 70 48 69 6e 74 20 64 6f  lob in *pHint do
27cb0 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
27cc0 6e 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 76  n at least two v
27cd0 61 6c 69 64 20 76 61 72 69 6e 74 73 2c 20 72 65  alid varints, re
27ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
27cf0 55 50 54 5f 56 54 41 42 2e 0a 2a 2f 0a 73 74 61  UPT_VTAB..*/.sta
27d00 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
27d10 6d 65 72 67 65 48 69 6e 74 50 6f 70 28 42 6c 6f  mergeHintPop(Blo
27d20 62 20 2a 70 48 69 6e 74 2c 20 69 36 34 20 2a 70  b *pHint, i64 *p
27d30 69 41 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a  iAbsLevel, int *
27d40 70 6e 49 6e 70 75 74 29 7b 0a 20 20 63 6f 6e 73  pnInput){.  cons
27d50 74 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20 70 48  t int nHint = pH
27d60 69 6e 74 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 3b  int->n;.  int i;
27d70 0a 0a 20 20 69 20 3d 20 70 48 69 6e 74 2d 3e 6e  ..  i = pHint->n
27d80 2d 32 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  -2;.  while( i>0
27d90 20 26 26 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d   && (pHint->a[i-
27da0 31 5d 20 26 20 30 78 38 30 29 20 29 20 69 2d 2d  1] & 0x80) ) i--
27db0 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26  ;.  while( i>0 &
27dc0 26 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d  & (pHint->a[i-1]
27dd0 20 26 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a   & 0x80) ) i--;.
27de0 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 69 3b  .  pHint->n = i;
27df0 0a 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46  .  i += sqlite3F
27e00 74 73 33 47 65 74 56 61 72 69 6e 74 28 26 70 48  ts3GetVarint(&pH
27e10 69 6e 74 2d 3e 61 5b 69 5d 2c 20 70 69 41 62 73  int->a[i], piAbs
27e20 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66  Level);.  i += f
27e30 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts3GetVarint32(&
27e40 70 48 69 6e 74 2d 3e 61 5b 69 5d 2c 20 70 6e 49  pHint->a[i], pnI
27e50 6e 70 75 74 29 3b 0a 20 20 69 66 28 20 69 21 3d  nput);.  if( i!=
27e60 6e 48 69 6e 74 20 29 20 72 65 74 75 72 6e 20 46  nHint ) return F
27e70 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
27e80 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
27e90 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
27ea0 41 74 74 65 6d 70 74 20 61 6e 20 69 6e 63 72 65  Attempt an incre
27eb0 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 74 68 61  mental merge tha
27ec0 74 20 77 72 69 74 65 73 20 6e 4d 65 72 67 65 20  t writes nMerge 
27ed0 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a  leaf blocks..**.
27ee0 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ** Incremental m
27ef0 65 72 67 65 73 20 68 61 70 70 65 6e 20 6e 4d 69  erges happen nMi
27f00 6e 20 73 65 67 6d 65 6e 74 73 20 61 74 20 61 20  n segments at a 
27f10 74 69 6d 65 2e 20 54 68 65 20 73 65 67 6d 65 6e  time. The segmen
27f20 74 73 20 0a 2a 2a 20 74 6f 20 62 65 20 6d 65 72  ts .** to be mer
27f30 67 65 64 20 61 72 65 20 74 68 65 20 6e 4d 69 6e  ged are the nMin
27f40 20 6f 6c 64 65 73 74 20 73 65 67 6d 65 6e 74 73   oldest segments
27f50 20 28 74 68 65 20 6f 6e 65 73 20 77 69 74 68 20   (the ones with 
27f60 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 0a 2a 2a  the smallest .**
27f70 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
27f80 5f 73 65 67 64 69 72 2e 69 64 78 20 66 69 65 6c  _segdir.idx fiel
27f90 64 29 20 69 6e 20 74 68 65 20 68 69 67 68 65 73  d) in the highes
27fa0 74 20 6c 65 76 65 6c 20 74 68 61 74 20 63 6f 6e  t level that con
27fb0 74 61 69 6e 73 20 0a 2a 2a 20 61 74 20 6c 65 61  tains .** at lea
27fc0 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73  st nMin segments
27fd0 2e 20 4d 75 6c 74 69 70 6c 65 20 6d 65 72 67 65  . Multiple merge
27fe0 73 20 6d 69 67 68 74 20 6f 63 63 75 72 20 69 6e  s might occur in
27ff0 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 0a   an attempt to .
28000 2a 2a 20 77 72 69 74 65 20 74 68 65 20 71 75 6f  ** write the quo
28010 74 61 20 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61  ta of nMerge lea
28020 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74  f blocks..*/.int
28030 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72   sqlite3Fts3Incr
28040 6d 65 72 67 65 28 46 74 73 33 54 61 62 6c 65 20  merge(Fts3Table 
28050 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20  *p, int nMerge, 
28060 69 6e 74 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74  int nMin){.  int
28070 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28090 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
280a0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72   int nRem = nMer
280b0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
280c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
280d0 61 66 20 70 61 67 65 73 20 79 65 74 20 74 6f 20  af pages yet to 
280e0 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
280f0 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
28100 64 65 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20  der *pCsr;      
28110 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20   /* Cursor used 
28120 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61  to read input da
28130 74 61 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46  ta */.  Fts3SegF
28140 69 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 3b 20  ilter *pFilter; 
28150 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 74 65          /* Filte
28160 72 20 75 73 65 64 20 77 69 74 68 20 63 75 72 73  r used with curs
28170 6f 72 20 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63  or pCsr */.  Inc
28180 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57  rmergeWriter *pW
28190 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  riter;       /* 
281a0 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
281b0 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
281e0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
281f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
28200 34 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b  4 iAbsLevel = 0;
28210 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
28220 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20  level number to 
28230 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f  work on */.  Blo
28240 62 20 68 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20  b hint = {0, 0, 
28250 30 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0};          /* 
28260 48 69 6e 74 20 72 65 61 64 20 66 72 6f 6d 20 25  Hint read from %
28270 5f 73 74 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20  _stat table */. 
28280 20 69 6e 74 20 62 44 69 72 74 79 48 69 6e 74 20   int bDirtyHint 
28290 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
282a0 20 2f 2a 20 54 72 75 65 20 69 66 20 62 6c 6f 62   /* True if blob
282b0 20 27 68 69 6e 74 27 20 68 61 73 20 62 65 65 6e   'hint' has been
282c0 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20   modified */..  
282d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
282e0 65 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72  e for the cursor
282f0 2c 20 66 69 6c 74 65 72 20 61 6e 64 20 77 72 69  , filter and wri
28300 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  ter objects */. 
28310 20 63 6f 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f   const int nAllo
28320 63 20 3d 20 73 69 7a 65 6f 66 28 2a 70 43 73 72  c = sizeof(*pCsr
28330 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c  ) + sizeof(*pFil
28340 74 65 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ter) + sizeof(*p
28350 57 72 69 74 65 72 29 3b 0a 20 20 70 57 72 69 74  Writer);.  pWrit
28360 65 72 20 3d 20 28 49 6e 63 72 6d 65 72 67 65 57  er = (IncrmergeW
28370 72 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f  riter *)sqlite3_
28380 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a  malloc(nAlloc);.
28390 20 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29    if( !pWriter )
283a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
283b0 4f 4d 45 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20  OMEM;.  pFilter 
283c0 3d 20 28 46 74 73 33 53 65 67 46 69 6c 74 65 72  = (Fts3SegFilter
283d0 20 2a 29 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a   *)&pWriter[1];.
283e0 20 20 70 43 73 72 20 3d 20 28 46 74 73 33 4d 75    pCsr = (Fts3Mu
283f0 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 29 26  ltiSegReader *)&
28400 70 46 69 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72  pFilter[1];..  r
28410 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67  c = fts3Incrmerg
28420 65 48 69 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69  eHintLoad(p, &hi
28430 6e 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  nt);.  while( rc
28440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
28450 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  Rem>0 ){.    con
28460 73 74 20 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54  st i64 nMod = FT
28470 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
28480 45 4c 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a  EL * p->nIndex;.
28490 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
284a0 20 2a 70 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30   *pFindLevel = 0
284b0 3b 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f  ; /* SQL used to
284c0 20 64 65 74 65 72 6d 69 6e 65 20 69 41 62 73 4c   determine iAbsL
284d0 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  evel */.    int 
284e0 62 55 73 65 48 69 6e 74 20 3d 20 30 3b 20 20 20  bUseHint = 0;   
284f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28500 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20  e if attempting 
28510 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 20  to append */.   
28520 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20   int iIdx = 0;  
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28540 2a 20 4c 61 72 67 65 73 74 20 69 64 78 20 69 6e  * Largest idx in
28550 20 6c 65 76 65 6c 20 28 69 41 62 73 4c 65 76 65   level (iAbsLeve
28560 6c 2b 31 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  l+1) */..    /* 
28570 53 65 61 72 63 68 20 74 68 65 20 25 5f 73 65 67  Search the %_seg
28580 64 69 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68  dir table for th
28590 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  e absolute level
285a0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
285b0 73 74 0a 20 20 20 20 2a 2a 20 72 65 6c 61 74 69  st.    ** relati
285c0 76 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20  ve level number 
285d0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  that contains at
285e0 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d   least nMin segm
285f0 65 6e 74 73 2c 20 69 66 20 61 6e 79 2e 0a 20 20  ents, if any..  
28600 20 20 2a 2a 20 49 66 20 6f 6e 65 20 69 73 20 66    ** If one is f
28610 6f 75 6e 64 2c 20 73 65 74 20 69 41 62 73 4c 65  ound, set iAbsLe
28620 76 65 6c 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  vel to the absol
28630 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72  ute level number
28640 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6e 53 65 67   and.    ** nSeg
28650 20 74 6f 20 6e 4d 69 6e 2e 20 49 66 20 6e 6f 20   to nMin. If no 
28660 6c 65 76 65 6c 20 77 69 74 68 20 61 74 20 6c 65  level with at le
28670 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74  ast nMin segment
28680 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  s can be found, 
28690 0a 20 20 20 20 2a 2a 20 73 65 74 20 6e 53 65 67  .    ** set nSeg
286a0 20 74 6f 20 2d 31 2e 0a 20 20 20 20 2a 2f 0a 20   to -1..    */. 
286b0 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
286c0 74 6d 74 28 70 2c 20 53 51 4c 5f 46 49 4e 44 5f  tmt(p, SQL_FIND_
286d0 4d 45 52 47 45 5f 4c 45 56 45 4c 2c 20 26 70 46  MERGE_LEVEL, &pF
286e0 69 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20  indLevel, 0);.  
286f0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
28700 6e 74 28 70 46 69 6e 64 4c 65 76 65 6c 2c 20 31  nt(pFindLevel, 1
28710 2c 20 4d 41 58 28 32 2c 20 6e 4d 69 6e 29 29 3b  , MAX(2, nMin));
28720 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
28730 5f 73 74 65 70 28 70 46 69 6e 64 4c 65 76 65 6c  _step(pFindLevel
28740 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
28750 0a 20 20 20 20 20 20 69 41 62 73 4c 65 76 65 6c  .      iAbsLevel
28760 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
28770 6e 5f 69 6e 74 36 34 28 70 46 69 6e 64 4c 65 76  n_int64(pFindLev
28780 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 53  el, 0);.      nS
28790 65 67 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  eg = sqlite3_col
287a0 75 6d 6e 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76  umn_int(pFindLev
287b0 65 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  el, 1);.      as
287c0 73 65 72 74 28 20 6e 53 65 67 3e 3d 32 20 29 3b  sert( nSeg>=2 );
287d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
287e0 20 20 6e 53 65 67 20 3d 20 2d 31 3b 0a 20 20 20    nSeg = -1;.   
287f0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
28800 74 65 33 5f 72 65 73 65 74 28 70 46 69 6e 64 4c  te3_reset(pFindL
28810 65 76 65 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  evel);..    /* I
28820 66 20 74 68 65 20 68 69 6e 74 20 72 65 61 64 20  f the hint read 
28830 66 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 20  from the %_stat 
28840 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 65 6d 70  table is not emp
28850 74 79 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ty, check if the
28860 0a 20 20 20 20 2a 2a 20 6c 61 73 74 20 65 6e 74  .    ** last ent
28870 72 79 20 69 6e 20 69 74 20 73 70 65 63 69 66 69  ry in it specifi
28880 65 73 20 61 20 72 65 6c 61 74 69 76 65 20 6c 65  es a relative le
28890 76 65 6c 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  vel smaller than
288a0 20 6f 72 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a   or equal.    **
288b0 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 69 64   to the level id
288c0 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
288d0 62 6c 6f 63 6b 20 61 62 6f 76 65 20 28 69 66 20  block above (if 
288e0 61 6e 79 29 2e 20 49 66 20 73 6f 2c 20 74 68 69  any). If so, thi
288f0 73 20 0a 20 20 20 20 2a 2a 20 69 74 65 72 61 74  s .    ** iterat
28900 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
28910 77 69 6c 6c 20 77 6f 72 6b 20 6f 6e 20 6d 65 72  will work on mer
28920 67 69 6e 67 20 61 74 20 74 68 65 20 68 69 6e 74  ging at the hint
28930 65 64 20 6c 65 76 65 6c 2e 0a 20 20 20 20 2a 2f  ed level..    */
28940 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28950 49 54 45 5f 4f 4b 20 26 26 20 68 69 6e 74 2e 6e  ITE_OK && hint.n
28960 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48   ){.      int nH
28970 69 6e 74 20 3d 20 68 69 6e 74 2e 6e 3b 0a 20 20  int = hint.n;.  
28980 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
28990 34 20 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20  4 iHintAbsLevel 
289a0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 48 69 6e  = 0;      /* Hin
289b0 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20  t level */.     
289c0 20 69 6e 74 20 6e 48 69 6e 74 53 65 67 20 3d 20   int nHintSeg = 
289d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
289e0 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20 6e         /* Hint n
289f0 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
28a00 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  s */..      rc =
28a10 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
28a20 6e 74 50 6f 70 28 26 68 69 6e 74 2c 20 26 69 48  ntPop(&hint, &iH
28a30 69 6e 74 41 62 73 4c 65 76 65 6c 2c 20 26 6e 48  intAbsLevel, &nH
28a40 69 6e 74 53 65 67 29 3b 0a 20 20 20 20 20 20 69  intSeg);.      i
28a50 66 28 20 6e 53 65 67 3c 30 20 7c 7c 20 28 69 41  f( nSeg<0 || (iA
28a60 62 73 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20  bsLevel % nMod) 
28a70 3e 3d 20 28 69 48 69 6e 74 41 62 73 4c 65 76 65  >= (iHintAbsLeve
28a80 6c 20 25 20 6e 4d 6f 64 29 20 29 7b 0a 20 20 20  l % nMod) ){.   
28a90 20 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d       iAbsLevel =
28aa0 20 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 3b 0a   iHintAbsLevel;.
28ab0 20 20 20 20 20 20 20 20 6e 53 65 67 20 3d 20 6e          nSeg = n
28ac0 48 69 6e 74 53 65 67 3b 0a 20 20 20 20 20 20 20  HintSeg;.       
28ad0 20 62 55 73 65 48 69 6e 74 20 3d 20 31 3b 0a 20   bUseHint = 1;. 
28ae0 20 20 20 20 20 20 20 62 44 69 72 74 79 48 69 6e         bDirtyHin
28af0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 1;.      }el
28b00 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
28b10 68 69 73 20 75 6e 64 6f 65 73 20 74 68 65 20 65  his undoes the e
28b20 66 66 65 63 74 20 6f 66 20 74 68 65 20 48 69 6e  ffect of the Hin
28b30 74 50 6f 70 28 29 20 61 62 6f 76 65 20 2d 20 73  tPop() above - s
28b40 6f 20 74 68 61 74 20 6e 6f 20 65 6e 74 72 79 0a  o that no entry.
28b50 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
28b60 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68  moved from the h
28b70 69 6e 74 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 20  int blob.  */.  
28b80 20 20 20 20 20 20 68 69 6e 74 2e 6e 20 3d 20 6e        hint.n = n
28b90 48 69 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Hint;.      }.  
28ba0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
28bb0 53 65 67 20 69 73 20 6c 65 73 73 20 74 68 61 74  Seg is less that
28bc0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72   zero, then ther
28bd0 65 20 69 73 20 6e 6f 20 6c 65 76 65 6c 20 77 69  e is no level wi
28be0 74 68 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  th at least.    
28bf0 2a 2a 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73  ** nMin segments
28c00 20 61 6e 64 20 6e 6f 20 68 69 6e 74 20 69 6e 20   and no hint in 
28c10 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65  the %_stat table
28c20 2e 20 4e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 2e  . No work to do.
28c30 0a 20 20 20 20 2a 2a 20 45 78 69 74 20 65 61 72  .    ** Exit ear
28c40 6c 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ly in this case.
28c50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 65    */.    if( nSe
28c60 67 3c 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  g<0 ) break;..  
28c70 20 20 2f 2a 20 4f 70 65 6e 20 61 20 63 75 72 73    /* Open a curs
28c80 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
28c90 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e  rough the conten
28ca0 74 73 20 6f 66 20 74 68 65 20 6f 6c 64 65 73 74  ts of the oldest
28cb0 20 6e 53 65 67 20 0a 20 20 20 20 2a 2a 20 69 6e   nSeg .    ** in
28cc0 64 65 78 65 73 20 6f 66 20 61 62 73 6f 6c 75 74  dexes of absolut
28cd0 65 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65  e level iAbsLeve
28ce0 6c 2e 20 49 66 20 74 68 69 73 20 63 75 72 73 6f  l. If this curso
28cf0 72 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  r is opened usin
28d00 67 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 27 68  g .    ** the 'h
28d10 69 6e 74 27 20 70 61 72 61 6d 65 74 65 72 73 2c  int' parameters,
28d20 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
28d30 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6c  that there are l
28d40 65 73 73 20 74 68 61 6e 20 6e 53 65 67 0a 20 20  ess than nSeg.  
28d50 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 76    ** segments av
28d60 61 69 6c 61 62 6c 65 20 69 6e 20 6c 65 76 65 6c  ailable in level
28d70 20 69 41 62 73 4c 65 76 65 6c 2e 20 49 6e 20 74   iAbsLevel. In t
28d80 68 69 73 20 63 61 73 65 2c 20 6e 6f 20 77 6f 72  his case, no wor
28d90 6b 20 69 73 0a 20 20 20 20 2a 2a 20 64 6f 6e 65  k is.    ** done
28da0 20 6f 6e 20 69 41 62 73 4c 65 76 65 6c 20 2d 20   on iAbsLevel - 
28db0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
28dc0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
28dd0 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 0a  on of the loop .
28de0 20 20 20 20 2a 2a 20 74 6f 20 73 74 61 72 74 20      ** to start 
28df0 77 6f 72 6b 20 6f 6e 20 73 6f 6d 65 20 6f 74 68  work on some oth
28e00 65 72 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20  er level.  */.  
28e10 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
28e20 2c 20 30 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20  , 0, nAlloc);.  
28e30 20 20 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73    pFilter->flags
28e40 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   = FTS3_SEGMENT_
28e50 52 45 51 55 49 52 45 5f 50 4f 53 3b 0a 0a 20 20  REQUIRE_POS;..  
28e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
28e80 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4f  = fts3IncrmergeO
28e90 75 74 70 75 74 49 64 78 28 70 2c 20 69 41 62 73  utputIdx(p, iAbs
28ea0 4c 65 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20  Level, &iIdx);. 
28eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 55 73       assert( bUs
28ec0 65 48 69 6e 74 3d 3d 31 20 7c 7c 20 62 55 73 65  eHint==1 || bUse
28ed0 48 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hint==0 );.     
28ee0 20 69 66 28 20 69 49 64 78 3d 3d 30 20 7c 7c 20   if( iIdx==0 || 
28ef0 28 62 55 73 65 48 69 6e 74 20 26 26 20 69 49 64  (bUseHint && iId
28f00 78 3d 3d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  x==1) ){.       
28f10 20 69 6e 74 20 62 49 67 6e 6f 72 65 20 3d 20 30   int bIgnore = 0
28f20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
28f30 74 73 33 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c  ts3SegmentIsMaxL
28f40 65 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65  evel(p, iAbsLeve
28f50 6c 2b 31 2c 20 26 62 49 67 6e 6f 72 65 29 3b 0a  l+1, &bIgnore);.
28f60 20 20 20 20 20 20 20 20 69 66 28 20 62 49 67 6e          if( bIgn
28f70 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ore ){.         
28f80 20 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20   pFilter->flags 
28f90 7c 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f  |= FTS3_SEGMENT_
28fa0 49 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20  IGNORE_EMPTY;.  
28fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28fc0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
28fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28fe0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49        rc = fts3I
28ff0 6e 63 72 6d 65 72 67 65 43 73 72 28 70 2c 20 69  ncrmergeCsr(p, i
29000 41 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20  AbsLevel, nSeg, 
29010 70 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCsr);.    }.   
29020 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
29030 72 63 20 26 26 20 70 43 73 72 2d 3e 6e 53 65 67  rc && pCsr->nSeg
29040 6d 65 6e 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20  ment==nSeg.     
29050 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
29060 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
29070 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c  egReaderStart(p,
29080 20 70 43 73 72 2c 20 70 46 69 6c 74 65 72 29 29   pCsr, pFilter))
29090 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
290a0 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  ROW==(rc = sqlit
290b0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
290c0 74 65 70 28 70 2c 20 70 43 73 72 29 29 0a 20 20  tep(p, pCsr)).  
290d0 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62    ){.      if( b
290e0 55 73 65 48 69 6e 74 20 26 26 20 69 49 64 78 3e  UseHint && iIdx>
290f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
29100 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20  st char *zKey = 
29110 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20  pCsr->zTerm;.   
29120 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
29130 70 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  pCsr->nTerm;.   
29140 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
29150 63 72 6d 65 72 67 65 4c 6f 61 64 28 70 2c 20 69  crmergeLoad(p, i
29160 41 62 73 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31  AbsLevel, iIdx-1
29170 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57  , zKey, nKey, pW
29180 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  riter);.      }e
29190 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
291a0 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 57  = fts3IncrmergeW
291b0 72 69 74 65 72 28 70 2c 20 69 41 62 73 4c 65 76  riter(p, iAbsLev
291c0 65 6c 2c 20 69 49 64 78 2c 20 70 43 73 72 2c 20  el, iIdx, pCsr, 
291d0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  pWriter);.      
291e0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
291f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57  =SQLITE_OK && pW
29200 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20  riter->nLeafEst 
29210 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 4c  ){.        fts3L
29220 6f 67 4d 65 72 67 65 28 6e 53 65 67 2c 20 69 41  ogMerge(nSeg, iA
29230 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  bsLevel);.      
29240 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20    do {.         
29250 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65   rc = fts3Incrme
29260 72 67 65 41 70 70 65 6e 64 28 70 2c 20 70 57 72  rgeAppend(p, pWr
29270 69 74 65 72 2c 20 70 43 73 72 29 3b 0a 20 20 20  iter, pCsr);.   
29280 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29290 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
292a0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
292b0 61 64 65 72 53 74 65 70 28 70 2c 20 70 43 73 72  aderStep(p, pCsr
292c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
292d0 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e   pWriter->nWork>
292e0 3d 6e 52 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c  =nRem && rc==SQL
292f0 49 54 45 5f 52 4f 57 20 29 20 72 63 20 3d 20 53  ITE_ROW ) rc = S
29300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
29310 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
29320 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20  LITE_ROW );..   
29330 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6f       /* Update o
29340 72 20 64 65 6c 65 74 65 20 74 68 65 20 69 6e 70  r delete the inp
29350 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
29360 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29380 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31        nRem -= (1
29390 20 2b 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72   + pWriter->nWor
293a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  k);.          rc
293b0 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65   = fts3Incrmerge
293c0 43 68 6f 6d 70 28 70 2c 20 69 41 62 73 4c 65 76  Chomp(p, iAbsLev
293d0 65 6c 2c 20 70 43 73 72 2c 20 26 6e 53 65 67 29  el, pCsr, &nSeg)
293e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
293f0 6e 53 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20  nSeg!=0 ){.     
29400 20 20 20 20 20 20 20 62 44 69 72 74 79 48 69 6e         bDirtyHin
29410 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
29420 20 20 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65     fts3Incrmerge
29430 48 69 6e 74 50 75 73 68 28 26 68 69 6e 74 2c 20  HintPush(&hint, 
29440 69 41 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c  iAbsLevel, nSeg,
29450 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20   &rc);.         
29460 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29470 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
29480 6e 53 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20  nSeg!=0 ){.     
29490 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61     pWriter->nLea
294a0 66 44 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d  fData = pWriter-
294b0 3e 6e 4c 65 61 66 44 61 74 61 20 2a 20 2d 31 3b  >nLeafData * -1;
294c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
294d0 74 73 33 49 6e 63 72 6d 65 72 67 65 52 65 6c 65  ts3IncrmergeRele
294e0 61 73 65 28 70 2c 20 70 57 72 69 74 65 72 2c 20  ase(p, pWriter, 
294f0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
29500 6e 53 65 67 3d 3d 30 20 26 26 20 70 57 72 69 74  nSeg==0 && pWrit
29510 65 72 2d 3e 62 4e 6f 4c 65 61 66 44 61 74 61 3d  er->bNoLeafData=
29520 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  =0 ){.        ft
29530 73 33 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74  s3PromoteSegment
29540 73 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31  s(p, iAbsLevel+1
29550 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66  , pWriter->nLeaf
29560 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
29570 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
29580 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69  3Fts3SegReaderFi
29590 6e 69 73 68 28 70 43 73 72 29 3b 0a 20 20 7d 0a  nish(pCsr);.  }.
295a0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
295b0 68 69 6e 74 20 76 61 6c 75 65 73 20 69 6e 74 6f  hint values into
295c0 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c   the %_stat tabl
295d0 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69  e for the next i
295e0 6e 63 72 2d 6d 65 72 67 65 72 20 2a 2f 0a 20 20  ncr-merger */.  
295f0 69 66 28 20 62 44 69 72 74 79 48 69 6e 74 20 26  if( bDirtyHint &
29600 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
29610 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
29620 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 53 74 6f  IncrmergeHintSto
29630 72 65 28 70 2c 20 26 68 69 6e 74 29 3b 0a 20 20  re(p, &hint);.  
29640 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
29650 65 28 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71  e(pWriter);.  sq
29660 6c 69 74 65 33 5f 66 72 65 65 28 68 69 6e 74 2e  lite3_free(hint.
29670 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  a);.  return rc;
29680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
29690 74 20 74 68 65 20 74 65 78 74 20 62 65 67 69 6e  t the text begin
296a0 6e 69 6e 67 20 61 74 20 2a 70 7a 20 69 6e 74 6f  ning at *pz into
296b0 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
296c0 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20 76 61  return.** its va
296d0 6c 75 65 2e 20 20 41 64 76 61 6e 63 65 20 2a 70  lue.  Advance *p
296e0 7a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  z to point to th
296f0 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
29700 72 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 69 6e  r past.** the in
29710 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  teger..**.** Thi
29720 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20  s function used 
29730 66 6f 72 20 70 61 72 61 6d 65 74 65 72 73 20 74  for parameters t
29740 6f 20 6d 65 72 67 65 3d 20 61 6e 64 20 69 6e 63  o merge= and inc
29750 72 6d 65 72 67 65 3d 0a 2a 2a 20 63 6f 6d 6d 61  rmerge=.** comma
29760 6e 64 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nds. .*/.static 
29770 69 6e 74 20 66 74 73 33 47 65 74 69 6e 74 28 63  int fts3Getint(c
29780 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 29 7b  onst char **pz){
29790 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
297a0 20 3d 20 2a 70 7a 3b 0a 20 20 69 6e 74 20 69 20   = *pz;.  int i 
297b0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a  = 0;.  while( (*
297c0 7a 29 3e 3d 27 30 27 20 26 26 20 28 2a 7a 29 3c  z)>='0' && (*z)<
297d0 3d 27 39 27 20 26 26 20 69 3c 32 31 34 37 34 38  ='9' && i<214748
297e0 33 36 33 20 29 20 69 20 3d 20 31 30 2a 69 20 2b  363 ) i = 10*i +
297f0 20 2a 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20   *(z++) - '0';. 
29800 20 2a 70 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75   *pz = z;.  retu
29810 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn i;.}../*.** P
29820 72 6f 63 65 73 73 20 73 74 61 74 65 6d 65 6e 74  rocess statement
29830 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
29840 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49  *.**    INSERT I
29850 4e 54 4f 20 74 61 62 6c 65 28 74 61 62 6c 65 29  NTO table(table)
29860 20 56 41 4c 55 45 53 28 27 6d 65 72 67 65 3d 41   VALUES('merge=A
29870 2c 42 27 29 3b 0a 2a 2a 0a 2a 2a 20 41 20 61 6e  ,B');.**.** A an
29880 64 20 42 20 61 72 65 20 69 6e 74 65 67 65 72 73  d B are integers
29890 20 74 68 61 74 20 64 65 63 6f 64 65 20 74 6f 20   that decode to 
298a0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
298b0 20 6c 65 61 66 20 70 61 67 65 73 0a 2a 2a 20 77   leaf pages.** w
298c0 72 69 74 74 65 6e 20 66 6f 72 20 74 68 65 20 6d  ritten for the m
298d0 65 72 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 69  erge, and the mi
298e0 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
298f0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61 20 6c 65  segments on a le
29900 76 65 6c 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74  vel.** before it
29910 20 77 69 6c 6c 20 62 65 20 73 65 6c 65 63 74 65   will be selecte
29920 64 20 66 6f 72 20 61 20 6d 65 72 67 65 2c 20 72  d for a merge, r
29930 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a  espectively..*/.
29940 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
29950 6f 49 6e 63 72 6d 65 72 67 65 28 0a 20 20 46 74  oIncrmerge(.  Ft
29960 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29980 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
29990 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
299a0 61 72 20 2a 7a 50 61 72 61 6d 20 20 20 20 20 20  ar *zParam      
299b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
299c0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
299d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 22 41 2c 42   containing "A,B
299e0 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  " */.){.  int rc
299f0 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 28  ;.  int nMin = (
29a00 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
29a10 20 2f 20 32 29 3b 0a 20 20 69 6e 74 20 6e 4d 65   / 2);.  int nMe
29a20 72 67 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  rge = 0;.  const
29a30 20 63 68 61 72 20 2a 7a 20 3d 20 7a 50 61 72 61   char *z = zPara
29a40 6d 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  m;..  /* Read th
29a50 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
29a60 76 61 6c 75 65 20 2a 2f 0a 20 20 6e 4d 65 72 67  value */.  nMerg
29a70 65 20 3d 20 66 74 73 33 47 65 74 69 6e 74 28 26  e = fts3Getint(&
29a80 7a 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  z);..  /* If the
29a90 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 76   first integer v
29aa0 61 6c 75 65 20 69 73 20 66 6f 6c 6c 6f 77 65 64  alue is followed
29ab0 20 62 79 20 61 20 27 2c 27 2c 20 20 72 65 61 64   by a ',',  read
29ac0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
29ad0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20   integer value. 
29ae0 2a 2f 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  */.  if( z[0]=='
29af0 2c 27 20 26 26 20 7a 5b 31 5d 21 3d 27 5c 30 27  ,' && z[1]!='\0'
29b00 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20   ){.    z++;.   
29b10 20 6e 4d 69 6e 20 3d 20 66 74 73 33 47 65 74 69   nMin = fts3Geti
29b20 6e 74 28 26 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69  nt(&z);.  }..  i
29b30 66 28 20 7a 5b 30 5d 21 3d 27 5c 30 27 20 7c 7c  f( z[0]!='\0' ||
29b40 20 6e 4d 69 6e 3c 32 20 29 7b 0a 20 20 20 20 72   nMin<2 ){.    r
29b50 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
29b60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29b70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29b80 20 20 20 69 66 28 20 21 70 2d 3e 62 48 61 73 53     if( !p->bHasS
29b90 74 61 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  tat ){.      ass
29ba0 65 72 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d 30  ert( p->bFts4==0
29bb0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
29bc0 33 46 74 73 33 43 72 65 61 74 65 53 74 61 74 54  3Fts3CreateStatT
29bd0 61 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20 20  able(&rc, p);.  
29be0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
29bf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
29c10 74 73 33 49 6e 63 72 6d 65 72 67 65 28 70 2c 20  ts3Incrmerge(p, 
29c20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 3b 0a 20  nMerge, nMin);. 
29c30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29c40 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73  Fts3SegmentsClos
29c50 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
29c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29c70 50 72 6f 63 65 73 73 20 73 74 61 74 65 6d 65 6e  Process statemen
29c80 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ts of the form:.
29c90 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20  **.**    INSERT 
29ca0 49 4e 54 4f 20 74 61 62 6c 65 28 74 61 62 6c 65  INTO table(table
29cb0 29 20 56 41 4c 55 45 53 28 27 61 75 74 6f 6d 65  ) VALUES('autome
29cc0 72 67 65 3d 58 27 29 3b 0a 2a 2a 0a 2a 2a 20 77  rge=X');.**.** w
29cd0 68 65 72 65 20 58 20 69 73 20 61 6e 20 69 6e 74  here X is an int
29ce0 65 67 65 72 2e 20 20 58 3d 3d 30 20 6d 65 61 6e  eger.  X==0 mean
29cf0 73 20 74 6f 20 74 75 72 6e 20 61 75 74 6f 6d 65  s to turn autome
29d00 72 67 65 20 6f 66 66 2e 20 20 58 21 3d 30 20 6d  rge off.  X!=0 m
29d10 65 61 6e 73 0a 2a 2a 20 74 75 72 6e 20 69 74 20  eans.** turn it 
29d20 6f 6e 2e 20 20 54 68 65 20 73 65 74 74 69 6e 67  on.  The setting
29d30 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
29d40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
29d50 73 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72 67  s3DoAutoincrmerg
29d60 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
29d70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
29d80 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
29d90 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  le handle */.  c
29da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
29db0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m              /
29dc0 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
29dd0 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
29de0 6e 67 20 62 6f 6f 6c 65 61 6e 20 2a 2f 0a 29 7b  ng boolean */.){
29df0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29e00 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
29e10 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
29e20 3b 0a 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72  ;.  p->nAutoincr
29e30 6d 65 72 67 65 20 3d 20 66 74 73 33 47 65 74 69  merge = fts3Geti
29e40 6e 74 28 26 7a 50 61 72 61 6d 29 3b 0a 20 20 69  nt(&zParam);.  i
29e50 66 28 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d  f( p->nAutoincrm
29e60 65 72 67 65 3d 3d 31 20 7c 7c 20 70 2d 3e 6e 41  erge==1 || p->nA
29e70 75 74 6f 69 6e 63 72 6d 65 72 67 65 3e 46 54 53  utoincrmerge>FTS
29e80 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b  3_MERGE_COUNT ){
29e90 0a 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63  .    p->nAutoinc
29ea0 72 6d 65 72 67 65 20 3d 20 38 3b 0a 20 20 7d 0a  rmerge = 8;.  }.
29eb0 20 20 69 66 28 20 21 70 2d 3e 62 48 61 73 53 74    if( !p->bHasSt
29ec0 61 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  at ){.    assert
29ed0 28 20 70 2d 3e 62 46 74 73 34 3d 3d 30 20 29 3b  ( p->bFts4==0 );
29ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
29ef0 43 72 65 61 74 65 53 74 61 74 54 61 62 6c 65 28  CreateStatTable(
29f00 26 72 63 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  &rc, p);.    if(
29f10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29f20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33  .  }.  rc = fts3
29f30 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52  SqlStmt(p, SQL_R
29f40 45 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 53  EPLACE_STAT, &pS
29f50 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
29f60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29f70 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
29f80 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f  t(pStmt, 1, FTS_
29f90 53 54 41 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52  STAT_AUTOINCRMER
29fa0 47 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  GE);.  sqlite3_b
29fb0 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  ind_int(pStmt, 2
29fc0 2c 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65  , p->nAutoincrme
29fd0 72 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rge);.  sqlite3_
29fe0 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 72  step(pStmt);.  r
29ff0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
2a000 74 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75  t(pStmt);.  retu
2a010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a020 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20  Return a 64-bit 
2a030 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
2a040 20 46 54 53 20 69 6e 64 65 78 20 65 6e 74 72 79   FTS index entry
2a050 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
2a060 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74  e.** arguments t
2a070 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
2a080 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66  .*/.static u64 f
2a090 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79  ts3ChecksumEntry
2a0a0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2a0b0 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
2a0c0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2a0d0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
2a0e0 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ing term */.  in
2a0f0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t nTerm,        
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a110 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69   Size of zTerm i
2a120 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
2a130 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a150 4c 61 6e 67 75 61 67 65 20 69 64 20 66 6f 72 20  Language id for 
2a160 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20  current row */. 
2a170 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20   int iIndex,    
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a190 20 2f 2a 20 49 6e 64 65 78 20 28 30 2e 2e 46 74   /* Index (0..Ft
2a1a0 73 33 54 61 62 6c 65 2e 6e 49 6e 64 65 78 2d 31  s3Table.nIndex-1
2a1b0 29 20 2a 2f 0a 20 20 69 36 34 20 69 44 6f 63 69  ) */.  i64 iDoci
2a1c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2a1d0 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
2a1e0 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  for current row.
2a1f0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a210 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2a220 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
2a230 69 50 6f 73 20 20 20 20 20 20 20 20 20 20 20 20  iPos            
2a240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a250 6f 73 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  osition */.){.  
2a260 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74  int i;.  u64 ret
2a270 20 3d 20 28 75 36 34 29 69 44 6f 63 69 64 3b 0a   = (u64)iDocid;.
2a280 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
2a290 33 29 20 2b 20 69 4c 61 6e 67 69 64 3b 0a 20 20  3) + iLangid;.  
2a2a0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
2a2b0 2b 20 69 49 6e 64 65 78 3b 0a 20 20 72 65 74 20  + iIndex;.  ret 
2a2c0 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43  += (ret<<3) + iC
2a2d0 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  ol;.  ret += (re
2a2e0 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20  t<<3) + iPos;.  
2a2f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
2a300 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72  ; i++) ret += (r
2a310 65 74 3c 3c 33 29 20 2b 20 7a 54 65 72 6d 5b 69  et<<3) + zTerm[i
2a320 5d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74  ];..  return ret
2a330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2a340 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  n a checksum of 
2a350 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  all entries in t
2a360 68 65 20 46 54 53 20 69 6e 64 65 78 20 74 68 61  he FTS index tha
2a370 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a  t correspond to.
2a380 2a 2a 20 6c 61 6e 67 75 61 67 65 20 69 64 20 69  ** language id i
2a390 4c 61 6e 67 69 64 2e 20 54 68 65 20 63 68 65 63  Langid. The chec
2a3a0 6b 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61 74  ksum is calculat
2a3b0 65 64 20 62 79 20 58 4f 52 69 6e 67 20 74 68 65  ed by XORing the
2a3c0 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 6f 66   checksums.** of
2a3d0 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
2a3e0 20 65 6e 74 72 79 20 28 73 65 65 20 66 74 73 33   entry (see fts3
2a3f0 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29  ChecksumEntry())
2a400 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a   together..**.**
2a410 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2a420 74 68 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  the checksum val
2a430 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ue is returned a
2a440 6e 64 20 2a 70 52 63 20 73 65 74 20 74 6f 20 53  nd *pRc set to S
2a450 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
2a460 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
2a470 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63  ror occurs, *pRc
2a480 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53 51   is set to an SQ
2a490 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
2a4a0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
2a4b0 61 6c 75 65 20 69 73 20 75 6e 64 65 66 69 6e 65  alue is undefine
2a4c0 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
2a4d0 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66 74  */.static u64 ft
2a4e0 73 33 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28  s3ChecksumIndex(
2a4f0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
2a520 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
2a530 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a550 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20 72  Language id to r
2a560 65 74 75 72 6e 20 63 6b 73 75 6d 20 66 6f 72 20  eturn cksum for 
2a570 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  */.  int iIndex,
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
2a5a0 20 63 6b 73 75 6d 20 28 30 2e 2e 70 2d 3e 6e 49   cksum (0..p->nI
2a5b0 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69 6e 74  ndex-1) */.  int
2a5c0 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a5e0 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65  OUT: Return code
2a5f0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67   */.){.  Fts3Seg
2a600 46 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 0a 20  Filter filter;. 
2a610 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
2a620 64 65 72 20 63 73 72 3b 0a 20 20 69 6e 74 20 72  der csr;.  int r
2a630 63 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d  c;.  u64 cksum =
2a640 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a   0;..  assert( *
2a650 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2a660 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  ;..  memset(&fil
2a670 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  ter, 0, sizeof(f
2a680 69 6c 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  ilter));.  memse
2a690 74 28 26 63 73 72 2c 20 30 2c 20 73 69 7a 65 6f  t(&csr, 0, sizeo
2a6a0 66 28 63 73 72 29 29 3b 0a 20 20 66 69 6c 74 65  f(csr));.  filte
2a6b0 72 2e 66 6c 61 67 73 20 3d 20 20 46 54 53 33 5f  r.flags =  FTS3_
2a6c0 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f  SEGMENT_REQUIRE_
2a6d0 50 4f 53 7c 46 54 53 33 5f 53 45 47 4d 45 4e 54  POS|FTS3_SEGMENT
2a6e0 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20  _IGNORE_EMPTY;. 
2a6f0 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d   filter.flags |=
2a700 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43   FTS3_SEGMENT_SC
2a710 41 4e 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  AN;..  rc = sqli
2a720 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
2a730 43 75 72 73 6f 72 28 0a 20 20 20 20 20 20 70 2c  Cursor(.      p,
2a740 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
2a750 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  , FTS3_SEGCURSOR
2a760 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 2c 20 31  _ALL, 0, 0, 0, 1
2a770 2c 26 63 73 72 0a 20 20 29 3b 0a 20 20 69 66 28  ,&csr.  );.  if(
2a780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a790 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2a7a0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
2a7b0 74 61 72 74 28 70 2c 20 26 63 73 72 2c 20 26 66  tart(p, &csr, &f
2a7c0 69 6c 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  ilter);.  }..  i
2a7d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a7e0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   ){.    while( S
2a7f0 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d  QLITE_ROW==(rc =
2a800 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
2a810 65 61 64 65 72 53 74 65 70 28 70 2c 20 26 63 73  eaderStep(p, &cs
2a820 72 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  r)) ){.      cha
2a830 72 20 2a 70 43 73 72 20 3d 20 63 73 72 2e 61 44  r *pCsr = csr.aD
2a840 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 63 68  oclist;.      ch
2a850 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 43 73 72  ar *pEnd = &pCsr
2a860 5b 63 73 72 2e 6e 44 6f 63 6c 69 73 74 5d 3b 0a  [csr.nDoclist];.
2a870 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69  .      i64 iDoci
2a880 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34  d = 0;.      i64
2a890 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20   iCol = 0;.     
2a8a0 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 0a 0a   i64 iPos = 0;..
2a8b0 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71        pCsr += sq
2a8c0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
2a8d0 6e 74 28 70 43 73 72 2c 20 26 69 44 6f 63 69 64  nt(pCsr, &iDocid
2a8e0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
2a8f0 70 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20  pCsr<pEnd ){.   
2a900 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d 20       i64 iVal = 
2a910 30 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 20  0;.        pCsr 
2a920 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
2a930 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69  tVarint(pCsr, &i
2a940 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Val);.        if
2a950 28 20 70 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20  ( pCsr<pEnd ){. 
2a960 20 20 20 20 20 20 20 20 20 69 66 28 20 69 56 61           if( iVa
2a970 6c 3d 3d 30 20 7c 7c 20 69 56 61 6c 3d 3d 31 20  l==0 || iVal==1 
2a980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2a990 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
2a9a0 20 20 20 20 20 69 50 6f 73 20 3d 20 30 3b 0a 20       iPos = 0;. 
2a9b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2a9c0 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Val ){.         
2a9d0 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c       pCsr += sql
2a9e0 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
2a9f0 74 28 70 43 73 72 2c 20 26 69 43 6f 6c 29 3b 0a  t(pCsr, &iCol);.
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2aa10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2aa20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   pCsr += sqlite3
2aa30 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43  Fts3GetVarint(pC
2aa40 73 72 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  sr, &iVal);.    
2aa50 20 20 20 20 20 20 20 20 20 20 69 44 6f 63 69 64            iDocid
2aa60 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20   += iVal;.      
2aa70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aa80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2aa90 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 28 69 56       iPos += (iV
2aaa0 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 20 20 20  al - 2);.       
2aab0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 63 6b 73       cksum = cks
2aac0 75 6d 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75  um ^ fts3Checksu
2aad0 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20  mEntry(.        
2aae0 20 20 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72          csr.zTer
2aaf0 6d 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20 69 4c  m, csr.nTerm, iL
2ab00 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69  angid, iIndex, i
2ab10 44 6f 63 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Docid,.         
2ab20 20 20 20 20 20 20 20 28 69 6e 74 29 69 43 6f 6c         (int)iCol
2ab30 2c 20 28 69 6e 74 29 69 50 6f 73 0a 20 20 20 20  , (int)iPos.    
2ab40 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2ab50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ab60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ab70 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33   }.  sqlite3Fts3
2ab80 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28  SegReaderFinish(
2ab90 26 63 73 72 29 3b 0a 0a 20 20 2a 70 52 63 20 3d  &csr);..  *pRc =
2aba0 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 63 6b   rc;.  return ck
2abb0 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  sum;.}../*.** Ch
2abc0 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6e 74 65  eck if the conte
2abd0 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69  nts of the FTS i
2abe0 6e 64 65 78 20 6d 61 74 63 68 20 74 68 65 20 63  ndex match the c
2abf0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
2ac00 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  of the.** conten
2ac10 74 20 74 61 62 6c 65 2e 20 49 66 20 6e 6f 20 65  t table. If no e
2ac20 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
2ac30 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  the contents do 
2ac40 6d 61 74 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b  match, set *pbOk
2ac50 0a 2a 2a 20 74 6f 20 74 72 75 65 20 61 6e 64 20  .** to true and 
2ac60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ac70 2e 20 4f 72 20 69 66 20 74 68 65 20 63 6f 6e 74  . Or if the cont
2ac80 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
2ac90 68 2c 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20  h, set *pbOk.** 
2aca0 74 6f 20 66 61 6c 73 65 20 62 65 66 6f 72 65 20  to false before 
2acb0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2acc0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2acd0 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d  urs (e.g. an OOM
2ace0 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 2c 20 72   or IO error), r
2acf0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
2ad00 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 2e 20  error .** code. 
2ad10 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  The final value 
2ad20 6f 66 20 2a 70 62 4f 6b 20 69 73 20 75 6e 64 65  of *pbOk is unde
2ad30 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
2ad40 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
2ad50 74 20 66 74 73 33 49 6e 74 65 67 72 69 74 79 43  t fts3IntegrityC
2ad60 68 65 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a  heck(Fts3Table *
2ad70 70 2c 20 69 6e 74 20 2a 70 62 4f 6b 29 7b 0a 20  p, int *pbOk){. 
2ad80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ad90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2ada0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2adb0 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20  */.  u64 cksum1 
2adc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2add0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
2ade0 20 62 61 73 65 64 20 6f 6e 20 46 54 53 20 69 6e   based on FTS in
2adf0 64 65 78 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  dex contents */.
2ae00 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30    u64 cksum2 = 0
2ae10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ae20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2ae30 73 65 64 20 6f 6e 20 25 5f 63 6f 6e 74 65 6e 74  sed on %_content
2ae40 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 73   contents */.  s
2ae50 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c  qlite3_stmt *pAl
2ae60 6c 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20 20 2f  lLangid = 0;   /
2ae70 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  * Statement to r
2ae80 65 74 75 72 6e 20 61 6c 6c 20 6c 61 6e 67 75 61  eturn all langua
2ae90 67 65 2d 69 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ge-ids */..  /* 
2aea0 54 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75  This block calcu
2aeb0 6c 61 74 65 73 20 74 68 65 20 63 68 65 63 6b 73  lates the checks
2aec0 75 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  um according to 
2aed0 74 68 65 20 46 54 53 20 69 6e 64 65 78 2e 20 2a  the FTS index. *
2aee0 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
2aef0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
2af00 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26  CT_ALL_LANGID, &
2af10 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a  pAllLangid, 0);.
2af20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2af30 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
2af40 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  c2;.    sqlite3_
2af50 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e  bind_int(pAllLan
2af60 67 69 64 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76  gid, 1, p->iPrev
2af70 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  Langid);.    sql
2af80 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41  ite3_bind_int(pA
2af90 6c 6c 4c 61 6e 67 69 64 2c 20 32 2c 20 70 2d 3e  llLangid, 2, p->
2afa0 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69  nIndex);.    whi
2afb0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2afc0 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  K && sqlite3_ste
2afd0 70 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53  p(pAllLangid)==S
2afe0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2aff0 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d     int iLangid =
2b000 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2b010 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  int(pAllLangid, 
2b020 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  0);.      int i;
2b030 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2b040 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b  i<p->nIndex; i++
2b050 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  ){.        cksum
2b060 31 20 3d 20 63 6b 73 75 6d 31 20 5e 20 66 74 73  1 = cksum1 ^ fts
2b070 33 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 70  3ChecksumIndex(p
2b080 2c 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 26 72  , iLangid, i, &r
2b090 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2b0a0 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  }.    rc2 = sqli
2b0b0 74 65 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61  te3_reset(pAllLa
2b0c0 6e 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  ngid);.    if( r
2b0d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
2b0e0 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
2b0f0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 61  /* This block ca
2b100 6c 63 75 6c 61 74 65 73 20 74 68 65 20 63 68 65  lculates the che
2b110 63 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 20  cksum according 
2b120 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  to the %_content
2b130 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
2b140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  .    sqlite3_tok
2b160 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f  enizer_module co
2b170 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  nst *pModule = p
2b180 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d  ->pTokenizer->pM
2b190 6f 64 75 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  odule;.    sqlit
2b1a0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
2b1b0 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   0;.    char *zS
2b1c0 71 6c 3b 0a 20 20 20 0a 20 20 20 20 7a 53 71 6c  ql;.   .    zSql
2b1d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2b1e0 74 66 28 22 53 45 4c 45 43 54 20 25 73 22 20 2c  tf("SELECT %s" ,
2b1f0 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73   p->zReadExprlis
2b200 74 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 71  t);.    if( !zSq
2b210 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
2b220 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2b240 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2b250 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
2b260 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
2b270 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2b280 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2b290 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20    }..    while( 
2b2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b2b0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2b2c0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2b2d0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
2b2e0 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ocid = sqlite3_c
2b2f0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
2b300 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74  t, 0);.      int
2b310 20 69 4c 61 6e 67 20 3d 20 6c 61 6e 67 69 64 46   iLang = langidF
2b320 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 74  romSelect(p, pSt
2b330 6d 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  mt);.      int i
2b340 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  Col;..      for(
2b350 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iCol=0; rc==SQLI
2b360 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d  TE_OK && iCol<p-
2b370 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b  >nColumn; iCol++
2b380 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2b390 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69  ->abNotindexed[i
2b3a0 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col]==0 ){.     
2b3b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2b3c0 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
2b3d0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
2b3e0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2b3f0 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  , iCol+1);.     
2b400 20 20 20 20 20 69 6e 74 20 6e 54 65 78 74 20 3d       int nText =
2b410 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2b420 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f  bytes(pStmt, iCo
2b430 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l+1);.          
2b440 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
2b450 72 5f 63 75 72 73 6f 72 20 2a 70 54 20 3d 20 30  r_cursor *pT = 0
2b460 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ;..          rc 
2b470 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65  = sqlite3Fts3Ope
2b480 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 2d 3e 70 54  nTokenizer(p->pT
2b490 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 2c  okenizer, iLang,
2b4a0 20 7a 54 65 78 74 2c 20 6e 54 65 78 74 2c 26 70   zText, nText,&p
2b4b0 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  T);.          wh
2b4c0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2b4d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2b4e0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
2b4f0 6f 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42  oken;       /* B
2b500 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2b510 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   token */.      
2b520 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
2b530 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b540 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2b550 65 73 20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20  es in token */. 
2b560 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
2b570 44 75 6d 31 20 3d 20 30 2c 20 69 44 75 6d 32 20  Dum1 = 0, iDum2 
2b580 3d 20 30 3b 20 2f 2a 20 44 75 6d 6d 79 20 76 61  = 0; /* Dummy va
2b590 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20  riables */.     
2b5a0 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20         int iPos 
2b5b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b5c0 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   /* Position of 
2b5d0 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a  token in zText *
2b5e0 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  /..            r
2b5f0 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  c = pModule->xNe
2b600 78 74 28 70 54 2c 20 26 7a 54 6f 6b 65 6e 2c 20  xt(pT, &zToken, 
2b610 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c  &nToken, &iDum1,
2b620 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b   &iDum2, &iPos);
2b630 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b660 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
2b670 20 20 20 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b       cksum2 = ck
2b680 73 75 6d 32 20 5e 20 66 74 73 33 43 68 65 63 6b  sum2 ^ fts3Check
2b690 73 75 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20  sumEntry(.      
2b6a0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b              zTok
2b6b0 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 69 4c 61 6e  en, nToken, iLan
2b6c0 67 2c 20 30 2c 20 69 44 6f 63 69 64 2c 20 69 43  g, 0, iDocid, iC
2b6d0 6f 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20 20 20  ol, iPos.       
2b6e0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2b6f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
2b700 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b   i<p->nIndex; i+
2b710 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2b720 20 20 20 20 69 66 28 20 70 2d 3e 61 49 6e 64 65      if( p->aInde
2b730 78 5b 69 5d 2e 6e 50 72 65 66 69 78 3c 3d 6e 54  x[i].nPrefix<=nT
2b740 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  oken ){.        
2b750 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32            cksum2
2b760 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66 74 73 33   = cksum2 ^ fts3
2b770 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20  ChecksumEntry(. 
2b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b790 20 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 70 2d 3e       zToken, p->
2b7a0 61 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69  aIndex[i].nPrefi
2b7b0 78 2c 20 69 4c 61 6e 67 2c 20 69 2c 20 69 44 6f  x, iLang, i, iDo
2b7c0 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a  cid, iCol, iPos.
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7e0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20    );.           
2b7f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2b820 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2b830 54 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  T ) pModule->xCl
2b840 6f 73 65 28 70 54 29 3b 0a 20 20 20 20 20 20 20  ose(pT);.       
2b850 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b860 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
2b870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2b880 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2b890 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ..    sqlite3_fi
2b8a0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2b8b0 20 7d 0a 0a 20 20 2a 70 62 4f 6b 20 3d 20 28 63   }..  *pbOk = (c
2b8c0 6b 73 75 6d 31 3d 3d 63 6b 73 75 6d 32 29 3b 0a  ksum1==cksum2);.
2b8d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b8e0 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 69 6e  /*.** Run the in
2b8f0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 20 49  tegrity-check. I
2b900 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2b910 73 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  s and the curren
2b920 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a  t contents of.**
2b930 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 61   the FTS index a
2b940 72 65 20 63 6f 72 72 65 63 74 2c 20 72 65 74 75  re correct, retu
2b950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72  rn SQLITE_OK. Or
2b960 2c 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  , if the content
2b970 73 20 6f 66 20 74 68 65 0a 2a 2a 20 46 54 53 20  s of the.** FTS 
2b980 69 6e 64 65 78 20 61 72 65 20 69 6e 63 6f 72 72  index are incorr
2b990 65 63 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ect, return SQLI
2b9a0 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 2e  TE_CORRUPT_VTAB.
2b9b0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  .**.** Or, if an
2b9c0 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 61 6e 20   error (e.g. an 
2b9d0 4f 4f 4d 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  OOM or IO error)
2b9e0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
2b9f0 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72  an SQLite .** er
2ba00 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
2ba10 54 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  The integrity-ch
2ba20 65 63 6b 20 77 6f 72 6b 73 20 61 73 20 66 6f 6c  eck works as fol
2ba30 6c 6f 77 73 2e 20 46 6f 72 20 65 61 63 68 20 74  lows. For each t
2ba40 6f 6b 65 6e 20 61 6e 64 20 69 6e 64 65 78 65 64  oken and indexed
2ba50 20 74 6f 6b 65 6e 0a 2a 2a 20 70 72 65 66 69 78   token.** prefix
2ba60 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
2ba70 20 73 65 74 2c 20 61 20 36 34 2d 62 69 74 20 63   set, a 64-bit c
2ba80 68 65 63 6b 73 75 6d 20 69 73 20 63 61 6c 63 75  hecksum is calcu
2ba90 6c 61 74 65 64 20 28 62 79 20 63 6f 64 65 0a 2a  lated (by code.*
2baa0 2a 20 69 6e 20 66 74 73 33 43 68 65 63 6b 73 75  * in fts3Checksu
2bab0 6d 45 6e 74 72 79 28 29 29 20 62 61 73 65 64 20  mEntry()) based 
2bac0 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
2bad0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 54 68  :.**.**     + Th
2bae0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 28  e index number (
2baf0 30 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 69  0 for the main i
2bb00 6e 64 65 78 2c 20 31 20 66 6f 72 20 74 68 65 20  ndex, 1 for the 
2bb10 66 69 72 73 74 20 70 72 65 66 69 78 0a 2a 2a 20  first prefix.** 
2bb20 20 20 20 20 20 20 69 6e 64 65 78 20 65 74 63 2e        index etc.
2bb30 29 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  ),.**     + The 
2bb40 74 6f 6b 65 6e 20 28 6f 72 20 74 6f 6b 65 6e 20  token (or token 
2bb50 70 72 65 66 69 78 29 20 74 65 78 74 20 69 74 73  prefix) text its
2bb60 65 6c 66 2c 20 0a 2a 2a 20 20 20 20 20 2b 20 54  elf, .**     + T
2bb70 68 65 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 6f  he language-id o
2bb80 66 20 74 68 65 20 72 6f 77 20 69 74 20 61 70 70  f the row it app
2bb90 65 61 72 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20  ears in,.**     
2bba0 2b 20 54 68 65 20 64 6f 63 69 64 20 6f 66 20 74  + The docid of t
2bbb0 68 65 20 72 6f 77 20 69 74 20 61 70 70 65 61 72  he row it appear
2bbc0 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54  s in,.**     + T
2bbd0 68 65 20 63 6f 6c 75 6d 6e 20 69 74 20 61 70 70  he column it app
2bbe0 65 61 72 73 20 69 6e 2c 20 61 6e 64 0a 2a 2a 20  ears in, and.** 
2bbf0 20 20 20 20 2b 20 54 68 65 20 74 6f 6b 65 6e 73      + The tokens
2bc00 20 70 6f 73 69 74 69 6f 6e 20 77 69 74 68 69 6e   position within
2bc10 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a   that column..**
2bc20 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d  .** The checksum
2bc30 73 20 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65  s for all entrie
2bc40 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61  s in the index a
2bc50 72 65 20 58 4f 52 65 64 20 74 6f 67 65 74 68 65  re XORed togethe
2bc60 72 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61  r to create.** a
2bc70 20 73 69 6e 67 6c 65 20 63 68 65 63 6b 73 75 6d   single checksum
2bc80 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
2bc90 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  index..**.** The
2bca0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
2bcb0 20 63 6f 64 65 20 63 61 6c 63 75 6c 61 74 65 73   code calculates
2bcc0 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73   the same checks
2bcd0 75 6d 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a  um in two ways:.
2bce0 2a 2a 0a 2a 2a 20 20 20 20 20 31 2e 20 42 79 20  **.**     1. By 
2bcf0 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 63 6f 6e  scanning the con
2bd00 74 65 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53  tents of the FTS
2bd10 20 69 6e 64 65 78 2c 20 61 6e 64 20 0a 2a 2a 20   index, and .** 
2bd20 20 20 20 20 32 2e 20 42 79 20 73 63 61 6e 6e 69      2. By scanni
2bd30 6e 67 20 61 6e 64 20 74 6f 6b 65 6e 69 7a 69 6e  ng and tokenizin
2bd40 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  g the content ta
2bd50 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
2bd60 65 20 74 77 6f 20 63 68 65 63 6b 73 75 6d 73 20  e two checksums 
2bd70 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 74  are identical, t
2bd80 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
2bd90 63 6b 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ck is deemed to 
2bda0 68 61 76 65 0a 2a 2a 20 70 61 73 73 65 64 2e 0a  have.** passed..
2bdb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
2bdc0 73 33 44 6f 49 6e 74 65 67 72 69 74 79 43 68 65  s3DoIntegrityChe
2bdd0 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ck(.  Fts3Table 
2bde0 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
2bdf0 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
2be00 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b  ble handle */.){
2be10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2be20 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 72 63 20 3d   bOk = 0;.  rc =
2be30 20 66 74 73 33 49 6e 74 65 67 72 69 74 79 43 68   fts3IntegrityCh
2be40 65 63 6b 28 70 2c 20 26 62 4f 6b 29 3b 0a 20 20  eck(p, &bOk);.  
2be50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2be60 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 20 72 63  K && bOk==0 ) rc
2be70 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56   = FTS_CORRUPT_V
2be80 54 41 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  TAB;.  return rc
2be90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  ;.}../*.** Handl
2bea0 65 20 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e  e a 'special' IN
2beb0 53 45 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d  SERT of the form
2bec0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52  :.**.**   "INSER
2bed0 54 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20  T INTO tbl(tbl) 
2bee0 56 41 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a  VALUES(<expr>)".
2bef0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
2bf00 56 61 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Val contains the
2bf10 20 72 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72   result of <expr
2bf20 3e 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65  >. Currently the
2bf30 20 6f 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e   only .** meanin
2bf40 67 66 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e  gful value to in
2bf50 73 65 72 74 20 69 73 20 74 68 65 20 74 65 78 74  sert is the text
2bf60 20 27 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a   'optimize'..*/.
2bf70 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
2bf80 70 65 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73  pecialInsert(Fts
2bf90 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74  3Table *p, sqlit
2bfa0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b  e3_value *pVal){
2bfb0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2bfe0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2bff0 72 20 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74  r *zVal = (const
2c000 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
2c010 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
2c020 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73  ;.  int nVal = s
2c030 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2c040 65 73 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  es(pVal);..  if(
2c050 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65   !zVal ){.    re
2c060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2c070 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  M;.  }else if( n
2c080 56 61 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c  Val==8 && 0==sql
2c090 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2c0a0 61 6c 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20  al, "optimize", 
2c0b0 38 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  8) ){.    rc = f
2c0c0 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c  ts3DoOptimize(p,
2c0d0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
2c0e0 20 6e 56 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73   nVal==7 && 0==s
2c0f0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
2c100 7a 56 61 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c  zVal, "rebuild",
2c110 20 37 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   7) ){.    rc = 
2c120 66 74 73 33 44 6f 52 65 62 75 69 6c 64 28 70 29  fts3DoRebuild(p)
2c130 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  ;.  }else if( nV
2c140 61 6c 3d 3d 31 35 20 26 26 20 30 3d 3d 73 71 6c  al==15 && 0==sql
2c150 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2c160 61 6c 2c 20 22 69 6e 74 65 67 72 69 74 79 2d 63  al, "integrity-c
2c170 68 65 63 6b 22 2c 20 31 35 29 20 29 7b 0a 20 20  heck", 15) ){.  
2c180 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 74    rc = fts3DoInt
2c190 65 67 72 69 74 79 43 68 65 63 6b 28 70 29 3b 0a  egrityCheck(p);.
2c1a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
2c1b0 3e 36 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  >6 && 0==sqlite3
2c1c0 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20  _strnicmp(zVal, 
2c1d0 22 6d 65 72 67 65 3d 22 2c 20 36 29 20 29 7b 0a  "merge=", 6) ){.
2c1e0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49      rc = fts3DoI
2c1f0 6e 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61  ncrmerge(p, &zVa
2c200 6c 5b 36 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  l[6]);.  }else i
2c210 66 28 20 6e 56 61 6c 3e 31 30 20 26 26 20 30 3d  f( nVal>10 && 0=
2c220 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
2c230 70 28 7a 56 61 6c 2c 20 22 61 75 74 6f 6d 65 72  p(zVal, "automer
2c240 67 65 3d 22 2c 20 31 30 29 20 29 7b 0a 20 20 20  ge=", 10) ){.   
2c250 20 72 63 20 3d 20 66 74 73 33 44 6f 41 75 74 6f   rc = fts3DoAuto
2c260 69 6e 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56  incrmerge(p, &zV
2c270 61 6c 5b 31 30 5d 29 3b 0a 23 69 66 64 65 66 20  al[10]);.#ifdef 
2c280 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7d 65  SQLITE_TEST.  }e
2c290 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 39 20 26  lse if( nVal>9 &
2c2a0 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
2c2b0 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64  nicmp(zVal, "nod
2c2c0 65 73 69 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20  esize=", 9) ){. 
2c2d0 20 20 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20     p->nNodeSize 
2c2e0 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29  = atoi(&zVal[9])
2c2f0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2c300 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
2c310 28 20 6e 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d  ( nVal>11 && 0==
2c320 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
2c330 28 7a 56 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69  (zVal, "maxpendi
2c340 6e 67 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20  ng=", 9) ){.    
2c350 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
2c360 74 61 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b  ta = atoi(&zVal[
2c370 31 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  11]);.    rc = S
2c380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2c390 65 20 69 66 28 20 6e 56 61 6c 3e 32 31 20 26 26  e if( nVal>21 &&
2c3a0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e   0==sqlite3_strn
2c3b0 69 63 6d 70 28 7a 56 61 6c 2c 20 22 74 65 73 74  icmp(zVal, "test
2c3c0 2d 6e 6f 2d 69 6e 63 72 2d 64 6f 63 6c 69 73 74  -no-incr-doclist
2c3d0 3d 22 2c 20 32 31 29 20 29 7b 0a 20 20 20 20 70  =", 21) ){.    p
2c3e0 2d 3e 62 4e 6f 49 6e 63 72 44 6f 63 6c 69 73 74  ->bNoIncrDoclist
2c3f0 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 32 31   = atoi(&zVal[21
2c400 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ]);.    rc = SQL
2c410 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20  ITE_OK;.#endif. 
2c420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2c430 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c440 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2c450 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2c460 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 34 5f  TE_DISABLE_FTS4_
2c470 44 45 46 45 52 52 45 44 0a 2f 2a 0a 2a 2a 20 44  DEFERRED./*.** D
2c480 65 6c 65 74 65 20 61 6c 6c 20 63 61 63 68 65 64  elete all cached
2c490 20 64 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73   deferred doclis
2c4a0 74 73 2e 20 44 65 66 65 72 72 65 64 20 64 6f 63  ts. Deferred doc
2c4b0 6c 69 73 74 73 20 61 72 65 20 63 61 63 68 65 64  lists are cached
2c4c0 0a 2a 2a 20 28 61 6c 6c 6f 63 61 74 65 64 29 20  .** (allocated) 
2c4d0 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 46 74  by the sqlite3Ft
2c4e0 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44  s3CacheDeferredD
2c4f0 6f 63 6c 69 73 74 73 28 29 20 66 75 6e 63 74 69  oclists() functi
2c500 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2c510 74 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72  te3Fts3FreeDefer
2c520 72 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33  redDoclists(Fts3
2c530 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
2c540 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
2c550 65 6e 20 2a 70 44 65 66 3b 0a 20 20 66 6f 72 28  en *pDef;.  for(
2c560 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65  pDef=pCsr->pDefe
2c570 72 72 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66  rred; pDef; pDef
2c580 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pDef->pNext){. 
2c590 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69     fts3PendingLi
2c5a0 73 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70  stDelete(pDef->p
2c5b0 4c 69 73 74 29 3b 0a 20 20 20 20 70 44 65 66 2d  List);.    pDef-
2c5c0 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pList = 0;.  }.
2c5d0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
2c5e0 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  l entries in the
2c5f0 20 70 43 73 72 2d 3e 70 44 65 66 66 65 72 65 64   pCsr->pDeffered
2c600 20 6c 69 73 74 2e 20 45 6e 74 72 69 65 73 20 61   list. Entries a
2c610 72 65 20 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20  re added to .** 
2c620 74 68 69 73 20 6c 69 73 74 20 75 73 69 6e 67 20  this list using 
2c630 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72  sqlite3Fts3Defer
2c640 54 6f 6b 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Token()..*/.void
2c650 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65   sqlite3Fts3Free
2c660 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 46  DeferredTokens(F
2c670 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ts3Cursor *pCsr)
2c680 7b 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64  {.  Fts3Deferred
2c690 54 6f 6b 65 6e 20 2a 70 44 65 66 3b 0a 20 20 46  Token *pDef;.  F
2c6a0 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
2c6b0 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
2c6c0 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72  Def=pCsr->pDefer
2c6d0 72 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d  red; pDef; pDef=
2c6e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
2c6f0 74 20 3d 20 70 44 65 66 2d 3e 70 4e 65 78 74 3b  t = pDef->pNext;
2c700 0a 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67  .    fts3Pending
2c710 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65 66 2d  ListDelete(pDef-
2c720 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  >pList);.    sql
2c730 69 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b  ite3_free(pDef);
2c740 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65  .  }.  pCsr->pDe
2c750 66 65 72 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  ferred = 0;.}../
2c760 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 64 65  *.** Generate de
2c770 66 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 73 20  ferred-doclists 
2c780 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69  for all tokens i
2c790 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66  n the pCsr->pDef
2c7a0 65 72 72 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61  erred list.** ba
2c7b0 73 65 64 20 6f 6e 20 74 68 65 20 72 6f 77 20 74  sed on the row t
2c7c0 68 61 74 20 70 43 73 72 20 63 75 72 72 65 6e 74  hat pCsr current
2c7d0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
2c7e0 0a 2a 2a 20 41 20 64 65 66 65 72 72 65 64 2d 64  .** A deferred-d
2c7f0 6f 63 6c 69 73 74 20 69 73 20 6c 69 6b 65 20 61  oclist is like a
2c800 6e 79 20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74  ny other doclist
2c810 20 77 69 74 68 20 70 6f 73 69 74 69 6f 6e 20 69   with position i
2c820 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
2c830 63 6c 75 64 65 64 2c 20 65 78 63 65 70 74 20 74  cluded, except t
2c840 68 61 74 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74  hat it only cont
2c850 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
2c860 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2c870 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e   the.** table, n
2c880 6f 74 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e  ot for all rows.
2c890 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2c8a0 74 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64  ts3CacheDeferred
2c8b0 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72  Doclists(Fts3Cur
2c8c0 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
2c8d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c8e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c8f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2c900 20 20 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66    if( pCsr->pDef
2c910 65 72 72 65 64 20 29 7b 0a 20 20 20 20 69 6e 74  erred ){.    int
2c920 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
2c930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2c940 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
2c950 72 6f 75 67 68 20 74 61 62 6c 65 20 63 6f 6c 75  rough table colu
2c960 6d 6e 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  mns */.    sqlit
2c970 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b  e3_int64 iDocid;
2c980 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69           /* Doci
2c990 64 20 6f 66 20 74 68 65 20 72 6f 77 20 70 43 73  d of the row pCs
2c9a0 72 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20  r points to */. 
2c9b0 20 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54     Fts3DeferredT
2c9c0 6f 6b 65 6e 20 2a 70 44 65 66 3b 20 20 20 20 20  oken *pDef;     
2c9d0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
2c9e0 61 74 65 20 74 68 72 6f 75 67 68 20 64 65 66 65  ate through defe
2c9f0 72 72 65 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20  rred tokens */. 
2ca00 20 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20   .    Fts3Table 
2ca10 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
2ca20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
2ca30 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ab;.    sqlite3_
2ca40 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20  tokenizer *pT = 
2ca50 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20  p->pTokenizer;. 
2ca60 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e     sqlite3_token
2ca70 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73  izer_module cons
2ca80 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d  t *pModule = pT-
2ca90 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20  >pModule;.   .  
2caa0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
2cab0 69 73 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30  isRequireSeek==0
2cac0 20 29 3b 0a 20 20 20 20 69 44 6f 63 69 64 20 3d   );.    iDocid =
2cad0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2cae0 69 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d  int64(pCsr->pStm
2caf0 74 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f  t, 0);.  .    fo
2cb00 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
2cb10 75 6d 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  umn && rc==SQLIT
2cb20 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
2cb30 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e    if( p->abNotin
2cb40 64 65 78 65 64 5b 69 5d 3d 3d 30 20 29 7b 0a 20  dexed[i]==0 ){. 
2cb50 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2cb60 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73  r *zText = (cons
2cb70 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
2cb80 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73  _column_text(pCs
2cb90 72 2d 3e 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a  r->pStmt, i+1);.
2cba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2cbb0 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72  tokenizer_cursor
2cbc0 20 2a 70 54 43 20 3d 20 30 3b 0a 0a 20 20 20 20   *pTC = 0;..    
2cbd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cbe0 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65  Fts3OpenTokenize
2cbf0 72 28 70 54 2c 20 70 43 73 72 2d 3e 69 4c 61 6e  r(pT, pCsr->iLan
2cc00 67 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  gid, zText, -1, 
2cc10 26 70 54 43 29 3b 0a 20 20 20 20 20 20 20 20 77  &pTC);.        w
2cc20 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2cc30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2cc40 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f   char const *zTo
2cc50 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75  ken;       /* Bu
2cc60 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2cc70 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  token */.       
2cc80 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20     int nToken = 
2cc90 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2cca0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2ccb0 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  in token */.    
2ccc0 20 20 20 20 20 20 69 6e 74 20 69 44 75 6d 31 20        int iDum1 
2ccd0 3d 20 30 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20  = 0, iDum2 = 0; 
2cce0 2f 2a 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c  /* Dummy variabl
2ccf0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
2cd00 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 20 20 20  int iPos = 0;   
2cd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
2cd20 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69  ition of token i
2cd30 6e 20 7a 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20  n zText */..    
2cd40 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75        rc = pModu
2cd50 6c 65 2d 3e 78 4e 65 78 74 28 70 54 43 2c 20 26  le->xNext(pTC, &
2cd60 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c  zToken, &nToken,
2cd70 20 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c   &iDum1, &iDum2,
2cd80 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20   &iPos);.       
2cd90 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72     for(pDef=pCsr
2cda0 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65  ->pDeferred; pDe
2cdb0 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  f && rc==SQLITE_
2cdc0 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70  OK; pDef=pDef->p
2cdd0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
2cde0 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b     Fts3PhraseTok
2cdf0 65 6e 20 2a 70 50 54 20 3d 20 70 44 65 66 2d 3e  en *pPT = pDef->
2ce00 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  pToken;.        
2ce10 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 69      if( (pDef->i
2ce20 43 6f 6c 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  Col>=p->nColumn 
2ce30 7c 7c 20 70 44 65 66 2d 3e 69 43 6f 6c 3d 3d 69  || pDef->iCol==i
2ce40 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2ce50 20 20 26 26 20 28 70 50 54 2d 3e 62 46 69 72 73    && (pPT->bFirs
2ce60 74 3d 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29  t==0 || iPos==0)
2ce70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ce80 20 26 26 20 28 70 50 54 2d 3e 6e 3d 3d 6e 54 6f   && (pPT->n==nTo
2ce90 6b 65 6e 20 7c 7c 20 28 70 50 54 2d 3e 69 73 50  ken || (pPT->isP
2cea0 72 65 66 69 78 20 26 26 20 70 50 54 2d 3e 6e 3c  refix && pPT->n<
2ceb0 6e 54 6f 6b 65 6e 29 29 0a 20 20 20 20 20 20 20  nToken)).       
2cec0 20 20 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d           && (0==
2ced0 6d 65 6d 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20 70  memcmp(zToken, p
2cee0 50 54 2d 3e 7a 2c 20 70 50 54 2d 3e 6e 29 29 0a  PT->z, pPT->n)).
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
2cf00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
2cf10 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
2cf20 70 65 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73  pend(&pDef->pLis
2cf30 74 2c 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50  t, iDocid, i, iP
2cf40 6f 73 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  os, &rc);.      
2cf50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cf60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2cf70 20 20 20 20 20 20 69 66 28 20 70 54 43 20 29 20        if( pTC ) 
2cf80 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
2cf90 70 54 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pTC);.        if
2cfa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
2cfb0 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
2cfc0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2cfd0 7d 0a 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d  }..    for(pDef=
2cfe0 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b  pCsr->pDeferred;
2cff0 20 70 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c   pDef && rc==SQL
2d000 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65  ITE_OK; pDef=pDe
2d010 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  f->pNext){.     
2d020 20 69 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74   if( pDef->pList
2d030 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2d040 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
2d050 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44  AppendVarint(&pD
2d060 65 66 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20  ef->pList, 0);. 
2d070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d080 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2d090 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
2d0a0 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69  3DeferredTokenLi
2d0b0 73 74 28 0a 20 20 46 74 73 33 44 65 66 65 72 72  st(.  Fts3Deferr
2d0c0 65 64 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63  edToken *p, .  c
2d0d0 68 61 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20  har **ppData, . 
2d0e0 20 69 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a   int *pnData.){.
2d0f0 20 20 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20    char *pRet;.  
2d100 69 6e 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c  int nSkip;.  sql
2d110 69 74 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79  ite3_int64 dummy
2d120 3b 0a 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30  ;..  *ppData = 0
2d130 3b 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b  ;.  *pnData = 0;
2d140 0a 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74  ..  if( p->pList
2d150 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2d160 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2d170 0a 0a 20 20 70 52 65 74 20 3d 20 28 63 68 61 72  ..  pRet = (char
2d180 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2d190 63 28 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74  c(p->pList->nDat
2d1a0 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20  a);.  if( !pRet 
2d1b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2d1c0 4e 4f 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20  NOMEM;..  nSkip 
2d1d0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
2d1e0 56 61 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d  Varint(p->pList-
2d1f0 3e 61 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b  >aData, &dummy);
2d200 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e  .  *pnData = p->
2d210 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e  pList->nData - n
2d220 53 6b 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20  Skip;.  *ppData 
2d230 3d 20 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d  = pRet;.  .  mem
2d240 63 70 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c  cpy(pRet, &p->pL
2d250 69 73 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70  ist->aData[nSkip
2d260 5d 2c 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72  ], *pnData);.  r
2d270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
2d290 20 65 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e   entry for token
2d2a0 20 70 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70   pToken to the p
2d2b0 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c  Csr->pDeferred l
2d2c0 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
2d2d0 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65  te3Fts3DeferToke
2d2e0 6e 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  n(.  Fts3Cursor 
2d2f0 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
2d300 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
2d310 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46  le cursor */.  F
2d320 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
2d330 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
2d340 2a 20 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72  * Token to defer
2d350 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d370 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2d380 74 68 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20  that token must 
2d390 61 70 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31  appear in (or -1
2d3a0 29 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65  ) */.){.  Fts3De
2d3b0 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
2d3c0 66 65 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72  ferred;.  pDefer
2d3d0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  red = sqlite3_ma
2d3e0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65  lloc(sizeof(*pDe
2d3f0 66 65 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20  ferred));.  if( 
2d400 21 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20  !pDeferred ){.  
2d410 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d420 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
2d430 73 65 74 28 70 44 65 66 65 72 72 65 64 2c 20 30  set(pDeferred, 0
2d440 2c 20 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72  , sizeof(*pDefer
2d450 72 65 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72  red));.  pDeferr
2d460 65 64 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f  ed->pToken = pTo
2d470 6b 65 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64  ken;.  pDeferred
2d480 2d 3e 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e  ->pNext = pCsr->
2d490 70 44 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44  pDeferred; .  pD
2d4a0 65 66 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20  eferred->iCol = 
2d4b0 69 43 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44  iCol;.  pCsr->pD
2d4c0 65 66 65 72 72 65 64 20 3d 20 70 44 65 66 65 72  eferred = pDefer
2d4d0 72 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  red;..  assert( 
2d4e0 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65  pToken->pDeferre
2d4f0 64 3d 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e  d==0 );.  pToken
2d500 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20 70 44  ->pDeferred = pD
2d510 65 66 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75  eferred;..  retu
2d520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d530 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 51  #endif../*.** SQ
2d540 4c 69 74 65 20 76 61 6c 75 65 20 70 52 6f 77 69  Lite value pRowi
2d550 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  d contains the r
2d560 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 68  owid of a row th
2d570 61 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  at may or may no
2d580 74 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20  t be.** present 
2d590 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  in the FTS3 tabl
2d5a0 65 2e 20 49 66 20 69 74 20 69 73 2c 20 64 65 6c  e. If it is, del
2d5b0 65 74 65 20 69 74 20 61 6e 64 20 61 64 6a 75 73  ete it and adjus
2d5c0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
2d5d0 2a 20 6f 66 20 73 75 62 73 69 64 75 61 72 79 20  * of subsiduary 
2d5e0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
2d5f0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
2d600 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
2d610 65 6c 65 74 65 42 79 52 6f 77 69 64 28 0a 20 20  eleteByRowid(.  
2d620 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20  Fts3Table *p, . 
2d630 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d640 70 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 2a  pRowid, .  int *
2d650 70 6e 43 68 6e 67 2c 20 20 20 20 20 20 20 20 20  pnChng,         
2d660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2d670 2f 4f 55 54 3a 20 44 65 63 72 65 6d 65 6e 74 20  /OUT: Decrement 
2d680 69 66 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65  if row is delete
2d690 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44  d */.  u32 *aSzD
2d6a0 65 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  el.){.  int rc =
2d6b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d6c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d6d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2d6e0 62 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20  bFound = 0;     
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d700 72 75 65 20 69 66 20 2a 70 52 6f 77 69 64 20 72  rue if *pRowid r
2d710 65 61 6c 6c 79 20 69 73 20 69 6e 20 74 68 65 20  eally is in the 
2d720 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 66 74 73 33  table */..  fts3
2d730 44 65 6c 65 74 65 54 65 72 6d 73 28 26 72 63 2c  DeleteTerms(&rc,
2d740 20 70 2c 20 70 52 6f 77 69 64 2c 20 61 53 7a 44   p, pRowid, aSzD
2d750 65 6c 2c 20 26 62 46 6f 75 6e 64 29 3b 0a 20 20  el, &bFound);.  
2d760 69 66 28 20 62 46 6f 75 6e 64 20 26 26 20 72 63  if( bFound && rc
2d770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d780 20 20 20 69 6e 74 20 69 73 45 6d 70 74 79 20 3d     int isEmpty =
2d790 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d7a0 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 2a 70 52   /* Deleting *pR
2d7b0 6f 77 69 64 20 6c 65 61 76 65 73 20 74 68 65 20  owid leaves the 
2d7c0 74 61 62 6c 65 20 65 6d 70 74 79 20 2a 2f 0a 20  table empty */. 
2d7d0 20 20 20 72 63 20 3d 20 66 74 73 33 49 73 45 6d     rc = fts3IsEm
2d7e0 70 74 79 28 70 2c 20 70 52 6f 77 69 64 2c 20 26  pty(p, pRowid, &
2d7f0 69 73 45 6d 70 74 79 29 3b 0a 20 20 20 20 69 66  isEmpty);.    if
2d800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d810 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 45  ){.      if( isE
2d820 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  mpty ){.        
2d830 2f 2a 20 44 65 6c 65 74 69 6e 67 20 74 68 69 73  /* Deleting this
2d840 20 72 6f 77 20 6d 65 61 6e 73 20 74 68 65 20 77   row means the w
2d850 68 6f 6c 65 20 74 61 62 6c 65 20 69 73 20 65 6d  hole table is em
2d860 70 74 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pty. In this cas
2d870 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 6c  e.        ** del
2d880 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ete the contents
2d890 20 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 74 61   of all three ta
2d8a0 62 6c 65 73 20 61 6e 64 20 74 68 72 6f 77 20 61  bles and throw a
2d8b0 77 61 79 20 61 6e 79 0a 20 20 20 20 20 20 20 20  way any.        
2d8c0 2a 2a 20 64 61 74 61 20 69 6e 20 74 68 65 20 70  ** data in the p
2d8d0 65 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68  endingTerms hash
2d8e0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
2d8f0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c      rc = fts3Del
2d900 65 74 65 41 6c 6c 28 70 2c 20 31 29 3b 0a 20 20  eteAll(p, 1);.  
2d910 20 20 20 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20        *pnChng = 
2d920 30 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  0;.        memse
2d930 74 28 61 53 7a 44 65 6c 2c 20 30 2c 20 73 69 7a  t(aSzDel, 0, siz
2d940 65 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e  eof(u32) * (p->n
2d950 43 6f 6c 75 6d 6e 2b 31 29 20 2a 20 32 29 3b 0a  Column+1) * 2);.
2d960 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d970 20 20 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20 2a       *pnChng = *
2d980 70 6e 43 68 6e 67 20 2d 20 31 3b 0a 20 20 20 20  pnChng - 1;.    
2d990 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74      if( p->zCont
2d9a0 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  entTbl==0 ){.   
2d9b0 20 20 20 20 20 20 20 66 74 73 33 53 71 6c 45 78         fts3SqlEx
2d9c0 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44  ec(&rc, p, SQL_D
2d9d0 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26  ELETE_CONTENT, &
2d9e0 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  pRowid);.       
2d9f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
2da00 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
2da10 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 53  .          fts3S
2da20 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
2da30 51 4c 5f 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a  QL_DELETE_DOCSIZ
2da40 45 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20  E, &pRowid);.   
2da50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2da60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2da70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2da80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
2da90 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20  es the work for 
2daa0 74 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68  the xUpdate meth
2dab0 6f 64 20 6f 66 20 46 54 53 33 20 76 69 72 74 75  od of FTS3 virtu
2dac0 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68  al.** tables. Th
2dad0 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20  e schema of the 
2dae0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62 65  virtual table be
2daf0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ing:.**.**     C
2db00 52 45 41 54 45 20 54 41 42 4c 45 20 3c 74 61 62  REATE TABLE <tab
2db10 6c 65 20 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20 20  le name>( .**   
2db20 20 20 20 20 3c 75 73 65 72 20 63 6f 6c 75 6d 6e      <user column
2db30 73 3e 2c 0a 2a 2a 20 20 20 20 20 20 20 3c 74 61  s>,.**       <ta
2db40 62 6c 65 20 6e 61 6d 65 3e 20 48 49 44 44 45 4e  ble name> HIDDEN
2db50 2c 20 0a 2a 2a 20 20 20 20 20 20 20 64 6f 63 69  , .**       doci
2db60 64 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20  d HIDDEN, .**   
2db70 20 20 20 20 3c 6c 61 6e 67 69 64 3e 20 48 49 44      <langid> HID
2db80 44 45 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a  DEN.**     );.**
2db90 0a 2a 2a 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  .** .*/.int sqli
2dba0 74 65 33 46 74 73 33 55 70 64 61 74 65 4d 65 74  te3Fts3UpdateMet
2dbb0 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  hod(.  sqlite3_v
2dbc0 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20  tab *pVtab,     
2dbd0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 76         /* FTS3 v
2dbe0 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tab object */.  
2dbf0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc10 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d  /* Size of argum
2dc20 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
2dc30 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2dc40 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  pVal,          /
2dc50 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
2dc60 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ents */.  sqlite
2dc70 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 20 20  _int64 *pRowid  
2dc80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2dc90 3a 20 54 68 65 20 61 66 66 65 63 74 65 64 20 28  : The affected (
2dca0 6f 72 20 65 66 66 65 63 74 65 64 29 20 72 6f 77  or effected) row
2dcb0 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54  id */.){.  Fts3T
2dcc0 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
2dcd0 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20  able *)pVtab;.  
2dce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2dcf0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2dd00 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2dd10 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20  /.  u32 *aSzIns 
2dd20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2dd30 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2dd40 69 6e 73 65 72 74 65 64 20 64 6f 63 75 6d 65 6e  inserted documen
2dd50 74 73 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a  ts */.  u32 *aSz
2dd60 44 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Del = 0;        
2dd70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
2dd80 20 6f 66 20 64 65 6c 65 74 65 64 20 64 6f 63 75   of deleted docu
2dd90 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ments */.  int n
2dda0 43 68 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Chng = 0;       
2ddb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2ddc0 74 20 63 68 61 6e 67 65 20 69 6e 20 6e 75 6d 62  t change in numb
2ddd0 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  er of documents 
2dde0 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74  */.  int bInsert
2ddf0 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Done = 0;..  /* 
2de00 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
2de10 20 6d 75 73 74 20 62 65 20 6b 6e 6f 77 6e 20 69   must be known i
2de20 66 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62  f the %_stat tab
2de30 6c 65 20 65 78 69 73 74 73 20 6f 72 20 6e 6f 74  le exists or not
2de40 2e 0a 20 20 2a 2a 20 53 6f 20 62 48 61 73 53 74  ..  ** So bHasSt
2de50 61 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 32 2e  at may not be 2.
2de60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2de70 2d 3e 62 48 61 73 53 74 61 74 3d 3d 30 20 7c 7c  ->bHasStat==0 ||
2de80 20 70 2d 3e 62 48 61 73 53 74 61 74 3d 3d 31 20   p->bHasStat==1 
2de90 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  );..  assert( p-
2dea0 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
2deb0 0a 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20  .  assert( .    
2dec0 20 20 6e 41 72 67 3d 3d 31 20 20 20 20 20 20 20    nArg==1       
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dee0 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2def0 6e 73 20 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67  ns */.   || nArg
2df00 3d 3d 28 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d  ==(2 + p->nColum
2df10 6e 20 2b 20 33 29 20 20 2f 2a 20 49 4e 53 45 52  n + 3)  /* INSER
2df20 54 20 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72  T or UPDATE oper
2df30 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a  ations */.  );..
2df40 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
2df50 20 22 73 70 65 63 69 61 6c 22 20 49 4e 53 45 52   "special" INSER
2df60 54 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65  T operation. One
2df70 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
2df80 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54  **.  **   INSERT
2df90 20 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56   INTO xyz(xyz) V
2dfa0 41 4c 55 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29  ALUES('command')
2dfb0 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72  ;.  */.  if( nAr
2dfc0 67 3e 31 20 0a 20 20 20 26 26 20 73 71 6c 69 74  g>1 .   && sqlit
2dfd0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
2dfe0 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  Val[0])==SQLITE_
2dff0 4e 55 4c 4c 20 0a 20 20 20 26 26 20 73 71 6c 69  NULL .   && sqli
2e000 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
2e010 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
2e020 32 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  2])!=SQLITE_NULL
2e030 20 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   .  ){.    rc = 
2e040 66 74 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72  fts3SpecialInser
2e050 74 28 70 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43  t(p, apVal[p->nC
2e060 6f 6c 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67  olumn+2]);.    g
2e070 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a  oto update_out;.
2e080 20 20 7d 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e    }..  if( nArg>
2e090 31 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  1 && sqlite3_val
2e0a0 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b  ue_int(apVal[2 +
2e0b0 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d   p->nColumn + 2]
2e0c0 29 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  )<0 ){.    rc = 
2e0d0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2e0e0 54 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  T;.    goto upda
2e0f0 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  te_out;.  }..  /
2e100 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
2e110 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 63 68 61   to hold the cha
2e120 6e 67 65 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20  nge in document 
2e130 73 69 7a 65 73 20 2a 2f 0a 20 20 61 53 7a 44 65  sizes */.  aSzDe
2e140 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  l = sqlite3_mall
2e150 6f 63 28 20 73 69 7a 65 6f 66 28 61 53 7a 44 65  oc( sizeof(aSzDe
2e160 6c 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d  l[0])*(p->nColum
2e170 6e 2b 31 29 2a 32 20 29 3b 0a 20 20 69 66 28 20  n+1)*2 );.  if( 
2e180 61 53 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  aSzDel==0 ){.   
2e190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2e1a0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64  EM;.    goto upd
2e1b0 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61  ate_out;.  }.  a
2e1c0 53 7a 49 6e 73 20 3d 20 26 61 53 7a 44 65 6c 5b  SzIns = &aSzDel[
2e1d0 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20  p->nColumn+1];. 
2e1e0 20 6d 65 6d 73 65 74 28 61 53 7a 44 65 6c 2c 20   memset(aSzDel, 
2e1f0 30 2c 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c  0, sizeof(aSzDel
2e200 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e  [0])*(p->nColumn
2e210 2b 31 29 2a 32 29 3b 0a 0a 20 20 72 63 20 3d 20  +1)*2);..  rc = 
2e220 66 74 73 33 57 72 69 74 65 6c 6f 63 6b 28 70 29  fts3Writelock(p)
2e230 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2e240 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 75 70 64  TE_OK ) goto upd
2e250 61 74 65 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49  ate_out;..  /* I
2e260 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53  f this is an INS
2e270 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  ERT operation, o
2e280 72 20 61 6e 20 55 50 44 41 54 45 20 74 68 61 74  r an UPDATE that
2e290 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 72 6f   modifies the ro
2e2a0 77 69 64 0a 20 20 2a 2a 20 76 61 6c 75 65 2c 20  wid.  ** value, 
2e2b0 74 68 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74  then this operat
2e2c0 69 6f 6e 20 72 65 71 75 69 72 65 73 20 63 6f 6e  ion requires con
2e2d0 73 74 72 61 69 6e 74 20 68 61 6e 64 6c 69 6e 67  straint handling
2e2e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
2e2f0 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d  he on-conflict m
2e300 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20  ode is REPLACE, 
2e310 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
2e320 74 68 65 20 65 78 69 73 74 69 6e 67 20 72 6f 77  the existing row
2e330 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  .  ** should be 
2e340 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
2e350 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2e360 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e   inserting the n
2e370 65 77 20 72 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a  ew row. Or,.  **
2e380 20 69 66 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c   if the on-confl
2e390 69 63 74 20 6d 6f 64 65 20 69 73 20 6f 74 68 65  ict mode is othe
2e3a0 72 20 74 68 61 6e 20 52 45 50 4c 41 43 45 2c 20  r than REPLACE, 
2e3b0 74 68 65 6e 20 74 68 69 73 20 6d 65 74 68 6f 64  then this method
2e3c0 20 6d 75 73 74 0a 20 20 2a 2a 20 64 65 74 65 63   must.  ** detec
2e3d0 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  t the conflict a
2e3e0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
2e3f0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 62 65 66 6f  _CONSTRAINT befo
2e400 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  re beginning to.
2e410 20 20 2a 2a 20 6d 6f 64 69 66 79 20 74 68 65 20    ** modify the 
2e420 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2e430 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   */.  if( nArg>1
2e440 20 26 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54   && p->zContentT
2e450 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  bl==0 ){.    /* 
2e460 46 69 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Find the value o
2e470 62 6a 65 63 74 20 74 68 61 74 20 68 6f 6c 64 73  bject that holds
2e480 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 76   the new rowid v
2e490 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  alue. */.    sql
2e4a0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4e 65 77  ite3_value *pNew
2e4b0 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 33 2b  Rowid = apVal[3+
2e4c0 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20  p->nColumn];.   
2e4d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
2e4e0 75 65 5f 74 79 70 65 28 70 4e 65 77 52 6f 77 69  ue_type(pNewRowi
2e4f0 64 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  d)==SQLITE_NULL 
2e500 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 52 6f 77  ){.      pNewRow
2e510 69 64 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20  id = apVal[1];. 
2e520 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
2e530 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2e540 28 70 4e 65 77 52 6f 77 69 64 29 21 3d 53 51 4c  (pNewRowid)!=SQL
2e550 49 54 45 5f 4e 55 4c 4c 20 26 26 20 28 20 0a 20  ITE_NULL && ( . 
2e560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
2e570 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
2e580 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
2e590 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
2e5a0 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56  _value_int64(apV
2e5b0 61 6c 5b 30 5d 29 21 3d 73 71 6c 69 74 65 33 5f  al[0])!=sqlite3_
2e5c0 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 4e 65 77  value_int64(pNew
2e5d0 52 6f 77 69 64 29 0a 20 20 20 20 29 29 7b 0a 20  Rowid).    )){. 
2e5e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2e5f0 72 6f 77 69 64 20 69 73 20 6e 6f 74 20 4e 55 4c  rowid is not NUL
2e600 4c 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 20  L (in this case 
2e610 74 68 65 20 72 6f 77 69 64 20 77 69 6c 6c 20 62  the rowid will b
2e620 65 0a 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d  e.      ** autom
2e630 61 74 69 63 61 6c 6c 79 20 61 73 73 69 67 6e 65  atically assigne
2e640 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  d and there is n
2e650 6f 20 63 68 61 6e 63 65 20 6f 66 20 61 20 63 6f  o chance of a co
2e660 6e 66 6c 69 63 74 29 2c 20 61 6e 64 20 0a 20 20  nflict), and .  
2e670 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
2e680 6d 65 6e 74 20 69 73 20 65 69 74 68 65 72 20 61  ment is either a
2e690 6e 20 49 4e 53 45 52 54 20 6f 72 20 61 6e 20 55  n INSERT or an U
2e6a0 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64 69 66  PDATE that modif
2e6b0 69 65 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ies the.      **
2e6c0 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 53   rowid column. S
2e6d0 6f 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63  o if the conflic
2e6e0 74 20 6d 6f 64 65 20 69 73 20 52 45 50 4c 41 43  t mode is REPLAC
2e6f0 45 2c 20 74 68 65 6e 20 64 65 6c 65 74 65 20 61  E, then delete a
2e700 6e 79 0a 20 20 20 20 20 20 2a 2a 20 65 78 69 73  ny.      ** exis
2e710 74 69 6e 67 20 72 6f 77 20 77 69 74 68 20 72 6f  ting row with ro
2e720 77 69 64 3d 70 4e 65 77 52 6f 77 69 64 2e 20 0a  wid=pNewRowid. .
2e730 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e740 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e  * Or, if the con
2e750 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20 6e 6f  flict mode is no
2e760 74 20 52 45 50 4c 41 43 45 2c 20 69 6e 73 65 72  t REPLACE, inser
2e770 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  t the new record
2e780 20 69 6e 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20   into .      ** 
2e790 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
2e7a0 62 6c 65 2e 20 49 66 20 77 65 20 68 69 74 20 74  ble. If we hit t
2e7b0 68 65 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  he duplicate row
2e7c0 69 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 6f  id constraint (o
2e7d0 72 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  r any.      ** o
2e7e0 74 68 65 72 20 65 72 72 6f 72 29 20 77 68 69 6c  ther error) whil
2e7f0 65 20 64 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75  e doing so, retu
2e800 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  rn immediately..
2e810 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e820 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
2e830 79 20 61 6c 73 6f 20 72 75 6e 20 69 66 20 70 4e  y also run if pN
2e840 65 77 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73  ewRowid contains
2e850 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 63 61   a value that ca
2e860 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  nnot.      ** be
2e870 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76   losslessly conv
2e880 65 72 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  erted to an inte
2e890 67 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ger. In this cas
2e8a0 65 2c 20 74 68 65 20 65 76 65 6e 74 75 61 6c 20  e, the eventual 
2e8b0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
2e8c0 6f 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61  o fts3InsertData
2e8d0 28 29 20 28 65 69 74 68 65 72 20 6a 75 73 74 20  () (either just 
2e8e0 62 65 6c 6f 77 20 6f 72 20 66 75 72 74 68 65 72  below or further
2e8f0 20 6f 6e 20 69 6e 20 74 68 69 73 0a 20 20 20 20   on in this.    
2e900 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 29 20 77    ** function) w
2e910 69 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ill return SQLIT
2e920 45 5f 4d 49 53 4d 41 54 43 48 2e 20 49 66 20 66  E_MISMATCH. If f
2e930 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64  ts3DeleteByRowid
2e940 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e   is .      ** in
2e950 76 6f 6b 65 64 2c 20 69 74 20 77 69 6c 6c 20 64  voked, it will d
2e960 65 6c 65 74 65 20 7a 65 72 6f 20 72 6f 77 73 20  elete zero rows 
2e970 28 73 69 6e 63 65 20 6e 6f 20 72 6f 77 20 77 69  (since no row wi
2e980 6c 6c 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  ll have.      **
2e990 20 64 6f 63 69 64 3d 24 70 4e 65 77 52 6f 77 69   docid=$pNewRowi
2e9a0 64 20 69 66 20 24 70 4e 65 77 52 6f 77 69 64 20  d if $pNewRowid 
2e9b0 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
2e9c0 72 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 20 20  r value)..      
2e9d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
2e9e0 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e  ite3_vtab_on_con
2e9f0 66 6c 69 63 74 28 70 2d 3e 64 62 29 3d 3d 53 51  flict(p->db)==SQ
2ea00 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a  LITE_REPLACE ){.
2ea10 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2ea20 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64 28 70  3DeleteByRowid(p
2ea30 2c 20 70 4e 65 77 52 6f 77 69 64 2c 20 26 6e 43  , pNewRowid, &nC
2ea40 68 6e 67 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20  hng, aSzDel);.  
2ea50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ea60 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65     rc = fts3Inse
2ea70 72 74 44 61 74 61 28 70 2c 20 61 70 56 61 6c 2c  rtData(p, apVal,
2ea80 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   pRowid);.      
2ea90 20 20 62 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20    bInsertDone = 
2eaa0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2eab0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
2eac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ead0 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b  goto update_out;
2eae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2eaf0 69 73 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f  is is a DELETE o
2eb00 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  r UPDATE operati
2eb10 6f 6e 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 6f  on, remove the o
2eb20 6c 64 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20  ld record. */.  
2eb30 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
2eb40 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29  e_type(apVal[0])
2eb50 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  !=SQLITE_NULL ){
2eb60 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2eb70 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
2eb80 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54  apVal[0])==SQLIT
2eb90 45 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  E_INTEGER );.   
2eba0 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65   rc = fts3Delete
2ebb0 42 79 52 6f 77 69 64 28 70 2c 20 61 70 56 61 6c  ByRowid(p, apVal
2ebc0 5b 30 5d 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a  [0], &nChng, aSz
2ebd0 44 65 6c 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Del);.  }.  .  /
2ebe0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2ebf0 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
2ec00 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65   operation, inse
2ec10 72 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  rt the new recor
2ec20 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  d. */.  if( nArg
2ec30 3e 31 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >1 && rc==SQLITE
2ec40 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
2ec50 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33  Langid = sqlite3
2ec60 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2ec70 5b 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  [2 + p->nColumn 
2ec80 2b 20 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 62  + 2]);.    if( b
2ec90 49 6e 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b  InsertDone==0 ){
2eca0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
2ecb0 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70  InsertData(p, ap
2ecc0 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20  Val, pRowid);.  
2ecd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ece0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
2ecf0 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d   p->zContentTbl=
2ed00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2ed10 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56   = FTS_CORRUPT_V
2ed20 54 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TAB;.      }.   
2ed30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2ed40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ed50 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
2ed60 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20  ngTermsDocid(p, 
2ed70 30 2c 20 69 4c 61 6e 67 69 64 2c 20 2a 70 52 6f  0, iLangid, *pRo
2ed80 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
2ed90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2eda0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2edb0 74 28 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  t( p->iPrevDocid
2edc0 3d 3d 2a 70 52 6f 77 69 64 20 29 3b 0a 20 20 20  ==*pRowid );.   
2edd0 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65     rc = fts3Inse
2ede0 72 74 54 65 72 6d 73 28 70 2c 20 69 4c 61 6e 67  rtTerms(p, iLang
2edf0 69 64 2c 20 61 70 56 61 6c 2c 20 61 53 7a 49 6e  id, apVal, aSzIn
2ee00 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
2ee10 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65  ( p->bHasDocsize
2ee20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 49 6e   ){.      fts3In
2ee30 73 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c  sertDocsize(&rc,
2ee40 20 70 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20   p, aSzIns);.   
2ee50 20 7d 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a   }.    nChng++;.
2ee60 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 46    }..  if( p->bF
2ee70 74 73 34 20 29 7b 0a 20 20 20 20 66 74 73 33 55  ts4 ){.    fts3U
2ee80 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 26  pdateDocTotals(&
2ee90 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61  rc, p, aSzIns, a
2eea0 53 7a 44 65 6c 2c 20 6e 43 68 6e 67 29 3b 0a 20  SzDel, nChng);. 
2eeb0 20 7d 0a 0a 20 75 70 64 61 74 65 5f 6f 75 74 3a   }.. update_out:
2eec0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2eed0 61 53 7a 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aSzDel);.  sqlit
2eee0 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c  e3Fts3SegmentsCl
2eef0 6f 73 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ose(p);.  return
2ef00 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46   rc;.}../* .** F
2ef10 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 69 6e  lush any data in
2ef20 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
2ef30 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ms hash table to
2ef40 20 64 69 73 6b 2e 20 49 66 20 73 75 63 63 65 73   disk. If succes
2ef50 73 66 75 6c 2c 0a 2a 2a 20 6d 65 72 67 65 20 61  sful,.** merge a
2ef60 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ll segments in t
2ef70 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 63  he database (inc
2ef80 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 73  luding the new s
2ef90 65 67 6d 65 6e 74 2c 20 69 66 20 0a 2a 2a 20 74  egment, if .** t
2efa0 68 65 72 65 20 77 61 73 20 61 6e 79 20 64 61 74  here was any dat
2efb0 61 20 74 6f 20 66 6c 75 73 68 29 20 69 6e 74 6f  a to flush) into
2efc0 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
2efd0 74 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t. .*/.int sqlit
2efe0 65 33 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 46  e3Fts3Optimize(F
2eff0 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
2f000 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
2f010 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2f020 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 66 74  b, "SAVEPOINT ft
2f030 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
2f040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f050 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  OK ){.    rc = f
2f060 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c  ts3DoOptimize(p,
2f070 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   1);.    if( rc=
2f080 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
2f090 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2f0a0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
2f0b0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2f0c0 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 66 74  >db, "RELEASE ft
2f0d0 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
2f0e0 20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51       if( rc2!=SQ
2f0f0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
2f100 63 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c2;.    }else{. 
2f110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
2f120 63 28 70 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41  c(p->db, "ROLLBA
2f130 43 4b 20 54 4f 20 66 74 73 33 22 2c 20 30 2c 20  CK TO fts3", 0, 
2f140 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
2f150 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2f160 20 22 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c   "RELEASE fts3",
2f170 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
2f180 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
2f190 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
2f1a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2f1b0 0a 7d 0a 0a 23 65 6e 64 69 66 0a                 .}..#endif.