/ Hex Artifact Content
Login

Artifact ceb65d6a85f44c7dd1d96f12d04e20f75884bfe3:


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 69 6e 74 20 62 4c 6f   PT */.  int bLo
12e0: 6f 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20  okup;           
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 0a 20 20 73 71 6c 69 74 65 33  ly */..  sqlite3
1320: 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f  _int64 iStartBlo
1330: 63 6b 3b 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ck;      /* Rowi
1340: 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66 20  d of first leaf 
1350: 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65 72 73  block to travers
1360: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
1370: 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f  nt64 iLeafEndBlo
1380: 63 6b 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  ck;    /* Rowid 
1390: 6f 66 20 66 69 6e 61 6c 20 6c 65 61 66 20 62 6c  of final leaf bl
13a0: 6f 63 6b 20 74 6f 20 74 72 61 76 65 72 73 65 20  ock to traverse 
13b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
13c0: 36 34 20 69 45 6e 64 42 6c 6f 63 6b 3b 20 20 20  64 iEndBlock;   
13d0: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66       /* Rowid of
13e0: 20 66 69 6e 61 6c 20 62 6c 6f 63 6b 20 69 6e 20   final block in 
13f0: 73 65 67 6d 65 6e 74 20 28 6f 72 20 30 29 20 2a  segment (or 0) *
1400: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1410: 34 20 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3b  4 iCurrentBlock;
1420: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
1430: 65 61 66 20 62 6c 6f 63 6b 20 28 6f 72 20 30 29  eaf block (or 0)
1440: 20 2a 2f 0a 0a 20 20 63 68 61 72 20 2a 61 4e 6f   */..  char *aNo
1450: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1460: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1470: 72 20 74 6f 20 6e 6f 64 65 20 64 61 74 61 20 28  r to node data (
1480: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
1490: 74 20 6e 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  t nNode;        
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
14c0: 61 74 20 61 4e 6f 64 65 20 28 6f 72 20 30 29 20  at aNode (or 0) 
14d0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 75 6c 61  */.  int nPopula
14e0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
14f0: 20 20 20 20 20 2f 2a 20 49 66 20 3e 30 2c 20 62       /* If >0, b
1500: 79 74 65 73 20 6f 66 20 62 75 66 66 65 72 20 61  ytes of buffer a
1510: 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65 64 20 2a 2f  Node[] loaded */
1520: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
1530: 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20  *pBlob;         
1540: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
1550: 4c 2c 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 74  L, blob handle t
1560: 6f 20 72 65 61 64 20 6e 6f 64 65 20 2a 2f 0a 0a  o read node */..
1570: 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a    Fts3HashElem *
1580: 2a 70 70 4e 65 78 74 45 6c 65 6d 3b 0a 0a 20 20  *ppNextElem;..  
1590: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 73 65 74  /* Variables set
15a0: 20 62 79 20 66 74 73 33 53 65 67 52 65 61 64 65   by fts3SegReade
15b0: 72 4e 65 78 74 28 29 2e 20 54 68 65 73 65 20 6d  rNext(). These m
15c0: 61 79 20 62 65 20 72 65 61 64 20 64 69 72 65 63  ay be read direc
15d0: 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
15e0: 63 61 6c 6c 65 72 2e 20 54 68 65 79 20 61 72 65  caller. They are
15f0: 20 76 61 6c 69 64 20 66 72 6f 6d 20 74 68 65 20   valid from the 
1600: 74 69 6d 65 20 53 65 67 6d 65 6e 74 52 65 61 64  time SegmentRead
1610: 65 72 4e 65 77 28 29 20 72 65 74 75 72 6e 73 0a  erNew() returns.
1620: 20 20 2a 2a 20 75 6e 74 69 6c 20 53 65 67 6d 65    ** until Segme
1630: 6e 74 52 65 61 64 65 72 4e 65 78 74 28 29 20 72  ntReaderNext() r
1640: 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
1650: 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1660: 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28 69 2e 65 2e  TE_OK.  ** (i.e.
1670: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 2e 0a 20   SQLITE_DONE).. 
1680: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16b0: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72  of bytes in curr
16c0: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 63 68  ent term */.  ch
16d0: 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
1700: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
1710: 74 20 6e 54 65 72 6d 41 6c 6c 6f 63 3b 20 20 20  t nTermAlloc;   
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1730: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
1740: 6f 66 20 7a 54 65 72 6d 20 62 75 66 66 65 72 20  of zTerm buffer 
1750: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63 6c  */.  char *aDocl
1760: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1770: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1780: 74 6f 20 64 6f 63 6c 69 73 74 20 6f 66 20 63 75  to doclist of cu
1790: 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
17a0: 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20   int nDoclist;  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c   /* Size of docl
17d0: 69 73 74 20 69 6e 20 63 75 72 72 65 6e 74 20 65  ist in current e
17e0: 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  ntry */..  /* Th
17f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1800: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 62  ables are used b
1810: 79 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  y fts3SegReaderN
1820: 65 78 74 44 6f 63 69 64 28 29 20 74 6f 20 69 74  extDocid() to it
1830: 65 72 61 74 65 20 0a 20 20 2a 2a 20 74 68 72 6f  erate .  ** thro
1840: 75 67 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ugh the current 
1850: 64 6f 63 6c 69 73 74 20 28 61 44 6f 63 6c 69 73  doclist (aDoclis
1860: 74 2f 6e 44 6f 63 6c 69 73 74 29 2e 0a 20 20 2a  t/nDoclist)..  *
1870: 2f 0a 20 20 63 68 61 72 20 2a 70 4f 66 66 73 65  /.  char *pOffse
1880: 74 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 4f 66  tList;.  int nOf
1890: 66 73 65 74 4c 69 73 74 3b 20 20 20 20 20 20 20  fsetList;       
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
18b0: 64 65 73 63 65 6e 64 69 6e 67 20 70 65 6e 64 69  descending pendi
18c0: 6e 67 20 73 65 67 2d 72 65 61 64 65 72 73 20 6f  ng seg-readers o
18d0: 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nly */.  sqlite3
18e0: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 0a 7d  _int64 iDocid;.}
18f0: 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 33 53  ;..#define fts3S
1900: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
1910: 67 28 70 29 20 28 28 70 29 2d 3e 70 70 4e 65 78  g(p) ((p)->ppNex
1920: 74 45 6c 65 6d 21 3d 30 29 0a 23 64 65 66 69 6e  tElem!=0).#defin
1930: 65 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  e fts3SegReaderI
1940: 73 52 6f 6f 74 4f 6e 6c 79 28 70 29 20 28 28 70  sRootOnly(p) ((p
1950: 29 2d 3e 61 4e 6f 64 65 3d 3d 28 63 68 61 72 20  )->aNode==(char 
1960: 2a 29 26 28 70 29 5b 31 5d 29 0a 0a 2f 2a 0a 2a  *)&(p)[1])../*.*
1970: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1980: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1990: 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
19a0: 65 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  e a segment b-tr
19b0: 65 65 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ee in the.** dat
19c0: 61 62 61 73 65 2e 20 54 68 65 20 69 6e 74 65 72  abase. The inter
19d0: 6e 61 6c 20 64 65 74 61 69 6c 73 20 6f 66 20 74  nal details of t
19e0: 68 69 73 20 74 79 70 65 20 61 72 65 20 6f 6e 6c  his type are onl
19f0: 79 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  y accessed by th
1a00: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 66  e.** following f
1a10: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
1a20: 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41    fts3SegWriterA
1a30: 64 64 28 29 0a 2a 2a 20 20 20 66 74 73 33 53 65  dd().**   fts3Se
1a40: 67 57 72 69 74 65 72 46 6c 75 73 68 28 29 0a 2a  gWriterFlush().*
1a50: 2a 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65  *   fts3SegWrite
1a60: 72 46 72 65 65 28 29 0a 2a 2f 0a 73 74 72 75 63  rFree().*/.struc
1a70: 74 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  t SegmentWriter 
1a80: 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  {.  SegmentNode 
1a90: 2a 70 54 72 65 65 3b 20 20 20 20 20 20 20 20 20  *pTree;         
1aa0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ab0: 6f 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65 20  o interior tree 
1ac0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73  structure */.  s
1ad0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 46 69  qlite3_int64 iFi
1ae0: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1af0: 2a 20 46 69 72 73 74 20 73 6c 6f 74 20 69 6e 20  * First slot in 
1b00: 25 5f 73 65 67 6d 65 6e 74 73 20 77 72 69 74 74  %_segments writt
1b10: 65 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  en */.  sqlite3_
1b20: 69 6e 74 36 34 20 69 46 72 65 65 3b 20 20 20 20  int64 iFree;    
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1b40: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73  free slot in %_s
1b50: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  egments */.  cha
1b60: 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20  r *zTerm;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 50 6f 69 6e 74 65 72 20 74 6f 20 70 72 65 76 69  Pointer to previ
1b90: 6f 75 73 20 74 65 72 6d 20 62 75 66 66 65 72 20  ous term buffer 
1ba0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bd0: 66 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72 6d  f bytes in zTerm
1be0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f   */.  int nMallo
1bf0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c00: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c10: 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72   malloc'd buffer
1c20: 20 61 74 20 7a 4d 61 6c 6c 6f 63 20 2a 2f 0a 20   at zMalloc */. 
1c30: 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b 20   char *zMalloc; 
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 73 70 61   /* Malloc'd spa
1c60: 63 65 20 28 70 6f 73 73 69 62 6c 79 29 20 75 73  ce (possibly) us
1c70: 65 64 20 66 6f 72 20 7a 54 65 72 6d 20 2a 2f 0a  ed for zTerm */.
1c80: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c    /* Size of all
1cb0: 6f 63 61 74 69 6f 6e 20 61 74 20 61 44 61 74 61  ocation at aData
1cc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b   */.  int nData;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1cf0: 66 20 64 61 74 61 20 69 6e 20 61 44 61 74 61 20  f data in aData 
1d00: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
1d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d30: 74 6f 20 62 6c 6f 63 6b 20 66 72 6f 6d 20 6d 61  to block from ma
1d40: 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lloc() */.};../*
1d50: 0a 2a 2a 20 54 79 70 65 20 53 65 67 6d 65 6e 74  .** Type Segment
1d60: 4e 6f 64 65 20 69 73 20 75 73 65 64 20 62 79 20  Node is used by 
1d70: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  the following th
1d80: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  ree functions to
1d90: 20 63 72 65 61 74 65 0a 2a 2a 20 74 68 65 20 69   create.** the i
1da0: 6e 74 65 72 69 6f 72 20 70 61 72 74 20 6f 66 20  nterior part of 
1db0: 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2b 2d 74  the segment b+-t
1dc0: 72 65 65 20 73 74 72 75 63 74 75 72 65 73 20 28  ree structures (
1dd0: 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70  everything excep
1de0: 74 0a 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f  t.** the leaf no
1df0: 64 65 73 29 2e 20 54 68 65 73 65 20 66 75 6e 63  des). These func
1e00: 74 69 6f 6e 73 20 61 6e 64 20 74 79 70 65 20 61  tions and type a
1e10: 72 65 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  re only ever use
1e20: 64 20 62 79 20 63 6f 64 65 0a 2a 2a 20 77 69 74  d by code.** wit
1e30: 68 69 6e 20 74 68 65 20 66 74 73 33 53 65 67 57  hin the fts3SegW
1e40: 72 69 74 65 72 58 58 58 28 29 20 66 61 6d 69 6c  riterXXX() famil
1e50: 79 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 64  y of functions d
1e60: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
1e70: 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65  **.**   fts3Node
1e80: 41 64 64 54 65 72 6d 28 29 0a 2a 2a 20 20 20 66  AddTerm().**   f
1e90: 74 73 33 4e 6f 64 65 57 72 69 74 65 28 29 0a 2a  ts3NodeWrite().*
1ea0: 2a 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65  *   fts3NodeFree
1eb0: 28 29 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  ().**.** When a 
1ec0: 62 2b 74 72 65 65 20 69 73 20 77 72 69 74 74 65  b+tree is writte
1ed0: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1ee0: 65 20 28 65 69 74 68 65 72 20 61 73 20 61 20 72  e (either as a r
1ef0: 65 73 75 6c 74 20 6f 66 20 61 20 6d 65 72 67 65  esult of a merge
1f00: 0a 2a 2a 20 6f 72 20 74 68 65 20 70 65 6e 64 69  .** or the pendi
1f10: 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c 65 20 62  ng-terms table b
1f20: 65 69 6e 67 20 66 6c 75 73 68 65 64 29 2c 20 6c  eing flushed), l
1f30: 65 61 76 65 73 20 61 72 65 20 77 72 69 74 74 65  eaves are writte
1f40: 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 64  n into the .** d
1f50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 20  atabase file as 
1f60: 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65  soon as they are
1f70: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 70 6f 70 75   completely popu
1f80: 6c 61 74 65 64 2e 20 54 68 65 20 69 6e 74 65 72  lated. The inter
1f90: 69 6f 72 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ior of.** the tr
1fa0: 65 65 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20  ee is assembled 
1fb0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77 72  in memory and wr
1fc0: 69 74 74 65 6e 20 6f 75 74 20 6f 6e 6c 79 20 6f  itten out only o
1fd0: 6e 63 65 20 61 6c 6c 20 6c 65 61 76 65 73 20 68  nce all leaves h
1fe0: 61 76 65 0a 2a 2a 20 62 65 65 6e 20 70 6f 70 75  ave.** been popu
1ff0: 6c 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64  lated and stored
2000: 2e 20 54 68 69 73 20 69 73 20 4f 6b 2c 20 61 73  . This is Ok, as
2010: 20 74 68 65 20 62 2b 2d 74 72 65 65 20 66 61 6e   the b+-tree fan
2020: 6f 75 74 20 69 73 20 75 73 75 61 6c 6c 79 0a 2a  out is usually.*
2030: 2a 20 76 65 72 79 20 6c 61 72 67 65 2c 20 6d 65  * very large, me
2040: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 20 69  aning that the i
2050: 6e 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20 74  nterior of the t
2060: 72 65 65 20 63 6f 6e 73 75 6d 65 73 20 72 65 6c  ree consumes rel
2070: 61 74 69 76 65 6c 79 20 0a 2a 2a 20 6c 69 74 74  atively .** litt
2080: 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
2090: 72 75 63 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65  ruct SegmentNode
20a0: 20 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65   {.  SegmentNode
20b0: 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
20c0: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 6e       /* Parent n
20d0: 6f 64 65 20 28 6f 72 20 4e 55 4c 4c 20 66 6f 72  ode (or NULL for
20e0: 20 72 6f 6f 74 20 6e 6f 64 65 29 20 2a 2f 0a 20   root node) */. 
20f0: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52   SegmentNode *pR
2100: 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
2110: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72   /* Pointer to r
2120: 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight-sibling */.
2130: 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
2140: 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 20  Leftmost;       
2150: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2160: 6c 65 66 74 2d 6d 6f 73 74 20 6e 6f 64 65 20 6f  left-most node o
2170: 66 20 74 68 69 73 20 64 65 70 74 68 20 2a 2f 0a  f this depth */.
2180: 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
21b0: 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20  erms written to 
21c0: 6e 6f 64 65 20 73 6f 20 66 61 72 20 2a 2f 0a 20  node so far */. 
21d0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
2200: 72 65 76 69 6f 75 73 20 74 65 72 6d 20 62 75 66  revious term buf
2210: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  fer */.  int nTe
2220: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2240: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
2250: 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  Term */.  int nM
2260: 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  alloc;          
2270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2280: 65 20 6f 66 20 6d 61 6c 6c 6f 63 27 64 20 62 75  e of malloc'd bu
2290: 66 66 65 72 20 61 74 20 7a 4d 61 6c 6c 6f 63 20  ffer at zMalloc 
22a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c  */.  char *zMall
22b0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
22c0: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64       /* Malloc'd
22d0: 20 73 70 61 63 65 20 28 70 6f 73 73 69 62 6c 79   space (possibly
22e0: 29 20 75 73 65 64 20 66 6f 72 20 7a 54 65 72 6d  ) used for zTerm
22f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b   */.  int nData;
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2320: 66 20 76 61 6c 69 64 20 64 61 74 61 20 73 6f 20  f valid data so 
2330: 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  far */.  char *a
2340: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
2360: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
2370: 2a 2a 20 56 61 6c 69 64 20 76 61 6c 75 65 73 20  ** Valid values 
2380: 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 61  for the second a
2390: 72 67 75 6d 65 6e 74 20 74 6f 20 66 74 73 33 53  rgument to fts3S
23a0: 71 6c 53 74 6d 74 28 29 2e 0a 2a 2f 0a 23 64 65  qlStmt()..*/.#de
23b0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
23c0: 43 4f 4e 54 45 4e 54 20 20 20 20 20 20 20 20 20  CONTENT         
23d0: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51      0.#define SQ
23e0: 4c 5f 49 53 5f 45 4d 50 54 59 20 20 20 20 20 20  L_IS_EMPTY      
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 23               1.#
2400: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2410: 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 20 20 20  E_ALL_CONTENT   
2420: 20 20 20 20 20 20 32 20 0a 23 64 65 66 69 6e 65        2 .#define
2430: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
2440: 53 45 47 4d 45 4e 54 53 20 20 20 20 20 20 20 20  SEGMENTS        
2450: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45  3.#define SQL_DE
2460: 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52 20  LETE_ALL_SEGDIR 
2470: 20 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69           4.#defi
2480: 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  ne SQL_DELETE_AL
2490: 4c 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  L_DOCSIZE       
24a0: 20 20 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f    5.#define SQL_
24b0: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 20  DELETE_ALL_STAT 
24c0: 20 20 20 20 20 20 20 20 20 20 20 36 0a 23 64 65             6.#de
24d0: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
24e0: 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44  CONTENT_BY_ROWID
24f0: 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 51      7.#define SQ
2500: 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49  L_NEXT_SEGMENT_I
2510: 4e 44 45 58 20 20 20 20 20 20 20 20 20 38 0a 23  NDEX         8.#
2520: 64 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53 45 52  define SQL_INSER
2530: 54 5f 53 45 47 4d 45 4e 54 53 20 20 20 20 20 20  T_SEGMENTS      
2540: 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20        9.#define 
2550: 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
2560: 53 5f 49 44 20 20 20 20 20 20 20 20 20 20 31 30  S_ID          10
2570: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53  .#define SQL_INS
2580: 45 52 54 5f 53 45 47 44 49 52 20 20 20 20 20 20  ERT_SEGDIR      
2590: 20 20 20 20 20 20 20 31 31 0a 23 64 65 66 69 6e         11.#defin
25a0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56  e SQL_SELECT_LEV
25b0: 45 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EL              
25c0: 31 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  12.#define SQL_S
25d0: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47  ELECT_LEVEL_RANG
25e0: 45 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66  E        13.#def
25f0: 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c  ine SQL_SELECT_L
2600: 45 56 45 4c 5f 43 4f 55 4e 54 20 20 20 20 20 20  EVEL_COUNT      
2610: 20 20 31 34 0a 23 64 65 66 69 6e 65 20 53 51 4c    14.#define SQL
2620: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d  _SELECT_SEGDIR_M
2630: 41 58 5f 4c 45 56 45 4c 20 20 20 31 35 0a 23 64  AX_LEVEL   15.#d
2640: 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45  efine SQL_DELETE
2650: 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c 20 20 20  _SEGDIR_LEVEL   
2660: 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 53      16.#define S
2670: 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e  QL_DELETE_SEGMEN
2680: 54 53 5f 52 41 4e 47 45 20 20 20 20 20 31 37 0a  TS_RANGE     17.
2690: 23 64 65 66 69 6e 65 20 53 51 4c 5f 43 4f 4e 54  #define SQL_CONT
26a0: 45 4e 54 5f 49 4e 53 45 52 54 20 20 20 20 20 20  ENT_INSERT      
26b0: 20 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e 65        18.#define
26c0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 44 4f 43 53   SQL_DELETE_DOCS
26d0: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 31  IZE            1
26e0: 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52 45  9.#define SQL_RE
26f0: 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 20 20 20  PLACE_DOCSIZE   
2700: 20 20 20 20 20 20 20 20 32 30 0a 23 64 65 66 69          20.#defi
2710: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f  ne SQL_SELECT_DO
2720: 43 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20  CSIZE           
2730: 20 32 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   21.#define SQL_
2740: 53 45 4c 45 43 54 5f 53 54 41 54 20 20 20 20 20  SELECT_STAT     
2750: 20 20 20 20 20 20 20 20 20 20 32 32 0a 23 64 65            22.#de
2760: 66 69 6e 65 20 53 51 4c 5f 52 45 50 4c 41 43 45  fine SQL_REPLACE
2770: 5f 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20  _STAT           
2780: 20 20 20 32 33 0a 0a 23 64 65 66 69 6e 65 20 53     23..#define S
2790: 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 50 52  QL_SELECT_ALL_PR
27a0: 45 46 49 58 5f 4c 45 56 45 4c 20 20 20 32 34 0a  EFIX_LEVEL   24.
27b0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45  #define SQL_DELE
27c0: 54 45 5f 41 4c 4c 5f 54 45 52 4d 53 5f 53 45 47  TE_ALL_TERMS_SEG
27d0: 44 49 52 20 20 20 32 35 0a 23 64 65 66 69 6e 65  DIR   25.#define
27e0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
27f0: 49 52 5f 52 41 4e 47 45 20 20 20 20 20 20 20 32  IR_RANGE       2
2800: 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  6.#define SQL_SE
2810: 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 20  LECT_ALL_LANGID 
2820: 20 20 20 20 20 20 20 20 32 37 0a 23 64 65 66 69          27.#defi
2830: 6e 65 20 53 51 4c 5f 46 49 4e 44 5f 4d 45 52 47  ne SQL_FIND_MERG
2840: 45 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20 20  E_LEVEL         
2850: 20 32 38 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   28.#define SQL_
2860: 4d 41 58 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45 53  MAX_LEAF_NODE_ES
2870: 54 49 4d 41 54 45 20 20 20 20 32 39 0a 23 64 65  TIMATE    29.#de
2880: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2890: 53 45 47 44 49 52 5f 45 4e 54 52 59 20 20 20 20  SEGDIR_ENTRY    
28a0: 20 20 20 33 30 0a 23 64 65 66 69 6e 65 20 53 51     30.#define SQ
28b0: 4c 5f 53 48 49 46 54 5f 53 45 47 44 49 52 5f 45  L_SHIFT_SEGDIR_E
28c0: 4e 54 52 59 20 20 20 20 20 20 20 20 33 31 0a 23  NTRY        31.#
28d0: 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43  define SQL_SELEC
28e0: 54 5f 53 45 47 44 49 52 20 20 20 20 20 20 20 20  T_SEGDIR        
28f0: 20 20 20 20 20 33 32 0a 23 64 65 66 69 6e 65 20       32.#define 
2900: 53 51 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52  SQL_CHOMP_SEGDIR
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 33                33
2920: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 47  .#define SQL_SEG
2930: 4d 45 4e 54 5f 49 53 5f 41 50 50 45 4e 44 41 42  MENT_IS_APPENDAB
2940: 4c 45 20 20 20 20 20 33 34 0a 23 64 65 66 69 6e  LE     34.#defin
2950: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44  e SQL_SELECT_IND
2960: 45 58 45 53 20 20 20 20 20 20 20 20 20 20 20 20  EXES            
2970: 33 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  35.#define SQL_S
2980: 45 4c 45 43 54 5f 4d 58 4c 45 56 45 4c 20 20 20  ELECT_MXLEVEL   
2990: 20 20 20 20 20 20 20 20 20 33 36 0a 0a 2f 2a 0a           36../*.
29a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29b0: 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61   is used to obta
29c0: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70 72 65  in an SQLite pre
29d0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
29e0: 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  handle.** for th
29f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64 65 6e  e statement iden
2a00: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 65  tified by the se
2a10: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49  cond argument. I
2a20: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
2a30: 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 74   *pp is set to t
2a40: 68 65 20 72 65 71 75 65 73 74 65 64 20 73 74 61  he requested sta
2a50: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e  tement handle an
2a60: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2a70: 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
2a80: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
2a90: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2aa0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
2ab0: 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
2ac0: 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70 56 61  If argument apVa
2ad0: 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  l is not NULL, t
2ae0: 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f 69 6e  hen it must poin
2af0: 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 77 69  t to an array wi
2b00: 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 61  th.** at least a
2b10: 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 20 61  s many entries a
2b20: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
2b30: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 6f  statement has bo
2b40: 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  und .** paramete
2b50: 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73 20 61  rs. The values a
2b60: 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  re bound to the 
2b70: 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72 61 6d  statements param
2b80: 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a 2a 20  eters before.** 
2b90: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
2ba0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 71 6c  atic int fts3Sql
2bb0: 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61 62 6c  Stmt(.  Fts3Tabl
2bc0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
2be0: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
2bf0: 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c 20  */.  int eStmt, 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
2c20: 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e 73 74  he SQL_XXX const
2c30: 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a 20 20  ants above */.  
2c40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
2c50: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2c60: 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e  /* OUT: Statemen
2c70: 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  t handle */.  sq
2c80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2c90: 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
2ca0: 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e 64 20   Values to bind 
2cb0: 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  to statement */.
2cc0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2cd0: 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f 2a 20  *azSql[] = {./* 
2ce0: 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  0  */  "DELETE F
2cf0: 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  ROM %Q.'%q_conte
2d00: 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69 64 20  nt' WHERE rowid 
2d10: 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f 20 20  = ?",./* 1  */  
2d20: 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58 49 53  "SELECT NOT EXIS
2d30: 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69 64 20  TS(SELECT docid 
2d40: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74  FROM %Q.'%q_cont
2d50: 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69 64  ent' WHERE rowid
2d60: 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a 2f 20  !=?)",./* 2  */ 
2d70: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
2d80: 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22 2c 0a  .'%q_content'",.
2d90: 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c 45 54  /* 3  */  "DELET
2da0: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  E FROM %Q.'%q_se
2db0: 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34 20 20  gments'",./* 4  
2dc0: 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  */  "DELETE FROM
2dd0: 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22   %Q.'%q_segdir'"
2de0: 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44 45 4c  ,./* 5  */  "DEL
2df0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2e00: 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20 36 20  docsize'",./* 6 
2e10: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
2e20: 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27 22 2c  M %Q.'%q_stat'",
2e30: 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45 4c 45  ./* 7  */  "SELE
2e40: 43 54 20 25 73 20 57 48 45 52 45 20 72 6f 77 69  CT %s WHERE rowi
2e50: 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f 20 20  d=?",./* 8  */  
2e60: 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20  "SELECT (SELECT 
2e70: 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20 25 51  max(idx) FROM %Q
2e80: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
2e90: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20 2b 20  RE level = ?) + 
2ea0: 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20 22 52  1",./* 9  */  "R
2eb0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27  EPLACE INTO %Q.'
2ec0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62 6c 6f  %q_segments'(blo
2ed0: 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c  ckid, block) VAL
2ee0: 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a 20 31  UES(?, ?)",./* 1
2ef0: 30 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f  0 */  "SELECT co
2f00: 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 6d  alesce((SELECT m
2f10: 61 78 28 62 6c 6f 63 6b 69 64 29 20 46 52 4f 4d  ax(blockid) FROM
2f20: 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73   %Q.'%q_segments
2f30: 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f 2a 20  ') + 1, 1)",./* 
2f40: 31 31 20 2a 2f 20 20 22 52 45 50 4c 41 43 45 20  11 */  "REPLACE 
2f50: 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65 67 64  INTO %Q.'%q_segd
2f60: 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  ir' VALUES(?,?,?
2f70: 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20 20 20  ,?,?,?)",..     
2f80: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 73       /* Return s
2f90: 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72  egments in order
2fa0: 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20   from oldest to 
2fb0: 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20 31 32  newest.*/ ./* 12
2fc0: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78   */  "SELECT idx
2fd0: 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c  , start_block, l
2fe0: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c  eaves_end_block,
2ff0: 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74   end_block, root
3000: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
3010: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
3020: 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20  ir' WHERE level 
3030: 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69 64 78  = ? ORDER BY idx
3040: 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a 2f 20   ASC",./* 13 */ 
3050: 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20 73 74   "SELECT idx, st
3060: 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76 65  art_block, leave
3070: 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64  s_end_block, end
3080: 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22 0a 20  _block, root ". 
3090: 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
30a0: 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20   %Q.'%q_segdir' 
30b0: 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57  WHERE level BETW
30c0: 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20 20 20  EEN ? AND ?".   
30d0: 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
30e0: 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69  BY level DESC, i
30f0: 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31 34 20  dx ASC",../* 14 
3100: 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  */  "SELECT coun
3110: 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  t(*) FROM %Q.'%q
3120: 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c  _segdir' WHERE l
3130: 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31 35  evel = ?",./* 15
3140: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d 61 78   */  "SELECT max
3150: 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e  (level) FROM %Q.
3160: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
3170: 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20  E level BETWEEN 
3180: 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20 31 36  ? AND ?",../* 16
3190: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
31a0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
31b0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
31c0: 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22 44 45  ",./* 17 */  "DE
31d0: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71  LETE FROM %Q.'%q
31e0: 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45  _segments' WHERE
31f0: 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45 45 4e   blockid BETWEEN
3200: 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20 31 38   ? AND ?",./* 18
3210: 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49 4e 54   */  "INSERT INT
3220: 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74  O %Q.'%q_content
3230: 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c 0a 2f  ' VALUES(%s)",./
3240: 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 19 */  "DELETE
3250: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63   FROM %Q.'%q_doc
3260: 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f 63 69  size' WHERE doci
3270: 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20 2a 2f  d = ?",./* 20 */
3280: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
3290: 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 20  %Q.'%q_docsize' 
32a0: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a 2f 2a  VALUES(?,?)",./*
32b0: 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   21 */  "SELECT 
32c0: 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27 25 71  size FROM %Q.'%q
32d0: 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20  _docsize' WHERE 
32e0: 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32 32 20  docid=?",./* 22 
32f0: 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75  */  "SELECT valu
3300: 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74  e FROM %Q.'%q_st
3310: 61 74 27 20 57 48 45 52 45 20 69 64 3d 3f 22 2c  at' WHERE id=?",
3320: 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45 50 4c  ./* 23 */  "REPL
3330: 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f  ACE INTO %Q.'%q_
3340: 73 74 61 74 27 20 56 41 4c 55 45 53 28 3f 2c 3f  stat' VALUES(?,?
3350: 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20 22 22  )",./* 24 */  ""
3360: 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22 2c 0a  ,./* 25 */  "",.
3370: 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c 45 54  ./* 26 */ "DELET
3380: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  E FROM %Q.'%q_se
3390: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
33a0: 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
33b0: 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22 53 45  ?",./* 27 */ "SE
33c0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 65  LECT DISTINCT le
33d0: 76 65 6c 20 2f 20 28 31 30 32 34 20 2a 20 3f 29  vel / (1024 * ?)
33e0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
33f0: 64 69 72 27 22 2c 0a 0a 2f 2a 20 54 68 69 73 20  dir'",../* This 
3400: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65  statement is use
3410: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
3420: 68 69 63 68 20 6c 65 76 65 6c 20 74 6f 20 72 65  hich level to re
3430: 61 64 20 74 68 65 20 69 6e 70 75 74 20 66 72 6f  ad the input fro
3440: 6d 0a 2a 2a 20 77 68 65 6e 20 70 65 72 66 6f 72  m.** when perfor
3450: 6d 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ming an incremen
3460: 74 61 6c 20 6d 65 72 67 65 2e 20 49 74 20 72 65  tal merge. It re
3470: 74 75 72 6e 73 20 74 68 65 20 61 62 73 6f 6c 75  turns the absolu
3480: 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 0a  te level number.
3490: 2a 2a 20 6f 66 20 74 68 65 20 6f 6c 64 65 73 74  ** of the oldest
34a0: 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64 62   level in the db
34b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
34c0: 74 20 6c 65 61 73 74 20 3f 20 73 65 67 6d 65 6e  t least ? segmen
34d0: 74 73 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 6e 6f  ts. Or,.** if no
34e0: 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 46 54   level in the FT
34f0: 53 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  S index contains
3500: 20 6d 6f 72 65 20 74 68 61 6e 20 3f 20 73 65 67   more than ? seg
3510: 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 61 74 65  ments, the state
3520: 6d 65 6e 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ment.** returns 
3530: 7a 65 72 6f 20 72 6f 77 73 2e 20 20 2a 2f 0a 2f  zero rows.  */./
3540: 2a 20 32 38 20 2a 2f 20 22 53 45 4c 45 43 54 20  * 28 */ "SELECT 
3550: 6c 65 76 65 6c 20 46 52 4f 4d 20 25 51 2e 27 25  level FROM %Q.'%
3560: 71 5f 73 65 67 64 69 72 27 20 47 52 4f 55 50 20  q_segdir' GROUP 
3570: 42 59 20 6c 65 76 65 6c 20 48 41 56 49 4e 47 20  BY level HAVING 
3580: 63 6f 75 6e 74 28 2a 29 3e 3d 3f 22 0a 20 20 20  count(*)>=?".   
3590: 20 20 20 20 20 20 22 20 20 4f 52 44 45 52 20 42        "  ORDER B
35a0: 59 20 28 6c 65 76 65 6c 20 25 25 20 31 30 32 34  Y (level %% 1024
35b0: 29 20 41 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a  ) ASC LIMIT 1",.
35c0: 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  ./* Estimate the
35d0: 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f 6e 20   upper limit on 
35e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
35f0: 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20 6e 65  af nodes in a ne
3600: 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63 72 65  w segment.** cre
3610: 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e 67 20  ated by merging 
3620: 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20 73 65  the oldest :2 se
3630: 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f  gments from abso
3640: 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e 20 53  lute level :1. S
3650: 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ee .** function 
3660: 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d  sqlite3Fts3Incrm
3670: 65 72 67 65 28 29 20 66 6f 72 20 64 65 74 61 69  erge() for detai
3680: 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20 2a 2f  ls.  */./* 29 */
3690: 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74 6f 74   "SELECT 2 * tot
36a0: 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f 65 6e  al(1 + leaves_en
36b0: 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f  d_block - start_
36c0: 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20 20 20  block) ".       
36d0: 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27 25 71    "  FROM %Q.'%q
36e0: 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c  _segdir' WHERE l
36f0: 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69 64 78  evel = ? AND idx
3700: 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 44   < ?",../* SQL_D
3710: 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54  ELETE_SEGDIR_ENT
3720: 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65 20 74  RY.**   Delete t
3730: 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  he %_segdir entr
3740: 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65  y on absolute le
3750: 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e 64 65  vel :1 with inde
3760: 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33 30 20  x :2.  */./* 30 
3770: 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  */ "DELETE FROM 
3780: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
3790: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41  HERE level = ? A
37a0: 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a  ND idx = ?",../*
37b0: 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47 44 49   SQL_SHIFT_SEGDI
37c0: 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d 6f 64  R_ENTRY.**   Mod
37d0: 69 66 79 20 74 68 65 20 69 64 78 20 76 61 6c 75  ify the idx valu
37e0: 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e  e for the segmen
37f0: 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20 6f 6e  t with idx=:3 on
3800: 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
3810: 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e 20 20  :2.**   to :1.  
3820: 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55 50 44  */./* 31 */ "UPD
3830: 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ATE %Q.'%q_segdi
3840: 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f 20 57  r' SET idx = ? W
3850: 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41 4e 44  HERE level=? AND
3860: 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53 51 4c   idx=?",../* SQL
3870: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 0a 2a  _SELECT_SEGDIR.*
3880: 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e 67 6c  *   Read a singl
3890: 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  e entry from the
38a0: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
38b0: 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f 6d 20   The entry from 
38c0: 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20 20 6c  absolute .**   l
38d0: 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e 64  evel :1 with ind
38e0: 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20 2a 2f  ex value :2.  */
38f0: 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45 4c 45  ./* 32 */  "SELE
3900: 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f 62 6c  CT idx, start_bl
3910: 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64 5f  ock, leaves_end_
3920: 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b  block, end_block
3930: 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20 20 20  , root ".       
3940: 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e 27 25       "FROM %Q.'%
3950: 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
3960: 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69 64  level = ? AND id
3970: 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c 5f  x = ?",../* SQL_
3980: 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a 2a 20  CHOMP_SEGDIR.** 
3990: 20 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61    Update the sta
39a0: 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20 61 6e  rt_block (:1) an
39b0: 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69 65 6c  d root (:2) fiel
39c0: 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64  ds of the %_segd
39d0: 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20 6c 6f  ir.**   entry lo
39e0: 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c 75 74  cated on absolut
39f0: 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74 68 20  e level :3 with 
3a00: 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a 2f 2a  index :4.  */./*
3a10: 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54 45 20   33 */  "UPDATE 
3a20: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 53  %Q.'%q_segdir' S
3a30: 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 3d  ET start_block =
3a40: 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a 20 20   ?, root = ?".  
3a50: 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45            "WHERE
3a60: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69   level = ? AND i
3a70: 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c  dx = ?",../* SQL
3a80: 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50 50 45  _SEGMENT_IS_APPE
3a90: 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65 74 75  NDABLE.**   Retu
3aa0: 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  rn a single row 
3ab0: 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 77  if the segment w
3ac0: 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d 3f 20  ith end_block=? 
3ad0: 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e 20 4f  is appendable. O
3ae0: 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73 20 6f  r.**   no rows o
3af0: 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 2f 2a  therwise.  */./*
3b00: 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   34 */  "SELECT 
3b10: 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  1 FROM %Q.'%q_se
3b20: 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20 62 6c  gments' WHERE bl
3b30: 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c 6f 63  ockid=? AND bloc
3b40: 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f 2a 20  k IS NULL",../* 
3b50: 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 45 58  SQL_SELECT_INDEX
3b60: 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 74  ES.**   Return t
3b70: 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c 69 64  he list of valid
3b80: 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 65 73   segment indexes
3b90: 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20 6c 65   for absolute le
3ba0: 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33 35 20  vel ?  */./* 35 
3bb0: 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 20  */  "SELECT idx 
3bc0: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
3bd0: 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 3d  ir' WHERE level=
3be0: 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  ? ORDER BY 1 ASC
3bf0: 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c 45 43  ",../* SQL_SELEC
3c00: 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20 20 52  T_MXLEVEL.**   R
3c10: 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67 65 73  eturn the larges
3c20: 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c  t relative level
3c30: 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65   in the FTS inde
3c40: 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20 20 2a  x or indexes.  *
3c50: 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53 45 4c  /./* 36 */  "SEL
3c60: 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c 20 25  ECT max( level %
3c70: 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20 25 51  % 1024 ) FROM %Q
3c80: 2e 27 25 71 5f 73 65 67 64 69 72 27 22 0a 20 20  .'%q_segdir'".  
3c90: 7d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  };.  int rc = SQ
3ca0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
3cb0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
3cc0: 0a 20 20 61 73 73 65 72 74 28 20 53 69 7a 65 6f  .  assert( Sizeo
3cd0: 66 41 72 72 61 79 28 61 7a 53 71 6c 29 3d 3d 53  fArray(azSql)==S
3ce0: 69 7a 65 6f 66 41 72 72 61 79 28 70 2d 3e 61 53  izeofArray(p->aS
3cf0: 74 6d 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tmt) );.  assert
3d00: 28 20 65 53 74 6d 74 3c 53 69 7a 65 6f 66 41 72  ( eStmt<SizeofAr
3d10: 72 61 79 28 61 7a 53 71 6c 29 20 26 26 20 65 53  ray(azSql) && eS
3d20: 74 6d 74 3e 3d 30 20 29 3b 0a 20 20 0a 20 20 70  tmt>=0 );.  .  p
3d30: 53 74 6d 74 20 3d 20 70 2d 3e 61 53 74 6d 74 5b  Stmt = p->aStmt[
3d40: 65 53 74 6d 74 5d 3b 0a 20 20 69 66 28 20 21 70  eStmt];.  if( !p
3d50: 53 74 6d 74 20 29 7b 0a 20 20 20 20 63 68 61 72  Stmt ){.    char
3d60: 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 69 66 28 20   *zSql;.    if( 
3d70: 65 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f 4e 54 45  eStmt==SQL_CONTE
3d80: 4e 54 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20  NT_INSERT ){.   
3d90: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
3da0: 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b  3_mprintf(azSql[
3db0: 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20  eStmt], p->zDb, 
3dc0: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 7a 57 72  p->zName, p->zWr
3dd0: 69 74 65 45 78 70 72 6c 69 73 74 29 3b 0a 20 20  iteExprlist);.  
3de0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 6d    }else if( eStm
3df0: 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f  t==SQL_SELECT_CO
3e00: 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 20 29  NTENT_BY_ROWID )
3e10: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
3e20: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
3e30: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
3e40: 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a  zReadExprlist);.
3e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3e60: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
3e70: 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53  mprintf(azSql[eS
3e80: 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d  tmt], p->zDb, p-
3e90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
3ea0: 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a     if( !zSql ){.
3eb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3ec0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
3ed0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
3ee0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
3ef0: 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
3f00: 31 2c 20 26 70 53 74 6d 74 2c 20 4e 55 4c 4c 29  1, &pStmt, NULL)
3f10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3f20: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
3f30: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
3f40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
3f50: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
3f60: 61 53 74 6d 74 5b 65 53 74 6d 74 5d 20 3d 20 70  aStmt[eStmt] = p
3f70: 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Stmt;.    }.  }.
3f80: 20 20 69 66 28 20 61 70 56 61 6c 20 29 7b 0a 20    if( apVal ){. 
3f90: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
3fa0: 74 20 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74  t nParam = sqlit
3fb0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
3fc0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
3fd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
3fe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
3ff0: 6e 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nParam; i++){.  
4000: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4010: 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d  _bind_value(pStm
4020: 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d  t, i+1, apVal[i]
4030: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
4040: 70 70 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65  pp = pStmt;.  re
4050: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
4060: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 6c 65  tic int fts3Sele
4070: 63 74 44 6f 63 73 69 7a 65 28 0a 20 20 46 74 73  ctDocsize(.  Fts
4080: 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20  3Table *pTab,   
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40a0: 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
40b0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
40c0: 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20  nt64 iDocid,    
40d0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
40e0: 74 6f 20 62 69 6e 64 20 66 6f 72 20 53 51 4c 5f  to bind for SQL_
40f0: 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20 2a  SELECT_DOCSIZE *
4100: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
4110: 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20   **ppStmt       
4120: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74      /* OUT: Stat
4130: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
4140: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
4150: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20  t *pStmt = 0;   
4160: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
4170: 74 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  t requested from
4180: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 20 2a   fts3SqlStmt() *
4190: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
41c0: 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  de */..  rc = ft
41d0: 73 33 53 71 6c 53 74 6d 74 28 70 54 61 62 2c 20  s3SqlStmt(pTab, 
41e0: 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53 49  SQL_SELECT_DOCSI
41f0: 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  ZE, &pStmt, 0);.
4200: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4210: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
4220: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
4230: 74 6d 74 2c 20 31 2c 20 69 44 6f 63 69 64 29 3b  tmt, 1, iDocid);
4240: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4250: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
4260: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
4270: 45 5f 52 4f 57 20 7c 7c 20 73 71 6c 69 74 65 33  E_ROW || sqlite3
4280: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
4290: 6d 74 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 42  mt, 0)!=SQLITE_B
42a0: 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 72 63 20  LOB ){.      rc 
42b0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
42c0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
42d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
42e0: 29 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55  ) rc = FTS_CORRU
42f0: 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 70  PT_VTAB;.      p
4300: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
4310: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
4320: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
4330: 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 74 6d 74 20  .  }..  *ppStmt 
4340: 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72  = pStmt;.  retur
4350: 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  n rc;.}..int sql
4360: 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44 6f  ite3Fts3SelectDo
4370: 63 74 6f 74 61 6c 28 0a 20 20 46 74 73 33 54 61  ctotal(.  Fts3Ta
4380: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
4390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
43a0: 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
43b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
43c0: 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20   **ppStmt       
43d0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74      /* OUT: Stat
43e0: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
43f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
4400: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
4410: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 66  int rc;.  rc = f
4420: 74 73 33 53 71 6c 53 74 6d 74 28 70 54 61 62 2c  ts3SqlStmt(pTab,
4430: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54   SQL_SELECT_STAT
4440: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
4450: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4460: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
4470: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
4480: 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43   1, FTS_STAT_DOC
4490: 54 4f 54 41 4c 29 3b 0a 20 20 20 20 69 66 28 20  TOTAL);.    if( 
44a0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
44b0: 6d 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 0a  mt)!=SQLITE_ROW.
44c0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
44d0: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
44e0: 74 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 42 4c  t, 0)!=SQLITE_BL
44f0: 4f 42 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OB.    ){.      
4500: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
4510: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
4520: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4530: 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f 43 4f  OK ) rc = FTS_CO
4540: 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
4550: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
4560: 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 6d 74   }.  }.  *ppStmt
4570: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   = pStmt;.  retu
4580: 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
4590: 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44  lite3Fts3SelectD
45a0: 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 33 54 61  ocsize(.  Fts3Ta
45b0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
45c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
45d0: 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
45e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
45f0: 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  4 iDocid,       
4600: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20      /* Docid to 
4610: 72 65 61 64 20 73 69 7a 65 20 64 61 74 61 20 66  read size data f
4620: 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
4630: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20  stmt **ppStmt   
4640: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4650: 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  Statement handle
4660: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
4670: 66 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a  fts3SelectDocsiz
4680: 65 28 70 54 61 62 2c 20 69 44 6f 63 69 64 2c 20  e(pTab, iDocid, 
4690: 70 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ppStmt);.}../*.*
46a0: 2a 20 53 69 6d 69 6c 61 72 20 74 6f 20 66 74 73  * Similar to fts
46b0: 33 53 71 6c 53 74 6d 74 28 29 2e 20 45 78 63 65  3SqlStmt(). Exce
46c0: 70 74 2c 20 61 66 74 65 72 20 62 69 6e 64 69 6e  pt, after bindin
46d0: 67 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  g the parameters
46e0: 20 69 6e 0a 2a 2a 20 61 72 72 61 79 20 61 70 56   in.** array apV
46f0: 61 6c 5b 5d 20 74 6f 20 74 68 65 20 53 51 4c 20  al[] to the SQL 
4700: 73 74 61 74 65 6d 65 6e 74 20 69 64 65 6e 74 69  statement identi
4710: 66 69 65 64 20 62 79 20 65 53 74 6d 74 2c 20 74  fied by eStmt, t
4720: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
4730: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a  is executed..**.
4740: 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54  ** Returns SQLIT
4750: 45 5f 4f 4b 20 69 66 20 74 68 65 20 73 74 61 74  E_OK if the stat
4760: 65 6d 65 6e 74 20 69 73 20 73 75 63 63 65 73 73  ement is success
4770: 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2c 20  fully executed, 
4780: 6f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  or an.** SQLite 
4790: 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
47a0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
47b0: 76 6f 69 64 20 66 74 73 33 53 71 6c 45 78 65 63  void fts3SqlExec
47c0: 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20  (.  int *pRC,   
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47e0: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
47f0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
4800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4810: 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20   FTS3 table */. 
4820: 20 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20 20   int eStmt,     
4830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
4840: 65 78 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20  ex of statement 
4850: 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20  to evaluate */. 
4860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4870: 2a 61 70 56 61 6c 20 20 20 20 2f 2a 20 50 61 72  *apVal    /* Par
4880: 61 6d 65 74 65 72 73 20 74 6f 20 62 69 6e 64 20  ameters to bind 
4890: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
48a0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
48b0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 2a 70 52  nt rc;.  if( *pR
48c0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63  C ) return;.  rc
48d0: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
48e0: 2c 20 65 53 74 6d 74 2c 20 26 70 53 74 6d 74 2c  , eStmt, &pStmt,
48f0: 20 61 70 56 61 6c 29 3b 20 0a 20 20 69 66 28 20   apVal); .  if( 
4900: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4910: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
4920: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63  p(pStmt);.    rc
4930: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
4940: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 2a  (pStmt);.  }.  *
4950: 70 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  pRC = rc;.}.../*
4960: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4970: 6e 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  n ensures that t
4980: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62  he caller has ob
4990: 74 61 69 6e 65 64 20 61 20 73 68 61 72 65 64 2d  tained a shared-
49a0: 63 61 63 68 65 0a 2a 2a 20 74 61 62 6c 65 2d 6c  cache.** table-l
49b0: 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 63 6f 6e  ock on the %_con
49c0: 74 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73  tent table. This
49d0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
49e0: 6f 72 65 20 72 65 61 64 69 6e 67 0a 2a 2a 20 64  ore reading.** d
49f0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 74 73  ata from the fts
4a00: 33 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73  3 table. If this
4a10: 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71   lock is not acq
4a20: 75 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65  uired first, the
4a30: 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
4a40: 6d 61 79 20 65 6e 64 20 75 70 20 68 6f 6c 64 69  may end up holdi
4a50: 6e 67 20 72 65 61 64 2d 6c 6f 63 6b 73 20 6f 6e  ng read-locks on
4a60: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
4a70: 61 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20  and %_segdir.** 
4a80: 74 61 62 6c 65 73 2c 20 62 75 74 20 6e 6f 20 72  tables, but no r
4a90: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
4aa0: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
4ab0: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4ac0: 20 0a 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 6f   .** a second co
4ad0: 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nnection will be
4ae0: 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74   able to write t
4af0: 6f 20 74 68 65 20 66 74 73 33 20 74 61 62 6c 65  o the fts3 table
4b00: 2c 20 62 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74  , but.** attempt
4b10: 69 6e 67 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ing to commit th
4b20: 6f 73 65 20 77 72 69 74 65 73 20 6d 69 67 68 74  ose writes might
4b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
4b40: 4f 43 4b 45 44 20 6f 72 0a 2a 2a 20 53 51 4c 49  OCKED or.** SQLI
4b50: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
4b60: 43 41 43 48 45 20 28 62 65 63 61 75 73 65 20 74  CACHE (because t
4b70: 68 65 20 63 6f 6d 6d 69 74 20 61 74 74 65 6d 70  he commit attemp
4b80: 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 0a 2a 2a  ts to obtain .**
4b90: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 6f 6e 20   write-locks on 
4ba0: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 61  the %_segments a
4bb0: 6e 64 20 25 5f 73 65 67 64 69 72 20 2a 2a 20 74  nd %_segdir ** t
4bc0: 61 62 6c 65 73 29 2e 20 0a 2a 2a 0a 2a 2a 20 57  ables). .**.** W
4bd0: 65 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20 74  e try to avoid t
4be0: 68 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46  his because if F
4bf0: 54 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20  TS3 returns any 
4c00: 65 72 72 6f 72 20 77 68 65 6e 20 63 6f 6d 6d 69  error when commi
4c10: 74 74 69 6e 67 0a 2a 2a 20 61 20 74 72 61 6e 73  tting.** a trans
4c20: 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c  action, the whol
4c30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
4c40: 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
4c50: 6b 2e 20 41 6e 64 20 74 68 69 73 20 69 73 0a 2a  k. And this is.*
4c60: 2a 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72 73  * not what users
4c70: 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68 65   expect when the
4c80: 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f 43  y get SQLITE_LOC
4c90: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 2e  KED_SHAREDCACHE.
4ca0: 20 49 74 20 63 61 6e 0a 2a 2a 20 73 74 69 6c 6c   It can.** still
4cb0: 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 75   happen if the u
4cc0: 73 65 72 20 72 65 61 64 73 20 64 61 74 61 20 64  ser reads data d
4cd0: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
4ce0: 20 25 5f 73 65 67 6d 65 6e 74 73 20 6f 72 0a 2a   %_segments or.*
4cf0: 2a 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  * %_segdir table
4d00: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 67 6f 69  s instead of goi
4d10: 6e 67 20 74 68 72 6f 75 67 68 20 46 54 53 33 20  ng through FTS3 
4d20: 74 68 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  though..**.** Th
4d30: 69 73 20 72 65 61 73 6f 6e 69 6e 67 20 64 6f 65  is reasoning doe
4d40: 73 20 6e 6f 74 20 61 70 70 6c 79 20 74 6f 20 61  s not apply to a
4d50: 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 74 61 62   content=xxx tab
4d60: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
4d70: 65 33 46 74 73 33 52 65 61 64 4c 6f 63 6b 28 46  e3Fts3ReadLock(F
4d80: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
4d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
4dc0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
4dd0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
4de0: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
4df0: 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
4e00: 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 69 66 28 20 70  lock */..  if( p
4e10: 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
4e20: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
4e30: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
4e40: 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42  SELECT_CONTENT_B
4e50: 59 5f 52 4f 57 49 44 2c 20 26 70 53 74 6d 74 2c  Y_ROWID, &pStmt,
4e60: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
4e70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4e80: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
4e90: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 31 29 3b  _null(pStmt, 1);
4ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4eb0: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
4ec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
4ed0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
4ee0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
4ef0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4f00: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
4f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 54 53 20 6d  ;.}../*.** FTS m
4f20: 61 69 6e 74 61 69 6e 73 20 61 20 73 65 70 61 72  aintains a separ
4f30: 61 74 65 20 69 6e 64 65 78 65 73 20 66 6f 72 20  ate indexes for 
4f40: 65 61 63 68 20 6c 61 6e 67 75 61 67 65 2d 69 64  each language-id
4f50: 20 28 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67   (a 32-bit integ
4f60: 65 72 29 2e 0a 2a 2a 20 57 69 74 68 69 6e 20 65  er)..** Within e
4f70: 61 63 68 20 6c 61 6e 67 75 61 67 65 20 69 64 2c  ach language id,
4f80: 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65   a separate inde
4f90: 78 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  x is maintained 
4fa0: 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  to store the.** 
4fb0: 64 6f 63 75 6d 65 6e 74 20 74 65 72 6d 73 2c 20  document terms, 
4fc0: 61 6e 64 20 65 61 63 68 20 63 6f 6e 66 69 67 75  and each configu
4fd0: 72 65 64 20 70 72 65 66 69 78 20 73 69 7a 65 20  red prefix size 
4fe0: 28 63 6f 6e 66 69 67 75 72 65 64 20 74 68 65 20  (configured the 
4ff0: 46 54 53 20 0a 2a 2a 20 22 70 72 65 66 69 78 3d  FTS .** "prefix=
5000: 22 20 6f 70 74 69 6f 6e 29 2e 20 41 6e 64 20 65  " option). And e
5010: 61 63 68 20 69 6e 64 65 78 20 63 6f 6e 73 69 73  ach index consis
5020: 74 73 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20 6c  ts of multiple l
5030: 65 76 65 6c 73 20 28 22 72 65 6c 61 74 69 76 65  evels ("relative
5040: 0a 2a 2a 20 6c 65 76 65 6c 73 22 29 2e 0a 2a 2a  .** levels")..**
5050: 0a 2a 2a 20 41 6c 6c 20 74 68 72 65 65 20 6f 66  .** All three of
5060: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 28 74   these values (t
5070: 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64 2c 20  he language id, 
5080: 74 68 65 20 73 70 65 63 69 66 69 63 20 69 6e 64  the specific ind
5090: 65 78 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6c 65  ex and the.** le
50a0: 76 65 6c 20 77 69 74 68 69 6e 20 74 68 65 20 69  vel within the i
50b0: 6e 64 65 78 29 20 61 72 65 20 65 6e 63 6f 64 65  ndex) are encode
50c0: 64 20 69 6e 20 36 34 2d 62 69 74 20 69 6e 74 65  d in 64-bit inte
50d0: 67 65 72 20 76 61 6c 75 65 73 20 73 74 6f 72 65  ger values store
50e0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 25 5f 73 65  d.** in the %_se
50f0: 67 64 69 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  gdir table on di
5100: 73 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  sk. This functio
5110: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  n is used to con
5120: 76 65 72 74 20 74 68 72 65 65 0a 2a 2a 20 73 65  vert three.** se
5130: 70 61 72 61 74 65 20 63 6f 6d 70 6f 6e 65 6e 74  parate component
5140: 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 74 68 65   values into the
5150: 20 73 69 6e 67 6c 65 20 36 34 2d 62 69 74 20 69   single 64-bit i
5160: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61  nteger value tha
5170: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  t.** can be used
5180: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 25 5f   to query the %_
5190: 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a  segdir table..**
51a0: 0a 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79  .** Specifically
51b0: 2c 20 65 61 63 68 20 6c 61 6e 67 75 61 67 65 2d  , each language-
51c0: 69 64 2f 69 6e 64 65 78 20 63 6f 6d 62 69 6e 61  id/index combina
51d0: 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 63 61 74 65  tion is allocate
51e0: 64 20 31 30 32 34 20 0a 2a 2a 20 36 34 2d 62 69  d 1024 .** 64-bi
51f0: 74 20 69 6e 74 65 67 65 72 20 6c 65 76 65 6c 20  t integer level 
5200: 76 61 6c 75 65 73 20 28 22 61 62 73 6f 6c 75 74  values ("absolut
5210: 65 20 6c 65 76 65 6c 73 22 29 2e 20 54 68 65 20  e levels"). The 
5220: 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65 78  main terms index
5230: 0a 2a 2a 20 66 6f 72 20 6c 61 6e 67 75 61 67 65  .** for language
5240: 2d 69 64 20 30 20 69 73 20 61 6c 6c 6f 63 61 74  -id 0 is allocat
5250: 65 20 76 61 6c 75 65 73 20 30 2d 31 30 32 33 2e  e values 0-1023.
5260: 20 54 68 65 20 66 69 72 73 74 20 70 72 65 66 69   The first prefi
5270: 78 20 69 6e 64 65 78 0a 2a 2a 20 28 69 66 20 61  x index.** (if a
5280: 6e 79 29 20 66 6f 72 20 6c 61 6e 67 75 61 67 65  ny) for language
5290: 2d 69 64 20 30 20 69 73 20 61 6c 6c 6f 63 61 74  -id 0 is allocat
52a0: 65 64 20 76 61 6c 75 65 73 20 31 30 32 34 2d 32  ed values 1024-2
52b0: 30 34 37 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a  047. And so on..
52c0: 2a 2a 20 4c 61 6e 67 75 61 67 65 20 31 20 69 6e  ** Language 1 in
52d0: 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63 61  dexes are alloca
52e0: 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ted immediately 
52f0: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 61 6e 67 75 61  following langua
5300: 67 65 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20  ge 0..**.** So, 
5310: 66 6f 72 20 61 20 73 79 73 74 65 6d 20 77 69 74  for a system wit
5320: 68 20 6e 50 72 65 66 69 78 20 70 72 65 66 69 78  h nPrefix prefix
5330: 20 69 6e 64 65 78 65 73 20 63 6f 6e 66 69 67 75   indexes configu
5340: 72 65 64 2c 20 74 68 65 20 62 6c 6f 63 6b 20 6f  red, the block o
5350: 66 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6c 65  f.** absolute le
5360: 76 65 6c 73 20 74 68 61 74 20 63 6f 72 72 65 73  vels that corres
5370: 70 6f 6e 64 73 20 74 6f 20 6c 61 6e 67 75 61 67  ponds to languag
5380: 65 2d 69 64 20 69 4c 61 6e 67 69 64 20 61 6e 64  e-id iLangid and
5390: 20 69 6e 64 65 78 20 0a 2a 2a 20 69 49 6e 64 65   index .** iInde
53a0: 78 20 73 74 61 72 74 73 20 61 74 20 61 62 73 6f  x starts at abso
53b0: 6c 75 74 65 20 6c 65 76 65 6c 20 28 28 69 4c 61  lute level ((iLa
53c0: 6e 67 69 64 20 2a 20 28 6e 50 72 65 66 69 78 2b  ngid * (nPrefix+
53d0: 31 29 20 2b 20 69 49 6e 64 65 78 29 20 2a 20 31  1) + iIndex) * 1
53e0: 30 32 34 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  024)..*/.static 
53f0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 67 65  sqlite3_int64 ge
5400: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 0a  tAbsoluteLevel(.
5410: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
5440: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
5450: 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20  iLangid,        
5460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5470: 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20  anguage id */.  
5480: 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61  /* Index in p->a
54b0: 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Index[] */.  int
54c0: 20 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20   iLevel         
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54e0: 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74  Level of segment
54f0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
5500: 33 5f 69 6e 74 36 34 20 69 42 61 73 65 3b 20 20  3_int64 iBase;  
5510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5520: 73 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  st absolute leve
5530: 6c 20 66 6f 72 20 69 4c 61 6e 67 69 64 2f 69 49  l for iLangid/iI
5540: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
5550: 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a  ( iLangid>=0 );.
5560: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e    assert( p->nIn
5570: 64 65 78 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  dex>0 );.  asser
5580: 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20  t( iIndex>=0 && 
5590: 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78  iIndex<p->nIndex
55a0: 20 29 3b 0a 0a 20 20 69 42 61 73 65 20 3d 20 28   );..  iBase = (
55b0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69  (sqlite3_int64)i
55c0: 4c 61 6e 67 69 64 20 2a 20 70 2d 3e 6e 49 6e 64  Langid * p->nInd
55d0: 65 78 20 2b 20 69 49 6e 64 65 78 29 20 2a 20 46  ex + iIndex) * F
55e0: 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
55f0: 56 45 4c 3b 0a 20 20 72 65 74 75 72 6e 20 69 42  VEL;.  return iB
5600: 61 73 65 20 2b 20 69 4c 65 76 65 6c 3b 0a 7d 0a  ase + iLevel;.}.
5610: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 53 74  ./*.** Set *ppSt
5620: 6d 74 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  mt to a statemen
5630: 74 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61  t handle that ma
5640: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  y be used to ite
5650: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
5660: 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20  all rows in the 
5670: 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20  %_segdir table, 
5680: 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e  from oldest to n
5690: 65 77 65 73 74 2e 20 49 66 20 73 75 63 63 65 73  ewest. If succes
56a0: 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
56b0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
56c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
56d0: 69 6c 65 20 70 72 65 70 61 72 69 6e 67 20 74 68  ile preparing th
56e0: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a  e statement, .**
56f0: 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
5700: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
5710: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  .** There is onl
5720: 79 20 65 76 65 72 20 6f 6e 65 20 69 6e 73 74 61  y ever one insta
5730: 6e 63 65 20 6f 66 20 74 68 69 73 20 53 51 4c 20  nce of this SQL 
5740: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 69 6c  statement compil
5750: 65 64 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 46  ed for.** each F
5760: 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  TS3 table..**.**
5770: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   The statement r
5780: 65 74 75 72 6e 73 20 74 68 65 20 66 6f 6c 6c 6f  eturns the follo
5790: 77 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  wing columns fro
57a0: 6d 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  m the %_segdir t
57b0: 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  able:.**.**   0:
57c0: 20 69 64 78 0a 2a 2a 20 20 20 31 3a 20 73 74 61   idx.**   1: sta
57d0: 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a  rt_block.**   2:
57e0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
57f0: 6b 0a 2a 2a 20 20 20 33 3a 20 65 6e 64 5f 62 6c  k.**   3: end_bl
5800: 6f 63 6b 0a 2a 2a 20 20 20 34 3a 20 72 6f 6f 74  ock.**   4: root
5810: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5820: 74 73 33 41 6c 6c 53 65 67 64 69 72 73 28 0a 20  ts3AllSegdirs(. 
5830: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 2a   /* FTS3 table *
5860: 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
5890: 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
58a0: 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20  .  int iIndex,  
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
58d0: 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20  p->aIndex[] */. 
58e0: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 73 65 6c   /* Level to sel
5910: 65 63 74 20 28 72 65 6c 61 74 69 76 65 20 6c 65  ect (relative le
5920: 76 65 6c 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  vel) */.  sqlite
5930: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20  3_stmt **ppStmt 
5940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5950: 3a 20 43 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  : Compiled state
5960: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
5970: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
5980: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
5990: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65  .  assert( iLeve
59a0: 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
59b0: 52 5f 41 4c 4c 20 7c 7c 20 69 4c 65 76 65 6c 3e  R_ALL || iLevel>
59c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
59d0: 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 47 44  iLevel<FTS3_SEGD
59e0: 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a 20  IR_MAXLEVEL );. 
59f0: 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
5a00: 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
5a10: 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 66 28  nIndex );..  if(
5a20: 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
5a30: 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52   /* "SELECT * FR
5a40: 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48 45 52  OM %_segdir WHER
5a50: 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20  E level BETWEEN 
5a60: 3f 20 41 4e 44 20 3f 20 4f 52 44 45 52 20 42 59  ? AND ? ORDER BY
5a70: 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72 63 20   ..." */.    rc 
5a80: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
5a90: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
5aa0: 4c 5f 52 41 4e 47 45 2c 20 26 70 53 74 6d 74 2c  L_RANGE, &pStmt,
5ab0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
5ac0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
5ae0: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
5af0: 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  , getAbsoluteLev
5b00: 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
5b10: 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 20 20  Index, 0));.    
5b20: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
5b30: 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a  nt64(pStmt, 2, .
5b40: 20 20 20 20 20 20 20 20 20 20 67 65 74 41 62 73            getAbs
5b50: 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c  oluteLevel(p, iL
5b60: 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 46  angid, iIndex, F
5b70: 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
5b80: 56 45 4c 2d 31 29 0a 20 20 20 20 20 20 29 3b 0a  VEL-1).      );.
5b90: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5ba0: 20 20 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a 20     /* "SELECT * 
5bb0: 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48  FROM %_segdir WH
5bc0: 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f 52  ERE level = ? OR
5bd0: 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20  DER BY ..." */. 
5be0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
5bf0: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
5c00: 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c  T_LEVEL, &pStmt,
5c10: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
5c20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
5c40: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
5c50: 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  , getAbsoluteLev
5c60: 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
5c70: 49 6e 64 65 78 2c 69 4c 65 76 65 6c 29 29 3b 0a  Index,iLevel));.
5c80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53      }.  }.  *ppS
5c90: 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72  tmt = pStmt;.  r
5ca0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5cb0: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e  .** Append a sin
5cc0: 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20  gle varint to a 
5cd0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 62 75 66 66  PendingList buff
5ce0: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
5cf0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20   returned.** if 
5d00: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
5d10: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
5d20: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
5d30: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5d40: 6f 6e 20 61 6c 73 6f 20 73 65 72 76 65 73 20 74  on also serves t
5d50: 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
5d60: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
5d70: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  ture itself..** 
5d80: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  For example, to 
5d90: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 65 6e  create a new Pen
5da0: 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75  dingList structu
5db0: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 77  re containing tw
5dc0: 6f 0a 2a 2a 20 76 61 72 69 6e 74 73 3a 0a 2a 2a  o.** varints:.**
5dd0: 0a 2a 2a 20 20 20 50 65 6e 64 69 6e 67 4c 69 73  .**   PendingLis
5de0: 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20 20 66  t *p = 0;.**   f
5df0: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
5e00: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31  pendVarint(&p, 1
5e10: 29 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65 6e 64  );.**   fts3Pend
5e20: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
5e30: 69 6e 74 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73  int(&p, 2);.*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65  tatic int fts3Pe
5e50: 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56  ndingListAppendV
5e60: 61 72 69 6e 74 28 0a 20 20 50 65 6e 64 69 6e 67  arint(.  Pending
5e70: 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20 20  List **pp,      
5e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
5e90: 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 50  UT: Pointer to P
5ea0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
5eb0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
5ec0: 6e 74 36 34 20 69 20 20 20 20 20 20 20 20 20 20  nt64 i          
5ed0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
5ee0: 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
5ef0: 61 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e  a */.){.  Pendin
5f00: 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a  gList *p = *pp;.
5f10: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  .  /* Allocate o
5f20: 72 20 67 72 6f 77 20 74 68 65 20 50 65 6e 64 69  r grow the Pendi
5f30: 6e 67 4c 69 73 74 20 61 73 20 72 65 71 75 69 72  ngList as requir
5f40: 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 20  ed. */.  if( !p 
5f50: 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
5f60: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
5f70: 28 2a 70 29 20 2b 20 31 30 30 29 3b 0a 20 20 20  (*p) + 100);.   
5f80: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20   if( !p ){.     
5f90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5fa0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
5fb0: 70 2d 3e 6e 53 70 61 63 65 20 3d 20 31 30 30 3b  p->nSpace = 100;
5fc0: 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20  .    p->aData = 
5fd0: 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20  (char *)&p[1];. 
5fe0: 20 20 20 70 2d 3e 6e 44 61 74 61 20 3d 20 30 3b     p->nData = 0;
5ff0: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
6000: 70 2d 3e 6e 44 61 74 61 2b 46 54 53 33 5f 56 41  p->nData+FTS3_VA
6010: 52 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53  RINT_MAX+1>p->nS
6020: 70 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  pace ){.    int 
6030: 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53 70 61 63 65  nNew = p->nSpace
6040: 20 2a 20 32 3b 0a 20 20 20 20 70 20 3d 20 73 71   * 2;.    p = sq
6050: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c  lite3_realloc(p,
6060: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e 4e   sizeof(*p) + nN
6070: 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20  ew);.    if( !p 
6080: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6090: 5f 66 72 65 65 28 2a 70 70 29 3b 0a 20 20 20 20  _free(*pp);.    
60a0: 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 20    *pp = 0;.     
60b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
60c0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
60d0: 70 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65 77  p->nSpace = nNew
60e0: 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d  ;.    p->aData =
60f0: 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a   (char *)&p[1];.
6100: 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
6110: 20 74 68 65 20 6e 65 77 20 73 65 72 69 61 6c 69   the new seriali
6120: 7a 65 64 20 76 61 72 69 6e 74 20 74 6f 20 74 68  zed varint to th
6130: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
6140: 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74 61  t. */.  p->nData
6150: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
6160: 75 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 44 61  utVarint(&p->aDa
6170: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20 69 29  ta[p->nData], i)
6180: 3b 0a 20 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e  ;.  p->aData[p->
6190: 6e 44 61 74 61 5d 20 3d 20 27 5c 30 27 3b 0a 20  nData] = '\0';. 
61a0: 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75   *pp = p;.  retu
61b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
61c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 64 6f 63  ./*.** Add a doc
61d0: 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69  id/column/positi
61e0: 6f 6e 20 65 6e 74 72 79 20 74 6f 20 61 20 50 65  on entry to a Pe
61f0: 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74  ndingList struct
6200: 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  ure. Non-zero.**
6210: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6220: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  the structure is
6230: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
6240: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 64  ed as part of ad
6250: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 74 72  ding.** the entr
6260: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65  y. Otherwise, ze
6270: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ro..**.** If an 
6280: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6290: 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  , *pRc is set to
62a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65   SQLITE_NOMEM be
62b0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
62c0: 2a 2a 20 5a 65 72 6f 20 69 73 20 61 6c 77 61 79  ** Zero is alway
62d0: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  s returned in th
62e0: 69 73 20 63 61 73 65 2e 20 4f 74 68 65 72 77 69  is case. Otherwi
62f0: 73 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20 65 72  se, if no OOM er
6300: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ror occurs,.** i
6310: 74 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  t is set to SQLI
6320: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
6330: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
6340: 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 65  ListAppend(.  Pe
6350: 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20  ndingList **pp, 
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6370: 20 49 4e 2f 4f 55 54 3a 20 50 65 6e 64 69 6e 67   IN/OUT: Pending
6380: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 2a  List structure *
6390: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
63a0: 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  4 iDocid,       
63b0: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f 72      /* Docid for
63c0: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
63d0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
63e0: 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
63f0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72     /* Column for
6400: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
6410: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6420: 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
6430: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
6440: 66 20 74 65 72 6d 20 66 6f 72 20 65 6e 74 72 79  f term for entry
6450: 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74   to add */.  int
6460: 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6480: 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65  OUT: Return code
6490: 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67   */.){.  Pending
64a0: 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 20  List *p = *pp;. 
64b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
64c0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
64d0: 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44 6f  !p || p->iLastDo
64e0: 63 69 64 3c 3d 69 44 6f 63 69 64 20 29 3b 0a 0a  cid<=iDocid );..
64f0: 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e 69    if( !p || p->i
6500: 4c 61 73 74 44 6f 63 69 64 21 3d 69 44 6f 63 69  LastDocid!=iDoci
6510: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
6520: 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 20 3d 20  _int64 iDelta = 
6530: 69 44 6f 63 69 64 20 2d 20 28 70 20 3f 20 70 2d  iDocid - (p ? p-
6540: 3e 69 4c 61 73 74 44 6f 63 69 64 20 3a 20 30 29  >iLastDocid : 0)
6550: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6560: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
6570: 6e 44 61 74 61 3c 70 2d 3e 6e 53 70 61 63 65 20  nData<p->nSpace 
6580: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
6590: 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61   p->aData[p->nDa
65a0: 74 61 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ta]==0 );.      
65b0: 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20 20 20  p->nData++;.    
65c0: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
65d0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
65e0: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
65f0: 56 61 72 69 6e 74 28 26 70 2c 20 69 44 65 6c 74  Varint(&p, iDelt
6600: 61 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  a)) ){.      got
6610: 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70 70  o pendinglistapp
6620: 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  end_out;.    }. 
6630: 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d     p->iLastCol =
6640: 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73   -1;.    p->iLas
6650: 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d  tPos = 0;.    p-
6660: 3e 69 4c 61 73 74 44 6f 63 69 64 20 3d 20 69 44  >iLastDocid = iD
6670: 6f 63 69 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ocid;.  }.  if( 
6680: 69 43 6f 6c 3e 30 20 26 26 20 70 2d 3e 69 4c 61  iCol>0 && p->iLa
6690: 73 74 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20  stCol!=iCol ){. 
66a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
66b0: 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64  !=(rc = fts3Pend
66c0: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
66d0: 69 6e 74 28 26 70 2c 20 31 29 29 0a 20 20 20 20  int(&p, 1)).    
66e0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
66f0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
6700: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
6710: 28 26 70 2c 20 69 43 6f 6c 29 29 0a 20 20 20 20  (&p, iCol)).    
6720: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65  ){.      goto pe
6730: 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f  ndinglistappend_
6740: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
6750: 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 69 43 6f  ->iLastCol = iCo
6760: 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50  l;.    p->iLastP
6770: 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  os = 0;.  }.  if
6780: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
6790: 20 61 73 73 65 72 74 28 20 69 50 6f 73 3e 70 2d   assert( iPos>p-
67a0: 3e 69 4c 61 73 74 50 6f 73 20 7c 7c 20 28 69 50  >iLastPos || (iP
67b0: 6f 73 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 61 73  os==0 && p->iLas
67c0: 74 50 6f 73 3d 3d 30 29 20 29 3b 0a 20 20 20 20  tPos==0) );.    
67d0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
67e0: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
67f0: 28 26 70 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e 69  (&p, 2+iPos-p->i
6800: 4c 61 73 74 50 6f 73 29 3b 0a 20 20 20 20 69 66  LastPos);.    if
6810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6820: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 61 73  ){.      p->iLas
6830: 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20 20  tPos = iPos;.   
6840: 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64 69 6e 67   }.  }.. pending
6850: 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3a 0a  listappend_out:.
6860: 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 69    *pRc = rc;.  i
6870: 66 28 20 70 21 3d 2a 70 70 20 29 7b 0a 20 20 20  f( p!=*pp ){.   
6880: 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20 72 65   *pp = p;.    re
6890: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
68a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
68b0: 20 46 72 65 65 20 61 20 50 65 6e 64 69 6e 67 4c   Free a PendingL
68c0: 69 73 74 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  ist object alloc
68d0: 61 74 65 64 20 62 79 20 66 74 73 33 50 65 6e 64  ated by fts3Pend
68e0: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 29 2e  ingListAppend().
68f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6900: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44  fts3PendingListD
6910: 65 6c 65 74 65 28 50 65 6e 64 69 6e 67 4c 69 73  elete(PendingLis
6920: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
6930: 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
6940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
6950: 6e 20 65 6e 74 72 79 20 74 6f 20 6f 6e 65 20 6f  n entry to one o
6960: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
6970: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e  rms hash tables.
6980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
6990: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41  ts3PendingTermsA
69a0: 64 64 4f 6e 65 28 0a 20 20 46 74 73 33 54 61 62  ddOne(.  Fts3Tab
69b0: 6c 65 20 2a 70 2c 0a 20 20 69 6e 74 20 69 43 6f  le *p,.  int iCo
69c0: 6c 2c 0a 20 20 69 6e 74 20 69 50 6f 73 2c 0a 20  l,.  int iPos,. 
69d0: 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
69e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
69f0: 20 2f 2a 20 50 65 6e 64 69 6e 67 20 74 65 72 6d   /* Pending term
6a00: 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  s hash table to 
6a10: 61 64 64 20 65 6e 74 72 79 20 74 6f 20 2a 2f 0a  add entry to */.
6a20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6a30: 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 6e 54 6f 6b  oken,.  int nTok
6a40: 65 6e 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c  en.){.  PendingL
6a50: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  ist *pList;.  in
6a60: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6a70: 3b 0a 0a 20 20 70 4c 69 73 74 20 3d 20 28 50 65  ;..  pList = (Pe
6a80: 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33  ndingList *)fts3
6a90: 48 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c 20  HashFind(pHash, 
6aa0: 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  zToken, nToken);
6ab0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
6ac0: 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
6ad0: 61 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e 6e  ata -= (pList->n
6ae0: 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20  Data + nToken + 
6af0: 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45  sizeof(Fts3HashE
6b00: 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lem));.  }.  if(
6b10: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6b20: 41 70 70 65 6e 64 28 26 70 4c 69 73 74 2c 20 70  Append(&pList, p
6b30: 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 69 43  ->iPrevDocid, iC
6b40: 6f 6c 2c 20 69 50 6f 73 2c 20 26 72 63 29 20 29  ol, iPos, &rc) )
6b50: 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  {.    if( pList=
6b60: 3d 66 74 73 33 48 61 73 68 49 6e 73 65 72 74 28  =fts3HashInsert(
6b70: 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e  pHash, zToken, n
6b80: 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20 29 7b  Token, pList) ){
6b90: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  .      /* Malloc
6ba0: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 69 6e   failed while in
6bb0: 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20  serting the new 
6bc0: 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61 6e 20  entry. This can 
6bd0: 6f 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 68  only .      ** h
6be0: 61 70 70 65 6e 20 69 66 20 74 68 65 72 65 20 77  appen if there w
6bf0: 61 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 65  as no previous e
6c00: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 6f  ntry for this to
6c10: 6b 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ken..      */.  
6c20: 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66      assert( 0==f
6c30: 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61 73  ts3HashFind(pHas
6c40: 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  h, zToken, nToke
6c50: 6e 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n) );.      sqli
6c60: 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b  te3_free(pList);
6c70: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6c80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
6c90: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
6ca0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
6cb0: 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 2b  ->nPendingData +
6cc0: 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20  = (pList->nData 
6cd0: 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f  + nToken + sizeo
6ce0: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29 29  f(Fts3HashElem))
6cf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6d00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65  c;.}../*.** Toke
6d10: 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d 74 65 72  nize the nul-ter
6d20: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 7a  minated string z
6d30: 54 65 78 74 20 61 6e 64 20 61 64 64 20 61 6c 6c  Text and add all
6d40: 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68 65 0a 2a   tokens to the.*
6d50: 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  * pending-terms 
6d60: 68 61 73 68 2d 74 61 62 6c 65 2e 20 54 68 65 20  hash-table. The 
6d70: 64 6f 63 69 64 20 75 73 65 64 20 69 73 20 74 68  docid used is th
6d80: 61 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  at currently sto
6d90: 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e 69 50 72  red in.** p->iPr
6da0: 65 76 44 6f 63 69 64 2c 20 61 6e 64 20 74 68 65  evDocid, and the
6db0: 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65 63 69   column is speci
6dc0: 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74  fied by argument
6dd0: 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iCol..**.** If 
6de0: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
6df0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6e00: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
6e10: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
6e20: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
6e30: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
6e40: 6d 73 41 64 64 28 0a 20 20 46 74 73 33 54 61 62  msAdd(.  Fts3Tab
6e50: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
6e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
6e70: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78  e into which tex
6e80: 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
6e90: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  ed */.  int iLan
6ea0: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
6eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
6ec0: 61 67 65 20 69 64 20 74 6f 20 75 73 65 20 2a 2f  age id to use */
6ed0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6ee0: 54 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Text,           
6ef0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 64 6f     /* Text of do
6f00: 63 75 6d 65 6e 74 20 74 6f 20 62 65 20 69 6e 73  cument to be ins
6f10: 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  erted */.  int i
6f20: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
6f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
6f40: 6c 75 6d 6e 20 69 6e 74 6f 20 77 68 69 63 68 20  lumn into which 
6f50: 74 65 78 74 20 69 73 20 62 65 69 6e 67 20 69 6e  text is being in
6f60: 73 65 72 74 65 64 20 2a 2f 0a 20 20 75 33 32 20  serted */.  u32 
6f70: 2a 70 6e 57 6f 72 64 20 20 20 20 20 20 20 20 20  *pnWord         
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6f90: 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 74 6f  UT: Number of to
6fa0: 6b 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  kens inserted */
6fb0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
6fc0: 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 69 6e  int iStart;.  in
6fd0: 74 20 69 45 6e 64 3b 0a 20 20 69 6e 74 20 69 50  t iEnd;.  int iP
6fe0: 6f 73 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 64 20  os;.  int nWord 
6ff0: 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e  = 0;..  char con
7000: 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69 6e  st *zToken;.  in
7010: 74 20 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c  t nToken;..  sql
7020: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a  ite3_tokenizer *
7030: 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e  pTokenizer = p->
7040: 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71  pTokenizer;.  sq
7050: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
7060: 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d  module const *pM
7070: 6f 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a  odule = pTokeniz
7080: 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73  er->pModule;.  s
7090: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
70a0: 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20  _cursor *pCsr;. 
70b0: 20 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71   int (*xNext)(sq
70c0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
70d0: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c  cursor *pCursor,
70e0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
70f0: 72 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e  r**,int*,int*,in
7100: 74 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73  t*,int*);..  ass
7110: 65 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20  ert( pTokenizer 
7120: 26 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20  && pModule );.. 
7130: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
7140: 68 61 73 20 69 6e 73 65 72 74 65 64 20 61 20 4e  has inserted a N
7150: 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73 20  ULL value, this 
7160: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
7170: 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
7180: 20 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74 68   zText==0. In th
7190: 69 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65 72  is case, add zer
71a0: 6f 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73 20  o token entries 
71b0: 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
71c0: 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74 75  e and .  ** retu
71d0: 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69  rn early. */.  i
71e0: 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
71f0: 20 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b 0a     *pnWord = 0;.
7200: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7210: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
7220: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65  = sqlite3Fts3Ope
7230: 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b 65  nTokenizer(pToke
7240: 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c 20  nizer, iLangid, 
7250: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72  zText, -1, &pCsr
7260: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7270: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
7280: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7290: 78 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d  xNext = pModule-
72a0: 3e 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28  >xNext;.  while(
72b0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20   SQLITE_OK==rc. 
72c0: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
72d0: 4b 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70  K==(rc = xNext(p
72e0: 43 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e  Csr, &zToken, &n
72f0: 54 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20  Token, &iStart, 
7300: 26 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20  &iEnd, &iPos)). 
7310: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
7320: 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57 6f     if( iPos>=nWo
7330: 72 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50 6f  rd ) nWord = iPo
7340: 73 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73  s+1;..    /* Pos
7350: 69 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65  itions cannot be
7360: 20 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75 73   negative; we us
7370: 65 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69 6e  e -1 as a termin
7380: 61 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  ator internally.
7390: 0a 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d  .    ** Tokens m
73a0: 75 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d 7a  ust have a non-z
73b0: 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20  ero length..    
73c0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3c  */.    if( iPos<
73d0: 30 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20  0 || !zToken || 
73e0: 6e 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20 20  nToken<=0 ){.   
73f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
7400: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
7410: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7420: 20 41 64 64 20 74 68 65 20 74 65 72 6d 20 74 6f   Add the term to
7430: 20 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65 78   the terms index
7440: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
7450: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64  3PendingTermsAdd
7460: 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c 20  One(.        p, 
7470: 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d 3e  iCol, iPos, &p->
7480: 61 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64 69  aIndex[0].hPendi
7490: 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ng, zToken, nTok
74a0: 65 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a 20  en.    );.    . 
74b0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65     /* Add the te
74c0: 72 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68  rm to each of th
74d0: 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  e prefix indexes
74e0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
74f0: 74 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f 72  too .    ** shor
7500: 74 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66 6f  t for. */.    fo
7510: 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=1; rc==SQLIT
7520: 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e  E_OK && i<p->nIn
7530: 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  dex; i++){.     
7540: 20 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65   struct Fts3Inde
7550: 78 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d 3e  x *pIndex = &p->
7560: 61 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20 20  aIndex[i];.     
7570: 20 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e 64   if( nToken<pInd
7580: 65 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63 6f  ex->nPrefix ) co
7590: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 63  ntinue;.      rc
75a0: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
75b0: 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20  rmsAddOne(.     
75c0: 20 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50       p, iCol, iP
75d0: 6f 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50 65  os, &pIndex->hPe
75e0: 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 70  nding, zToken, p
75f0: 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a 20  Index->nPrefix. 
7600: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
7610: 7d 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  }..  pModule->xC
7620: 6c 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a 70  lose(pCsr);.  *p
7630: 6e 57 6f 72 64 20 3d 20 6e 57 6f 72 64 3b 0a 20  nWord = nWord;. 
7640: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
7650: 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
7660: 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
7670: 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  * .** Calling th
7680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
7690: 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65  cates that subse
76a0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a  quent calls to .
76b0: 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  ** fts3PendingTe
76c0: 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f 20  rmsAdd() are to 
76d0: 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f  add term/positio
76e0: 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f 72  n-list pairs for
76f0: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
7700: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
7710: 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f 63   with docid iDoc
7720: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
7730: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
7740: 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54  msDocid(.  Fts3T
7750: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
7760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
7770: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68 61  ll-text table ha
7780: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndle */.  int iL
7790: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
77a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
77b0: 67 75 61 67 65 20 69 64 20 6f 66 20 72 6f 77 20  guage id of row 
77c0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
77d0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
77e0: 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20  iDocid          
77f0: 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 72     /* Docid of r
7800: 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ow being written
7810: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
7820: 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 0a   iLangid>=0 );..
7830: 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29    /* TODO(shess)
7840: 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72   Explore whether
7850: 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68   partially flush
7860: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f  ing the buffer o
7870: 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c  n.  ** forced-fl
7880: 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64  ush would provid
7890: 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d  e better perform
78a0: 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74  ance.  I suspect
78b0: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65   that if.  ** we
78c0: 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63   ordered the doc
78d0: 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e  lists by size an
78e0: 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61  d flushed the la
78f0: 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a  rgest until the.
7900: 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20    ** buffer was 
7910: 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74  half empty, that
7920: 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c   would let the l
7930: 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72  ess frequent ter
7940: 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  ms.  ** generate
7950: 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73   longer doclists
7960: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f  ..  */.  if( iDo
7970: 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44 6f 63  cid<=p->iPrevDoc
7980: 69 64 20 0a 20 20 20 7c 7c 20 70 2d 3e 69 50 72  id .   || p->iPr
7990: 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e 67 69  evLangid!=iLangi
79a0: 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64  d.   || p->nPend
79b0: 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78 50  ingData>p->nMaxP
79c0: 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20 29 7b  endingData .  ){
79d0: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
79e0: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
79f0: 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
7a00: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7a10: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7a20: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65 76  ;.  }.  p->iPrev
7a30: 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
7a40: 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64    p->iPrevLangid
7a50: 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72 65   = iLangid;.  re
7a60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
7a80: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
7a90: 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
7aa0: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ms hash tables. 
7ab0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7ac0: 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
7ad0: 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65 20  Clear(Fts3Table 
7ae0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7af0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
7b00: 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
7b10: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45  Fts3HashElem *pE
7b20: 6c 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61 73  lem;.    Fts3Has
7b30: 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e 61  h *pHash = &p->a
7b40: 49 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e  Index[i].hPendin
7b50: 67 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  g;.    for(pElem
7b60: 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28 70  =fts3HashFirst(p
7b70: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
7b80: 6c 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74  lem=fts3HashNext
7b90: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
7ba0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69  PendingList *pLi
7bb0: 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73  st = (PendingLis
7bc0: 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61  t *)fts3HashData
7bd0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66  (pElem);.      f
7be0: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65  ts3PendingListDe
7bf0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
7c00: 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68 43   }.    fts3HashC
7c10: 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d  lear(pHash);.  }
7c20: 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  .  p->nPendingDa
7c30: 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta = 0;.}../*.**
7c40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7c50: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7c60: 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64  xUpdate() method
7c70: 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49   as part of an I
7c80: 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69  NSERT.** operati
7c90: 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72  on. It adds entr
7ca0: 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 65 72  ies for each ter
7cb0: 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63  m in the new rec
7cc0: 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65  ord to the.** pe
7cd0: 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20  ndingTerms hash 
7ce0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  table..**.** Arg
7cf0: 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74  ument apVal is t
7d00: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
7d10: 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61  imilarly named a
7d20: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
7d30: 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44  o.** fts3InsertD
7d40: 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72  ata(). Parameter
7d50: 20 69 44 6f 63 69 64 20 69 73 20 74 68 65 20 64   iDocid is the d
7d60: 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20  ocid of the new 
7d70: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
7d80: 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54 65 72  nt fts3InsertTer
7d90: 6d 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ms(.  Fts3Table 
7da0: 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67  *p, .  int iLang
7db0: 69 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  id, .  sqlite3_v
7dc0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20  alue **apVal, . 
7dd0: 20 75 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20 69   u32 *aSz.){.  i
7de0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e00: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
7e10: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32  ble */.  for(i=2
7e20: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  ; i<p->nColumn+2
7e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
7e40: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  t char *zText = 
7e50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
7e60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7e70: 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20  (apVal[i]);.    
7e80: 69 6e 74 20 72 63 20 3d 20 66 74 73 33 50 65 6e  int rc = fts3Pen
7e90: 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20  dingTermsAdd(p, 
7ea0: 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c 20  iLangid, zText, 
7eb0: 69 2d 32 2c 20 26 61 53 7a 5b 69 2d 32 5d 29 3b  i-2, &aSz[i-2]);
7ec0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7ed0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7ee0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
7ef0: 0a 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c  .    aSz[p->nCol
7f00: 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  umn] += sqlite3_
7f10: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61  value_bytes(apVa
7f20: 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  l[i]);.  }.  ret
7f30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7f40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
7f50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
7f60: 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28 29  by the xUpdate()
7f70: 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 6e 20 49   method for an I
7f80: 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e  NSERT operation.
7f90: 0a 2a 2a 20 54 68 65 20 61 70 56 61 6c 20 70 61  .** The apVal pa
7fa0: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
7fb0: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
7fc0: 61 70 56 61 6c 20 61 72 67 75 6d 65 6e 74 20 70  apVal argument p
7fd0: 61 73 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c 69  assed by.** SQLi
7fe0: 74 65 20 74 6f 20 74 68 65 20 78 55 70 64 61 74  te to the xUpdat
7ff0: 65 28 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65 3a  e() method. i.e:
8000: 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 30  .**.**   apVal[0
8010: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
8020: 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 49 4e   Not used for IN
8030: 53 45 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61 6c  SERT..**   apVal
8040: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
8050: 20 20 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61 70     rowid.**   ap
8060: 56 61 6c 5b 32 5d 20 20 20 20 20 20 20 20 20 20  Val[2]          
8070: 20 20 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74 20        Left-most 
8080: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c  user-defined col
8090: 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  umn.**   ....** 
80a0: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
80b0: 6d 6e 2b 31 5d 20 20 20 20 20 52 69 67 68 74 2d  mn+1]     Right-
80c0: 6d 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65  most user-define
80d0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70  d column.**   ap
80e0: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  Val[p->nColumn+2
80f0: 5d 20 20 20 20 20 48 69 64 64 65 6e 20 63 6f 6c  ]     Hidden col
8100: 75 6d 6e 20 77 69 74 68 20 73 61 6d 65 20 6e 61  umn with same na
8110: 6d 65 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20 20  me as table.**  
8120: 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d   apVal[p->nColum
8130: 6e 2b 33 5d 20 20 20 20 20 48 69 64 64 65 6e 20  n+3]     Hidden 
8140: 22 64 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20 28  "docid" column (
8150: 61 6c 69 61 73 20 66 6f 72 20 72 6f 77 69 64 29  alias for rowid)
8160: 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e  .**   apVal[p->n
8170: 43 6f 6c 75 6d 6e 2b 34 5d 20 20 20 20 20 48 69  Column+4]     Hi
8180: 64 64 65 6e 20 6c 61 6e 67 75 61 67 65 69 64 20  dden languageid 
8190: 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
81a0: 20 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74 44   int fts3InsertD
81b0: 61 74 61 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ata(.  Fts3Table
81c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
81d0: 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74         /* Full-t
81e0: 65 78 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  ext table */.  s
81f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
8200: 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  pVal,          /
8210: 2a 20 41 72 72 61 79 20 6f 66 20 76 61 6c 75 65  * Array of value
8220: 73 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  s to insert */. 
8230: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
8240: 70 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20  piDocid         
8250: 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20 66   /* OUT: Docid f
8260: 6f 72 20 72 6f 77 20 6a 75 73 74 20 69 6e 73 65  or row just inse
8270: 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rted */.){.  int
8280: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82a0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
82b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
82c0: 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 3b 20 20  ContentInsert;  
82d0: 20 2f 2a 20 49 4e 53 45 52 54 20 49 4e 54 4f 20   /* INSERT INTO 
82e0: 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53  %_content VALUES
82f0: 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20 69 66 28 20  (...) */..  if( 
8300: 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 29  p->zContentTbl )
8310: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
8320: 6c 75 65 20 2a 70 52 6f 77 69 64 20 3d 20 61 70  lue *pRowid = ap
8330: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33  Val[p->nColumn+3
8340: 5d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ];.    if( sqlit
8350: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 52  e3_value_type(pR
8360: 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  owid)==SQLITE_NU
8370: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 77  LL ){.      pRow
8380: 69 64 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20  id = apVal[1];. 
8390: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
83a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
83b0: 70 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45 5f  pRowid)!=SQLITE_
83c0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
83d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
83e0: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
83f0: 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d 20  .    *piDocid = 
8400: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
8410: 74 36 34 28 70 52 6f 77 69 64 29 3b 0a 20 20 20  t64(pRowid);.   
8420: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8430: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  K;.  }..  /* Loc
8440: 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ate the statemen
8450: 74 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74 6f  t handle used to
8460: 20 69 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   insert data int
8470: 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 0a  o the %_content.
8480: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
8490: 53 51 4c 20 66 6f 72 20 74 68 69 73 20 73 74 61  SQL for this sta
84a0: 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 2a 2a 0a  tement is:.  **.
84b0: 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
84c0: 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c  TO %_content VAL
84d0: 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e  UES(?, ?, ?, ...
84e0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
84f0: 73 74 61 74 65 6d 65 6e 74 20 66 65 61 74 75 72  statement featur
8500: 65 73 20 4e 20 27 3f 27 20 76 61 72 69 61 62 6c  es N '?' variabl
8510: 65 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  es, where N is t
8520: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
8530: 72 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 63  r.  ** defined c
8540: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54  olumns in the FT
8550: 53 33 20 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f  S3 table, plus o
8560: 6e 65 20 66 6f 72 20 74 68 65 20 64 6f 63 69 64  ne for the docid
8570: 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72   field..  */.  r
8580: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
8590: 70 2c 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49  p, SQL_CONTENT_I
85a0: 4e 53 45 52 54 2c 20 26 70 43 6f 6e 74 65 6e 74  NSERT, &pContent
85b0: 49 6e 73 65 72 74 2c 20 26 61 70 56 61 6c 5b 31  Insert, &apVal[1
85c0: 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ]);.  if( rc==SQ
85d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 4c  LITE_OK && p->zL
85e0: 61 6e 67 75 61 67 65 69 64 20 29 7b 0a 20 20 20  anguageid ){.   
85f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
8600: 6e 64 5f 69 6e 74 28 0a 20 20 20 20 20 20 20 20  nd_int(.        
8610: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20  pContentInsert, 
8620: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 2c 20 0a 20  p->nColumn+2, . 
8630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
8640: 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 70  alue_int(apVal[p
8650: 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 29 0a 20 20  ->nColumn+4]).  
8660: 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72    );.  }.  if( r
8670: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8680: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
8690: 54 68 65 72 65 20 69 73 20 61 20 71 75 69 72 6b  There is a quirk
86a0: 20 68 65 72 65 2e 20 54 68 65 20 75 73 65 72 73   here. The users
86b0: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
86c0: 74 20 6d 61 79 20 68 61 76 65 20 73 70 65 63 69  t may have speci
86d0: 66 69 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c 75  fied.  ** a valu
86e0: 65 20 66 6f 72 20 74 68 65 20 22 72 6f 77 69 64  e for the "rowid
86f0: 22 20 66 69 65 6c 64 2c 20 66 6f 72 20 74 68 65  " field, for the
8700: 20 22 64 6f 63 69 64 22 20 66 69 65 6c 64 2c 20   "docid" field, 
8710: 6f 72 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  or for both..  *
8720: 2a 20 57 68 69 63 68 20 69 73 20 61 20 70 72 6f  * Which is a pro
8730: 62 6c 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f 77  blem, since "row
8740: 69 64 22 20 61 6e 64 20 22 64 6f 63 69 64 22 20  id" and "docid" 
8750: 61 72 65 20 61 6c 69 61 73 65 73 20 66 6f 72 20  are aliases for 
8760: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61  the.  ** same va
8770: 6c 75 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  lue. For example
8780: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e  :.  **.  **   IN
8790: 53 45 52 54 20 49 4e 54 4f 20 66 74 73 33 74 62  SERT INTO fts3tb
87a0: 6c 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 29 20  l(rowid, docid) 
87b0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
87c0: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33 2c  **.  ** In FTS3,
87d0: 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
87e0: 72 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  r. It is an erro
87f0: 72 20 74 6f 20 73 70 65 63 69 66 79 20 6e 6f 6e  r to specify non
8800: 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20 2a  -NULL values.  *
8810: 2a 20 66 6f 72 20 62 6f 74 68 20 64 6f 63 69 64  * for both docid
8820: 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20   and some other 
8830: 72 6f 77 69 64 20 61 6c 69 61 73 2e 0a 20 20 2a  rowid alias..  *
8840: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e  /.  if( SQLITE_N
8850: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
8860: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 33 2b  ue_type(apVal[3+
8870: 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a  p->nColumn]) ){.
8880: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
8890: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
88a0: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d  ue_type(apVal[0]
88b0: 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
88c0: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
88d0: 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
88e0: 31 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  1]).    ){.     
88f0: 20 2f 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63 69   /* A rowid/doci
8900: 64 20 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20  d conflict. */. 
8910: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8920: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
8930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8940: 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f 6e  _bind_value(pCon
8950: 74 65 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20 61  tentInsert, 1, a
8960: 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d  pVal[3+p->nColum
8970: 6e 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  n]);.    if( rc!
8980: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8990: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
89a0: 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73 74  * Execute the st
89b0: 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72  atement to inser
89c0: 74 20 74 68 65 20 72 65 63 6f 72 64 2e 20 53 65  t the record. Se
89d0: 74 20 2a 70 69 44 6f 63 69 64 20 74 6f 20 74 68  t *piDocid to th
89e0: 65 20 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63 69  e .  ** new doci
89f0: 64 20 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20  d value. .  */. 
8a00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43   sqlite3_step(pC
8a10: 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 20  ontentInsert);. 
8a20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
8a30: 73 65 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65  set(pContentInse
8a40: 72 74 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69 64  rt);..  *piDocid
8a50: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
8a60: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d 3e  insert_rowid(p->
8a70: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  db);.  return rc
8a80: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  ;.}..../*.** Rem
8a90: 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f  ove all data fro
8aa0: 6d 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  m the FTS3 table
8ab0: 2e 20 43 6c 65 61 72 20 74 68 65 20 68 61 73 68  . Clear the hash
8ac0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
8ad0: 67 0a 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65 72  g.** pending ter
8ae0: 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ms..*/.static in
8af0: 74 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28  t fts3DeleteAll(
8b00: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e  Fts3Table *p, in
8b10: 74 20 62 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 69  t bContent){.  i
8b20: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8b30: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
8b40: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
8b50: 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74  ..  /* Discard t
8b60: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
8b70: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
8b80: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
8b90: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
8ba0: 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
8bb0: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
8bc0: 65 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d 20  everything from 
8bd0: 74 68 65 20 73 68 61 64 6f 77 20 74 61 62 6c 65  the shadow table
8be0: 73 2e 20 45 78 63 65 70 74 2c 20 6c 65 61 76 65  s. Except, leave
8bf0: 20 25 5f 63 6f 6e 74 65 6e 74 20 61 73 0a 20 20   %_content as.  
8c00: 2a 2a 20 69 73 20 69 66 20 62 43 6f 6e 74 65 6e  ** is if bConten
8c10: 74 20 69 73 20 66 61 6c 73 65 2e 20 20 2a 2f 0a  t is false.  */.
8c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 43 6f    assert( p->zCo
8c30: 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 7c 7c 20 62  ntentTbl==0 || b
8c40: 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  Content==0 );.  
8c50: 69 66 28 20 62 43 6f 6e 74 65 6e 74 20 29 20 66  if( bContent ) f
8c60: 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20  ts3SqlExec(&rc, 
8c70: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
8c80: 4c 5f 43 4f 4e 54 45 4e 54 2c 20 30 29 3b 0a 20  L_CONTENT, 0);. 
8c90: 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63   fts3SqlExec(&rc
8ca0: 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  , p, SQL_DELETE_
8cb0: 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 2c 20 30 29  ALL_SEGMENTS, 0)
8cc0: 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63 28  ;.  fts3SqlExec(
8cd0: 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
8ce0: 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52 2c 20 30  TE_ALL_SEGDIR, 0
8cf0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73  );.  if( p->bHas
8d00: 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 66  Docsize ){.    f
8d10: 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20  ts3SqlExec(&rc, 
8d20: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
8d30: 4c 5f 44 4f 43 53 49 5a 45 2c 20 30 29 3b 0a 20  L_DOCSIZE, 0);. 
8d40: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73   }.  if( p->bHas
8d50: 53 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73 33  Stat ){.    fts3
8d60: 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20  SqlExec(&rc, p, 
8d70: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
8d80: 54 41 54 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  TAT, 0);.  }.  r
8d90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8da0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
8db0: 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63   langidFromSelec
8dc0: 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  t(Fts3Table *p, 
8dd0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
8de0: 65 6c 65 63 74 29 7b 0a 20 20 69 6e 74 20 69 4c  elect){.  int iL
8df0: 61 6e 67 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  angid = 0;.  if(
8e00: 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20   p->zLanguageid 
8e10: 29 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69  ) iLangid = sqli
8e20: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
8e30: 53 65 6c 65 63 74 2c 20 70 2d 3e 6e 43 6f 6c 75  Select, p->nColu
8e40: 6d 6e 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  mn+1);.  return 
8e50: 69 4c 61 6e 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  iLangid;.}../*.*
8e60: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
8e70: 65 6e 74 20 69 6e 20 74 68 65 20 61 70 56 61 6c  ent in the apVal
8e80: 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75  [] array is assu
8e90: 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  med to contain t
8ea0: 68 65 20 64 6f 63 69 64 0a 2a 2a 20 28 61 6e 20  he docid.** (an 
8eb0: 69 6e 74 65 67 65 72 29 20 6f 66 20 61 20 72 6f  integer) of a ro
8ec0: 77 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65  w about to be de
8ed0: 6c 65 74 65 64 2e 20 52 65 6d 6f 76 65 20 61 6c  leted. Remove al
8ee0: 6c 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  l terms from the
8ef0: 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  .** full-text in
8f00: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
8f10: 6f 69 64 20 66 74 73 33 44 65 6c 65 74 65 54 65  oid fts3DeleteTe
8f20: 72 6d 73 28 20 0a 20 20 69 6e 74 20 2a 70 52 43  rms( .  int *pRC
8f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8f40: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
8f50: 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  /.  Fts3Table *p
8f60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
8f70: 68 65 20 46 54 53 20 74 61 62 6c 65 20 74 6f 20  he FTS table to 
8f80: 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a 20  delete from */. 
8f90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8fa0: 70 52 6f 77 69 64 2c 20 20 2f 2a 20 54 68 65 20  pRowid,  /* The 
8fb0: 64 6f 63 69 64 20 74 6f 20 62 65 20 64 65 6c 65  docid to be dele
8fc0: 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53  ted */.  u32 *aS
8fd0: 7a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z               
8fe0: 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64 65 6c   /* Sizes of del
8ff0: 65 74 65 64 20 64 6f 63 75 6d 65 6e 74 20 77 72  eted document wr
9000: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
9010: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
9020: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
9030: 63 74 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  ct;..  if( *pRC 
9040: 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d  ) return;.  rc =
9050: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
9060: 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45  SQL_SELECT_CONTE
9070: 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70 53  NT_BY_ROWID, &pS
9080: 65 6c 65 63 74 2c 20 26 70 52 6f 77 69 64 29 3b  elect, &pRowid);
9090: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
90a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
90b0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
90c0: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
90d0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
90e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  ;.      int iLan
90f0: 67 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d  gid = langidFrom
9100: 53 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65 63  Select(p, pSelec
9110: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  t);.      rc = f
9120: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44  ts3PendingTermsD
9130: 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c  ocid(p, iLangid,
9140: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9150: 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 30  int64(pSelect, 0
9160: 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
9170: 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
9180: 20 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d   && i<=p->nColum
9190: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
91a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
91b0: 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  xt = (const char
91c0: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
91d0: 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20  n_text(pSelect, 
91e0: 69 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  i);.        rc =
91f0: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
9200: 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c  sAdd(p, iLangid,
9210: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 61 53 7a   zText, -1, &aSz
9220: 5b 69 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [i-1]);.        
9230: 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  aSz[p->nColumn] 
9240: 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  += sqlite3_colum
9250: 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74 2c  n_bytes(pSelect,
9260: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
9270: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9280: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9290: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
92a0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
92b0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
92c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
92d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20   }.    }.    rc 
92e0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
92f0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73  pSelect);.  }els
9300: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
9310: 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  eset(pSelect);. 
9320: 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a   }.  *pRC = rc;.
9330: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
9340: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f 20   declaration to 
9350: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
9360: 63 69 72 63 75 6c 61 72 20 64 65 70 65 6e 64 65  circular depende
9370: 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a 20 66  ncy between.** f
9380: 75 6e 63 74 69 6f 6e 73 20 66 74 73 33 53 65 67  unctions fts3Seg
9390: 6d 65 6e 74 4d 65 72 67 65 28 29 20 61 6e 64 20  mentMerge() and 
93a0: 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
93b0: 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74 61 74  irIdx()..*/.stat
93c0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65  ic int fts3Segme
93d0: 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c  ntMerge(Fts3Tabl
93e0: 65 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69  e *, int, int, i
93f0: 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  nt);../* .** Thi
9400: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
9410: 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65 6c  ates a new level
9420: 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69 6e   iLevel index in
9430: 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62 6c   the segdir tabl
9440: 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 69  e..** Usually, i
9450: 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63  ndexes are alloc
9460: 61 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c 65  ated within a le
9470: 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c 79  vel sequentially
9480: 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74   starting.** wit
9490: 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c 6f  h 0, so the allo
94a0: 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20 6f  cated index is o
94b0: 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ne greater than 
94c0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
94d0: 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a 20  ed.** by:.**.** 
94e0: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64 78    SELECT max(idx
94f0: 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20  ) FROM %_segdir 
9500: 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69  WHERE level = :i
9510: 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  Level.**.** Howe
9520: 76 65 72 2c 20 69 66 20 74 68 65 72 65 20 61 72  ver, if there ar
9530: 65 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f 4d  e already FTS3_M
9540: 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65 78  ERGE_COUNT index
9550: 65 73 20 61 74 20 74 68 65 20 72 65 71 75 65 73  es at the reques
9560: 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74 68  ted.** level, th
9570: 65 79 20 61 72 65 20 6d 65 72 67 65 64 20 69 6e  ey are merged in
9580: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  to a single leve
9590: 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65 67  l (iLevel+1) seg
95a0: 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a  ment and the .**
95b0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   allocated index
95c0: 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   is 0..**.** If 
95d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 49  successful, *piI
95e0: 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
95f0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   allocated index
9600: 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54 45   slot and SQLITE
9610: 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  _OK.** returned.
9620: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
9630: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9640: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9650: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
9660: 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64  AllocateSegdirId
9670: 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  x(.  Fts3Table *
9680: 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  p, .  int iLangi
9690: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
96a0: 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
96b0: 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  e id */.  int iI
96c0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
96d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
96e0: 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78  ex for p->aIndex
96f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
9700: 2c 20 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 0a  , .  int *piIdx.
9710: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
9740: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
9750: 5f 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b  _stmt *pNextIdx;
9760: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
9770: 79 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61  y for next idx a
9780: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a  t level iLevel *
9790: 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20  /.  int iNext = 
97a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
97b0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
97c0: 20 71 75 65 72 79 20 70 4e 65 78 74 49 64 78 20   query pNextIdx 
97d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
97e0: 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73  angid>=0 );.  as
97f0: 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e  sert( p->nIndex>
9800: 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  =1 );..  /* Set 
9810: 76 61 72 69 61 62 6c 65 20 69 4e 65 78 74 20 74  variable iNext t
9820: 6f 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c  o the next avail
9830: 61 62 6c 65 20 73 65 67 64 69 72 20 69 6e 64 65  able segdir inde
9840: 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  x at level iLeve
9850: 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  l. */.  rc = fts
9860: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
9870: 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44  NEXT_SEGMENT_IND
9880: 45 58 2c 20 26 70 4e 65 78 74 49 64 78 2c 20 30  EX, &pNextIdx, 0
9890: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
98a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
98b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
98c0: 28 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 49  (.        pNextI
98d0: 64 78 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75  dx, 1, getAbsolu
98e0: 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
98f0: 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
9900: 65 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  el).    );.    i
9910: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
9920: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4e 65 78  qlite3_step(pNex
9930: 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69  tIdx) ){.      i
9940: 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Next = sqlite3_c
9950: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74 49  olumn_int(pNextI
9960: 64 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  dx, 0);.    }.  
9970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
9980: 65 73 65 74 28 70 4e 65 78 74 49 64 78 29 3b 0a  eset(pNextIdx);.
9990: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
99a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
99b0: 2f 2a 20 49 66 20 69 4e 65 78 74 20 69 73 20 46  /* If iNext is F
99c0: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c  TS3_MERGE_COUNT,
99d0: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
99e0: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 73   level iLevel is
99f0: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
9a00: 66 75 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c 20  full, merge all 
9a10: 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76 65  segments in leve
9a20: 6c 20 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61 20  l iLevel into a 
9a30: 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31 0a  single iLevel+1.
9a40: 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 61      ** segment a
9a50: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65 77  nd allocate (new
9a60: 6c 79 20 66 72 65 65 64 29 20 69 6e 64 65 78 20  ly freed) index 
9a70: 30 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  0 at level iLeve
9a80: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
9a90: 20 20 2a 2a 20 69 66 20 69 4e 65 78 74 20 69 73    ** if iNext is
9aa0: 20 6c 65 73 73 20 74 68 61 6e 20 46 54 53 33 5f   less than FTS3_
9ab0: 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c 6c  MERGE_COUNT, all
9ac0: 6f 63 61 74 65 20 69 6e 64 65 78 20 69 4e 65 78  ocate index iNex
9ad0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
9ae0: 28 20 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d 45  ( iNext>=FTS3_ME
9af0: 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20  RGE_COUNT ){.   
9b00: 20 20 20 66 74 73 33 4c 6f 67 4d 65 72 67 65 28     fts3LogMerge(
9b10: 31 36 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c  16, getAbsoluteL
9b20: 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
9b30: 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29   iIndex, iLevel)
9b40: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
9b50: 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70  s3SegmentMerge(p
9b60: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
9b70: 78 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  x, iLevel);.    
9b80: 20 20 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20 20    *piIdx = 0;.  
9b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
9ba0: 70 69 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a 20  piIdx = iNext;. 
9bb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
9bc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9bd0: 54 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  The %_segments t
9be0: 61 62 6c 65 20 69 73 20 64 65 63 6c 61 72 65 64  able is declared
9bf0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
9c00: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
9c10: 45 20 25 5f 73 65 67 6d 65 6e 74 73 28 62 6c 6f  E %_segments(blo
9c20: 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ckid INTEGER PRI
9c30: 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
9c40: 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  BLOB).**.** This
9c50: 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
9c60: 64 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67  data from a sing
9c70: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 25 5f  le row of the %_
9c80: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20  segments table. 
9c90: 54 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  The.** specific 
9ca0: 72 6f 77 20 69 73 20 69 64 65 6e 74 69 66 69 65  row is identifie
9cb0: 64 20 62 79 20 74 68 65 20 69 42 6c 6f 63 6b 69  d by the iBlocki
9cc0: 64 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20  d parameter. If 
9cd0: 70 61 42 6c 6f 62 20 69 73 20 6e 6f 74 0a 2a 2a  paBlob is not.**
9ce0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 62 75   NULL, then a bu
9cf0: 66 66 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ffer is allocate
9d00: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
9d10: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 70  malloc() and pop
9d20: 75 6c 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ulated.** with t
9d30: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
9d40: 68 65 20 62 6c 6f 62 20 73 74 6f 72 65 64 20 69  he blob stored i
9d50: 6e 20 74 68 65 20 22 62 6c 6f 63 6b 22 20 63 6f  n the "block" co
9d60: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  lumn of the .** 
9d70: 69 64 65 6e 74 69 66 69 65 64 20 74 61 62 6c 65  identified table
9d80: 20 72 6f 77 20 69 73 2e 20 57 68 65 74 68 65 72   row is. Whether
9d90: 20 6f 72 20 6e 6f 74 20 70 61 42 6c 6f 62 20 69   or not paBlob i
9da0: 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42 6c 6f 62 20  s NULL, *pnBlob 
9db0: 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65  is set.** to the
9dc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
9dd0: 62 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72  b in bytes befor
9de0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
9df0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
9e00: 63 63 75 72 73 2c 20 6f 72 20 74 68 65 20 74 61  ccurs, or the ta
9e10: 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ble does not con
9e20: 74 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  tain the specifi
9e30: 65 64 20 72 6f 77 2c 0a 2a 2a 20 61 6e 20 53 51  ed row,.** an SQ
9e40: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
9e50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
9e60: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
9e70: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
9e80: 66 0a 2a 2a 20 70 61 42 6c 6f 62 20 69 73 20 6e  f.** paBlob is n
9e90: 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
9ea0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
9eb0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
9ec0: 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e 74  ller to.** event
9ed0: 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72  ually free the r
9ee0: 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 2e 0a  eturned buffer..
9ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9f00: 69 6f 6e 20 6d 61 79 20 6c 65 61 76 65 20 61 6e  ion may leave an
9f10: 20 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 62 6c   open sqlite3_bl
9f20: 6f 62 2a 20 68 61 6e 64 6c 65 20 69 6e 20 74 68  ob* handle in th
9f30: 65 0a 2a 2a 20 46 74 73 33 54 61 62 6c 65 2e 70  e.** Fts3Table.p
9f40: 53 65 67 6d 65 6e 74 73 20 76 61 72 69 61 62 6c  Segments variabl
9f50: 65 2e 20 54 68 69 73 20 68 61 6e 64 6c 65 20 69  e. This handle i
9f60: 73 20 72 65 75 73 65 64 20 62 79 20 73 75 62 73  s reused by subs
9f70: 65 71 75 65 6e 74 20 63 61 6c 6c 73 0a 2a 2a 20  equent calls.** 
9f80: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
9f90: 2e 20 54 68 65 20 68 61 6e 64 6c 65 20 6d 61 79  . The handle may
9fa0: 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 63 61   be closed by ca
9fb0: 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  lling the.** sql
9fc0: 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
9fd0: 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
9fe0: 2e 20 52 65 75 73 69 6e 67 20 61 20 62 6c 6f 62  . Reusing a blob
9ff0: 20 68 61 6e 64 6c 65 20 69 73 20 61 20 68 61 6e   handle is a han
a000: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
a010: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2c 20 62  e improvement, b
a020: 75 74 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  ut the blob hand
a030: 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  le should always
a040: 20 62 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 65   be closed.** be
a050: 66 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20  fore control is 
a060: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
a070: 75 73 65 72 20 28 74 6f 20 70 72 65 76 65 6e 74  user (to prevent
a080: 20 61 20 6c 6f 63 6b 20 62 65 69 6e 67 20 68 65   a lock being he
a090: 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  ld.** on the dat
a0a0: 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6c  abase file for l
a0b0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 65 63 65 73  onger than neces
a0c0: 73 61 72 79 29 2e 20 54 68 75 73 2c 20 61 6e 79  sary). Thus, any
a0d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a   virtual table.*
a0e0: 2a 20 6d 65 74 68 6f 64 20 28 78 46 69 6c 74 65  * method (xFilte
a0f0: 72 20 65 74 63 2e 29 20 74 68 61 74 20 6d 61 79  r etc.) that may
a100: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
a110: 69 72 65 63 74 6c 79 20 63 61 6c 6c 20 74 68 69  irectly call thi
a120: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
a130: 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 46  st call sqlite3F
a140: 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65  ts3SegmentsClose
a150: 28 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  () before return
a160: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
a170: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
a180: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
a190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a1a0: 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
a1b0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
a1c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
a1d0: 63 6b 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a  ckid,         /*
a1e0: 20 41 63 63 65 73 73 20 74 68 65 20 72 6f 77 20   Access the row 
a1f0: 77 69 74 68 20 62 6c 6f 63 6b 69 64 3d 24 69 42  with blockid=$iB
a200: 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20 63 68 61 72  lockid */.  char
a210: 20 2a 2a 70 61 42 6c 6f 62 2c 20 20 20 20 20 20   **paBlob,      
a220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a230: 55 54 3a 20 42 6c 6f 62 20 64 61 74 61 20 69 6e  UT: Blob data in
a240: 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72   malloc'd buffer
a250: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 6c 6f   */.  int *pnBlo
a260: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
a270: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
a280: 7a 65 20 6f 66 20 62 6c 6f 62 20 64 61 74 61 20  ze of blob data 
a290: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 61 64  */.  int *pnLoad
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 79 74       /* OUT: Byt
a2c0: 65 73 20 61 63 74 75 61 6c 6c 79 20 6c 6f 61 64  es actually load
a2d0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
a2e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
a2f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a300: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
a310: 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75 73 74 20 62  /* pnBlob must b
a320: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 70 61 42 6c  e non-NULL. paBl
a330: 6f 62 20 6d 61 79 20 62 65 20 4e 55 4c 4c 20 6f  ob may be NULL o
a340: 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 2a 2f 0a 20  r non-NULL. */. 
a350: 20 61 73 73 65 72 74 28 20 70 6e 42 6c 6f 62 20   assert( pnBlob 
a360: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53 65  );..  if( p->pSe
a370: 67 6d 65 6e 74 73 20 29 7b 0a 20 20 20 20 72 63  gments ){.    rc
a380: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
a390: 72 65 6f 70 65 6e 28 70 2d 3e 70 53 65 67 6d 65  reopen(p->pSegme
a3a0: 6e 74 73 2c 20 69 42 6c 6f 63 6b 69 64 29 3b 0a  nts, iBlockid);.
a3b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
a3c0: 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e 74 73   0==p->zSegments
a3d0: 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tbl ){.      p->
a3e0: 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 3d 20 73  zSegmentsTbl = s
a3f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
a400: 25 73 5f 73 65 67 6d 65 6e 74 73 22 2c 20 70 2d  %s_segments", p-
a410: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
a420: 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e  f( 0==p->zSegmen
a430: 74 73 54 62 6c 20 29 20 72 65 74 75 72 6e 20 53  tsTbl ) return S
a440: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a450: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a460: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0a 20  te3_blob_open(. 
a470: 20 20 20 20 20 20 70 2d 3e 64 62 2c 20 70 2d 3e        p->db, p->
a480: 7a 44 62 2c 20 70 2d 3e 7a 53 65 67 6d 65 6e 74  zDb, p->zSegment
a490: 73 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69  sTbl, "block", i
a4a0: 42 6c 6f 63 6b 69 64 2c 20 30 2c 20 26 70 2d 3e  Blockid, 0, &p->
a4b0: 70 53 65 67 6d 65 6e 74 73 0a 20 20 20 20 29 3b  pSegments.    );
a4c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
a4d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a4e0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
a4f0: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
a500: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20  p->pSegments);. 
a510: 20 20 20 2a 70 6e 42 6c 6f 62 20 3d 20 6e 42 79     *pnBlob = nBy
a520: 74 65 3b 0a 20 20 20 20 69 66 28 20 70 61 42 6c  te;.    if( paBl
a530: 6f 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ob ){.      char
a540: 20 2a 61 42 79 74 65 20 3d 20 73 71 6c 69 74 65   *aByte = sqlite
a550: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 20 2b  3_malloc(nByte +
a560: 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49   FTS3_NODE_PADDI
a570: 4e 47 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  NG);.      if( !
a580: 61 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  aByte ){.       
a590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a5a0: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
a5b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4c  .        if( pnL
a5c0: 6f 61 64 20 26 26 20 6e 42 79 74 65 3e 28 46 54  oad && nByte>(FT
a5d0: 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48  S3_NODE_CHUNK_TH
a5e0: 52 45 53 48 4f 4c 44 29 20 29 7b 0a 20 20 20 20  RESHOLD) ){.    
a5f0: 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 46 54        nByte = FT
a600: 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49 5a  S3_NODE_CHUNKSIZ
a610: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  E;.          *pn
a620: 4c 6f 61 64 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Load = nByte;.  
a630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a640: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
a650: 62 5f 72 65 61 64 28 70 2d 3e 70 53 65 67 6d 65  b_read(p->pSegme
a660: 6e 74 73 2c 20 61 42 79 74 65 2c 20 6e 42 79 74  nts, aByte, nByt
a670: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6d  e, 0);.        m
a680: 65 6d 73 65 74 28 26 61 42 79 74 65 5b 6e 42 79  emset(&aByte[nBy
a690: 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  te], 0, FTS3_NOD
a6a0: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
a6b0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a6c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a6d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a6e0: 61 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  aByte);.        
a6f0: 20 20 61 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    aByte = 0;.   
a700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a710: 20 20 20 20 20 2a 70 61 42 6c 6f 62 20 3d 20 61       *paBlob = a
a720: 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Byte;.    }.  }.
a730: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a740: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
a750: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 61 74 20   blob handle at 
a760: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69 66  p->pSegments, if
a770: 20 69 74 20 69 73 20 6f 70 65 6e 2e 20 53 65 65   it is open. See
a780: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 0a   comments above.
a790: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 46 74  ** the sqlite3Ft
a7a0: 73 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66 75  s3ReadBlock() fu
a7b0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  nction for detai
a7c0: 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ls..*/.void sqli
a7d0: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
a7e0: 6c 6f 73 65 28 46 74 73 33 54 61 62 6c 65 20 2a  lose(Fts3Table *
a7f0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  p){.  sqlite3_bl
a800: 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 53 65 67  ob_close(p->pSeg
a810: 6d 65 6e 74 73 29 3b 0a 20 20 70 2d 3e 70 53 65  ments);.  p->pSe
a820: 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 7d 0a 20 20  gments = 0;.}.  
a830: 20 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74    .static int ft
a840: 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52  s3SegReaderIncrR
a850: 65 61 64 28 46 74 73 33 53 65 67 52 65 61 64 65  ead(Fts3SegReade
a860: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69  r *pReader){.  i
a870: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a890: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
a8a0: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
a8b0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
a8e0: 0a 0a 20 20 6e 52 65 61 64 20 3d 20 4d 49 4e 28  ..  nRead = MIN(
a8f0: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 2d  pReader->nNode -
a900: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
a910: 61 74 65 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 43  ate, FTS3_NODE_C
a920: 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 20 72 63 20  HUNKSIZE);.  rc 
a930: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
a940: 65 61 64 28 0a 20 20 20 20 20 20 70 52 65 61 64  ead(.      pRead
a950: 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a 20 20 20 20  er->pBlob, .    
a960: 20 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64    &pReader->aNod
a970: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  e[pReader->nPopu
a980: 6c 61 74 65 5d 2c 0a 20 20 20 20 20 20 6e 52 65  late],.      nRe
a990: 61 64 2c 0a 20 20 20 20 20 20 70 52 65 61 64 65  ad,.      pReade
a9a0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20 20 29  r->nPopulate.  )
a9b0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
a9c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52  ITE_OK ){.    pR
a9d0: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
a9e0: 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 20 20 6d   += nRead;.    m
a9f0: 65 6d 73 65 74 28 26 70 52 65 61 64 65 72 2d 3e  emset(&pReader->
aa00: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
aa10: 50 6f 70 75 6c 61 74 65 5d 2c 20 30 2c 20 46 54  Populate], 0, FT
aa20: 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29  S3_NODE_PADDING)
aa30: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65  ;.    if( pReade
aa40: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 70 52  r->nPopulate==pR
aa50: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a  eader->nNode ){.
aa60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
aa70: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
aa80: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  ->pBlob);.      
aa90: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d  pReader->pBlob =
aaa0: 20 30 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65   0;.      pReade
aab0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3d 20 30  r->nPopulate = 0
aac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
aad0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
aae0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
aaf0: 61 64 65 72 52 65 71 75 69 72 65 28 46 74 73 33  aderRequire(Fts3
ab00: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
ab10: 65 72 2c 20 63 68 61 72 20 2a 70 46 72 6f 6d 2c  er, char *pFrom,
ab20: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
ab30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ab40: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52  K;.  assert( !pR
ab50: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 0a 20 20  eader->pBlob .  
ab60: 20 20 20 20 20 7c 7c 20 28 70 46 72 6f 6d 3e 3d       || (pFrom>=
ab70: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 26  pReader->aNode &
ab80: 26 20 70 46 72 6f 6d 3c 26 70 52 65 61 64 65 72  & pFrom<&pReader
ab90: 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d  ->aNode[pReader-
aba0: 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29 3b 0a 20 20  >nNode]).  );.  
abb0: 77 68 69 6c 65 28 20 70 52 65 61 64 65 72 2d 3e  while( pReader->
abc0: 70 42 6c 6f 62 20 26 26 20 72 63 3d 3d 53 51 4c  pBlob && rc==SQL
abd0: 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20  ITE_OK .     && 
abe0: 20 28 70 46 72 6f 6d 20 2d 20 70 52 65 61 64 65   (pFrom - pReade
abf0: 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e 42 79 74 65  r->aNode + nByte
ac00: 29 3e 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  )>pReader->nPopu
ac10: 6c 61 74 65 0a 20 20 29 7b 0a 20 20 20 20 72 63  late.  ){.    rc
ac20: 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
ac30: 49 6e 63 72 52 65 61 64 28 70 52 65 61 64 65 72  IncrRead(pReader
ac40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ac50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
ac60: 20 61 6e 20 46 74 73 33 53 65 67 52 65 61 64 65   an Fts3SegReade
ac70: 72 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  r cursor to poin
ac80: 74 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 73 74 61  t at EOF..*/.sta
ac90: 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67  tic void fts3Seg
aca0: 52 65 61 64 65 72 53 65 74 45 6f 66 28 46 74 73  ReaderSetEof(Fts
acb0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
acc0: 29 7b 0a 20 20 69 66 28 20 21 66 74 73 33 53 65  ){.  if( !fts3Se
acd0: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c  gReaderIsRootOnl
ace0: 79 28 70 53 65 67 29 20 29 7b 0a 20 20 20 20 73  y(pSeg) ){.    s
acf0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 67  qlite3_free(pSeg
ad00: 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71  ->aNode);.    sq
ad10: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
ad20: 28 70 53 65 67 2d 3e 70 42 6c 6f 62 29 3b 0a 20  (pSeg->pBlob);. 
ad30: 20 20 20 70 53 65 67 2d 3e 70 42 6c 6f 62 20 3d     pSeg->pBlob =
ad40: 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 67 2d 3e   0;.  }.  pSeg->
ad50: 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aNode = 0;.}../*
ad60: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
ad70: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
ad80: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
ad90: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74  nt to the next t
ada0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 73 65  erm in the.** se
adb0: 67 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73  gment. If succes
adc0: 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
add0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
ade0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
adf0: 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c 49 54 45   term,.** SQLITE
ae00: 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 77 69 73 65  _DONE. Otherwise
ae10: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
ae20: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
ae30: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
ae40: 64 65 72 4e 65 78 74 28 0a 20 20 46 74 73 33 54  derNext(.  Fts3T
ae50: 61 62 6c 65 20 2a 70 2c 20 0a 20 20 46 74 73 33  able *p, .  Fts3
ae60: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
ae70: 65 72 2c 0a 20 20 69 6e 74 20 62 49 6e 63 72 0a  er,.  int bIncr.
ae80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
aeb0: 6f 64 65 20 6f 66 20 76 61 72 69 6f 75 73 20 73  ode of various s
aec0: 75 62 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  ub-routines */. 
aed0: 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 20 20 20   char *pNext;   
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 2f 2a 20 43 75 72 73 6f 72 20 76 61 72 69 61   /* Cursor varia
af00: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ble */.  int nPr
af10: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
af20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
af30: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
af40: 65 72 6d 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  erm prefix */.  
af50: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
af80: 65 73 20 69 6e 20 74 65 72 6d 20 73 75 66 66 69  es in term suffi
af90: 78 20 2a 2f 0a 0a 20 20 69 66 28 20 21 70 52 65  x */..  if( !pRe
afa0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29  ader->aDoclist )
afb0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52  {.    pNext = pR
afc0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20  eader->aNode;.  
afd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 78 74  }else{.    pNext
afe0: 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f   = &pReader->aDo
aff0: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
b000: 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20  Doclist];.  }.. 
b010: 20 69 66 28 20 21 70 4e 65 78 74 20 7c 7c 20 70   if( !pNext || p
b020: 4e 65 78 74 3e 3d 26 70 52 65 61 64 65 72 2d 3e  Next>=&pReader->
b030: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
b040: 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20 20 20 69 66  Node] ){..    if
b050: 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  ( fts3SegReaderI
b060: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
b070: 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 48  ) ){.      Fts3H
b080: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d  ashElem *pElem =
b090: 20 2a 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65   *(pReader->ppNe
b0a0: 78 74 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 69  xtElem);.      i
b0b0: 66 28 20 70 45 6c 65 6d 3d 3d 30 20 29 7b 0a 20  f( pElem==0 ){. 
b0c0: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
b0d0: 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  aNode = 0;.     
b0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b0f0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69  PendingList *pLi
b100: 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73  st = (PendingLis
b110: 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61  t *)fts3HashData
b120: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20  (pElem);.       
b130: 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 20   pReader->zTerm 
b140: 3d 20 28 63 68 61 72 20 2a 29 66 74 73 33 48 61  = (char *)fts3Ha
b150: 73 68 4b 65 79 28 70 45 6c 65 6d 29 3b 0a 20 20  shKey(pElem);.  
b160: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e        pReader->n
b170: 54 65 72 6d 20 3d 20 66 74 73 33 48 61 73 68 4b  Term = fts3HashK
b180: 65 79 73 69 7a 65 28 70 45 6c 65 6d 29 3b 0a 20  eysize(pElem);. 
b190: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
b1a0: 6e 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d  nNode = pReader-
b1b0: 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73  >nDoclist = pLis
b1c0: 74 2d 3e 6e 44 61 74 61 20 2b 20 31 3b 0a 20 20  t->nData + 1;.  
b1d0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61        pReader->a
b1e0: 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e  Node = pReader->
b1f0: 61 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73 74  aDoclist = pList
b200: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
b210: 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74   pReader->ppNext
b220: 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Elem++;.        
b230: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
b240: 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  >aNode );.      
b250: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
b260: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
b270: 0a 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64  .    fts3SegRead
b280: 65 72 53 65 74 45 6f 66 28 70 52 65 61 64 65 72  erSetEof(pReader
b290: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 43  );..    /* If iC
b2a0: 75 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 69 4c 65  urrentBlock>=iLe
b2b0: 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 74 68 69 73  afEndBlock, this
b2c0: 20 69 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69   is an EOF condi
b2d0: 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65 61 66 20 0a  tion. All leaf .
b2e0: 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 73 20 68 61      ** blocks ha
b2f0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
b300: 74 72 61 76 65 72 73 65 64 2e 20 20 2a 2f 0a 20  traversed.  */. 
b310: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64     assert( pRead
b320: 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63  er->iCurrentBloc
b330: 6b 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61  k<=pReader->iLea
b340: 66 45 6e 64 42 6c 6f 63 6b 20 29 3b 0a 20 20 20  fEndBlock );.   
b350: 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e 69 43   if( pReader->iC
b360: 75 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 70 52 65  urrentBlock>=pRe
b370: 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c  ader->iLeafEndBl
b380: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ock ){.      ret
b390: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b3a0: 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
b3b0: 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
b3c0: 6f 63 6b 28 0a 20 20 20 20 20 20 20 20 70 2c 20  ock(.        p, 
b3d0: 2b 2b 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ++pReader->iCurr
b3e0: 65 6e 74 42 6c 6f 63 6b 2c 20 26 70 52 65 61 64  entBlock, &pRead
b3f0: 65 72 2d 3e 61 4e 6f 64 65 2c 20 26 70 52 65 61  er->aNode, &pRea
b400: 64 65 72 2d 3e 6e 4e 6f 64 65 2c 20 0a 20 20 20  der->nNode, .   
b410: 20 20 20 20 20 28 62 49 6e 63 72 20 3f 20 26 70       (bIncr ? &p
b420: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
b430: 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
b440: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b450: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
b470: 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 29  ader->pBlob==0 )
b480: 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 63 72 20  ;.    if( bIncr 
b490: 26 26 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  && pReader->nPop
b4a0: 75 6c 61 74 65 3c 70 52 65 61 64 65 72 2d 3e 6e  ulate<pReader->n
b4b0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70 52  Node ){.      pR
b4c0: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d 20 70  eader->pBlob = p
b4d0: 2d 3e 70 53 65 67 6d 65 6e 74 73 3b 0a 20 20 20  ->pSegments;.   
b4e0: 20 20 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20     p->pSegments 
b4f0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
b500: 4e 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d 3e  Next = pReader->
b510: 61 4e 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 61 73  aNode;.  }..  as
b520: 73 65 72 74 28 20 21 66 74 73 33 53 65 67 52 65  sert( !fts3SegRe
b530: 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52  aderIsPending(pR
b540: 65 61 64 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  eader) );..  rc 
b550: 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52  = fts3SegReaderR
b560: 65 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20  equire(pReader, 
b570: 70 4e 65 78 74 2c 20 46 54 53 33 5f 56 41 52 49  pNext, FTS3_VARI
b580: 4e 54 5f 4d 41 58 2a 32 29 3b 0a 20 20 69 66 28  NT_MAX*2);.  if(
b590: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b5a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20   return rc;.  . 
b5b0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 74   /* Because of t
b5c0: 68 65 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44  he FTS3_NODE_PAD
b5d0: 44 49 4e 47 20 62 79 74 65 73 20 6f 66 20 70 61  DING bytes of pa
b5e0: 64 64 69 6e 67 2c 20 74 68 65 20 66 6f 6c 6c 6f  dding, the follo
b5f0: 77 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 73 61  wing is .  ** sa
b600: 66 65 20 28 6e 6f 20 72 69 73 6b 20 6f 66 20 6f  fe (no risk of o
b610: 76 65 72 72 65 61 64 29 20 65 76 65 6e 20 69 66  verread) even if
b620: 20 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20 69   the node data i
b630: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 2a 2f 0a  s corrupted. */.
b640: 20 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74    pNext += sqlit
b650: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33  e3Fts3GetVarint3
b660: 32 28 70 4e 65 78 74 2c 20 26 6e 50 72 65 66 69  2(pNext, &nPrefi
b670: 78 29 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73  x);.  pNext += s
b680: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
b690: 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 53  int32(pNext, &nS
b6a0: 75 66 66 69 78 29 3b 0a 20 20 69 66 28 20 6e 50  uffix);.  if( nP
b6b0: 72 65 66 69 78 3c 30 20 7c 7c 20 6e 53 75 66 66  refix<0 || nSuff
b6c0: 69 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 26 70 4e  ix<=0 .   || &pN
b6d0: 65 78 74 5b 6e 53 75 66 66 69 78 5d 3e 26 70 52  ext[nSuffix]>&pR
b6e0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
b6f0: 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20  ader->nNode] .  
b700: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54  ){.    return FT
b710: 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a  S_CORRUPT_VTAB;.
b720: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 50 72 65 66    }..  if( nPref
b730: 69 78 2b 6e 53 75 66 66 69 78 3e 70 52 65 61 64  ix+nSuffix>pRead
b740: 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 29  er->nTermAlloc )
b750: 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d  {.    int nNew =
b760: 20 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69   (nPrefix+nSuffi
b770: 78 29 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a  x)*2;.    char *
b780: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
b790: 65 61 6c 6c 6f 63 28 70 52 65 61 64 65 72 2d 3e  ealloc(pReader->
b7a0: 7a 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20 20  zTerm, nNew);.  
b7b0: 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20    if( !zNew ){. 
b7c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b7d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
b7e0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65      pReader->zTe
b7f0: 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70  rm = zNew;.    p
b800: 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c  Reader->nTermAll
b810: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a  oc = nNew;.  }..
b820: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
b830: 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61  aderRequire(pRea
b840: 64 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66  der, pNext, nSuf
b850: 66 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f  fix+FTS3_VARINT_
b860: 4d 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  MAX);.  if( rc!=
b870: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
b880: 72 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70 79  rn rc;..  memcpy
b890: 28 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d  (&pReader->zTerm
b8a0: 5b 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78 74  [nPrefix], pNext
b8b0: 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 52  , nSuffix);.  pR
b8c0: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e  eader->nTerm = n
b8d0: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a  Prefix+nSuffix;.
b8e0: 20 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66    pNext += nSuff
b8f0: 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73  ix;.  pNext += s
b900: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
b910: 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70 52  int32(pNext, &pR
b920: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29  eader->nDoclist)
b930: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f  ;.  pReader->aDo
b940: 63 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  clist = pNext;. 
b950: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
b960: 74 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tList = 0;..  /*
b970: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
b980: 64 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  doclist does not
b990: 20 61 70 70 65 61 72 20 74 6f 20 65 78 74 65 6e   appear to exten
b9a0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
b9b0: 66 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65  f the.  ** b-tre
b9c0: 65 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68 61 74  e node. And that
b9d0: 20 74 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20   the final byte 
b9e0: 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69  of the doclist i
b9f0: 73 20 30 78 30 30 2e 20 49 66 20 65 69 74 68 65  s 0x00. If eithe
ba00: 72 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65  r .  ** of these
ba10: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 75   statements is u
ba20: 6e 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20  ntrue, then the 
ba30: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
ba40: 73 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a  s corrupt..  */.
ba50: 20 20 69 66 28 20 26 70 52 65 61 64 65 72 2d 3e    if( &pReader->
ba60: 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72  aDoclist[pReader
ba70: 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70 52 65  ->nDoclist]>&pRe
ba80: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
ba90: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 20  der->nNode] .   
baa0: 7c 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e 50 6f  || (pReader->nPo
bab0: 70 75 6c 61 74 65 3d 3d 30 20 26 26 20 70 52 65  pulate==0 && pRe
bac0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70  ader->aDoclist[p
bad0: 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74  Reader->nDoclist
bae0: 2d 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  -1]).  ){.    re
baf0: 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54  turn FTS_CORRUPT
bb00: 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _VTAB;.  }.  ret
bb10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bb20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
bb30: 53 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69  SegReader to poi
bb40: 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
bb50: 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63  docid in the doc
bb60: 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a  list associated.
bb70: 2a 2a 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ** with the curr
bb80: 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  ent term..*/.sta
bb90: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
bba0: 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28  eaderFirstDocid(
bbb0: 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c  Fts3Table *pTab,
bbc0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
bbd0: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20  pReader){.  int 
bbe0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bbf0: 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65    assert( pReade
bc00: 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a 20  r->aDoclist );. 
bc10: 20 61 73 73 65 72 74 28 20 21 70 52 65 61 64 65   assert( !pReade
bc20: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29  r->pOffsetList )
bc30: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44  ;.  if( pTab->bD
bc40: 65 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65  escIdx && fts3Se
bc50: 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67  gReaderIsPending
bc60: 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20  (pReader) ){.   
bc70: 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20   u8 bEof = 0;.  
bc80: 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69    pReader->iDoci
bc90: 64 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64  d = 0;.    pRead
bca0: 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20  er->nOffsetList 
bcb0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
bcc0: 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28  Fts3DoclistPrev(
bcd0: 30 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  0,.        pRead
bce0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52  er->aDoclist, pR
bcf0: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c  eader->nDoclist,
bd00: 20 26 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73   &pReader->pOffs
bd10: 65 74 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20  etList, .       
bd20: 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69   &pReader->iDoci
bd30: 64 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66  d, &pReader->nOf
bd40: 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a  fsetList, &bEof.
bd50: 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
bd60: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
bd70: 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52  ReaderRequire(pR
bd80: 65 61 64 65 72 2c 20 70 52 65 61 64 65 72 2d 3e  eader, pReader->
bd90: 61 44 6f 63 6c 69 73 74 2c 20 46 54 53 33 5f 56  aDoclist, FTS3_V
bda0: 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20  ARINT_MAX);.    
bdb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bdc0: 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
bdd0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   = sqlite3Fts3Ge
bde0: 74 56 61 72 69 6e 74 28 70 52 65 61 64 65 72 2d  tVarint(pReader-
bdf0: 3e 61 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61  >aDoclist, &pRea
be00: 64 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20  der->iDocid);.  
be10: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66      pReader->pOf
be20: 66 73 65 74 4c 69 73 74 20 3d 20 26 70 52 65 61  fsetList = &pRea
be30: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d  der->aDoclist[n]
be40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
be50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
be60: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 53 65  * Advance the Se
be70: 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74  gReader to point
be80: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63   to the next doc
be90: 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  id in the doclis
bea0: 74 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  t.** associated 
beb0: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
bec0: 20 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   term..** .** If
bed0: 20 61 72 67 75 6d 65 6e 74 73 20 70 70 4f 66 66   arguments ppOff
bee0: 73 65 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66  setList and pnOf
bef0: 66 73 65 74 4c 69 73 74 20 61 72 65 20 6e 6f 74  fsetList are not
bf00: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20   NULL, then .** 
bf10: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69 73  *ppOffsetList is
bf20: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
bf30: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
bf40: 6e 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a  n-offset list.**
bf50: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
bf60: 65 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65  entry (i.e. imme
bf70: 64 69 61 74 65 6c 79 20 70 61 73 74 20 74 68 65  diately past the
bf80: 20 64 6f 63 69 64 20 76 61 72 69 6e 74 29 2e 0a   docid varint)..
bf90: 2a 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74  ** *pnOffsetList
bfa0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
bfb0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 74  ength of the set
bfc0: 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65   of column-offse
bfd0: 74 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20  t.** lists, not 
bfe0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75  including the nu
bff0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
c000: 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  e. For example:.
c010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
c020: 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
c030: 6f 63 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c  ocid(.  Fts3Tabl
c040: 65 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 53  e *pTab,.  Fts3S
c050: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
c060: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
c070: 61 64 65 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ader to advance 
c080: 74 6f 20 6e 65 78 74 20 64 6f 63 69 64 20 2a 2f  to next docid */
c090: 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 66 66 73  .  char **ppOffs
c0a0: 65 74 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  etList,         
c0b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
c0c0: 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f  er to current po
c0d0: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 20  sition-list */. 
c0e0: 20 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c 69   int *pnOffsetLi
c0f0: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
c100: 20 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68 20   /* OUT: Length 
c110: 6f 66 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74  of *ppOffsetList
c120: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
c130: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c140: 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 70 20  E_OK;.  char *p 
c150: 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73  = pReader->pOffs
c160: 65 74 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 63  etList;.  char c
c170: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
c180: 20 70 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 61   p );..  if( pTa
c190: 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 66  b->bDescIdx && f
c1a0: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
c1b0: 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29  nding(pReader) )
c1c0: 7b 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e 64 69  {.    /* A pendi
c1d0: 6e 67 2d 74 65 72 6d 73 20 73 65 67 2d 72 65 61  ng-terms seg-rea
c1e0: 64 65 72 20 66 6f 72 20 61 6e 20 46 54 53 34 20  der for an FTS4 
c1f0: 74 61 62 6c 65 20 74 68 61 74 20 75 73 65 73 20  table that uses 
c200: 6f 72 64 65 72 3d 64 65 73 63 2e 0a 20 20 20 20  order=desc..    
c210: 2a 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72 6d 73  ** Pending-terms
c220: 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20 61 6c   doclists are al
c230: 77 61 79 73 20 62 75 69 6c 74 20 75 70 20 69 6e  ways built up in
c240: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
c250: 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 68  , so.    ** we h
c260: 61 76 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  ave to iterate t
c270: 68 72 6f 75 67 68 20 74 68 65 6d 20 62 61 63 6b  hrough them back
c280: 77 61 72 64 73 20 68 65 72 65 2e 20 2a 2f 0a 20  wards here. */. 
c290: 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a     u8 bEof = 0;.
c2a0: 20 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74      if( ppOffset
c2b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  List ){.      *p
c2c0: 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52  pOffsetList = pR
c2d0: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
c2e0: 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66  st;.      *pnOff
c2f0: 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65  setList = pReade
c300: 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 2d  r->nOffsetList -
c310: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
c320: 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74  lite3Fts3Doclist
c330: 50 72 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20  Prev(0,.        
c340: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
c350: 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63  t, pReader->nDoc
c360: 6c 69 73 74 2c 20 26 70 2c 20 26 70 52 65 61 64  list, &p, &pRead
c370: 65 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20 20 20  er->iDocid,.    
c380: 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f      &pReader->nO
c390: 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66  ffsetList, &bEof
c3a0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
c3b0: 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52  bEof ){.      pR
c3c0: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
c3d0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
c3e0: 65 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  e{.      pReader
c3f0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
c400: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  p;.    }.  }else
c410: 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64  {.    char *pEnd
c420: 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f   = &pReader->aDo
c430: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
c440: 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 2f  Doclist];..    /
c450: 2a 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72  * Pointer p curr
c460: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20  ently points at 
c470: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
c480: 66 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74  f an offset list
c490: 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  . The.    ** fol
c4a0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61 64 76  lowing block adv
c4b0: 61 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e  ances it to poin
c4c0: 74 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20  t one byte past 
c4d0: 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
c4e0: 2a 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65  * the same offse
c4f0: 74 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 77  t list. */.    w
c500: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a 20 20  hile( 1 ){.  .  
c510: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
c520: 77 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63 6f 64  wing line of cod
c530: 65 20 28 61 6e 64 20 74 68 65 20 22 70 2b 2b 22  e (and the "p++"
c540: 20 62 65 6c 6f 77 20 74 68 65 20 77 68 69 6c 65   below the while
c550: 28 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20 20 20  () loop) is.    
c560: 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 6c    ** normally al
c570: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
c580: 65 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69 6e 74  ed to move point
c590: 65 72 20 70 20 74 6f 20 74 68 65 20 64 65 73 69  er p to the desi
c5a0: 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 70 6f  red .      ** po
c5b0: 73 69 74 69 6f 6e 2e 20 54 68 65 20 65 78 63 65  sition. The exce
c5c0: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 69 73  ption is if this
c5d0: 20 6e 6f 64 65 20 69 73 20 62 65 69 6e 67 20 6c   node is being l
c5e0: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 0a  oaded from disk.
c5f0: 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
c600: 6e 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69 6e 74  ntally and point
c610: 65 72 20 22 70 22 20 6e 6f 77 20 70 6f 69 6e 74  er "p" now point
c620: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
c630: 79 74 65 20 70 61 73 73 65 64 0a 20 20 20 20 20  yte passed.     
c640: 20 2a 2a 20 74 68 65 20 70 6f 70 75 6c 61 74 65   ** the populate
c650: 64 20 70 61 72 74 20 6f 66 20 70 52 65 61 64 65  d part of pReade
c660: 72 2d 3e 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20  r->aNode[]..    
c670: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
c680: 28 20 2a 70 20 7c 20 63 20 29 20 63 20 3d 20 2a  ( *p | c ) c = *
c690: 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20  p++ & 0x80;.    
c6a0: 20 20 61 73 73 65 72 74 28 20 2a 70 3d 3d 30 20    assert( *p==0 
c6b0: 29 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20  );.  .      if( 
c6c0: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d  pReader->pBlob==
c6d0: 30 20 7c 7c 20 70 3c 26 70 52 65 61 64 65 72 2d  0 || p<&pReader-
c6e0: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
c6f0: 6e 50 6f 70 75 6c 61 74 65 5d 20 29 20 62 72 65  nPopulate] ) bre
c700: 61 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ak;.      rc = f
c710: 74 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72  ts3SegReaderIncr
c720: 52 65 61 64 28 70 52 65 61 64 65 72 29 3b 0a 20  Read(pReader);. 
c730: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c740: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
c750: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2b  rc;.    }.    p+
c760: 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  +;.  .    /* If 
c770: 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
c780: 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  te the output va
c790: 72 69 61 62 6c 65 73 20 77 69 74 68 20 61 20 70  riables with a p
c7a0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68  ointer to and th
c7b0: 65 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  e.    ** size of
c7c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 66   the previous of
c7d0: 66 73 65 74 2d 6c 69 73 74 2e 0a 20 20 20 20 2a  fset-list..    *
c7e0: 2f 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66 73  /.    if( ppOffs
c7f0: 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  etList ){.      
c800: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  *ppOffsetList = 
c810: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c820: 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f  List;.      *pnO
c830: 66 66 73 65 74 4c 69 73 74 20 3d 20 28 69 6e 74  ffsetList = (int
c840: 29 28 70 20 2d 20 70 52 65 61 64 65 72 2d 3e 70  )(p - pReader->p
c850: 4f 66 66 73 65 74 4c 69 73 74 20 2d 20 31 29 3b  OffsetList - 1);
c860: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
c870: 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 3d  e( p<pEnd && *p=
c880: 3d 30 20 29 20 70 2b 2b 3b 0a 20 20 0a 20 20 20  =0 ) p++;.  .   
c890: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
c8a0: 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65 73   no more entries
c8b0: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c   in the doclist,
c8c0: 20 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73 74   set pOffsetList
c8d0: 20 74 6f 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e   to.    ** NULL.
c8e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
c8f0: 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 44  Fts3SegReader.iD
c900: 6f 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ocid to the next
c910: 20 64 6f 63 69 64 20 61 6e 64 0a 20 20 20 20 2a   docid and.    *
c920: 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e  * Fts3SegReader.
c930: 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20 70  pOffsetList to p
c940: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
c950: 20 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65 66   offset list bef
c960: 6f 72 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  ore.    ** retur
c970: 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ning..    */.   
c980: 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b 0a   if( p>=pEnd ){.
c990: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
c9a0: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a  OffsetList = 0;.
c9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c9c0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
c9d0: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
c9e0: 65 72 2c 20 70 2c 20 46 54 53 33 5f 56 41 52 49  er, p, FTS3_VARI
c9f0: 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 20 20 69  NT_MAX);.      i
ca00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ca10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ca20: 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61  te3_int64 iDelta
ca30: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
ca40: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
ca50: 20 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33   p + sqlite3Fts3
ca60: 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44  GetVarint(p, &iD
ca70: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  elta);.        i
ca80: 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64  f( pTab->bDescId
ca90: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  x ){.          p
caa0: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2d  Reader->iDocid -
cab0: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
cac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cad0: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63     pReader->iDoc
cae0: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
caf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cb00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
cb10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cb20: 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
cb30: 73 33 4d 73 72 4f 76 66 6c 28 0a 20 20 46 74 73  s3MsrOvfl(.  Fts
cb40: 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a  3Cursor *pCsr, .
cb50: 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
cb60: 61 64 65 72 20 2a 70 4d 73 72 2c 0a 20 20 69 6e  ader *pMsr,.  in
cb70: 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46  t *pnOvfl.){.  F
cb80: 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
cb90: 74 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e  ts3Table*)pCsr->
cba0: 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e  base.pVtab;.  in
cbb0: 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  t nOvfl = 0;.  i
cbc0: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20  nt ii;.  int rc 
cbd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
cbe0: 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 6e 50 67  nt pgsz = p->nPg
cbf0: 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  sz;..  assert( p
cc00: 2d 3e 62 46 74 73 34 20 29 3b 0a 20 20 61 73 73  ->bFts4 );.  ass
cc10: 65 72 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 0a  ert( pgsz>0 );..
cc20: 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
cc30: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
cc40: 70 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pMsr->nSegment; 
cc50: 69 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53  ii++){.    Fts3S
cc60: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
cc70: 72 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d  r = pMsr->apSegm
cc80: 65 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  ent[ii];.    if(
cc90: 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49   !fts3SegReaderI
cca0: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
ccb0: 29 20 0a 20 20 20 20 20 26 26 20 21 66 74 73 33  ) .     && !fts3
ccc0: 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f  SegReaderIsRootO
ccd0: 6e 6c 79 28 70 52 65 61 64 65 72 29 20 0a 20 20  nly(pReader) .  
cce0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
ccf0: 65 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a 20 20 20  e3_int64 jj;.   
cd00: 20 20 20 66 6f 72 28 6a 6a 3d 70 52 65 61 64 65     for(jj=pReade
cd10: 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20  r->iStartBlock; 
cd20: 6a 6a 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65  jj<=pReader->iLe
cd30: 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b  afEndBlock; jj++
cd40: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
cd50: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 72 63  Blob;.        rc
cd60: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
cd70: 61 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30  adBlock(p, jj, 0
cd80: 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20  , &nBlob, 0);.  
cd90: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cda0: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
cdb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 42  .        if( (nB
cdc0: 6c 6f 62 2b 33 35 29 3e 70 67 73 7a 20 29 7b 0a  lob+35)>pgsz ){.
cdd0: 20 20 20 20 20 20 20 20 20 20 6e 4f 76 66 6c 20            nOvfl 
cde0: 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20 33 34 29 2f  += (nBlob + 34)/
cdf0: 70 67 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pgsz;.        }.
ce00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ce10: 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f  }.  *pnOvfl = nO
ce20: 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  vfl;.  return rc
ce30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
ce40: 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  all allocations 
ce50: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ce60: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
ce70: 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73  sed as the .** s
ce80: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
ce90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
cea0: 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
ceb0: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
cec0: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 66 28 20  pReader){.  if( 
ced0: 70 52 65 61 64 65 72 20 26 26 20 21 66 74 73 33  pReader && !fts3
cee0: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
cef0: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
cf00: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
cf10: 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b  pReader->zTerm);
cf20: 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65  .    if( !fts3Se
cf30: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c  gReaderIsRootOnl
cf40: 79 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20  y(pReader) ){.  
cf50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
cf60: 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29  (pReader->aNode)
cf70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
cf80: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64  blob_close(pRead
cf90: 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20  er->pBlob);.    
cfa0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
cfb0: 66 72 65 65 28 70 52 65 61 64 65 72 29 3b 0a 7d  free(pReader);.}
cfc0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
cfd0: 20 61 20 6e 65 77 20 53 65 67 52 65 61 64 65 72   a new SegReader
cfe0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
cff0: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
d000: 61 64 65 72 4e 65 77 28 0a 20 20 69 6e 74 20 69  aderNew(.  int i
d010: 41 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  Age,            
d020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
d030: 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a  gment "age". */.
d040: 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20 20    int bLookup,  
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
d070: 6c 6f 6f 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a 20  lookup only */. 
d080: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
d090: 53 74 61 72 74 4c 65 61 66 2c 20 20 20 20 20 20  StartLeaf,      
d0a0: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 74   /* First leaf t
d0b0: 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20  o traverse */.  
d0c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
d0d0: 6e 64 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20  ndLeaf,         
d0e0: 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f  /* Final leaf to
d0f0: 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73   traverse */.  s
d100: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
d110: 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f  dBlock,        /
d120: 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66  * Final block of
d130: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f   segment */.  co
d140: 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c  nst char *zRoot,
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d160: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
d170: 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  ng root node */.
d180: 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20    int nRoot,    
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
d1b0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72  fer containing r
d1c0: 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74  oot node */.  Ft
d1d0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70  s3SegReader **pp
d1e0: 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a  Reader        /*
d1f0: 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20   OUT: Allocated 
d200: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2f  Fts3SegReader */
d210: 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65 61  .){.  Fts3SegRea
d220: 64 65 72 20 2a 70 52 65 61 64 65 72 3b 20 20 20  der *pReader;   
d230: 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
d240: 6c 6c 6f 63 61 74 65 64 20 53 65 67 52 65 61 64  llocated SegRead
d250: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
d260: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20  nt nExtra = 0;  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d280: 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
d290: 61 74 65 20 73 65 67 6d 65 6e 74 20 72 6f 6f 74  ate segment root
d2a0: 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   node */..  asse
d2b0: 72 74 28 20 69 53 74 61 72 74 4c 65 61 66 3c 3d  rt( iStartLeaf<=
d2c0: 69 45 6e 64 4c 65 61 66 20 29 3b 0a 20 20 69 66  iEndLeaf );.  if
d2d0: 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d 30 20  ( iStartLeaf==0 
d2e0: 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  ){.    nExtra = 
d2f0: 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f 4e 4f 44  nRoot + FTS3_NOD
d300: 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20 7d 0a 0a  E_PADDING;.  }..
d310: 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73    pReader = (Fts
d320: 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c  3SegReader *)sql
d330: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
d340: 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72  of(Fts3SegReader
d350: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
d360: 66 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20  f( !pReader ){. 
d370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d380: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
d390: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c  mset(pReader, 0,
d3a0: 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52   sizeof(Fts3SegR
d3b0: 65 61 64 65 72 29 29 3b 0a 20 20 70 52 65 61 64  eader));.  pRead
d3c0: 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67 65 3b  er->iIdx = iAge;
d3d0: 0a 20 20 70 52 65 61 64 65 72 2d 3e 62 4c 6f 6f  .  pReader->bLoo
d3e0: 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75 70 3b 0a 20  kup = bLookup;. 
d3f0: 20 70 52 65 61 64 65 72 2d 3e 69 53 74 61 72 74   pReader->iStart
d400: 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72 74 4c 65  Block = iStartLe
d410: 61 66 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69  af;.  pReader->i
d420: 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 3d 20 69  LeafEndBlock = i
d430: 45 6e 64 4c 65 61 66 3b 0a 20 20 70 52 65 61 64  EndLeaf;.  pRead
d440: 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d 20  er->iEndBlock = 
d450: 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69 66  iEndBlock;..  if
d460: 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 20 20 20  ( nExtra ){.    
d470: 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 73 65  /* The entire se
d480: 67 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  gment is stored 
d490: 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  in the root node
d4a0: 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61 64 65 72  . */.    pReader
d4b0: 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68 61 72 20  ->aNode = (char 
d4c0: 2a 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20  *)&pReader[1];. 
d4d0: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64     pReader->nNod
d4e0: 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d  e = nRoot;.    m
d4f0: 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61  emcpy(pReader->a
d500: 4e 6f 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f  Node, zRoot, nRo
d510: 6f 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ot);.    memset(
d520: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
d530: 6e 52 6f 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f  nRoot], 0, FTS3_
d540: 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20  NODE_PADDING);. 
d550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 61   }else{.    pRea
d560: 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f  der->iCurrentBlo
d570: 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 2d  ck = iStartLeaf-
d580: 31 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64  1;.  }.  *ppRead
d590: 65 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20  er = pReader;.  
d5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d5c0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
d5d0: 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73  function used as
d5e0: 20 61 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62   a qsort() callb
d5f0: 61 63 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67  ack when sorting
d600: 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
d610: 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79  pending terms by
d620: 20 74 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75   term. This occu
d630: 72 73 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c  rs as part of fl
d640: 75 73 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ushing.** the co
d650: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65  ntents of the pe
d660: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
d670: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61   table to the da
d680: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
d690: 63 20 69 6e 74 20 66 74 73 33 43 6f 6d 70 61 72  c int fts3Compar
d6a0: 65 45 6c 65 6d 42 79 54 65 72 6d 28 63 6f 6e 73  eElemByTerm(cons
d6b0: 74 20 76 6f 69 64 20 2a 6c 68 73 2c 20 63 6f 6e  t void *lhs, con
d6c0: 73 74 20 76 6f 69 64 20 2a 72 68 73 29 7b 0a 20  st void *rhs){. 
d6d0: 20 63 68 61 72 20 2a 7a 31 20 3d 20 66 74 73 33   char *z1 = fts3
d6e0: 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61  HashKey(*(Fts3Ha
d6f0: 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a  shElem **)lhs);.
d700: 20 20 63 68 61 72 20 2a 7a 32 20 3d 20 66 74 73    char *z2 = fts
d710: 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48  3HashKey(*(Fts3H
d720: 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b  ashElem **)rhs);
d730: 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33  .  int n1 = fts3
d740: 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74  HashKeysize(*(Ft
d750: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68  s3HashElem **)lh
d760: 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66  s);.  int n2 = f
d770: 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a  ts3HashKeysize(*
d780: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
d790: 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20  )rhs);..  int n 
d7a0: 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20  = (n1<n2 ? n1 : 
d7b0: 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d  n2);.  int c = m
d7c0: 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29  emcmp(z1, z2, n)
d7d0: 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  ;.  if( c==0 ){.
d7e0: 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b      c = n1 - n2;
d7f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b  .  }.  return c;
d800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
d810: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
d820: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46  to allocate an F
d830: 74 73 33 53 65 67 52 65 61 64 65 72 20 74 68 61  ts3SegReader tha
d840: 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
d850: 67 68 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f  gh.** a subset o
d860: 66 20 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72  f the terms stor
d870: 65 64 20 69 6e 20 74 68 65 20 46 74 73 33 54 61  ed in the Fts3Ta
d880: 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73  ble.pendingTerms
d890: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   array..**.** If
d8a0: 20 74 68 65 20 69 73 50 72 65 66 69 78 49 74 65   the isPrefixIte
d8b0: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a  r parameter is z
d8c0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
d8d0: 74 75 72 6e 65 64 20 53 65 67 52 65 61 64 65 72  turned SegReader
d8e0: 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 74 68 72   iterates.** thr
d8f0: 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d 20 69  ough each term i
d900: 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  n the pending-te
d910: 72 6d 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69  rms table. Or, i
d920: 66 20 69 73 50 72 65 66 69 78 49 74 65 72 20 69  f isPrefixIter i
d930: 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  s.** non-zero, i
d940: 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
d950: 67 68 20 65 61 63 68 20 74 65 72 6d 20 61 6e 64  gh each term and
d960: 20 69 74 73 20 70 72 65 66 69 78 65 73 2e 20 46   its prefixes. F
d970: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
d980: 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65  * the pending te
d990: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 63  rms hash table c
d9a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
d9b0: 73 20 22 73 71 6c 69 74 65 22 2c 20 22 6d 79 73  s "sqlite", "mys
d9c0: 71 6c 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65  ql" and.** "fire
d9d0: 62 69 72 64 22 2c 20 74 68 65 6e 20 74 68 65 20  bird", then the 
d9e0: 69 74 65 72 61 74 6f 72 20 76 69 73 69 74 73 20  iterator visits 
d9f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74  the following 't
da00: 65 72 6d 73 27 20 28 69 6e 20 74 68 65 20 6f 72  erms' (in the or
da10: 64 65 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a  der.** shown):.*
da20: 2a 0a 2a 2a 20 20 20 66 20 66 69 20 66 69 72 20  *.**   f fi fir 
da30: 66 69 72 65 20 66 69 72 65 62 20 66 69 72 65 62  fire fireb fireb
da40: 69 20 66 69 72 65 62 69 72 20 66 69 72 65 62 69  i firebir firebi
da50: 72 64 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73  rd.**   m my mys
da60: 20 6d 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20   mysq mysql.**  
da70: 20 73 20 73 71 20 73 71 6c 20 73 71 6c 69 20 73   s sq sql sqli s
da80: 71 6c 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a  qlit sqlite.**.*
da90: 2a 20 57 68 65 72 65 61 73 20 69 66 20 69 73 50  * Whereas if isP
daa0: 72 65 66 69 78 49 74 65 72 20 69 73 20 7a 65 72  refixIter is zer
dab0: 6f 2c 20 74 68 65 20 74 65 72 6d 73 20 76 69 73  o, the terms vis
dac0: 69 74 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ited are:.**.** 
dad0: 20 20 66 69 72 65 62 69 72 64 20 6d 79 73 71 6c    firebird mysql
dae0: 20 73 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73   sqlite.*/.int s
daf0: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
db00: 64 65 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74  derPending(.  Ft
db10: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db30: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
db40: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
db50: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
db60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
db70: 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65  dex for p->aInde
db80: 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
db90: 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
dba0: 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74         /* Term t
dbb0: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
dbc0: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
dbf0: 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69  fer zTerm */.  i
dc00: 6e 74 20 62 50 72 65 66 69 78 2c 20 20 20 20 20  nt bPrefix,     
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc20: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65  * True for a pre
dc30: 66 69 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  fix iterator */.
dc40: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
dc50: 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20 20  **ppReader      
dc60: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61    /* OUT: SegRea
dc70: 64 65 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d  der for pending-
dc80: 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74  terms */.){.  Ft
dc90: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
dca0: 61 64 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ader = 0;     /*
dcb0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
dcc0: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
dcd0: 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65  */.  Fts3HashEle
dce0: 6d 20 2a 70 45 3b 20 20 20 20 20 20 20 20 20 20  m *pE;          
dcf0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
dd00: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46   variable */.  F
dd10: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45  ts3HashElem **aE
dd20: 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  lem = 0;       /
dd30: 2a 20 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20  * Array of term 
dd40: 68 61 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20  hash entries to 
dd50: 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  scan */.  int nE
dd60: 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lem = 0;        
dd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
dd80: 65 20 6f 66 20 61 72 72 61 79 20 61 74 20 61 45  e of array at aE
dd90: 6c 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  lem */.  int rc 
dda0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ddc0: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn Code */.  Fts
ddd0: 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20  3Hash *pHash;.. 
dde0: 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e   pHash = &p->aIn
ddf0: 64 65 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65 6e  dex[iIndex].hPen
de00: 64 69 6e 67 3b 0a 20 20 69 66 28 20 62 50 72 65  ding;.  if( bPre
de10: 66 69 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  fix ){.    int n
de20: 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
de30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
de40: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 61 72   of allocated ar
de50: 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a  ray at aElem */.
de60: 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33  .    for(pE=fts3
de70: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
de80: 3b 20 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73  ; pE; pE=fts3Has
de90: 68 4e 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20  hNext(pE)){.    
dea0: 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28    char *zKey = (
deb0: 63 68 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b  char *)fts3HashK
dec0: 65 79 28 70 45 29 3b 0a 20 20 20 20 20 20 69 6e  ey(pE);.      in
ded0: 74 20 6e 4b 65 79 20 3d 20 66 74 73 33 48 61 73  t nKey = fts3Has
dee0: 68 4b 65 79 73 69 7a 65 28 70 45 29 3b 0a 20 20  hKeysize(pE);.  
def0: 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30      if( nTerm==0
df00: 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d   || (nKey>=nTerm
df10: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b   && 0==memcmp(zK
df20: 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ey, zTerm, nTerm
df30: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  )) ){.        if
df40: 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20  ( nElem==nAlloc 
df50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
df60: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65  3HashElem **aEle
df70: 6d 32 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41  m2;.          nA
df80: 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20  lloc += 16;.    
df90: 20 20 20 20 20 20 61 45 6c 65 6d 32 20 3d 20 28        aElem2 = (
dfa0: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29  Fts3HashElem **)
dfb0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
dfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
dfd0: 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  Elem, nAlloc*siz
dfe0: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
dff0: 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   *).          );
e000: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
e010: 61 45 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20 20  aElem2 ){.      
e020: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e030: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
e040: 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a       nElem = 0;.
e050: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
e060: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
e070: 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 20 3d           aElem =
e080: 20 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20   aElem2;.       
e090: 20 7d 0a 0a 20 20 20 20 20 20 20 20 61 45 6c 65   }..        aEle
e0a0: 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b  m[nElem++] = pE;
e0b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e0c0: 20 20 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74      /* If more t
e0d0: 68 61 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74  han one term mat
e0e0: 63 68 65 73 20 74 68 65 20 70 72 65 66 69 78 2c  ches the prefix,
e0f0: 20 73 6f 72 74 20 74 68 65 20 46 74 73 33 48 61   sort the Fts3Ha
e100: 73 68 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62  shElem.    ** ob
e110: 6a 65 63 74 73 20 69 6e 20 74 65 72 6d 20 6f 72  jects in term or
e120: 64 65 72 20 75 73 69 6e 67 20 71 73 6f 72 74 28  der using qsort(
e130: 29 2e 20 54 68 69 73 20 75 73 65 73 20 74 68 65  ). This uses the
e140: 20 73 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e   same comparison
e150: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  .    ** callback
e160: 20 61 73 20 69 73 20 75 73 65 64 20 77 68 65 6e   as is used when
e170: 20 66 6c 75 73 68 69 6e 67 20 74 65 72 6d 73 20   flushing terms 
e180: 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  to disk..    */.
e190: 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20      if( nElem>1 
e1a0: 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74 28 61  ){.      qsort(a
e1b0: 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a  Elem, nElem, siz
e1c0: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
e1d0: 20 2a 29 2c 20 66 74 73 33 43 6f 6d 70 61 72 65   *), fts3Compare
e1e0: 45 6c 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20  ElemByTerm);.   
e1f0: 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
e200: 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 69 73   /* The query is
e210: 20 61 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c   a simple term l
e220: 6f 6f 6b 75 70 20 74 68 61 74 20 6d 61 74 63 68  ookup that match
e230: 65 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74  es at most one t
e240: 65 72 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  erm in.    ** th
e250: 65 20 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61  e index. All tha
e260: 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73  t is required is
e270: 20 61 20 73 74 72 61 69 67 68 74 20 68 61 73 68   a straight hash
e280: 2d 6c 6f 6f 6b 75 70 2e 20 0a 20 20 20 20 2a 2a  -lookup. .    **
e290: 0a 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20  .    ** Because 
e2a0: 74 68 65 20 73 74 61 63 6b 20 61 64 64 72 65 73  the stack addres
e2b0: 73 20 6f 66 20 70 45 20 6d 61 79 20 62 65 20 61  s of pE may be a
e2c0: 63 63 65 73 73 65 64 20 76 69 61 20 74 68 65 20  ccessed via the 
e2d0: 61 45 6c 65 6d 20 70 6f 69 6e 74 65 72 0a 20 20  aElem pointer.  
e2e0: 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 74 68 65 20    ** below, the 
e2f0: 22 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70  "Fts3HashElem *p
e300: 45 22 20 6d 75 73 74 20 62 65 20 64 65 63 6c 61  E" must be decla
e310: 72 65 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  red so that it i
e320: 73 20 76 61 6c 69 64 0a 20 20 20 20 2a 2a 20 77  s valid.    ** w
e330: 69 74 68 69 6e 20 74 68 69 73 20 65 6e 74 69 72  ithin this entir
e340: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20  e function, not 
e350: 6a 75 73 74 20 74 68 69 73 20 22 65 6c 73 65 7b  just this "else{
e360: 2e 2e 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20 20  ...}" block..   
e370: 20 2a 2f 0a 20 20 20 20 70 45 20 3d 20 66 74 73   */.    pE = fts
e380: 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28 70 48  3HashFindElem(pH
e390: 61 73 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  ash, zTerm, nTer
e3a0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 45 20 29  m);.    if( pE )
e3b0: 7b 0a 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20  {.      aElem = 
e3c0: 26 70 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65 6d  &pE;.      nElem
e3d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
e3e0: 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20 29  .  if( nElem>0 )
e3f0: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
e400: 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67  = sizeof(Fts3Seg
e410: 52 65 61 64 65 72 29 20 2b 20 28 6e 45 6c 65 6d  Reader) + (nElem
e420: 2b 31 29 2a 73 69 7a 65 6f 66 28 46 74 73 33 48  +1)*sizeof(Fts3H
e430: 61 73 68 45 6c 65 6d 20 2a 29 3b 0a 20 20 20 20  ashElem *);.    
e440: 70 52 65 61 64 65 72 20 3d 20 28 46 74 73 33 53  pReader = (Fts3S
e450: 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74  egReader *)sqlit
e460: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
e470: 3b 0a 20 20 20 20 69 66 28 20 21 70 52 65 61 64  ;.    if( !pRead
e480: 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
e490: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e4a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e4b0: 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20  memset(pReader, 
e4c0: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
e4d0: 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78 20 3d   pReader->iIdx =
e4e0: 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20 20   0x7FFFFFFF;.   
e4f0: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65     pReader->ppNe
e500: 78 74 45 6c 65 6d 20 3d 20 28 46 74 73 33 48 61  xtElem = (Fts3Ha
e510: 73 68 45 6c 65 6d 20 2a 2a 29 26 70 52 65 61 64  shElem **)&pRead
e520: 65 72 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  er[1];.      mem
e530: 63 70 79 28 70 52 65 61 64 65 72 2d 3e 70 70 4e  cpy(pReader->ppN
e540: 65 78 74 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20  extElem, aElem, 
e550: 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74 73  nElem*sizeof(Fts
e560: 33 48 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a 20  3HashElem *));. 
e570: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e580: 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 73  bPrefix ){.    s
e590: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 45 6c 65  qlite3_free(aEle
e5a0: 6d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61  m);.  }.  *ppRea
e5b0: 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20  der = pReader;. 
e5c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e5d0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
e5e0: 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 65 64   entries pointed
e5f0: 20 74 6f 20 62 79 20 74 77 6f 20 46 74 73 33 53   to by two Fts3S
e600: 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74 75  egReader structu
e610: 72 65 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69  res. .** Compari
e620: 73 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  son is as follow
e630: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f  s:.**.**   1) EO
e640: 46 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  F is greater tha
e650: 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  n not EOF..**.**
e660: 20 20 20 32 29 20 54 68 65 20 63 75 72 72 65 6e     2) The curren
e670: 74 20 74 65 72 6d 73 20 28 69 66 20 61 6e 79 29  t terms (if any)
e680: 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73   are compared us
e690: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
e6a0: 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 74 65 72   one.**      ter
e6b0: 6d 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  m is a prefix of
e6c0: 20 61 6e 6f 74 68 65 72 2c 20 74 68 65 20 6c 6f   another, the lo
e6d0: 6e 67 65 72 20 74 65 72 6d 20 69 73 20 63 6f 6e  nger term is con
e6e0: 73 69 64 65 72 65 64 20 74 68 65 0a 2a 2a 20 20  sidered the.**  
e6f0: 20 20 20 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a      larger..**.*
e700: 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e  *   3) By segmen
e710: 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20  t age. An older 
e720: 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69  segment is consi
e730: 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f  dered larger..*/
e740: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
e750: 53 65 67 52 65 61 64 65 72 43 6d 70 28 46 74 73  SegReaderCmp(Fts
e760: 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73  3SegReader *pLhs
e770: 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  , Fts3SegReader 
e780: 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRhs){.  int rc
e790: 3b 0a 20 20 69 66 28 20 70 4c 68 73 2d 3e 61 4e  ;.  if( pLhs->aN
e7a0: 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f  ode && pRhs->aNo
e7b0: 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
e7c0: 32 20 3d 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 20  2 = pLhs->nTerm 
e7d0: 2d 20 70 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20  - pRhs->nTerm;. 
e7e0: 20 20 20 69 66 28 20 72 63 32 3c 30 20 29 7b 0a     if( rc2<0 ){.
e7f0: 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
e800: 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70  p(pLhs->zTerm, p
e810: 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68 73  Rhs->zTerm, pLhs
e820: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65  ->nTerm);.    }e
e830: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
e840: 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65  memcmp(pLhs->zTe
e850: 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c  rm, pRhs->zTerm,
e860: 20 70 52 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20   pRhs->nTerm);. 
e870: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
e880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
e890: 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
e8a0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 28 70  lse{.    rc = (p
e8b0: 4c 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d  Lhs->aNode==0) -
e8c0: 20 28 70 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30   (pRhs->aNode==0
e8d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
e8e0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
e8f0: 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73  Rhs->iIdx - pLhs
e900: 2d 3e 69 49 64 78 3b 0a 20 20 7d 0a 20 20 61 73  ->iIdx;.  }.  as
e910: 73 65 72 74 28 20 72 63 21 3d 30 20 29 3b 0a 20  sert( rc!=0 );. 
e920: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e930: 2a 0a 2a 2a 20 41 20 64 69 66 66 65 72 65 6e 74  *.** A different
e940: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
e950: 74 69 6f 6e 20 66 6f 72 20 53 65 67 52 65 61 64  tion for SegRead
e960: 65 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 49  er structures. I
e970: 6e 20 74 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f  n this.** versio
e980: 6e 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  n, it is assumed
e990: 20 74 68 61 74 20 65 61 63 68 20 53 65 67 52 65   that each SegRe
e9a0: 61 64 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ader points to a
e9b0: 6e 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 61 20  n entry in.** a 
e9c0: 64 6f 63 6c 69 73 74 20 66 6f 72 20 69 64 65 6e  doclist for iden
e9d0: 74 69 63 61 6c 20 74 65 72 6d 73 2e 20 43 6f 6d  tical terms. Com
e9e0: 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
e9f0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
ea00: 2a 20 20 20 31 29 20 45 4f 46 20 28 65 6e 64 20  *   1) EOF (end 
ea10: 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68  of doclist in th
ea20: 69 73 20 63 61 73 65 29 20 69 73 20 67 72 65 61  is case) is grea
ea30: 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46  ter than not EOF
ea40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20  ..**.**   2) By 
ea50: 63 75 72 72 65 6e 74 20 64 6f 63 69 64 2e 0a 2a  current docid..*
ea60: 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67  *.**   3) By seg
ea70: 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64  ment age. An old
ea80: 65 72 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f  er segment is co
ea90: 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e  nsidered larger.
eaa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
eab0: 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
eac0: 69 73 74 43 6d 70 28 46 74 73 33 53 65 67 52 65  istCmp(Fts3SegRe
ead0: 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33  ader *pLhs, Fts3
eae0: 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73 29  SegReader *pRhs)
eaf0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c  {.  int rc = (pL
eb00: 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d  hs->pOffsetList=
eb10: 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73  =0)-(pRhs->pOffs
eb20: 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66  etList==0);.  if
eb30: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
eb40: 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d  f( pLhs->iDocid=
eb50: 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b  =pRhs->iDocid ){
eb60: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68 73  .      rc = pRhs
eb70: 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69  ->iIdx - pLhs->i
eb80: 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Idx;.    }else{.
eb90: 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73        rc = (pLhs
eba0: 2d 3e 69 44 6f 63 69 64 20 3e 20 70 52 68 73 2d  ->iDocid > pRhs-
ebb0: 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d  >iDocid) ? 1 : -
ebc0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  1;.    }.  }.  a
ebd0: 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f  ssert( pLhs->aNo
ebe0: 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64  de && pRhs->aNod
ebf0: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  e );.  return rc
ec00: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
ec10: 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
ec20: 69 73 74 43 6d 70 52 65 76 28 46 74 73 33 53 65  istCmpRev(Fts3Se
ec30: 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46  gReader *pLhs, F
ec40: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
ec50: 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  hs){.  int rc = 
ec60: 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69  (pLhs->pOffsetLi
ec70: 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f  st==0)-(pRhs->pO
ec80: 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20  ffsetList==0);. 
ec90: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
eca0: 20 20 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63    if( pLhs->iDoc
ecb0: 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64  id==pRhs->iDocid
ecc0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
ecd0: 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73  Rhs->iIdx - pLhs
ece0: 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73  ->iIdx;.    }els
ecf0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70  e{.      rc = (p
ed00: 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3c 20 70 52  Lhs->iDocid < pR
ed10: 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20  hs->iDocid) ? 1 
ed20: 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  : -1;.    }.  }.
ed30: 20 20 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e    assert( pLhs->
ed40: 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61  aNode && pRhs->a
ed50: 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Node );.  return
ed60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
ed70: 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20 74  mpare the term t
ed80: 68 61 74 20 74 68 65 20 46 74 73 33 53 65 67 52  hat the Fts3SegR
ed90: 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73  eader object pas
eda0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
edb0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69   argument.** poi
edc0: 6e 74 73 20 74 6f 20 77 69 74 68 20 74 68 65 20  nts to with the 
edd0: 74 65 72 6d 20 73 70 65 63 69 66 69 65 64 20 62  term specified b
ede0: 79 20 61 72 67 75 6d 65 6e 74 73 20 7a 54 65 72  y arguments zTer
edf0: 6d 20 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a 2a  m and nTerm. .**
ee00: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 67 20  .** If the pSeg 
ee10: 69 74 65 72 61 74 6f 72 20 69 73 20 61 6c 72 65  iterator is alre
ee20: 61 64 79 20 61 74 20 45 4f 46 2c 20 72 65 74 75  ady at EOF, retu
ee30: 72 6e 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c  rn 0. Otherwise,
ee40: 20 72 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20 69   return.** -ve i
ee50: 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d 20  f the pSeg term 
ee60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 54 65  is less than zTe
ee70: 72 6d 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20 74  rm/nTerm, 0 if t
ee80: 68 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65  he two terms are
ee90: 0a 2a 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76  .** equal, or +v
eea0: 65 20 69 66 20 74 68 65 20 70 53 65 67 20 74 65  e if the pSeg te
eeb0: 72 6d 20 69 73 20 67 72 65 61 74 65 72 20 74 68  rm is greater th
eec0: 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a  an zTerm/nTerm..
eed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
eee0: 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d 43  s3SegReaderTermC
eef0: 6d 70 28 0a 20 20 46 74 73 33 53 65 67 52 65 61  mp(.  Fts3SegRea
ef00: 64 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20  der *pSeg,      
ef10: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
ef20: 20 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a   reader object *
ef30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ef40: 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
ef50: 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 63      /* Term to c
ef60: 6f 6d 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20 69  ompare to */.  i
ef70: 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20  nt nTerm        
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef90: 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a  * Size of term z
efa0: 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
efb0: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  .){.  int res = 
efc0: 30 3b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 61  0;.  if( pSeg->a
efd0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Node ){.    if( 
efe0: 70 53 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65 72  pSeg->nTerm>nTer
eff0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  m ){.      res =
f000: 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54   memcmp(pSeg->zT
f010: 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
f020: 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
f030: 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d       res = memcm
f040: 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a  p(pSeg->zTerm, z
f050: 54 65 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65 72  Term, pSeg->nTer
f060: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  m);.    }.    if
f070: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
f080: 20 20 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e 54    res = pSeg->nT
f090: 65 72 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20 7d  erm-nTerm;.    }
f0a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
f0b0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  s;.}../*.** Argu
f0c0: 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e 74 20 69  ment apSegment i
f0d0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 53  s an array of nS
f0e0: 65 67 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73 2e  egment elements.
f0f0: 20 49 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61   It is known tha
f100: 74 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 28  t.** the final (
f110: 6e 53 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65 63  nSegment-nSuspec
f120: 74 29 20 6d 65 6d 62 65 72 73 20 61 72 65 20 61  t) members are a
f130: 6c 72 65 61 64 79 20 69 6e 20 73 6f 72 74 65 64  lready in sorted
f140: 20 6f 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f 72   order.** (accor
f150: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 70  ding to the comp
f160: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
f170: 70 72 6f 76 69 64 65 64 29 2e 20 54 68 69 73 20  provided). This 
f180: 66 75 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c 65  function shuffle
f190: 73 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61  s.** the array a
f1a0: 72 6f 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c 20  round until all 
f1b0: 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20 73  entries are in s
f1c0: 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a  orted order..*/.
f1d0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
f1e0: 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 0a 20  SegReaderSort(. 
f1f0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f200: 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  *apSegment,     
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 2f 2a 20 41 72 72 61 79 20 74 6f 20 73 6f 72 74  /* Array to sort
f230: 20 65 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a 20   entries of */. 
f240: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20   int nSegment,  
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67  /* Size of apSeg
f280: 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  ment array */.  
f290: 69 6e 74 20 6e 53 75 73 70 65 63 74 2c 20 20 20  int nSuspect,   
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f2c0: 2a 20 55 6e 73 6f 72 74 65 64 20 65 6e 74 72 79  * Unsorted entry
f2d0: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74 20   count */.  int 
f2e0: 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52  (*xCmp)(Fts3SegR
f2f0: 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67  eader *, Fts3Seg
f300: 52 65 61 64 65 72 20 2a 29 20 20 2f 2a 20 43 6f  Reader *)  /* Co
f310: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
f320: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  n */.){.  int i;
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
f350: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
f360: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 75  /..  assert( nSu
f370: 73 70 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74 20  spect<=nSegment 
f380: 29 3b 0a 0a 20 20 69 66 28 20 6e 53 75 73 70 65  );..  if( nSuspe
f390: 63 74 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20 6e  ct==nSegment ) n
f3a0: 53 75 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f 72  Suspect--;.  for
f3b0: 28 69 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20 69  (i=nSuspect-1; i
f3c0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
f3d0: 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nt j;.    for(j=
f3e0: 69 3b 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d 31  i; j<(nSegment-1
f3f0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 46  ); j++){.      F
f400: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 54  ts3SegReader *pT
f410: 6d 70 3b 0a 20 20 20 20 20 20 69 66 28 20 78 43  mp;.      if( xC
f420: 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c  mp(apSegment[j],
f430: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 29   apSegment[j+1])
f440: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
f450: 20 20 70 54 6d 70 20 3d 20 61 70 53 65 67 6d 65    pTmp = apSegme
f460: 6e 74 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 61  nt[j+1];.      a
f470: 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d 20  pSegment[j+1] = 
f480: 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20  apSegment[j];.  
f490: 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d      apSegment[j]
f4a0: 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20   = pTmp;.    }. 
f4b0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
f4c0: 55 47 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  UG.  /* Check th
f4d0: 61 74 20 74 68 65 20 6c 69 73 74 20 72 65 61 6c  at the list real
f4e0: 6c 79 20 69 73 20 73 6f 72 74 65 64 20 6e 6f 77  ly is sorted now
f4f0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
f500: 69 3c 28 6e 53 75 73 70 65 63 74 2d 31 29 3b 20  i<(nSuspect-1); 
f510: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
f520: 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74  ( xCmp(apSegment
f530: 5b 69 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69  [i], apSegment[i
f540: 2b 31 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23 65  +1])<0 );.  }.#e
f550: 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49  ndif.}../* .** I
f560: 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64 20 69  nsert a record i
f570: 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  nto the %_segmen
f580: 74 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ts table..*/.sta
f590: 74 69 63 20 69 6e 74 20 66 74 73 33 57 72 69 74  tic int fts3Writ
f5a0: 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33  eSegment(.  Fts3
f5b0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
f5d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
f5e0: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
f5f0: 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20 20  _int64 iBlock,  
f600: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
f610: 6b 20 69 64 20 66 6f 72 20 6e 65 77 20 62 6c 6f  k id for new blo
f620: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c  ck */.  char *z,
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f650: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
f660: 74 61 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64 61  taining block da
f670: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ta */.  int n   
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6a0: 6f 66 20 62 75 66 66 65 72 20 7a 20 69 6e 20 62  of buffer z in b
f6b0: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ytes */.){.  sql
f6c0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
f6d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
f6e0: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
f6f0: 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 2c  INSERT_SEGMENTS,
f700: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
f710: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f730: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
f740: 2c 20 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20  , 1, iBlock);.  
f750: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
f760: 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a 2c  lob(pStmt, 2, z,
f770: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
f780: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
f790: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
f7a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
f7b0: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  set(pStmt);.  }.
f7c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f7d0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6c  /*.** Find the l
f7e0: 61 72 67 65 73 74 20 72 65 6c 61 74 69 76 65 20  argest relative 
f7f0: 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 69 6e 20  level number in 
f800: 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 73 75  the table. If su
f810: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 0a 2a 2a  ccessful, set.**
f820: 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 69 73 20   *pnMax to this 
f830: 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e  value and return
f840: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
f850: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
f860: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 65  or occurs,.** se
f870: 74 20 2a 70 6e 4d 61 78 20 74 6f 20 7a 65 72 6f  t *pnMax to zero
f880: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
f890: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
f8a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f8b0: 46 74 73 33 4d 61 78 4c 65 76 65 6c 28 46 74 73  Fts3MaxLevel(Fts
f8c0: 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a  3Table *p, int *
f8d0: 70 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 63  pnMax){.  int rc
f8e0: 3b 0a 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20  ;.  int mxLevel 
f8f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
f900: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
f910: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
f920: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
f930: 54 5f 4d 58 4c 45 56 45 4c 2c 20 26 70 53 74 6d  T_MXLEVEL, &pStm
f940: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
f950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f960: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
f970: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
f980: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6d  Stmt) ){.      m
f990: 78 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  xLevel = sqlite3
f9a0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
f9b0: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
f9c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
f9d0: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  set(pStmt);.  }.
f9e0: 20 20 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c 65 76    *pnMax = mxLev
f9f0: 65 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  el;.  return rc;
fa00: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72  .}../* .** Inser
fa10: 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  t a record into 
fa20: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
fa30: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
fa40: 74 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69  t fts3WriteSegdi
fa50: 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  r(.  Fts3Table *
fa60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
fa70: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
fa80: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
fa90: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
faa0: 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
fab0: 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
fac0: 6c 65 76 65 6c 22 20 66 69 65 6c 64 20 28 61 62  level" field (ab
fad0: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 29 20 2a 2f  solute level) */
fae0: 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
fb10: 22 69 64 78 22 20 66 69 65 6c 64 20 2a 2f 0a 20  "idx" field */. 
fb20: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
fb30: 53 74 61 72 74 42 6c 6f 63 6b 2c 20 20 20 20 20  StartBlock,     
fb40: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 73   /* Value for "s
fb50: 74 61 72 74 5f 62 6c 6f 63 6b 22 20 66 69 65 6c  tart_block" fiel
fb60: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
fb70: 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f  nt64 iLeafEndBlo
fb80: 63 6b 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20  ck,    /* Value 
fb90: 66 6f 72 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f  for "leaves_end_
fba0: 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a  block" field */.
fbb0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
fbc0: 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20  iEndBlock,      
fbd0: 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
fbe0: 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64  end_block" field
fbf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f 6f   */.  char *zRoo
fc00: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
fc10: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20 76 61        /* Blob va
fc20: 6c 75 65 20 66 6f 72 20 22 72 6f 6f 74 22 20 66  lue for "root" f
fc30: 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ield */.  int nR
fc40: 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
fc50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fc60: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
fc70: 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a  buffer zRoot */.
fc80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
fc90: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
fca0: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
fcb0: 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53  (p, SQL_INSERT_S
fcc0: 45 47 44 49 52 2c 20 26 70 53 74 6d 74 2c 20 30  EGDIR, &pStmt, 0
fcd0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
fce0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
fcf0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
fd00: 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76 65  (pStmt, 1, iLeve
fd10: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
fd20: 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
fd30: 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71  2, iIdx);.    sq
fd40: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
fd50: 28 70 53 74 6d 74 2c 20 33 2c 20 69 53 74 61 72  (pStmt, 3, iStar
fd60: 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c  tBlock);.    sql
fd70: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
fd80: 70 53 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66 45  pStmt, 4, iLeafE
fd90: 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71  ndBlock);.    sq
fda0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
fdb0: 28 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64 42  (pStmt, 5, iEndB
fdc0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  lock);.    sqlit
fdd0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
fde0: 6d 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c 20 6e 52  mt, 6, zRoot, nR
fdf0: 6f 6f 74 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  oot, SQLITE_STAT
fe00: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
fe10: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
fe20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
fe30: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d  eset(pStmt);.  }
fe40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fe50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
fe60: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
fe70: 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66 20  mmon prefix (if 
fe80: 61 6e 79 29 20 73 68 61 72 65 64 20 62 79 20 7a  any) shared by z
fe90: 50 72 65 76 20 61 6e 64 0a 2a 2a 20 7a 4e 65 78  Prev and.** zNex
fea0: 74 2c 20 69 6e 20 62 79 74 65 73 2e 20 46 6f 72  t, in bytes. For
feb0: 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a 2a   example, .**.**
fec0: 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d     fts3PrefixCom
fed0: 70 72 65 73 73 28 22 61 62 63 22 2c 20 33 2c 20  press("abc", 3, 
fee0: 22 61 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f  "abcdef", 6)   /
fef0: 2f 20 72 65 74 75 72 6e 73 20 33 0a 2a 2a 20 20  / returns 3.**  
ff00: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
ff10: 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22 61  ess("abX", 3, "a
ff20: 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20  bcdef", 6)   // 
ff30: 72 65 74 75 72 6e 73 20 32 0a 2a 2a 20 20 20 66  returns 2.**   f
ff40: 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
ff50: 73 28 22 61 62 58 22 2c 20 33 2c 20 22 58 62 63  s("abX", 3, "Xbc
ff60: 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65  def", 6)   // re
ff70: 74 75 72 6e 73 20 30 0a 2a 2f 0a 73 74 61 74 69  turns 0.*/.stati
ff80: 63 20 69 6e 74 20 66 74 73 33 50 72 65 66 69 78  c int fts3Prefix
ff90: 43 6f 6d 70 72 65 73 73 28 0a 20 20 63 6f 6e 73  Compress(.  cons
ffa0: 74 20 63 68 61 72 20 2a 7a 50 72 65 76 2c 20 20  t char *zPrev,  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ffc0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
ffd0: 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   previous term *
ffe0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 76 2c 20 20  /.  int nPrev,  
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
10010 75 66 66 65 72 20 7a 50 72 65 76 20 69 6e 20 62  uffer zPrev in b
10020 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ytes */.  const 
10030 63 68 61 72 20 2a 7a 4e 65 78 74 2c 20 20 20 20  char *zNext,    
10040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
10050 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
10060 65 78 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ext term */.  in
10070 74 20 6e 4e 65 78 74 20 20 20 20 20 20 20 20 20  t nNext         
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10090 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
100a0 7a 4e 65 78 74 20 69 6e 20 62 79 74 65 73 20 2a  zNext in bytes *
100b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
100c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
100d0 28 6e 4e 65 78 74 29 3b 0a 20 20 66 6f 72 28 6e  (nNext);.  for(n
100e0 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26 26 20 7a  =0; n<nPrev && z
100f0 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78 74 5b 6e  Prev[n]==zNext[n
10100 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65 74 75 72  ]; n++);.  retur
10110 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n n;.}../*.** Ad
10120 64 20 74 65 72 6d 20 7a 54 65 72 6d 20 74 6f 20  d term zTerm to 
10130 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f 64 65 2e  the SegmentNode.
10140 20 49 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   It is guarantee
10150 64 20 74 68 61 74 20 7a 54 65 72 6d 20 69 73 20  d that zTerm is 
10160 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63 63 6f 72  larger.** (accor
10170 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d 70 29 20  ding to memcmp) 
10180 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
10190 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  s term..*/.stati
101a0 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65 41 64  c int fts3NodeAd
101b0 64 54 65 72 6d 28 0a 20 20 46 74 73 33 54 61 62  dTerm(.  Fts3Tab
101c0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
101d0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
101e0 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
101f0 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64   */.  SegmentNod
10200 65 20 2a 2a 70 70 54 72 65 65 2c 20 20 20 20 20  e **ppTree,     
10210 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
10220 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e   SegmentNode han
10230 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73  dle */ .  int is
10240 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20  CopyTerm,       
10250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10260 65 20 69 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  e if zTerm/nTerm
10270 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 2a 2f   is transient */
10280 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10290 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
102a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
102b0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
102c0 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  ng term */.  int
102d0 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102f0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
10300 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  bytes */.){.  Se
10310 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
10320 20 3d 20 2a 70 70 54 72 65 65 3b 0a 20 20 69 6e   = *ppTree;.  in
10330 74 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 4e  t rc;.  SegmentN
10340 6f 64 65 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a  ode *pNew;..  /*
10350 20 46 69 72 73 74 20 74 72 79 20 74 6f 20 61 70   First try to ap
10360 70 65 6e 64 20 74 68 65 20 74 65 72 6d 20 74 6f  pend the term to
10370 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
10380 65 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  e. Return early 
10390 69 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 69 73  if .  ** this is
103a0 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
103b0 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20    if( pTree ){. 
103c0 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70     int nData = p
103d0 54 72 65 65 2d 3e 6e 44 61 74 61 3b 20 20 20 20  Tree->nData;    
103e0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
103f0 20 6f 66 20 6e 6f 64 65 20 69 6e 20 62 79 74 65   of node in byte
10400 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  s */.    int nRe
10410 71 20 3d 20 6e 44 61 74 61 3b 20 20 20 20 20 20  q = nData;      
10420 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
10430 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20 61  ed space after a
10440 64 64 69 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a 20  dding zTerm */. 
10450 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20     int nPrefix; 
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
10480 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f  tes of prefix co
10490 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  mpression */.   
104a0 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20   int nSuffix;   
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
104c0 2a 20 53 75 66 66 69 78 20 6c 65 6e 67 74 68 20  * Suffix length 
104d0 2a 2f 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20  */..    nPrefix 
104e0 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
104f0 72 65 73 73 28 70 54 72 65 65 2d 3e 7a 54 65 72  ress(pTree->zTer
10500 6d 2c 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 2c  m, pTree->nTerm,
10510 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
10520 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
10530 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20  erm-nPrefix;..  
10540 20 20 6e 52 65 71 20 2b 3d 20 73 71 6c 69 74 65    nReq += sqlite
10550 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
10560 50 72 65 66 69 78 29 2b 73 71 6c 69 74 65 33 46  Prefix)+sqlite3F
10570 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
10580 66 66 69 78 29 2b 6e 53 75 66 66 69 78 3b 0a 20  ffix)+nSuffix;. 
10590 20 20 20 69 66 28 20 6e 52 65 71 3c 3d 70 2d 3e     if( nReq<=p->
105a0 6e 4e 6f 64 65 53 69 7a 65 20 7c 7c 20 21 70 54  nNodeSize || !pT
105b0 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20  ree->zTerm ){.. 
105c0 20 20 20 20 20 69 66 28 20 6e 52 65 71 3e 70 2d       if( nReq>p-
105d0 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20  >nNodeSize ){.  
105e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73        /* An unus
105f0 75 61 6c 20 63 61 73 65 3a 20 74 68 69 73 20 69  ual case: this i
10600 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
10610 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
10620 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20 20  the node.       
10630 20 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74   ** and the stat
10640 69 63 20 6e 6f 64 65 20 62 75 66 66 65 72 20 28  ic node buffer (
10650 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74  p->nNodeSize byt
10660 65 73 29 20 69 73 20 6e 6f 74 20 6c 61 72 67 65  es) is not large
10670 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 6f 75  .        ** enou
10680 67 68 2e 20 55 73 65 20 61 20 73 65 70 61 72 61  gh. Use a separa
10690 74 65 6c 79 20 6d 61 6c 6c 6f 63 65 64 20 62 75  tely malloced bu
106a0 66 66 65 72 20 69 6e 73 74 65 61 64 20 54 68 69  ffer instead Thi
106b0 73 20 77 61 73 74 65 73 0a 20 20 20 20 20 20 20  s wastes.       
106c0 20 2a 2a 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65   ** p->nNodeSize
106d0 20 62 79 74 65 73 2c 20 62 75 74 20 73 69 6e 63   bytes, but sinc
106e0 65 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  e this scenario 
106f0 6f 6e 6c 79 20 63 6f 6d 65 73 20 61 62 6f 75 74  only comes about
10700 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
10710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
10720 6e 74 61 69 6e 20 74 77 6f 20 74 65 72 6d 73 20  ntain two terms 
10730 74 68 61 74 20 73 68 61 72 65 20 61 20 70 72 65  that share a pre
10740 66 69 78 20 6f 66 20 61 6c 6d 6f 73 74 20 32 4b  fix of almost 2K
10750 42 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  B, .        ** t
10760 68 69 73 20 69 73 20 6e 6f 74 20 65 78 70 65 63  his is not expec
10770 74 65 64 20 74 6f 20 62 65 20 61 20 73 65 72 69  ted to be a seri
10780 6f 75 73 20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20  ous problem. .  
10790 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
107a0 20 61 73 73 65 72 74 28 20 70 54 72 65 65 2d 3e   assert( pTree->
107b0 61 44 61 74 61 3d 3d 28 63 68 61 72 20 2a 29 26  aData==(char *)&
107c0 70 54 72 65 65 5b 31 5d 20 29 3b 0a 20 20 20 20  pTree[1] );.    
107d0 20 20 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61      pTree->aData
107e0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
107f0 65 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71 29 3b  e3_malloc(nReq);
10800 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 54  .        if( !pT
10810 72 65 65 2d 3e 61 44 61 74 61 20 29 7b 0a 20 20  ree->aData ){.  
10820 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10830 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
10850 20 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d        if( pTree-
10860 3e 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  >zTerm ){.      
10870 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
10880 20 70 72 65 66 69 78 2d 6c 65 6e 67 74 68 20 66   prefix-length f
10890 69 65 6c 64 20 66 6f 72 20 66 69 72 73 74 20 74  ield for first t
108a0 65 72 6d 20 69 6e 20 61 20 6e 6f 64 65 20 2a 2f  erm in a node */
108b0 0a 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 2b  .        nData +
108c0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
108d0 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61  Varint(&pTree->a
108e0 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72  Data[nData], nPr
108f0 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  efix);.      }..
10900 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73        nData += s
10910 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
10920 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74  int(&pTree->aDat
10930 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69  a[nData], nSuffi
10940 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  x);.      memcpy
10950 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e  (&pTree->aData[n
10960 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50  Data], &zTerm[nP
10970 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29  refix], nSuffix)
10980 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e  ;.      pTree->n
10990 44 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e  Data = nData + n
109a0 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70 54  Suffix;.      pT
109b0 72 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a  ree->nEntry++;..
109c0 20 20 20 20 20 20 69 66 28 20 69 73 43 6f 70 79        if( isCopy
109d0 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
109e0 69 66 28 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c  if( pTree->nMall
109f0 6f 63 3c 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  oc<nTerm ){.    
10a00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
10a10 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
10a20 6f 63 28 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f  oc(pTree->zMallo
10a30 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20  c, nTerm*2);.   
10a40 20 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77         if( !zNew
10a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10a70 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
10a80 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 65 65  .          pTree
10a90 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72  ->nMalloc = nTer
10aa0 6d 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  m*2;.          p
10ab0 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  Tree->zMalloc = 
10ac0 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zNew;.        }.
10ad0 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a          pTree->z
10ae0 54 65 72 6d 20 3d 20 70 54 72 65 65 2d 3e 7a 4d  Term = pTree->zM
10af0 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 6d  alloc;.        m
10b00 65 6d 63 70 79 28 70 54 72 65 65 2d 3e 7a 54 65  emcpy(pTree->zTe
10b10 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
10b20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65  );.        pTree
10b30 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b  ->nTerm = nTerm;
10b40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10b50 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65        pTree->zTe
10b60 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65  rm = (char *)zTe
10b70 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65  rm;.        pTre
10b80 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d  e->nTerm = nTerm
10b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10bc0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
10bd0 77 73 20 74 6f 20 68 65 72 65 2c 20 69 74 20 77  ws to here, it w
10be0 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
10bf0 74 6f 20 61 70 70 65 6e 64 20 7a 54 65 72 6d 20  to append zTerm 
10c00 74 6f 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  to the.  ** curr
10c10 65 6e 74 20 6e 6f 64 65 2e 20 43 72 65 61 74 65  ent node. Create
10c20 20 61 20 6e 65 77 20 6e 6f 64 65 20 28 61 20 72   a new node (a r
10c30 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
10c40 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
10c50 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  )..  ** If this 
10c60 69 73 20 74 68 65 20 66 69 72 73 74 20 6e 6f 64  is the first nod
10c70 65 20 69 6e 20 74 68 65 20 74 72 65 65 2c 20 74  e in the tree, t
10c80 68 65 20 74 65 72 6d 20 69 73 20 61 64 64 65 64  he term is added
10c90 20 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a   to it..  **.  *
10ca0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
10cb0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 64 64   term is not add
10cc0 65 64 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 6f  ed to the new no
10cd0 64 65 2c 20 69 74 20 69 73 20 6c 65 66 74 20 65  de, it is left e
10ce0 6d 70 74 79 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f  mpty for.  ** no
10cf0 77 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  w. Instead, the 
10d00 74 65 72 6d 20 69 73 20 69 6e 73 65 72 74 65 64  term is inserted
10d10 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
10d20 20 6f 66 20 70 54 72 65 65 2e 20 49 66 20 70 54   of pTree. If pT
10d30 72 65 65 20 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  ree .  ** has no
10d40 20 70 61 72 65 6e 74 2c 20 6f 6e 65 20 69 73 20   parent, one is 
10d50 63 72 65 61 74 65 64 20 68 65 72 65 2e 0a 20 20  created here..  
10d60 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 28 53 65 67  */.  pNew = (Seg
10d70 6d 65 6e 74 4e 6f 64 65 20 2a 29 73 71 6c 69 74  mentNode *)sqlit
10d80 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
10d90 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 20 2b 20  (SegmentNode) + 
10da0 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20  p->nNodeSize);. 
10db0 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
10dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10dd0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
10de0 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
10df0 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29  eof(SegmentNode)
10e00 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44 61 74 61  );.  pNew->nData
10e10 20 3d 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49   = 1 + FTS3_VARI
10e20 4e 54 5f 4d 41 58 3b 0a 20 20 70 4e 65 77 2d 3e  NT_MAX;.  pNew->
10e30 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29  aData = (char *)
10e40 26 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69 66 28  &pNew[1];..  if(
10e50 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65   pTree ){.    Se
10e60 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65  gmentNode *pPare
10e70 6e 74 20 3d 20 70 54 72 65 65 2d 3e 70 50 61 72  nt = pTree->pPar
10e80 65 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  ent;.    rc = ft
10e90 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c  s3NodeAddTerm(p,
10ea0 20 26 70 50 61 72 65 6e 74 2c 20 69 73 43 6f 70   &pParent, isCop
10eb0 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  yTerm, zTerm, nT
10ec0 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  erm);.    if( pT
10ed0 72 65 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  ree->pParent==0 
10ee0 29 7b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e  ){.      pTree->
10ef0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
10f00 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72  t;.    }.    pTr
10f10 65 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65  ee->pRight = pNe
10f20 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65  w;.    pNew->pLe
10f30 66 74 6d 6f 73 74 20 3d 20 70 54 72 65 65 2d 3e  ftmost = pTree->
10f40 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 70  pLeftmost;.    p
10f50 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  New->pParent = p
10f60 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e 65 77  Parent;.    pNew
10f70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65  ->zMalloc = pTre
10f80 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  e->zMalloc;.    
10f90 70 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20  pNew->nMalloc = 
10fa0 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a  pTree->nMalloc;.
10fb0 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c      pTree->zMall
10fc0 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  oc = 0;.  }else{
10fd0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  .    pNew->pLeft
10fe0 6d 6f 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  most = pNew;.   
10ff0 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64   rc = fts3NodeAd
11000 64 54 65 72 6d 28 70 2c 20 26 70 4e 65 77 2c 20  dTerm(p, &pNew, 
11010 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72  isCopyTerm, zTer
11020 6d 2c 20 6e 54 65 72 6d 29 3b 20 0a 20 20 7d 0a  m, nTerm); .  }.
11030 0a 20 20 2a 70 70 54 72 65 65 20 3d 20 70 4e 65  .  *ppTree = pNe
11040 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  w;.  return rc;.
11050 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
11060 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 74 73  function for fts
11070 33 4e 6f 64 65 57 72 69 74 65 28 29 2e 0a 2a 2f  3NodeWrite()..*/
11080 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
11090 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 0a  TreeFinishNode(.
110a0 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
110b0 54 72 65 65 2c 20 0a 20 20 69 6e 74 20 69 48 65  Tree, .  int iHe
110c0 69 67 68 74 2c 20 0a 20 20 73 71 6c 69 74 65 33  ight, .  sqlite3
110d0 5f 69 6e 74 36 34 20 69 4c 65 66 74 43 68 69 6c  _int64 iLeftChil
110e0 64 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 61 72  d.){.  int nStar
110f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 48 65  t;.  assert( iHe
11100 69 67 68 74 3e 3d 31 20 26 26 20 69 48 65 69 67  ight>=1 && iHeig
11110 68 74 3c 31 32 38 20 29 3b 0a 20 20 6e 53 74 61  ht<128 );.  nSta
11120 72 74 20 3d 20 46 54 53 33 5f 56 41 52 49 4e 54  rt = FTS3_VARINT
11130 5f 4d 41 58 20 2d 20 73 71 6c 69 74 65 33 46 74  _MAX - sqlite3Ft
11140 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 4c 65 66  s3VarintLen(iLef
11150 74 43 68 69 6c 64 29 3b 0a 20 20 70 54 72 65 65  tChild);.  pTree
11160 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 20  ->aData[nStart] 
11170 3d 20 28 63 68 61 72 29 69 48 65 69 67 68 74 3b  = (char)iHeight;
11180 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  .  sqlite3Fts3Pu
11190 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e  tVarint(&pTree->
111a0 61 44 61 74 61 5b 6e 53 74 61 72 74 2b 31 5d 2c  aData[nStart+1],
111b0 20 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20   iLeftChild);.  
111c0 72 65 74 75 72 6e 20 6e 53 74 61 72 74 3b 0a 7d  return nStart;.}
111d0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
111e0 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 65  e buffer for the
111f0 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 70 54   segment node pT
11200 72 65 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ree and all of i
11210 74 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 0a  ts peers to the.
11220 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
11230 6e 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  n call this func
11240 74 69 6f 6e 20 72 65 63 75 72 73 69 76 65 6c 79  tion recursively
11250 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61   to write the pa
11260 72 65 6e 74 20 6f 66 20 0a 2a 2a 20 70 54 72 65  rent of .** pTre
11270 65 20 61 6e 64 20 69 74 73 20 70 65 65 72 73 20  e and its peers 
11280 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
11290 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
112a0 69 66 20 70 54 72 65 65 20 69 73 20 61 20 72 6f  if pTree is a ro
112b0 6f 74 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74 20  ot node, do not 
112c0 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
112d0 64 61 74 61 62 61 73 65 2e 20 49 6e 73 74 65 61  database. Instea
112e0 64 2c 0a 2a 2a 20 73 65 74 20 6f 75 74 70 75 74  d,.** set output
112f0 20 76 61 72 69 61 62 6c 65 73 20 2a 70 61 52 6f   variables *paRo
11300 6f 74 20 61 6e 64 20 2a 70 6e 52 6f 6f 74 20 74  ot and *pnRoot t
11310 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f  o contain the ro
11320 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  ot node..**.** I
11330 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
11340 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
11350 6e 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76  ned and output v
11360 61 72 69 61 62 6c 65 20 2a 70 69 4c 61 73 74 20  ariable *piLast 
11370 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  is.** set to the
11380 20 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64   largest blockid
11390 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
113a0 64 61 74 61 62 61 73 65 20 28 6f 72 20 7a 65 72  database (or zer
113b0 6f 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b  o if no.** block
113c0 73 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 74  s were written t
113d0 6f 20 74 68 65 20 64 62 29 2e 20 4f 74 68 65 72  o the db). Other
113e0 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
113f0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
11400 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
11410 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f  tatic int fts3No
11420 64 65 57 72 69 74 65 28 0a 20 20 46 74 73 33 54  deWrite(.  Fts3T
11430 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
11440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
11450 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
11460 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  le */.  SegmentN
11470 6f 64 65 20 2a 70 54 72 65 65 2c 20 20 20 20 20  ode *pTree,     
11480 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
11490 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f  ntNode handle */
114a0 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20  .  int iHeight, 
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20     /* Height of 
114d0 74 68 69 73 20 6e 6f 64 65 20 69 6e 20 74 72 65  this node in tre
114e0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
114f0 6e 74 36 34 20 69 4c 65 61 66 2c 20 20 20 20 20  nt64 iLeaf,     
11500 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
11510 69 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66  id of first leaf
11520 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
11530 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65 2c 20  e3_int64 iFree, 
11540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
11550 6f 63 6b 20 69 64 20 6f 66 20 6e 65 78 74 20 66  ock id of next f
11560 72 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65  ree slot in %_se
11570 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  gments */.  sqli
11580 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73  te3_int64 *piLas
11590 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t,          /* O
115a0 55 54 3a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20  UT: Block id of 
115b0 6c 61 73 74 20 65 6e 74 72 79 20 77 72 69 74 74  last entry writt
115c0 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  en */.  char **p
115d0 61 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  aRoot,          
115e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
115f0 44 61 74 61 20 66 6f 72 20 72 6f 6f 74 20 6e 6f  Data for root no
11600 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  de */.  int *pnR
11610 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
11620 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11630 53 69 7a 65 20 6f 66 20 72 6f 6f 74 20 6e 6f 64  Size of root nod
11640 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  e in bytes */.){
11650 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11660 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
11670 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b  Tree->pParent ){
11680 0a 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64  .    /* Root nod
11690 65 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a  e of the tree. *
116a0 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74  /.    int nStart
116b0 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73   = fts3TreeFinis
116c0 68 4e 6f 64 65 28 70 54 72 65 65 2c 20 69 48 65  hNode(pTree, iHe
116d0 69 67 68 74 2c 20 69 4c 65 61 66 29 3b 0a 20 20  ight, iLeaf);.  
116e0 20 20 2a 70 69 4c 61 73 74 20 3d 20 69 46 72 65    *piLast = iFre
116f0 65 2d 31 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f 74  e-1;.    *pnRoot
11700 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20   = pTree->nData 
11710 2d 20 6e 53 74 61 72 74 3b 0a 20 20 20 20 2a 70  - nStart;.    *p
11720 61 52 6f 6f 74 20 3d 20 26 70 54 72 65 65 2d 3e  aRoot = &pTree->
11730 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 3b 0a 20  aData[nStart];. 
11740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 65 67 6d   }else{.    Segm
11750 65 6e 74 4e 6f 64 65 20 2a 70 49 74 65 72 3b 0a  entNode *pIter;.
11760 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
11770 34 20 69 4e 65 78 74 46 72 65 65 20 3d 20 69 46  4 iNextFree = iF
11780 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ree;.    sqlite3
11790 5f 69 6e 74 36 34 20 69 4e 65 78 74 4c 65 61 66  _int64 iNextLeaf
117a0 20 3d 20 69 4c 65 61 66 3b 0a 20 20 20 20 66 6f   = iLeaf;.    fo
117b0 72 28 70 49 74 65 72 3d 70 54 72 65 65 2d 3e 70  r(pIter=pTree->p
117c0 4c 65 66 74 6d 6f 73 74 3b 20 70 49 74 65 72 20  Leftmost; pIter 
117d0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
117e0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
117f0 52 69 67 68 74 29 7b 0a 20 20 20 20 20 20 69 6e  Right){.      in
11800 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54  t nStart = fts3T
11810 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 49  reeFinishNode(pI
11820 74 65 72 2c 20 69 48 65 69 67 68 74 2c 20 69 4e  ter, iHeight, iN
11830 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  extLeaf);.      
11840 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 70 49 74  int nWrite = pIt
11850 65 72 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61  er->nData - nSta
11860 72 74 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20  rt;.  .      rc 
11870 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
11880 6e 74 28 70 2c 20 69 4e 65 78 74 46 72 65 65 2c  nt(p, iNextFree,
11890 20 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 6e   &pIter->aData[n
118a0 53 74 61 72 74 5d 2c 20 6e 57 72 69 74 65 29 3b  Start], nWrite);
118b0 0a 20 20 20 20 20 20 69 4e 65 78 74 46 72 65 65  .      iNextFree
118c0 2b 2b 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 4c  ++;.      iNextL
118d0 65 61 66 20 2b 3d 20 28 70 49 74 65 72 2d 3e 6e  eaf += (pIter->n
118e0 45 6e 74 72 79 2b 31 29 3b 0a 20 20 20 20 7d 0a  Entry+1);.    }.
118f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
11910 73 73 65 72 74 28 20 69 4e 65 78 74 4c 65 61 66  ssert( iNextLeaf
11920 3d 3d 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20  ==iFree );.     
11930 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72   rc = fts3NodeWr
11940 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  ite(.          p
11950 2c 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74  , pTree->pParent
11960 2c 20 69 48 65 69 67 68 74 2b 31 2c 20 69 46 72  , iHeight+1, iFr
11970 65 65 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 70  ee, iNextFree, p
11980 69 4c 61 73 74 2c 20 70 61 52 6f 6f 74 2c 20 70  iLast, paRoot, p
11990 6e 52 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a 20  nRoot.      );. 
119a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
119b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
119c0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
119d0 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
119e0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
119f0 74 72 65 65 20 70 54 72 65 65 2e 0a 2a 2f 0a 73  tree pTree..*/.s
11a00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4e  tatic void fts3N
11a10 6f 64 65 46 72 65 65 28 53 65 67 6d 65 6e 74 4e  odeFree(SegmentN
11a20 6f 64 65 20 2a 70 54 72 65 65 29 7b 0a 20 20 69  ode *pTree){.  i
11a30 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20  f( pTree ){.    
11a40 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 20 3d  SegmentNode *p =
11a50 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73   pTree->pLeftmos
11a60 74 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65 46  t;.    fts3NodeF
11a70 72 65 65 28 70 2d 3e 70 50 61 72 65 6e 74 29 3b  ree(p->pParent);
11a80 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b  .    while( p ){
11a90 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f  .      SegmentNo
11aa0 64 65 20 2a 70 52 69 67 68 74 20 3d 20 70 2d 3e  de *pRight = p->
11ab0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
11ac0 28 20 70 2d 3e 61 44 61 74 61 21 3d 28 63 68 61  ( p->aData!=(cha
11ad0 72 20 2a 29 26 70 5b 31 5d 20 29 7b 0a 20 20 20  r *)&p[1] ){.   
11ae0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11af0 65 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  e(p->aData);.   
11b00 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
11b10 74 28 20 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  t( pRight==0 || 
11b20 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  p->zMalloc==0 );
11b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11b40 72 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  ree(p->zMalloc);
11b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11b60 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 70 20  ree(p);.      p 
11b70 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  = pRight;.    }.
11b80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
11b90 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 73   a term to the s
11ba0 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 6e  egment being con
11bb0 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
11bc0 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62  SegmentWriter ob
11bd0 6a 65 63 74 0a 2a 2a 20 2a 70 70 57 72 69 74 65  ject.** *ppWrite
11be0 72 2e 20 57 68 65 6e 20 61 64 64 69 6e 67 20 74  r. When adding t
11bf0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f  he first term to
11c00 20 61 20 73 65 67 6d 65 6e 74 2c 20 2a 70 70 57   a segment, *ppW
11c10 72 69 74 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20  riter should.** 
11c20 62 65 20 70 61 73 73 65 64 20 4e 55 4c 4c 2e 20  be passed NULL. 
11c30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  This function wi
11c40 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ll allocate a ne
11c50 77 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  w SegmentWriter 
11c60 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 72 65  object.** and re
11c70 74 75 72 6e 20 69 74 20 76 69 61 20 74 68 65 20  turn it via the 
11c80 69 6e 70 75 74 2f 6f 75 74 70 75 74 20 76 61 72  input/output var
11c90 69 61 62 6c 65 20 2a 70 70 57 72 69 74 65 72 20  iable *ppWriter 
11ca0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
11cb0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11cc0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
11cd0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
11ce0 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
11cf0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
11d00 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
11d10 57 72 69 74 65 72 41 64 64 28 0a 20 20 46 74 73  WriterAdd(.  Fts
11d20 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d40 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
11d50 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ndle */.  Segmen
11d60 74 57 72 69 74 65 72 20 2a 2a 70 70 57 72 69 74  tWriter **ppWrit
11d70 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  er,       /* IN/
11d80 4f 55 54 3a 20 53 65 67 6d 65 6e 74 57 72 69 74  OUT: SegmentWrit
11d90 65 72 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20  er handle */ .  
11da0 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20  int isCopyTerm, 
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 2f 2a 20 54 72 75 65 20 69 66 20 62 75 66 66 65  /* True if buffe
11dd0 72 20 7a 54 65 72 6d 20 6d 75 73 74 20 62 65 20  r zTerm must be 
11de0 63 6f 70 69 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  copied */.  cons
11df0 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  t char *zTerm,  
11e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11e10 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
11e20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
11e30 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11e60 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a   term in bytes *
11e70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11e80 61 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20  aDoclist,       
11e90 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
11ea0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
11eb0 69 6e 67 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20  ing doclist */. 
11ec0 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20   int nDoclist   
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c   /* Size of docl
11ef0 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
11f00 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  ){.  int nPrefix
11f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11f30 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62  term prefix in b
11f40 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ytes */.  int nS
11f50 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  uffix;          
11f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11f70 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78  e of term suffix
11f80 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
11f90 6e 74 20 6e 52 65 71 3b 20 20 20 20 20 20 20 20  nt nReq;        
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
11fc0 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65  s required on le
11fd0 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  af page */.  int
11fe0 20 6e 44 61 74 61 3b 0a 20 20 53 65 67 6d 65 6e   nData;.  Segmen
11ff0 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
12000 20 3d 20 2a 70 70 57 72 69 74 65 72 3b 0a 0a 20   = *ppWriter;.. 
12010 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29 7b   if( !pWriter ){
12020 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
12030 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12040 53 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  Stmt;..    /* Al
12050 6c 6f 63 61 74 65 20 74 68 65 20 53 65 67 6d 65  locate the Segme
12060 6e 74 57 72 69 74 65 72 20 73 74 72 75 63 74 75  ntWriter structu
12070 72 65 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65  re */.    pWrite
12080 72 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74  r = (SegmentWrit
12090 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  er *)sqlite3_mal
120a0 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65  loc(sizeof(Segme
120b0 6e 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20  ntWriter));.    
120c0 69 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72  if( !pWriter ) r
120d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
120e0 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  EM;.    memset(p
120f0 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
12100 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29  f(SegmentWriter)
12110 29 3b 0a 20 20 20 20 2a 70 70 57 72 69 74 65 72  );.    *ppWriter
12120 20 3d 20 70 57 72 69 74 65 72 3b 0a 0a 20 20 20   = pWriter;..   
12130 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
12140 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
12150 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74  o accumulate dat
12160 61 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72  a */.    pWriter
12170 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20  ->aData = (char 
12180 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
12190 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a  (p->nNodeSize);.
121a0 20 20 20 20 69 66 28 20 21 70 57 72 69 74 65 72      if( !pWriter
121b0 2d 3e 61 44 61 74 61 20 29 20 72 65 74 75 72 6e  ->aData ) return
121c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
121d0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a     pWriter->nSiz
121e0 65 20 3d 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  e = p->nNodeSize
121f0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
12200 68 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c 6f  he next free blo
12210 63 6b 69 64 20 69 6e 20 74 68 65 20 25 5f 73 65  ckid in the %_se
12220 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a  gments table */.
12230 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
12240 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54  Stmt(p, SQL_NEXT
12250 5f 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70  _SEGMENTS_ID, &p
12260 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
12270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12280 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12290 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
122a0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
122b0 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70 57  tmt) ){.      pW
122c0 72 69 74 65 72 2d 3e 69 46 72 65 65 20 3d 20 73  riter->iFree = s
122d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
122e0 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  t64(pStmt, 0);. 
122f0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46       pWriter->iF
12300 69 72 73 74 20 3d 20 70 57 72 69 74 65 72 2d 3e  irst = pWriter->
12310 69 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  iFree;.    }.   
12320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
12330 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
12340 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12350 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
12360 20 7d 0a 20 20 6e 44 61 74 61 20 3d 20 70 57 72   }.  nData = pWr
12370 69 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 0a 20 20  iter->nData;..  
12380 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72  nPrefix = fts3Pr
12390 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 57 72  efixCompress(pWr
123a0 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 57 72  iter->zTerm, pWr
123b0 69 74 65 72 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65  iter->nTerm, zTe
123c0 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53  rm, nTerm);.  nS
123d0 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50  uffix = nTerm-nP
123e0 72 65 66 69 78 3b 0a 0a 20 20 2f 2a 20 46 69 67  refix;..  /* Fig
123f0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
12400 20 62 79 74 65 73 20 61 72 65 20 72 65 71 75 69   bytes are requi
12410 72 65 64 20 62 79 20 74 68 69 73 20 6e 65 77 20  red by this new 
12420 65 6e 74 72 79 20 2a 2f 0a 20 20 6e 52 65 71 20  entry */.  nReq 
12430 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
12440 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 20  intLen(nPrefix) 
12450 2b 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63  +    /* varint c
12460 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
12470 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
12480 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
12490 6e 28 6e 53 75 66 66 69 78 29 20 2b 20 20 20 20  n(nSuffix) +    
124a0 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63       /* varint c
124b0 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69 78  ontaining suffix
124c0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6e 53 75   size */.    nSu
124d0 66 66 69 78 20 2b 20 20 20 20 20 20 20 20 20 20  ffix +          
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75 66       /* Term suf
12500 66 69 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fix */.    sqlit
12510 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
12520 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20  nDoclist) +     
12530 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f     /* Size of do
12540 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6e 44 6f  clist */.    nDo
12550 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
12580 64 61 74 61 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  data */..  if( n
12590 44 61 74 61 3e 30 20 26 26 20 6e 44 61 74 61 2b  Data>0 && nData+
125a0 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a  nReq>p->nNodeSiz
125b0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
125c0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ..    /* The cur
125d0 72 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65 20 69  rent leaf node i
125e0 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74  s full. Write it
125f0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
12600 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20  base. */.    rc 
12610 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
12620 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69  nt(p, pWriter->i
12630 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d  Free++, pWriter-
12640 3e 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  >aData, nData);.
12650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12660 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
12670 63 3b 0a 20 20 20 20 70 2d 3e 6e 4c 65 61 66 41  c;.    p->nLeafA
12680 64 64 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  dd++;..    /* Ad
12690 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  d the current te
126a0 72 6d 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69  rm to the interi
126b0 6f 72 20 6e 6f 64 65 20 74 72 65 65 2e 20 54 68  or node tree. Th
126c0 65 20 74 65 72 6d 20 61 64 64 65 64 20 74 6f 0a  e term added to.
126d0 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 74 65 72      ** the inter
126e0 69 6f 72 20 74 72 65 65 20 6d 75 73 74 3a 0a 20  ior tree must:. 
126f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61     **.    **   a
12700 29 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  ) be greater tha
12710 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65  n the largest te
12720 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e  rm on the leaf n
12730 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ode just written
12740 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  .    **      to 
12750 74 68 65 20 64 61 74 61 62 61 73 65 20 28 73 74  the database (st
12760 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ill available in
12770 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 29   pWriter->zTerm)
12780 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20  , and.    **.   
12790 20 2a 2a 20 20 20 62 29 20 62 65 20 6c 65 73 73   **   b) be less
127a0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
127b0 6f 20 74 68 65 20 74 65 72 6d 20 61 62 6f 75 74  o the term about
127c0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
127d0 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20  the new.    **  
127e0 20 20 20 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a      leaf node (z
127f0 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20  Term/nTerm)..   
12800 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74   **.    ** In ot
12810 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75  her words, it mu
12820 73 74 20 62 65 20 74 68 65 20 70 72 65 66 69 78  st be the prefix
12830 20 6f 66 20 7a 54 65 72 6d 20 31 20 62 79 74 65   of zTerm 1 byte
12840 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20   longer than.   
12850 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70   ** the common p
12860 72 65 66 69 78 20 28 69 66 20 61 6e 79 29 20 6f  refix (if any) o
12870 66 20 7a 54 65 72 6d 20 61 6e 64 20 70 57 72 69  f zTerm and pWri
12880 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20  ter->zTerm..    
12890 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  */.    assert( n
128a0 50 72 65 66 69 78 3c 6e 54 65 72 6d 20 29 3b 0a  Prefix<nTerm );.
128b0 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
128c0 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70 57 72  eAddTerm(p, &pWr
128d0 69 74 65 72 2d 3e 70 54 72 65 65 2c 20 69 73 43  iter->pTree, isC
128e0 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  opyTerm, zTerm, 
128f0 6e 50 72 65 66 69 78 2b 31 29 3b 0a 20 20 20 20  nPrefix+1);.    
12900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12910 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
12920 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
12930 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72     pWriter->nTer
12940 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 50 72 65  m = 0;..    nPre
12950 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 6e 53 75  fix = 0;.    nSu
12960 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  ffix = nTerm;.  
12970 20 20 6e 52 65 71 20 3d 20 31 20 2b 20 20 20 20    nReq = 1 +    
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72            /* var
129a0 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  int containing p
129b0 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  refix size */.  
129c0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56      sqlite3Fts3V
129d0 61 72 69 6e 74 4c 65 6e 28 6e 54 65 72 6d 29 20  arintLen(nTerm) 
129e0 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72  +         /* var
129f0 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  int containing s
12a00 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  uffix size */.  
12a10 20 20 20 20 6e 54 65 72 6d 20 2b 20 20 20 20 20      nTerm +     
12a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
12a40 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20  m suffix */.    
12a50 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72    sqlite3Fts3Var
12a60 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29  intLen(nDoclist)
12a70 20 2b 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20   +      /* Size 
12a80 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
12a90 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20      nDoclist;   
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
12ac0 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 7d  list data */.  }
12ad0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 75  ..  /* If the bu
12ae0 66 66 65 72 20 63 75 72 72 65 6e 74 6c 79 20 61  ffer currently a
12af0 6c 6c 6f 63 61 74 65 64 20 69 73 20 74 6f 6f 20  llocated is too 
12b00 73 6d 61 6c 6c 20 66 6f 72 20 74 68 69 73 20 65  small for this e
12b10 6e 74 72 79 2c 20 72 65 61 6c 6c 6f 63 0a 20 20  ntry, realloc.  
12b20 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20 74 6f  ** the buffer to
12b30 20 6d 61 6b 65 20 69 74 20 6c 61 72 67 65 20 65   make it large e
12b40 6e 6f 75 67 68 2e 0a 20 20 2a 2f 0a 20 20 69 66  nough..  */.  if
12b50 28 20 6e 52 65 71 3e 70 57 72 69 74 65 72 2d 3e  ( nReq>pWriter->
12b60 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 68 61  nSize ){.    cha
12b70 72 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *aNew = sqlite
12b80 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65  3_realloc(pWrite
12b90 72 2d 3e 61 44 61 74 61 2c 20 6e 52 65 71 29 3b  r->aData, nReq);
12ba0 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29  .    if( !aNew )
12bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12bc0 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65  OMEM;.    pWrite
12bd0 72 2d 3e 61 44 61 74 61 20 3d 20 61 4e 65 77 3b  r->aData = aNew;
12be0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53  .    pWriter->nS
12bf0 69 7a 65 20 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a  ize = nReq;.  }.
12c00 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 2b    assert( nData+
12c10 6e 52 65 71 3c 3d 70 57 72 69 74 65 72 2d 3e 6e  nReq<=pWriter->n
12c20 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 70  Size );..  /* Ap
12c30 70 65 6e 64 20 74 68 65 20 70 72 65 66 69 78 2d  pend the prefix-
12c40 63 6f 6d 70 72 65 73 73 65 64 20 74 65 72 6d 20  compressed term 
12c50 61 6e 64 20 64 6f 63 6c 69 73 74 20 74 6f 20 74  and doclist to t
12c60 68 65 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20  he buffer. */.  
12c70 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
12c80 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
12c90 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
12ca0 61 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a  ata], nPrefix);.
12cb0 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74    nData += sqlit
12cc0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
12cd0 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b  &pWriter->aData[
12ce0 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29  nData], nSuffix)
12cf0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69  ;.  memcpy(&pWri
12d00 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ter->aData[nData
12d10 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69  ], &zTerm[nPrefi
12d20 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  x], nSuffix);.  
12d30 6e 44 61 74 61 20 2b 3d 20 6e 53 75 66 66 69 78  nData += nSuffix
12d40 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c  ;.  nData += sql
12d50 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
12d60 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74  t(&pWriter->aDat
12d70 61 5b 6e 44 61 74 61 5d 2c 20 6e 44 6f 63 6c 69  a[nData], nDocli
12d80 73 74 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  st);.  memcpy(&p
12d90 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
12da0 61 74 61 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20  ata], aDoclist, 
12db0 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 57 72  nDoclist);.  pWr
12dc0 69 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44  iter->nData = nD
12dd0 61 74 61 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a  ata + nDoclist;.
12de0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 63  .  /* Save the c
12df0 75 72 72 65 6e 74 20 74 65 72 6d 20 73 6f 20 74  urrent term so t
12e00 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 75 73  hat it can be us
12e10 65 64 20 74 6f 20 70 72 65 66 69 78 2d 63 6f 6d  ed to prefix-com
12e20 70 72 65 73 73 20 74 68 65 20 6e 65 78 74 2e 0a  press the next..
12e30 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
12e40 70 79 54 65 72 6d 20 70 61 72 61 6d 65 74 65 72  pyTerm parameter
12e50 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
12e60 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
12e70 64 20 74 6f 20 62 79 0a 20 20 2a 2a 20 7a 54 65  d to by.  ** zTe
12e80 72 6d 20 69 73 20 74 72 61 6e 73 69 65 6e 74 2c  rm is transient,
12e90 20 73 6f 20 74 61 6b 65 20 61 20 63 6f 70 79 20   so take a copy 
12ea0 6f 66 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  of the term data
12eb0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6a 75 73  . Otherwise, jus
12ec0 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 61 20 63  t.  ** store a c
12ed0 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  opy of the point
12ee0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  er..  */.  if( i
12ef0 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20  sCopyTerm ){.   
12f00 20 69 66 28 20 6e 54 65 72 6d 3e 70 57 72 69 74   if( nTerm>pWrit
12f10 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20  er->nMalloc ){. 
12f20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20       char *zNew 
12f30 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
12f40 63 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  c(pWriter->zMall
12f50 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20  oc, nTerm*2);.  
12f60 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b      if( !zNew ){
12f70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12f80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12f90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 72 69      }.      pWri
12fa0 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e  ter->nMalloc = n
12fb0 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20 70 57  Term*2;.      pW
12fc0 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d  riter->zMalloc =
12fd0 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 70 57 72   zNew;.      pWr
12fe0 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e  iter->zTerm = zN
12ff0 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ew;.    }.    as
13000 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 7a  sert( pWriter->z
13010 54 65 72 6d 3d 3d 70 57 72 69 74 65 72 2d 3e 7a  Term==pWriter->z
13020 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 6d 65  Malloc );.    me
13030 6d 63 70 79 28 70 57 72 69 74 65 72 2d 3e 7a 54  mcpy(pWriter->zT
13040 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
13050 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
13060 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20   pWriter->zTerm 
13070 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b  = (char *)zTerm;
13080 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e  .  }.  pWriter->
13090 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a  nTerm = nTerm;..
130a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
130b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  OK;.}../*.** Flu
130c0 73 68 20 61 6c 6c 20 64 61 74 61 20 61 73 73 6f  sh all data asso
130d0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
130e0 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62  SegmentWriter ob
130f0 6a 65 63 74 20 70 57 72 69 74 65 72 20 74 6f 20  ject pWriter to 
13100 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
13110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
13120 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66  ust be called af
13130 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 68 61  ter all terms ha
13140 76 65 20 62 65 65 6e 20 61 64 64 65 64 0a 2a 2a  ve been added.**
13150 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
13160 75 73 69 6e 67 20 66 74 73 33 53 65 67 57 72 69  using fts3SegWri
13170 74 65 72 41 64 64 28 29 2e 20 49 66 20 73 75 63  terAdd(). If suc
13180 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
13190 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  OK is.** returne
131a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
131b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
131c0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
131d0 74 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46  t fts3SegWriterF
131e0 6c 75 73 68 28 0a 20 20 46 74 73 33 54 61 62 6c  lush(.  Fts3Tabl
131f0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
13200 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
13210 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
13220 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74  */.  SegmentWrit
13230 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
13240 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 57       /* SegmentW
13250 72 69 74 65 72 20 74 6f 20 66 6c 75 73 68 20 74  riter to flush t
13260 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20 20 73 71  o the db */.  sq
13270 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 76  lite3_int64 iLev
13280 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  el,           /*
13290 20 56 61 6c 75 65 20 66 6f 72 20 27 6c 65 76 65   Value for 'leve
132a0 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73  l' column of %_s
132b0 65 67 64 69 72 20 2a 2f 0a 20 20 69 6e 74 20 69  egdir */.  int i
132c0 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
132d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
132e0 6c 75 65 20 66 6f 72 20 27 69 64 78 27 20 63 6f  lue for 'idx' co
132f0 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69 72  lumn of %_segdir
13300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13320 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13330 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28  rn code */.  if(
13340 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 20   pWriter->pTree 
13350 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
13360 6e 74 36 34 20 69 4c 61 73 74 20 3d 20 30 3b 20  nt64 iLast = 0; 
13370 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
13380 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e  block id written
13390 20 74 6f 20 64 61 74 61 62 61 73 65 20 2a 2f 0a   to database */.
133a0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
133b0 34 20 69 4c 61 73 74 4c 65 61 66 3b 20 20 20 20  4 iLastLeaf;    
133c0 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 6c 65 61    /* Largest lea
133d0 66 20 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74  f block id writt
133e0 65 6e 20 74 6f 20 64 62 20 2a 2f 0a 20 20 20 20  en to db */.    
133f0 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55  char *zRoot = NU
13400 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  LL;           /*
13410 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
13420 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f  er containing ro
13430 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 69  ot node */.    i
13440 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20  nt nRoot = 0;   
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13460 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a  Size of buffer z
13470 52 6f 6f 74 20 2a 2f 0a 0a 20 20 20 20 69 4c 61  Root */..    iLa
13480 73 74 4c 65 61 66 20 3d 20 70 57 72 69 74 65 72  stLeaf = pWriter
13490 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20 72 63 20  ->iFree;.    rc 
134a0 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
134b0 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69  nt(p, pWriter->i
134c0 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d  Free++, pWriter-
134d0 3e 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d  >aData, pWriter-
134e0 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >nData);.    if(
134f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
13510 33 4e 6f 64 65 57 72 69 74 65 28 70 2c 20 70 57  3NodeWrite(p, pW
13520 72 69 74 65 72 2d 3e 70 54 72 65 65 2c 20 31 2c  riter->pTree, 1,
13530 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74  .          pWrit
13540 65 72 2d 3e 69 46 69 72 73 74 2c 20 70 57 72 69  er->iFirst, pWri
13550 74 65 72 2d 3e 69 46 72 65 65 2c 20 26 69 4c 61  ter->iFree, &iLa
13560 73 74 2c 20 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f  st, &zRoot, &nRo
13570 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ot);.    }.    i
13580 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13590 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
135a0 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 0a  ts3WriteSegdir(.
135b0 20 20 20 20 20 20 20 20 20 20 70 2c 20 69 4c 65            p, iLe
135c0 76 65 6c 2c 20 69 49 64 78 2c 20 70 57 72 69 74  vel, iIdx, pWrit
135d0 65 72 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73  er->iFirst, iLas
135e0 74 4c 65 61 66 2c 20 69 4c 61 73 74 2c 20 7a 52  tLeaf, iLast, zR
135f0 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
13600 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13610 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 74 72  /* The entire tr
13620 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72  ee fits on the r
13630 6f 6f 74 20 6e 6f 64 65 2e 20 57 72 69 74 65 20  oot node. Write 
13640 69 74 20 74 6f 20 74 68 65 20 73 65 67 64 69 72  it to the segdir
13650 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72   table. */.    r
13660 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
13670 64 69 72 28 0a 20 20 20 20 20 20 20 20 70 2c 20  dir(.        p, 
13680 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 30 2c  iLevel, iIdx, 0,
13690 20 30 2c 20 30 2c 20 70 57 72 69 74 65 72 2d 3e   0, 0, pWriter->
136a0 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e  aData, pWriter->
136b0 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 2d  nData);.  }.  p-
136c0 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 20 20 72  >nLeafAdd++;.  r
136d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
136e0 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d  ** Release all m
136f0 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
13700 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  e SegmentWriter 
13710 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
13720 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 61   the .** first a
13730 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13740 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 57  ic void fts3SegW
13750 72 69 74 65 72 46 72 65 65 28 53 65 67 6d 65 6e  riterFree(Segmen
13760 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
13770 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
13780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13790 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
137a0 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
137b0 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
137c0 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74  zMalloc);.    ft
137d0 73 33 4e 6f 64 65 46 72 65 65 28 70 57 72 69 74  s3NodeFree(pWrit
137e0 65 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20 20 20  er->pTree);.    
137f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
13800 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  iter);.  }.}../*
13810 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61  .** The first va
13820 6c 75 65 20 69 6e 20 74 68 65 20 61 70 56 61 6c  lue in the apVal
13830 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75  [] array is assu
13840 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
13850 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68  n integer..** Th
13860 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  is function test
13870 73 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  s if there exist
13880 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73 20 77   any documents w
13890 69 74 68 20 64 6f 63 69 64 20 76 61 6c 75 65 73  ith docid values
138a0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 64 69 66   that.** are dif
138b0 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 61 74  ferent from that
138c0 20 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e 20 69   integer. i.e. i
138d0 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 64  f deleting the d
138e0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63  ocument with doc
138f0 69 64 0a 2a 2a 20 70 52 6f 77 69 64 20 77 6f 75  id.** pRowid wou
13900 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53 33  ld mean the FTS3
13910 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70 74   table were empt
13920 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  y..**.** If succ
13930 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74  essful, *pisEmpt
13940 79 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  y is set to true
13950 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
13960 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
13970 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 70 52  r.** document pR
13980 6f 77 69 64 2c 20 6f 72 20 66 61 6c 73 65 20 6f  owid, or false o
13990 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53 51  therwise, and SQ
139a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
139b0 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ned. If an.** er
139c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
139d0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
139e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
139f0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
13a00 49 73 45 6d 70 74 79 28 46 74 73 33 54 61 62 6c  IsEmpty(Fts3Tabl
13a10 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61  e *p, sqlite3_va
13a20 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 69 6e 74  lue *pRowid, int
13a30 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20 20 73   *pisEmpty){.  s
13a40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13a50 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
13a60 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  if( p->zContentT
13a70 62 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  bl ){.    /* If 
13a80 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  using the conten
13a90 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73  t=xxx option, as
13aa0 73 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 69  sume the table i
13ab0 73 20 6e 65 76 65 72 20 65 6d 70 74 79 20 2a 2f  s never empty */
13ac0 0a 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d  .    *pisEmpty =
13ad0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
13ae0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
13af0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
13b00 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f  lStmt(p, SQL_IS_
13b10 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c 20 26  EMPTY, &pStmt, &
13b20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  pRowid);.    if(
13b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13b40 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
13b50 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
13b60 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
13b70 20 20 20 20 20 20 20 2a 70 69 73 45 6d 70 74 79         *pisEmpty
13b80 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
13b90 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
13ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
13bb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
13bc0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
13bd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
13bf0 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c 61 72 67  nMax to the larg
13c00 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65  est segment leve
13c10 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  l in the databas
13c20 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
13c30 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ** iIndex..**.**
13c40 20 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c 73 20   Segment levels 
13c50 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
13c60 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e  e 'level' column
13c70 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72   of the %_segdir
13c80 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
13c90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
13ca0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
13cb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
13cc0 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f   code if not..*/
13cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
13ce0 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28  SegmentMaxLevel(
13cf0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
13d00 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c   .  int iLangid,
13d10 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a  .  int iIndex, .
13d20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
13d30 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20 73 71 6c 69  *pnMax.){.  sqli
13d40 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13d50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
13d60 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
13d70 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
13d80 65 78 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ex );..  /* Set 
13d90 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d  pStmt to the com
13da0 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  piled version of
13db0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45  :.  **.  **   SE
13dc0 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20  LECT max(level) 
13dd0 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
13de0 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20  ir' WHERE level 
13df0 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a  BETWEEN ? AND ?.
13e00 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20    **.  ** (1024 
13e10 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20  is actually the 
13e20 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46  value of macro F
13e30 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49  TS3_SEGDIR_PREFI
13e40 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a  XLEVEL_STR)..  *
13e50 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
13e60 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
13e70 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45  CT_SEGDIR_MAX_LE
13e80 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
13e90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13ea0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
13eb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
13ec0 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
13ed0 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
13ee0 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
13ef0 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 73 71 6c  ndex, 0));.  sql
13f00 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
13f10 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20  pStmt, 2, .     
13f20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
13f30 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
13f40 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49  ndex, FTS3_SEGDI
13f50 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20  R_MAXLEVEL-1).  
13f60 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
13f70 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
13f80 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
13f90 2a 70 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  *pnMax = sqlite3
13fa0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
13fb0 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  tmt, 0);.  }.  r
13fc0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65  eturn sqlite3_re
13fd0 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  set(pStmt);.}../
13fe0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
13ff0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25  entries in the %
14000 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
14010 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14020 74 68 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 6f  the segment.** o
14030 70 65 6e 65 64 20 77 69 74 68 20 73 65 67 2d 72  pened with seg-r
14040 65 61 64 65 72 20 70 53 65 67 2e 20 54 68 69 73  eader pSeg. This
14050 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
14060 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 63 6f  ot affect the co
14070 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
14080 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
14090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
140a0 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74  ts3DeleteSegment
140b0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
140c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
140d0 20 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65      /* FTS table
140e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
140f0 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14110 53 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74  Segment to delet
14120 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
14130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
14150 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66  urn code */.  if
14160 28 20 70 53 65 67 2d 3e 69 53 74 61 72 74 42 6c  ( pSeg->iStartBl
14170 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
14180 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65  e3_stmt *pDelete
14190 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20  ;        /* SQL 
141a0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c  statement to del
141b0 65 74 65 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  ete rows */.    
141c0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
141d0 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
141e0 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26  EGMENTS_RANGE, &
141f0 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20  pDelete, 0);.   
14200 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14210 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
14220 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
14230 44 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 2d  Delete, 1, pSeg-
14240 3e 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20  >iStartBlock);. 
14250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
14260 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c  d_int64(pDelete,
14270 20 32 2c 20 70 53 65 67 2d 3e 69 45 6e 64 42 6c   2, pSeg->iEndBl
14280 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ock);.      sqli
14290 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65  te3_step(pDelete
142a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
142b0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c  lite3_reset(pDel
142c0 65 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ete);.    }.  }.
142d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
142e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
142f0 69 6f 6e 20 69 73 20 75 73 65 64 20 61 66 74 65  ion is used afte
14300 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69 70  r merging multip
14310 6c 65 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f  le segments into
14320 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a   a single large.
14330 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 64 65  ** segment to de
14340 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c 20 6e 6f  lete the old, no
14350 77 20 72 65 64 75 6e 64 61 6e 74 2c 20 73 65 67  w redundant, seg
14360 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 53 70  ment b-trees. Sp
14370 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20 69  ecifically,.** i
14380 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29 20 44  t:.** .**   1) D
14390 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67  eletes all %_seg
143a0 6d 65 6e 74 73 20 65 6e 74 72 69 65 73 20 66 6f  ments entries fo
143b0 72 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61  r the segments a
143c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
143d0 2a 2a 20 20 20 20 20 20 65 61 63 68 20 6f 66 20  **      each of 
143e0 74 68 65 20 53 65 67 52 65 61 64 65 72 20 6f 62  the SegReader ob
143f0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 61 72 72  jects in the arr
14400 61 79 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ay passed as the
14410 20 74 68 69 72 64 20 0a 2a 2a 20 20 20 20 20 20   third .**      
14420 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a 2a  argument, and.**
14430 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65 74 65 73  .**   2) deletes
14440 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65 6e   all %_segdir en
14450 74 72 69 65 73 20 77 69 74 68 20 6c 65 76 65 6c  tries with level
14460 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c 6c 20   iLevel, or all 
14470 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20 20 20  %_segdir.**     
14480 20 65 6e 74 72 69 65 73 20 72 65 67 61 72 64 6c   entries regardl
14490 65 73 73 20 6f 66 20 6c 65 76 65 6c 20 69 66 20  ess of level if 
144a0 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a  (iLevel<0)..**.*
144b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
144c0 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
144d0 73 73 66 75 6c 2c 20 6f 74 68 65 72 77 69 73 65  ssful, otherwise
144e0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
144f0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
14500 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 53   int fts3DeleteS
14510 65 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62  egdir(.  Fts3Tab
14520 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
14530 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
14540 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
14550 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69   */.  int iLangi
14560 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
14570 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
14580 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  e id */.  int iI
14590 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
145a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
145b0 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78  ex for p->aIndex
145c0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
145d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
145e0 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
145f0 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69  f %_segdir entri
14600 65 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  es to delete */.
14610 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
14620 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20  **apSegment,    
14630 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53 65    /* Array of Se
14640 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20  gReader objects 
14650 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72  */.  int nReader
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14680 61 72 72 61 79 20 61 70 53 65 67 6d 65 6e 74 20  array apSegment 
14690 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
146a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
146b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
146c0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
146d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
146e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
146f0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
14700 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
14710 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  mt *pDelete = 0;
14720 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
14730 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65  tement to delete
14740 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 66 6f 72 28   rows */..  for(
14750 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
14760 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64 65 72 3b  OK && i<nReader;
14770 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
14780 66 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e  fts3DeleteSegmen
14790 74 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69  t(p, apSegment[i
147a0 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ]);.  }.  if( rc
147b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
147c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
147d0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  }..  assert( iLe
147e0 76 65 6c 3e 3d 30 20 7c 7c 20 69 4c 65 76 65 6c  vel>=0 || iLevel
147f0 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
14800 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 69 4c  _ALL );.  if( iL
14810 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
14820 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  RSOR_ALL ){.    
14830 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
14840 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
14850 45 47 44 49 52 5f 52 41 4e 47 45 2c 20 26 70 44  EGDIR_RANGE, &pD
14860 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69  elete, 0);.    i
14870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14880 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14890 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65  3_bind_int64(pDe
148a0 6c 65 74 65 2c 20 31 2c 20 67 65 74 41 62 73 6f  lete, 1, getAbso
148b0 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
148c0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29  ngid, iIndex, 0)
148d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
148e0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
148f0 65 74 65 2c 20 32 2c 20 0a 20 20 20 20 20 20 20  ete, 2, .       
14900 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65     getAbsoluteLe
14910 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
14920 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47  iIndex, FTS3_SEG
14930 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a  DIR_MAXLEVEL-1).
14940 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
14950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
14960 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
14970 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49  SQL_DELETE_SEGDI
14980 52 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c 65 74  R_LEVEL, &pDelet
14990 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
149a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
149b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
149c0 6e 64 5f 69 6e 74 36 34 28 0a 20 20 20 20 20 20  nd_int64(.      
149d0 20 20 20 20 70 44 65 6c 65 74 65 2c 20 31 2c 20      pDelete, 1, 
149e0 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
149f0 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
14a00 64 65 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20 20  dex, iLevel).   
14a10 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
14a20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
14a40 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65  te3_step(pDelete
14a50 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
14a60 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74  te3_reset(pDelet
14a70 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
14a80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
14a90 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
14aa0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 66  n is called, buf
14ab0 66 65 72 20 2a 70 70 4c 69 73 74 20 28 73 69 7a  fer *ppList (siz
14ac0 65 20 2a 70 6e 4c 69 73 74 20 62 79 74 65 73 29  e *pnList bytes)
14ad0 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20   contains .** a 
14ae0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68  position list th
14af0 61 74 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e  at may (or may n
14b00 6f 74 29 20 66 65 61 74 75 72 65 20 6d 75 6c 74  ot) feature mult
14b10 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  iple columns. Th
14b20 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
14b30 64 6a 75 73 74 73 20 74 68 65 20 70 6f 69 6e 74  djusts the point
14b40 65 72 20 2a 70 70 4c 69 73 74 20 61 6e 64 20 74  er *ppList and t
14b50 68 65 20 6c 65 6e 67 74 68 20 2a 70 6e 4c 69 73  he length *pnLis
14b60 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  t so that they.*
14b70 2a 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 73  * identify the s
14b80 75 62 73 65 74 20 6f 66 20 74 68 65 20 70 6f 73  ubset of the pos
14b90 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20  ition list that 
14ba0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 63  corresponds to c
14bb0 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a  olumn iCol..**.*
14bc0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
14bd0 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  o entries in the
14be0 20 69 6e 70 75 74 20 70 6f 73 69 74 69 6f 6e 20   input position 
14bf0 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
14c00 69 43 6f 6c 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  iCol, then.** *p
14c10 6e 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20  nList is set to 
14c20 7a 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75  zero before retu
14c30 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
14c40 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75 6d 6e   void fts3Column
14c50 46 69 6c 74 65 72 28 0a 20 20 69 6e 74 20 69 43  Filter(.  int iC
14c60 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
14c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
14c80 75 6d 6e 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e  umn to filter on
14c90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4c   */.  char **ppL
14ca0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
14cb0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
14cc0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69   Pointer to posi
14cd0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69  tion list */.  i
14ce0 6e 74 20 2a 70 6e 4c 69 73 74 20 20 20 20 20 20  nt *pnList      
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d00 2a 20 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20 6f  * IN/OUT: Size o
14d10 66 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74  f buffer *ppList
14d20 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
14d30 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d 20    char *pList = 
14d40 2a 70 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  *ppList;.  int n
14d50 4c 69 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b 0a  List = *pnList;.
14d60 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26    char *pEnd = &
14d70 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20 20  pList[nList];.  
14d80 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
14d90 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70 4c  ;.  char *p = pL
14da0 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ist;..  assert( 
14db0 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68 69  iCol>=0 );.  whi
14dc0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 63 68 61  le( 1 ){.    cha
14dd0 72 20 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  r c = 0;.    whi
14de0 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28 63  le( p<pEnd && (c
14df0 20 7c 20 2a 70 29 26 30 78 46 45 20 29 20 63 20   | *p)&0xFE ) c 
14e00 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20  = *p++ & 0x80;. 
14e10 20 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d   .    if( iCol==
14e20 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  iCurrent ){.    
14e30 20 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28    nList = (int)(
14e40 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  p - pList);.    
14e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
14e60 20 20 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69 6e      nList -= (in
14e70 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20  t)(p - pList);. 
14e80 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20     pList = p;.  
14e90 20 20 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20 29    if( nList==0 )
14ea0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
14eb0 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 4c     }.    p = &pL
14ec0 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b 3d  ist[1];.    p +=
14ed0 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
14ee0 61 72 69 6e 74 33 32 28 70 2c 20 26 69 43 75 72  arint32(p, &iCur
14ef0 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  rent);.  }..  *p
14f00 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
14f10 20 2a 70 6e 4c 69 73 74 20 3d 20 6e 4c 69 73 74   *pnList = nList
14f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 63 68 65  ;.}../*.** Cache
14f30 20 64 61 74 61 20 69 6e 20 74 68 65 20 46 74 73   data in the Fts
14f40 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 2e  3MultiSegReader.
14f50 61 42 75 66 66 65 72 5b 5d 20 62 75 66 66 65 72  aBuffer[] buffer
14f60 20 28 6f 76 65 72 77 72 69 74 69 6e 67 20 61 6e   (overwriting an
14f70 79 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 64 61  y.** existing da
14f80 74 61 29 2e 20 47 72 6f 77 20 74 68 65 20 62 75  ta). Grow the bu
14f90 66 66 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ffer if required
14fa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
14fb0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
14fc0 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
14fd0 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  se, if an OOM er
14fe0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
14ff0 65 64 0a 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  ed.** trying to 
15000 72 65 73 69 7a 65 20 74 68 65 20 62 75 66 66 65  resize the buffe
15010 72 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r, return SQLITE
15020 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
15030 63 20 69 6e 74 20 66 74 73 33 4d 73 72 42 75 66  c int fts3MsrBuf
15040 66 65 72 44 61 74 61 28 0a 20 20 46 74 73 33 4d  ferData(.  Fts3M
15050 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
15060 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75  Msr,       /* Mu
15070 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64  lti-segment-read
15080 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  er handle */.  c
15090 68 61 72 20 2a 70 4c 69 73 74 2c 0a 20 20 69 6e  har *pList,.  in
150a0 74 20 6e 4c 69 73 74 0a 29 7b 0a 20 20 69 66 28  t nList.){.  if(
150b0 20 6e 4c 69 73 74 3e 70 4d 73 72 2d 3e 6e 42 75   nList>pMsr->nBu
150c0 66 66 65 72 20 29 7b 0a 20 20 20 20 63 68 61 72  ffer ){.    char
150d0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4d 73 72   *pNew;.    pMsr
150e0 2d 3e 6e 42 75 66 66 65 72 20 3d 20 6e 4c 69 73  ->nBuffer = nLis
150f0 74 2a 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  t*2;.    pNew = 
15100 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
15110 72 65 61 6c 6c 6f 63 28 70 4d 73 72 2d 3e 61 42  realloc(pMsr->aB
15120 75 66 66 65 72 2c 20 70 4d 73 72 2d 3e 6e 42 75  uffer, pMsr->nBu
15130 66 66 65 72 29 3b 0a 20 20 20 20 69 66 28 20 21  ffer);.    if( !
15140 70 4e 65 77 20 29 20 72 65 74 75 72 6e 20 53 51  pNew ) return SQ
15150 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
15160 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 20 3d 20  pMsr->aBuffer = 
15170 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d  pNew;.  }..  mem
15180 63 70 79 28 70 4d 73 72 2d 3e 61 42 75 66 66 65  cpy(pMsr->aBuffe
15190 72 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29  r, pList, nList)
151a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
151b0 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  E_OK;.}..int sql
151c0 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 4e  ite3Fts3MsrIncrN
151d0 65 78 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ext(.  Fts3Table
151e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
151f0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
15200 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
15210 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
15220 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 20 20 20  Reader *pMsr,   
15230 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67      /* Multi-seg
15240 6d 65 6e 74 2d 72 65 61 64 65 72 20 68 61 6e 64  ment-reader hand
15250 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
15260 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 2c 20  int64 *piDocid, 
15270 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
15280 44 6f 63 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20  Docid value */. 
15290 20 63 68 61 72 20 2a 2a 70 61 50 6f 73 6c 69 73   char **paPoslis
152a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
152b0 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72   /* OUT: Pointer
152c0 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73   to position lis
152d0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 6f  t */.  int *pnPo
152e0 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  slist           
152f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
15300 69 7a 65 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20  ize of position 
15310 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
15320 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65  .){.  int nMerge
15330 20 3d 20 70 4d 73 72 2d 3e 6e 41 64 76 61 6e 63   = pMsr->nAdvanc
15340 65 3b 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  e;.  Fts3SegRead
15350 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 20 3d  er **apSegment =
15360 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pMsr->apSegment
15370 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  ;.  int (*xCmp)(
15380 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c  Fts3SegReader *,
15390 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
153a0 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65  ) = (.    p->bDe
153b0 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52  scIdx ? fts3SegR
153c0 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52  eaderDoclistCmpR
153d0 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64  ev : fts3SegRead
153e0 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29  erDoclistCmp.  )
153f0 3b 0a 0a 20 20 69 66 28 20 6e 4d 65 72 67 65 3d  ;..  if( nMerge=
15400 3d 30 20 29 7b 0a 20 20 20 20 2a 70 61 50 6f 73  =0 ){.    *paPos
15410 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  list = 0;.    re
15420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15430 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20    }..  while( 1 
15440 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52 65  ){.    Fts3SegRe
15450 61 64 65 72 20 2a 70 53 65 67 3b 0a 20 20 20 20  ader *pSeg;.    
15460 70 53 65 67 20 3d 20 70 4d 73 72 2d 3e 61 70 53  pSeg = pMsr->apS
15470 65 67 6d 65 6e 74 5b 30 5d 3b 0a 0a 20 20 20 20  egment[0];..    
15480 69 66 28 20 70 53 65 67 2d 3e 70 4f 66 66 73 65  if( pSeg->pOffse
15490 74 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tList==0 ){.    
154a0 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 30    *paPoslist = 0
154b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
154c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
154d0 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68  int rc;.      ch
154e0 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20  ar *pList;.     
154f0 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20   int nList;.    
15500 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
15510 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
15520 63 69 64 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  cid = apSegment[
15530 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 0a 20 20 20  0]->iDocid;..   
15540 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
15550 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70  eaderNextDocid(p
15560 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2c 20  , apSegment[0], 
15570 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
15580 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20  .      j = 1;.  
15590 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
155a0 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20  QLITE_OK .      
155b0 20 20 26 26 20 6a 3c 6e 4d 65 72 67 65 0a 20 20    && j<nMerge.  
155c0 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
155d0 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[j]->pOffsetLi
155e0 73 74 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  st.        && ap
155f0 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63  Segment[j]->iDoc
15600 69 64 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20 20  id==iDocid.     
15610 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
15620 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
15630 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67  xtDocid(p, apSeg
15640 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a  ment[j], 0, 0);.
15650 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
15660 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
15670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15690 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
156a0 74 28 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e  t(pMsr->apSegmen
156b0 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78 43  t, nMerge, j, xC
156c0 6d 70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  mp);..      if( 
156d0 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72  pMsr->iColFilter
156e0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  >=0 ){.        f
156f0 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28  ts3ColumnFilter(
15700 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72  pMsr->iColFilter
15710 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
15720 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
15730 20 20 69 66 28 20 6e 4c 69 73 74 3e 30 20 29 7b    if( nList>0 ){
15740 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
15750 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64  3SegReaderIsPend
15760 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d  ing(apSegment[0]
15770 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
15780 63 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66 65  c = fts3MsrBuffe
15790 72 44 61 74 61 28 70 4d 73 72 2c 20 70 4c 69 73  rData(pMsr, pLis
157a0 74 2c 20 6e 4c 69 73 74 2b 31 29 3b 0a 20 20 20  t, nList+1);.   
157b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
157c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
157d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
157e0 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 70 4d 73  *paPoslist = pMs
157f0 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20  r->aBuffer;.    
15800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
15810 4d 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 4c 69  Msr->aBuffer[nLi
15820 73 74 5d 20 26 20 30 78 46 45 29 3d 3d 30 78 30  st] & 0xFE)==0x0
15830 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  0 );.        }el
15840 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
15850 61 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74  aPoslist = pList
15860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15870 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 69      *piDocid = i
15880 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 2a  Docid;.        *
15890 70 6e 50 6f 73 6c 69 73 74 20 3d 20 6e 4c 69 73  pnPoslist = nLis
158a0 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t;.        break
158b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
158c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
158d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
158e0 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
158f0 61 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73  aderStart(.  Fts
15900 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15920 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
15930 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ndle */.  Fts3Mu
15940 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
15950 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr,       /* Cur
15960 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
15970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
15980 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
15990 2f 2a 20 54 65 72 6d 20 73 65 61 72 63 68 65 64  /* Term searched
159a0 20 66 6f 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a   for (or NULL) *
159b0 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  /.  int nTerm   
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
159e0 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
159f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
15a00 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 43 73 72   int nSeg = pCsr
15a10 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 0a 20 20 2f  ->nSegment;..  /
15a20 2a 20 49 66 20 74 68 65 20 46 74 73 33 53 65 67  * If the Fts3Seg
15a30 46 69 6c 74 65 72 20 64 65 66 69 6e 65 73 20 61  Filter defines a
15a40 20 73 70 65 63 69 66 69 63 20 74 65 72 6d 20 28   specific term (
15a50 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78 29 20  or term prefix) 
15a60 74 6f 20 73 65 61 72 63 68 20 0a 20 20 2a 2a 20  to search .  ** 
15a70 66 6f 72 2c 20 74 68 65 6e 20 61 64 76 61 6e 63  for, then advanc
15a80 65 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69  e each segment i
15a90 74 65 72 61 74 6f 72 20 75 6e 74 69 6c 20 69 74  terator until it
15aa0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 65 72   points to a ter
15ab0 6d 20 6f 66 0a 20 20 2a 2a 20 65 71 75 61 6c 20  m of.  ** equal 
15ac0 6f 72 20 67 72 65 61 74 65 72 20 76 61 6c 75 65  or greater value
15ad0 20 74 68 61 6e 20 74 68 65 20 73 70 65 63 69 66   than the specif
15ae0 69 65 64 20 74 65 72 6d 2e 20 54 68 69 73 20 70  ied term. This p
15af0 72 65 76 65 6e 74 73 20 6d 61 6e 79 0a 20 20 2a  revents many.  *
15b00 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20 6d 65  * unnecessary me
15b10 72 67 65 2f 73 6f 72 74 20 6f 70 65 72 61 74 69  rge/sort operati
15b20 6f 6e 73 20 66 6f 72 20 74 68 65 20 63 61 73 65  ons for the case
15b30 20 77 68 65 72 65 20 73 69 6e 67 6c 65 20 73 65   where single se
15b40 67 6d 65 6e 74 0a 20 20 2a 2a 20 62 2d 74 72 65  gment.  ** b-tre
15b50 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 63 6f 6e  e leaf nodes con
15b60 74 61 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  tain more than o
15b70 6e 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  ne term..  */.  
15b80 66 6f 72 28 69 3d 30 3b 20 70 43 73 72 2d 3e 62  for(i=0; pCsr->b
15b90 52 65 73 74 61 72 74 3d 3d 30 20 26 26 20 69 3c  Restart==0 && i<
15ba0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pCsr->nSegment; 
15bb0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  i++){.    int re
15bc0 73 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 33 53  s = 0;.    Fts3S
15bd0 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
15be0 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
15bf0 5b 69 5d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  [i];.    do {.  
15c00 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73      int rc = fts
15c10 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 28 70  3SegReaderNext(p
15c20 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20  , pSeg, 0);.    
15c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15c40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15c50 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 54 65  .    }while( zTe
15c60 72 6d 20 26 26 20 28 72 65 73 20 3d 20 66 74 73  rm && (res = fts
15c70 33 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d  3SegReaderTermCm
15c80 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e  p(pSeg, zTerm, n
15c90 54 65 72 6d 29 29 3c 30 20 29 3b 0a 0a 20 20 20  Term))<0 );..   
15ca0 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f 6f 6b   if( pSeg->bLook
15cb0 75 70 20 26 26 20 72 65 73 21 3d 30 20 29 7b 0a  up && res!=0 ){.
15cc0 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
15cd0 64 65 72 53 65 74 45 6f 66 28 70 53 65 67 29 3b  derSetEof(pSeg);
15ce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
15cf0 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70  3SegReaderSort(p
15d00 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20  Csr->apSegment, 
15d10 6e 53 65 67 2c 20 6e 53 65 67 2c 20 66 74 73 33  nSeg, nSeg, fts3
15d20 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b 0a 0a  SegReaderCmp);..
15d30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15d40 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  OK;.}..int sqlit
15d50 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
15d60 74 61 72 74 28 0a 20 20 46 74 73 33 54 61 62 6c  tart(.  Fts3Tabl
15d70 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
15d80 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
15d90 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
15da0 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
15db0 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20 20  gReader *pCsr,  
15dc0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
15dd0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 33 53  bject */.  Fts3S
15de0 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65  egFilter *pFilte
15df0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r          /* Re
15e00 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 72 61  strictions on ra
15e10 6e 67 65 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  nge of iteration
15e20 20 2a 2f 0a 29 7b 0a 20 20 70 43 73 72 2d 3e 70   */.){.  pCsr->p
15e30 46 69 6c 74 65 72 20 3d 20 70 46 69 6c 74 65 72  Filter = pFilter
15e40 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53  ;.  return fts3S
15e50 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c  egReaderStart(p,
15e60 20 70 43 73 72 2c 20 70 46 69 6c 74 65 72 2d 3e   pCsr, pFilter->
15e70 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e  zTerm, pFilter->
15e80 6e 54 65 72 6d 29 3b 0a 7d 0a 0a 69 6e 74 20 73  nTerm);.}..int s
15e90 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
15ea0 72 53 74 61 72 74 28 0a 20 20 46 74 73 33 54 61  rStart(.  Fts3Ta
15eb0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
15ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
15ed0 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
15ee0 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  e */.  Fts3Multi
15ef0 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c  SegReader *pCsr,
15f00 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
15f10 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
15f20 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f40 43 6f 6c 75 6d 6e 20 74 6f 20 6d 61 74 63 68 20  Column to match 
15f50 6f 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  on. */.  const c
15f60 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
15f70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
15f80 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
15f90 75 67 68 20 61 20 64 6f 63 6c 69 73 74 20 66 6f  ugh a doclist fo
15fa0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  r */.  int nTerm
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15fd0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 54 65   of bytes in zTe
15fe0 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  rm */.){.  int i
15ff0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
16000 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73  t nSegment = pCs
16010 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 69  r->nSegment;.  i
16020 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53  nt (*xCmp)(Fts3S
16030 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33  egReader *, Fts3
16040 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d 20 28  SegReader *) = (
16050 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49 64 78  .    p->bDescIdx
16060 20 3f 20 66 74 73 33 53 65 67 52 65 61 64 65 72   ? fts3SegReader
16070 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20 3a 20  DoclistCmpRev : 
16080 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
16090 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20  listCmp.  );..  
160a0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 46  assert( pCsr->pF
160b0 69 6c 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  ilter==0 );.  as
160c0 73 65 72 74 28 20 7a 54 65 72 6d 20 26 26 20 6e  sert( zTerm && n
160d0 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
160e0 41 64 76 61 6e 63 65 20 65 61 63 68 20 73 65 67  Advance each seg
160f0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e  ment iterator un
16100 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
16110 20 74 68 65 20 74 65 72 6d 20 7a 54 65 72 6d 2f   the term zTerm/
16120 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 72 63 20 3d  nTerm. */.  rc =
16130 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74   fts3SegReaderSt
16140 61 72 74 28 70 2c 20 70 43 73 72 2c 20 7a 54 65  art(p, pCsr, zTe
16150 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 69 66  rm, nTerm);.  if
16160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16170 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
16180 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 68 6f 77  /* Determine how
16190 20 6d 61 6e 79 20 6f 66 20 74 68 65 20 73 65 67   many of the seg
161a0 6d 65 6e 74 73 20 61 63 74 75 61 6c 6c 79 20 70  ments actually p
161b0 6f 69 6e 74 20 74 6f 20 7a 54 65 72 6d 2f 6e 54  oint to zTerm/nT
161c0 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  erm. */.  for(i=
161d0 30 3b 20 69 3c 6e 53 65 67 6d 65 6e 74 3b 20 69  0; i<nSegment; i
161e0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67  ++){.    Fts3Seg
161f0 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 70  Reader *pSeg = p
16200 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69  Csr->apSegment[i
16210 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 53 65 67  ];.    if( !pSeg
16220 2d 3e 61 4e 6f 64 65 20 7c 7c 20 66 74 73 33 53  ->aNode || fts3S
16230 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70 28  egReaderTermCmp(
16240 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  pSeg, zTerm, nTe
16250 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 62 72 65  rm) ){.      bre
16260 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
16270 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d  pCsr->nAdvance =
16280 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   i;..  /* Advanc
16290 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 65  e each of the se
162a0 67 6d 65 6e 74 73 20 74 6f 20 70 6f 69 6e 74 20  gments to point 
162b0 74 6f 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  to the first doc
162c0 69 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  id. */.  for(i=0
162d0 3b 20 69 3c 70 43 73 72 2d 3e 6e 41 64 76 61 6e  ; i<pCsr->nAdvan
162e0 63 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  ce; i++){.    rc
162f0 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
16300 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20 70 43  FirstDocid(p, pC
16310 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d  sr->apSegment[i]
16320 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16330 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16340 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 74 73 33  n rc;.  }.  fts3
16350 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70 43  SegReaderSort(pC
16360 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 69  sr->apSegment, i
16370 2c 20 69 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 61  , i, xCmp);..  a
16380 73 73 65 72 74 28 20 69 43 6f 6c 3c 30 20 7c 7c  ssert( iCol<0 ||
16390 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e   iCol<p->nColumn
163a0 20 29 3b 0a 20 20 70 43 73 72 2d 3e 69 43 6f 6c   );.  pCsr->iCol
163b0 46 69 6c 74 65 72 20 3d 20 69 43 6f 6c 3b 0a 0a  Filter = iCol;..
163c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
163d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
163e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
163f0 6c 6c 65 64 20 6f 6e 20 61 20 4d 75 6c 74 69 53  lled on a MultiS
16400 65 67 52 65 61 64 65 72 20 74 68 61 74 20 68 61  egReader that ha
16410 73 20 62 65 65 6e 20 73 74 61 72 74 65 64 20 75  s been started u
16420 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 46  sing.** sqlite3F
16430 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28  ts3MsrIncrStart(
16440 29 2e 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  ). One or more c
16450 61 6c 6c 73 20 74 6f 20 4d 73 72 49 6e 63 72 4e  alls to MsrIncrN
16460 65 78 74 28 29 20 6d 61 79 20 61 6c 73 6f 0a 2a  ext() may also.*
16470 2a 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65  * have been made
16480 2e 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  . Calling this f
16490 75 6e 63 74 69 6f 6e 20 70 75 74 73 20 74 68 65  unction puts the
164a0 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20   MultiSegReader 
164b0 69 6e 20 73 75 63 68 0a 2a 2a 20 61 20 73 74 61  in such.** a sta
164c0 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20 6e  te that if the n
164d0 65 78 74 20 74 77 6f 20 63 61 6c 6c 73 20 61 72  ext two calls ar
164e0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  e:.**.**   sqlit
164f0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
16500 74 61 72 74 28 29 0a 2a 2a 20 20 20 73 71 6c 69  tart().**   sqli
16510 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
16520 53 74 65 70 28 29 0a 2a 2a 0a 2a 2a 20 74 68 65  Step().**.** the
16530 6e 20 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63  n the entire doc
16540 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 65 72  list for the ter
16550 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  m is available i
16560 6e 20 0a 2a 2a 20 4d 75 6c 74 69 53 65 67 52 65  n .** MultiSegRe
16570 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2f 6e 44  ader.aDoclist/nD
16580 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  oclist..*/.int s
16590 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
165a0 72 52 65 73 74 61 72 74 28 46 74 73 33 4d 75 6c  rRestart(Fts3Mul
165b0 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
165c0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  r){.  int i;    
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
165f0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
16600 20 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 73   segment-readers
16610 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
16620 43 73 72 2d 3e 7a 54 65 72 6d 3d 3d 30 20 29 3b  Csr->zTerm==0 );
16630 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
16640 3e 6e 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61  >nTerm==0 );.  a
16650 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 44 6f  ssert( pCsr->aDo
16660 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 61 73  clist==0 );.  as
16670 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44 6f 63  sert( pCsr->nDoc
16680 6c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  list==0 );..  pC
16690 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30  sr->nAdvance = 0
166a0 3b 0a 20 20 70 43 73 72 2d 3e 62 52 65 73 74 61  ;.  pCsr->bResta
166b0 72 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  rt = 1;.  for(i=
166c0 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d  0; i<pCsr->nSegm
166d0 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ent; i++){.    p
166e0 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69  Csr->apSegment[i
166f0 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  ]->pOffsetList =
16700 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70   0;.    pCsr->ap
16710 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 6e 4f 66 66  Segment[i]->nOff
16720 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  setList = 0;.   
16730 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
16740 5b 69 5d 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b  [i]->iDocid = 0;
16750 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
16760 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69 6e  QLITE_OK;.}...in
16770 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
16780 52 65 61 64 65 72 53 74 65 70 28 0a 20 20 46 74  ReaderStep(.  Ft
16790 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
167b0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
167c0 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d  andle */.  Fts3M
167d0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
167e0 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr        /* Cu
167f0 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  rsor object */.)
16800 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16810 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74 20 69  ITE_OK;..  int i
16820 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 20  sIgnoreEmpty =  
16830 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
16840 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
16850 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54  MENT_IGNORE_EMPT
16860 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 71 75  Y);.  int isRequ
16870 69 72 65 50 6f 73 20 3d 20 20 20 28 70 43 73 72  irePos =   (pCsr
16880 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
16890 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
168a0 52 45 51 55 49 52 45 5f 50 4f 53 29 3b 0a 20 20  REQUIRE_POS);.  
168b0 69 6e 74 20 69 73 43 6f 6c 46 69 6c 74 65 72 20  int isColFilter 
168c0 3d 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c  =    (pCsr->pFil
168d0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
168e0 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e  3_SEGMENT_COLUMN
168f0 5f 46 49 4c 54 45 52 29 3b 0a 20 20 69 6e 74 20  _FILTER);.  int 
16900 69 73 50 72 65 66 69 78 20 3d 20 20 20 20 20 20  isPrefix =      
16910 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d   (pCsr->pFilter-
16920 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45  >flags & FTS3_SE
16930 47 4d 45 4e 54 5f 50 52 45 46 49 58 29 3b 0a 20  GMENT_PREFIX);. 
16940 20 69 6e 74 20 69 73 53 63 61 6e 20 3d 20 20 20   int isScan =   
16950 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69        (pCsr->pFi
16960 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  lter->flags & FT
16970 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41 4e 29  S3_SEGMENT_SCAN)
16980 3b 0a 20 20 69 6e 74 20 69 73 46 69 72 73 74 20  ;.  int isFirst 
16990 3d 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e  =        (pCsr->
169a0 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
169b0 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 46 49   FTS3_SEGMENT_FI
169c0 52 53 54 29 3b 0a 0a 20 20 46 74 73 33 53 65 67  RST);..  Fts3Seg
169d0 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65  Reader **apSegme
169e0 6e 74 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67  nt = pCsr->apSeg
169f0 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 53 65 67  ment;.  int nSeg
16a00 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65  ment = pCsr->nSe
16a10 67 6d 65 6e 74 3b 0a 20 20 46 74 73 33 53 65 67  gment;.  Fts3Seg
16a20 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 20  Filter *pFilter 
16a30 3d 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 3b  = pCsr->pFilter;
16a40 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46  .  int (*xCmp)(F
16a50 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20  ts3SegReader *, 
16a60 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
16a70 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73   = (.    p->bDes
16a80 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52 65  cIdx ? fts3SegRe
16a90 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65  aderDoclistCmpRe
16aa0 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64 65  v : fts3SegReade
16ab0 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b  rDoclistCmp.  );
16ac0 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 6e 53  ..  if( pCsr->nS
16ad0 65 67 6d 65 6e 74 3d 3d 30 20 29 20 72 65 74 75  egment==0 ) retu
16ae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
16af0 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4d   do {.    int nM
16b00 65 72 67 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b  erge;.    int i;
16b10 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e  .  .    /* Advan
16b20 63 65 20 74 68 65 20 66 69 72 73 74 20 70 43 73  ce the first pCs
16b30 72 2d 3e 6e 41 64 76 61 6e 63 65 20 65 6e 74 72  r->nAdvance entr
16b40 69 65 73 20 69 6e 20 74 68 65 20 61 70 53 65 67  ies in the apSeg
16b50 6d 65 6e 74 5b 5d 20 61 72 72 61 79 0a 20 20 20  ment[] array.   
16b60 20 2a 2a 20 66 6f 72 77 61 72 64 2e 20 54 68 65   ** forward. The
16b70 6e 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20  n sort the list 
16b80 69 6e 20 6f 72 64 65 72 20 6f 66 20 63 75 72 72  in order of curr
16b90 65 6e 74 20 74 65 72 6d 20 61 67 61 69 6e 2e 20  ent term again. 
16ba0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72   .    */.    for
16bb0 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 41  (i=0; i<pCsr->nA
16bc0 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 20  dvance; i++){.  
16bd0 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
16be0 72 20 2a 70 53 65 67 20 3d 20 61 70 53 65 67 6d  r *pSeg = apSegm
16bf0 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ent[i];.      if
16c00 28 20 70 53 65 67 2d 3e 62 4c 6f 6f 6b 75 70 20  ( pSeg->bLookup 
16c10 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53  ){.        fts3S
16c20 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70  egReaderSetEof(p
16c30 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Seg);.      }els
16c40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
16c50 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
16c60 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20  t(p, pSeg, 0);. 
16c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16c80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16ca0 7d 0a 20 20 20 20 66 74 73 33 53 65 67 52 65 61  }.    fts3SegRea
16cb0 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e  derSort(apSegmen
16cc0 74 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 70 43 73  t, nSegment, pCs
16cd0 72 2d 3e 6e 41 64 76 61 6e 63 65 2c 20 66 74 73  r->nAdvance, fts
16ce0 33 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b 0a  3SegReaderCmp);.
16cf0 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e      pCsr->nAdvan
16d00 63 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ce = 0;..    /* 
16d10 49 66 20 61 6c 6c 20 74 68 65 20 73 65 67 2d 72  If all the seg-r
16d20 65 61 64 65 72 73 20 61 72 65 20 61 74 20 45 4f  eaders are at EO
16d30 46 2c 20 77 65 27 72 65 20 66 69 6e 69 73 68 65  F, we're finishe
16d40 64 2e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d. return SQLITE
16d50 5f 4f 4b 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  _OK. */.    asse
16d60 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
16d70 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 61 70 53  K );.    if( apS
16d80 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 4e 6f 64 65  egment[0]->aNode
16d90 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
16da0 20 20 70 43 73 72 2d 3e 6e 54 65 72 6d 20 3d 20    pCsr->nTerm = 
16db0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 54  apSegment[0]->nT
16dc0 65 72 6d 3b 0a 20 20 20 20 70 43 73 72 2d 3e 7a  erm;.    pCsr->z
16dd0 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74  Term = apSegment
16de0 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a 0a 20 20 20  [0]->zTerm;..   
16df0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
16e00 20 70 72 65 66 69 78 2d 73 65 61 72 63 68 2c 20   prefix-search, 
16e10 61 6e 64 20 69 66 20 74 68 65 20 74 65 72 6d 20  and if the term 
16e20 74 68 61 74 20 61 70 53 65 67 6d 65 6e 74 5b 30  that apSegment[0
16e30 5d 20 70 6f 69 6e 74 73 0a 20 20 20 20 2a 2a 20  ] points.    ** 
16e40 74 6f 20 64 6f 65 73 20 6e 6f 74 20 73 68 61 72  to does not shar
16e50 65 20 61 20 73 75 66 66 69 78 20 77 69 74 68 20  e a suffix with 
16e60 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2f 6e  pFilter->zTerm/n
16e70 54 65 72 6d 2c 20 74 68 65 6e 20 61 6c 6c 20 0a  Term, then all .
16e80 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
16e90 63 61 6c 6c 62 61 63 6b 73 20 68 61 76 65 20 62  callbacks have b
16ea0 65 65 6e 20 6d 61 64 65 2e 20 49 6e 20 74 68 69  een made. In thi
16eb0 73 20 63 61 73 65 20 65 78 69 74 20 65 61 72 6c  s case exit earl
16ec0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
16ed0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74   Similarly, if t
16ee0 68 69 73 20 69 73 20 61 20 73 65 61 72 63 68 20  his is a search 
16ef0 66 6f 72 20 61 6e 20 65 78 61 63 74 20 6d 61 74  for an exact mat
16f00 63 68 2c 20 61 6e 64 20 74 68 65 20 66 69 72 73  ch, and the firs
16f10 74 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 6f 66  t term.    ** of
16f20 20 73 65 67 6d 65 6e 74 20 61 70 53 65 67 6d 65   segment apSegme
16f30 6e 74 5b 30 5d 20 69 73 20 6e 6f 74 20 61 20 6d  nt[0] is not a m
16f40 61 74 63 68 2c 20 65 78 69 74 20 65 61 72 6c 79  atch, exit early
16f50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16f60 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 20   pFilter->zTerm 
16f70 26 26 20 21 69 73 53 63 61 6e 20 29 7b 0a 20 20  && !isScan ){.  
16f80 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 6e 54      if( pCsr->nT
16f90 65 72 6d 3c 70 46 69 6c 74 65 72 2d 3e 6e 54 65  erm<pFilter->nTe
16fa0 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21  rm .       || (!
16fb0 69 73 50 72 65 66 69 78 20 26 26 20 70 43 73 72  isPrefix && pCsr
16fc0 2d 3e 6e 54 65 72 6d 3e 70 46 69 6c 74 65 72 2d  ->nTerm>pFilter-
16fd0 3e 6e 54 65 72 6d 29 0a 20 20 20 20 20 20 20 7c  >nTerm).       |
16fe0 7c 20 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a  | memcmp(pCsr->z
16ff0 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 7a  Term, pFilter->z
17000 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 6e  Term, pFilter->n
17010 54 65 72 6d 29 20 0a 20 20 20 20 20 20 29 7b 0a  Term) .      ){.
17020 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
17040 20 20 6e 4d 65 72 67 65 20 3d 20 31 3b 0a 20 20    nMerge = 1;.  
17050 20 20 77 68 69 6c 65 28 20 6e 4d 65 72 67 65 3c    while( nMerge<
17060 6e 53 65 67 6d 65 6e 74 20 0a 20 20 20 20 20 20  nSegment .      
17070 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e    && apSegment[n
17080 4d 65 72 67 65 5d 2d 3e 61 4e 6f 64 65 0a 20 20  Merge]->aNode.  
17090 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
170a0 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 6e 54 65 72  nt[nMerge]->nTer
170b0 6d 3d 3d 70 43 73 72 2d 3e 6e 54 65 72 6d 20 0a  m==pCsr->nTerm .
170c0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 6d 65          && 0==me
170d0 6d 63 6d 70 28 70 43 73 72 2d 3e 7a 54 65 72 6d  mcmp(pCsr->zTerm
170e0 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72  , apSegment[nMer
170f0 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20 70 43 73 72  ge]->zTerm, pCsr
17100 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a  ->nTerm).    ){.
17110 20 20 20 20 20 20 6e 4d 65 72 67 65 2b 2b 3b 0a        nMerge++;.
17120 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
17130 74 28 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79  t( isIgnoreEmpty
17140 20 7c 7c 20 28 69 73 52 65 71 75 69 72 65 50 6f   || (isRequirePo
17150 73 20 26 26 20 21 69 73 43 6f 6c 46 69 6c 74 65  s && !isColFilte
17160 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d  r) );.    if( nM
17170 65 72 67 65 3d 3d 31 20 0a 20 20 20 20 20 26 26  erge==1 .     &&
17180 20 21 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20   !isIgnoreEmpty 
17190 0a 20 20 20 20 20 26 26 20 21 69 73 46 69 72 73  .     && !isFirs
171a0 74 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 62  t .     && (p->b
171b0 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20 66 74  DescIdx==0 || ft
171c0 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
171d0 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30  ding(apSegment[0
171e0 5d 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ])==0).    ){.  
171f0 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69      pCsr->nDocli
17200 73 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  st = apSegment[0
17210 5d 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20  ]->nDoclist;.   
17220 20 20 20 69 66 28 20 66 74 73 33 53 65 67 52 65     if( fts3SegRe
17230 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70  aderIsPending(ap
17240 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20  Segment[0]) ){. 
17250 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
17260 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 70 43  MsrBufferData(pC
17270 73 72 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  sr, apSegment[0]
17280 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 43 73 72  ->aDoclist, pCsr
17290 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  ->nDoclist);.   
172a0 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c       pCsr->aDocl
172b0 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42 75 66  ist = pCsr->aBuf
172c0 66 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fer;.      }else
172d0 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e  {.        pCsr->
172e0 61 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67  aDoclist = apSeg
172f0 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73  ment[0]->aDoclis
17300 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
17310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17320 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
17330 5f 52 4f 57 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _ROW;.    }else{
17340 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c  .      int nDocl
17350 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ist = 0;        
17360 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f     /* Size of do
17370 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 73  clist */.      s
17380 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72  qlite3_int64 iPr
17390 65 76 20 3d 20 30 3b 20 20 20 20 2f 2a 20 50 72  ev = 0;    /* Pr
173a0 65 76 69 6f 75 73 20 64 6f 63 69 64 20 73 74 6f  evious docid sto
173b0 72 65 64 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a  red in doclist *
173c0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
173d0 63 75 72 72 65 6e 74 20 74 65 72 6d 20 6f 66 20  current term of 
173e0 74 68 65 20 66 69 72 73 74 20 6e 4d 65 72 67 65  the first nMerge
173f0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17400 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2a 20 6f  array.      ** o
17410 66 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  f Fts3SegReader 
17420 6f 62 6a 65 63 74 73 20 69 73 20 74 68 65 20 73  objects is the s
17430 61 6d 65 2e 20 54 68 65 20 64 6f 63 6c 69 73 74  ame. The doclist
17440 73 20 6d 75 73 74 20 62 65 20 6d 65 72 67 65 64  s must be merged
17450 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 20  .      ** and a 
17460 73 69 6e 67 6c 65 20 74 65 72 6d 20 72 65 74 75  single term retu
17470 72 6e 65 64 20 77 69 74 68 20 74 68 65 20 6d 65  rned with the me
17480 72 67 65 64 20 64 6f 63 6c 69 73 74 2e 0a 20 20  rged doclist..  
17490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
174a0 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 3b 20  (i=0; i<nMerge; 
174b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74  i++){.        ft
174c0 73 33 53 65 67 52 65 61 64 65 72 46 69 72 73 74  s3SegReaderFirst
174d0 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65  Docid(p, apSegme
174e0 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  nt[i]);.      }.
174f0 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
17500 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e  derSort(apSegmen
17510 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 65 72 67  t, nMerge, nMerg
17520 65 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20 20 20  e, xCmp);.      
17530 77 68 69 6c 65 28 20 61 70 53 65 67 6d 65 6e 74  while( apSegment
17540 5b 30 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  [0]->pOffsetList
17550 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
17560 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
17570 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17580 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  of segments that
17590 20 73 68 61 72 65 20 61 20 64 6f 63 69 64 20 2a   share a docid *
175a0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
175b0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
175c0 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  nt nList;.      
175d0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
175e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
175f0 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65  64 iDocid = apSe
17600 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64  gment[0]->iDocid
17610 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65  ;.        fts3Se
17620 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64  gReaderNextDocid
17630 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  (p, apSegment[0]
17640 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
17650 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31  );.        j = 1
17660 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
17670 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20   j<nMerge.      
17680 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
17690 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[j]->pOffsetLi
176a0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  st.            &
176b0 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e  & apSegment[j]->
176c0 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20  iDocid==iDocid. 
176d0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
176e0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
176f0 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70  rNextDocid(p, ap
17700 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30  Segment[j], 0, 0
17710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  );.          j++
17720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
17730 20 20 20 20 20 69 66 28 20 69 73 43 6f 6c 46 69       if( isColFi
17740 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
17750 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74    fts3ColumnFilt
17760 65 72 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c  er(pFilter->iCol
17770 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
17780 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
17790 20 20 20 20 20 20 69 66 28 20 21 69 73 49 67 6e        if( !isIgn
177a0 6f 72 65 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73  oreEmpty || nLis
177b0 74 3e 30 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  t>0 ){..        
177c0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
177d0 68 65 20 27 64 6f 63 69 64 27 20 64 65 6c 74 61  he 'docid' delta
177e0 20 76 61 6c 75 65 20 74 6f 20 77 72 69 74 65 20   value to write 
177f0 69 6e 74 6f 20 74 68 65 20 6d 65 72 67 65 64 20  into the merged 
17800 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  .          ** do
17810 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  clist. */.      
17820 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
17830 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
17840 20 20 20 20 69 66 28 20 70 2d 3e 62 44 65 73 63      if( p->bDesc
17850 49 64 78 20 26 26 20 6e 44 6f 63 6c 69 73 74 3e  Idx && nDoclist>
17860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
17870 20 69 44 65 6c 74 61 20 3d 20 69 50 72 65 76 20   iDelta = iPrev 
17880 2d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  - iDocid;.      
17890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
178a0 20 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20         iDelta = 
178b0 69 44 6f 63 69 64 20 2d 20 69 50 72 65 76 3b 0a  iDocid - iPrev;.
178c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
178d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
178e0 65 6c 74 61 3e 30 20 7c 7c 20 28 6e 44 6f 63 6c  elta>0 || (nDocl
178f0 69 73 74 3d 3d 30 20 26 26 20 69 44 65 6c 74 61  ist==0 && iDelta
17900 3d 3d 69 44 6f 63 69 64 29 20 29 3b 0a 20 20 20  ==iDocid) );.   
17910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
17920 44 6f 63 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65  Doclist>0 || iDe
17930 6c 74 61 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a  lta==iDocid );..
17940 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
17950 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
17960 69 6e 74 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b  intLen(iDelta) +
17970 20 28 69 73 52 65 71 75 69 72 65 50 6f 73 3f 6e   (isRequirePos?n
17980 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20  List+1:0);.     
17990 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73       if( nDoclis
179a0 74 2b 6e 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42  t+nByte>pCsr->nB
179b0 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
179c0 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 3b       char *aNew;
179d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
179e0 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 28 6e 44  r->nBuffer = (nD
179f0 6f 63 6c 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b  oclist+nByte)*2;
17a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4e 65  .            aNe
17a10 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
17a20 6c 6f 63 28 70 43 73 72 2d 3e 61 42 75 66 66 65  loc(pCsr->aBuffe
17a30 72 2c 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72  r, pCsr->nBuffer
17a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17a50 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
17a60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17a70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17a80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17a90 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61           pCsr->a
17aa0 42 75 66 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20  Buffer = aNew;. 
17ab0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
17ac0 20 20 20 20 20 20 69 66 28 20 69 73 46 69 72 73        if( isFirs
17ad0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
17ae0 20 63 68 61 72 20 2a 61 20 3d 20 26 70 43 73 72   char *a = &pCsr
17af0 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69  ->aBuffer[nDocli
17b00 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st];.           
17b10 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20 20 20   int nWrite;.   
17b20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
17b30 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 71       nWrite = sq
17b40 6c 69 74 65 33 46 74 73 33 46 69 72 73 74 46 69  lite3Fts3FirstFi
17b50 6c 74 65 72 28 69 44 65 6c 74 61 2c 20 70 4c 69  lter(iDelta, pLi
17b60 73 74 2c 20 6e 4c 69 73 74 2c 20 61 29 3b 0a 20  st, nList, a);. 
17b70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
17b80 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
17b90 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
17ba0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
17bb0 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d       nDoclist +=
17bc0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20   nWrite;.       
17bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17bf0 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20      nDoclist += 
17c00 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
17c10 72 69 6e 74 28 26 70 43 73 72 2d 3e 61 42 75 66  rint(&pCsr->aBuf
17c20 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69  fer[nDoclist], i
17c30 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
17c40 20 20 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63      iPrev = iDoc
17c50 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  id;.            
17c60 69 66 28 20 69 73 52 65 71 75 69 72 65 50 6f 73  if( isRequirePos
17c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17c80 20 20 6d 65 6d 63 70 79 28 26 70 43 73 72 2d 3e    memcpy(&pCsr->
17c90 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74  aBuffer[nDoclist
17ca0 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29  ], pList, nList)
17cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17cc0 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73  nDoclist += nLis
17cd0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
17ce0 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e   pCsr->aBuffer[n
17cf0 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30  Doclist++] = '\0
17d00 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ';.            }
17d10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17d20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17d30 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
17d40 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  t(apSegment, nMe
17d50 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 20  rge, j, xCmp);. 
17d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17d70 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20   nDoclist>0 ){. 
17d80 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f         pCsr->aDo
17d90 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42  clist = pCsr->aB
17da0 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20 20 70  uffer;.        p
17db0 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  Csr->nDoclist = 
17dc0 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  nDoclist;.      
17dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
17de0 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
17df0 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61  .    pCsr->nAdva
17e00 6e 63 65 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20  nce = nMerge;.  
17e10 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
17e20 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 72 65 74 75  TE_OK );..  retu
17e30 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76 6f 69 64 20  rn rc;.}...void 
17e40 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
17e50 61 64 65 72 46 69 6e 69 73 68 28 0a 20 20 46 74  aderFinish(.  Ft
17e60 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
17e70 20 2a 70 43 73 72 20 20 20 20 20 20 20 2f 2a 20   *pCsr       /* 
17e80 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
17e90 0a 29 7b 0a 20 20 69 66 28 20 70 43 73 72 20 29  .){.  if( pCsr )
17ea0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
17eb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
17ec0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29  ->nSegment; i++)
17ed0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
17ee0 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
17ef0 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
17f00 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
17f10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
17f20 72 2d 3e 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20  r->apSegment);. 
17f30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17f40 70 43 73 72 2d 3e 61 42 75 66 66 65 72 29 3b 0a  pCsr->aBuffer);.
17f50 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d  .    pCsr->nSegm
17f60 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ent = 0;.    pCs
17f70 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 30  r->apSegment = 0
17f80 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66  ;.    pCsr->aBuf
17f90 66 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  fer = 0;.  }.}..
17fa0 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20  /*.** Merge all 
17fb0 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 73 65 67  level iLevel seg
17fc0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74  ments in the dat
17fd0 61 62 61 73 65 20 69 6e 74 6f 20 61 20 73 69 6e  abase into a sin
17fe0 67 6c 65 20 0a 2a 2a 20 69 4c 65 76 65 6c 2b 31  gle .** iLevel+1
17ff0 20 73 65 67 6d 65 6e 74 2e 20 4f 72 2c 20 69 66   segment. Or, if
18000 20 69 4c 65 76 65 6c 3c 30 2c 20 6d 65 72 67 65   iLevel<0, merge
18010 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
18020 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 73  to a.** single s
18030 65 67 6d 65 6e 74 20 77 69 74 68 20 61 20 6c 65  egment with a le
18040 76 65 6c 20 65 71 75 61 6c 20 74 6f 20 74 68 65  vel equal to the
18050 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72   numerically lar
18060 67 65 73 74 20 6c 65 76 65 6c 20 0a 2a 2a 20 63  gest level .** c
18070 75 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74  urrently present
18080 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
18090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
180a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
180b0 65 64 20 77 69 74 68 20 69 4c 65 76 65 6c 3c 30  ed with iLevel<0
180c0 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6f  , but there is o
180d0 6e 6c 79 20 6f 6e 65 0a 2a 2a 20 73 65 67 6d 65  nly one.** segme
180e0 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
180f0 73 65 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  se, SQLITE_DONE 
18100 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65  is returned imme
18110 64 69 61 74 65 6c 79 2e 20 0a 2a 2a 20 4f 74 68  diately. .** Oth
18120 65 72 77 69 73 65 2c 20 69 66 20 73 75 63 63 65  erwise, if succe
18130 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
18140 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
18150 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
18160 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
18170 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18180 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
18190 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e  c int fts3Segmen
181a0 74 4d 65 72 67 65 28 0a 20 20 46 74 73 33 54 61  tMerge(.  Fts3Ta
181b0 62 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69  ble *p, .  int i
181c0 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
181d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
181e0 6e 67 75 61 67 65 20 69 64 20 74 6f 20 6d 65 72  nguage id to mer
181f0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  ge */.  int iInd
18200 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
18210 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18220 20 69 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20   in p->aIndex[] 
18230 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  to merge */.  in
18240 74 20 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20  t iLevel        
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18260 20 4c 65 76 65 6c 20 74 6f 20 6d 65 72 67 65 20   Level to merge 
18270 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
182a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
182b0 69 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  iIdx = 0;       
182c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
182d0 6e 64 65 78 20 6f 66 20 6e 65 77 20 73 65 67 6d  ndex of new segm
182e0 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
182f0 5f 69 6e 74 36 34 20 69 4e 65 77 4c 65 76 65 6c  _int64 iNewLevel
18300 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4c 65 76 65   = 0;    /* Leve
18310 6c 2f 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  l/index to creat
18320 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74  e new segment at
18330 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69   */.  SegmentWri
18340 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 30  ter *pWriter = 0
18350 3b 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f  ;     /* Used to
18360 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 2c 20   write the new, 
18370 6d 65 72 67 65 64 2c 20 73 65 67 6d 65 6e 74 20  merged, segment 
18380 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
18390 65 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20 20  er filter;      
183a0 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
183b0 74 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64  term filter cond
183c0 69 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 4d  ition */.  Fts3M
183d0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 63 73  ultiSegReader cs
183e0 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  r;         /* Cu
183f0 72 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  rsor to iterate 
18400 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 28 73 29  through level(s)
18410 20 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72   */.  int bIgnor
18420 65 45 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 20  eEmpty = 0;     
18430 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
18440 20 69 67 6e 6f 72 65 20 65 6d 70 74 79 20 73 65   ignore empty se
18450 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 61 73 73  gments */..  ass
18460 65 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53  ert( iLevel==FTS
18470 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 0a  3_SEGCURSOR_ALL.
18480 20 20 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c         || iLevel
18490 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
184a0 5f 50 45 4e 44 49 4e 47 0a 20 20 20 20 20 20 20  _PENDING.       
184b0 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30 0a 20 20 29  || iLevel>=0.  )
184c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ;.  assert( iLev
184d0 65 6c 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  el<FTS3_SEGDIR_M
184e0 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73  AXLEVEL );.  ass
184f0 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
18500 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
18510 65 78 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  ex );..  rc = sq
18520 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
18530 65 72 43 75 72 73 6f 72 28 70 2c 20 69 4c 61 6e  erCursor(p, iLan
18540 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
18550 76 65 6c 2c 20 30 2c 20 30 2c 20 31 2c 20 30 2c  vel, 0, 0, 1, 0,
18560 20 26 63 73 72 29 3b 0a 20 20 69 66 28 20 72 63   &csr);.  if( rc
18570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
18580 73 72 2e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29  sr.nSegment==0 )
18590 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
185a0 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46  .  if( iLevel==F
185b0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
185c0 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  L ){.    /* This
185d0 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67   call is to merg
185e0 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  e all segments i
185f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
18600 6f 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a  o a single.    *
18610 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 6c  * segment. The l
18620 65 76 65 6c 20 6f 66 20 74 68 65 20 6e 65 77 20  evel of the new 
18630 73 65 67 6d 65 6e 74 20 69 73 20 65 71 75 61 6c  segment is equal
18640 20 74 6f 20 74 68 65 20 74 68 65 20 6e 75 6d 65   to the the nume
18650 72 69 63 61 6c 6c 79 20 0a 20 20 20 20 2a 2a 20  rically .    ** 
18660 67 72 65 61 74 65 73 74 20 73 65 67 6d 65 6e 74  greatest segment
18670 20 6c 65 76 65 6c 20 63 75 72 72 65 6e 74 6c 79   level currently
18680 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
18690 64 61 74 61 62 61 73 65 20 66 6f 72 20 74 68 69  database for thi
186a0 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20  s.    ** index. 
186b0 54 68 65 20 69 64 78 20 6f 66 20 74 68 65 20 6e  The idx of the n
186c0 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6c  ew segment is al
186d0 77 61 79 73 20 30 2e 20 20 2a 2f 0a 20 20 20 20  ways 0.  */.    
186e0 69 66 28 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74  if( csr.nSegment
186f0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==1 ){.      rc 
18700 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
18710 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68       goto finish
18720 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ed;.    }.    rc
18730 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 61   = fts3SegmentMa
18740 78 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  xLevel(p, iLangi
18750 64 2c 20 69 49 6e 64 65 78 2c 20 26 69 4e 65 77  d, iIndex, &iNew
18760 4c 65 76 65 6c 29 3b 0a 20 20 20 20 62 49 67 6e  Level);.    bIgn
18770 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a 20  oreEmpty = 1;.. 
18780 20 7d 65 6c 73 65 20 69 66 28 20 69 4c 65 76 65   }else if( iLeve
18790 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
187a0 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20  R_PENDING ){.   
187b0 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65 74   iNewLevel = get
187c0 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
187d0 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
187e0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  , 0);.    rc = f
187f0 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69  ts3AllocateSegdi
18800 72 49 64 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c  rIdx(p, iLangid,
18810 20 69 49 6e 64 65 78 2c 20 30 2c 20 26 69 49 64   iIndex, 0, &iId
18820 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
18830 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
18840 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65   to merge all se
18850 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20  gments at level 
18860 69 4c 65 76 65 6c 2e 20 66 69 6e 64 20 74 68 65  iLevel. find the
18870 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 61 76 61   next.    ** ava
18880 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69  ilable segment i
18890 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c  ndex at level iL
188a0 65 76 65 6c 2b 31 2e 20 54 68 65 20 63 61 6c 6c  evel+1. The call
188b0 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74 73 33 41   to.    ** fts3A
188c0 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
188d0 28 29 20 77 69 6c 6c 20 6d 65 72 67 65 20 74 68  () will merge th
188e0 65 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65  e segments at le
188f0 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20 74 6f 20  vel iLevel+1 to 
18900 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65  .    ** a single
18910 20 69 4c 65 76 65 6c 2b 32 20 73 65 67 6d 65 6e   iLevel+2 segmen
18920 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  t if necessary. 
18930 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
18940 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
18950 64 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  dx(p, iLangid, i
18960 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2b 31 2c  Index, iLevel+1,
18970 20 26 69 49 64 78 29 3b 0a 20 20 20 20 69 4e 65   &iIdx);.    iNe
18980 77 4c 65 76 65 6c 20 3d 20 67 65 74 41 62 73 6f  wLevel = getAbso
18990 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
189a0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c  ngid, iIndex, iL
189b0 65 76 65 6c 2b 31 29 3b 0a 20 20 7d 0a 20 20 69  evel+1);.  }.  i
189c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
189d0 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
189e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 73 72 2e  ;.  assert( csr.
189f0 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  nSegment>0 );.  
18a00 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65  assert( iNewLeve
18a10 6c 3e 3d 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  l>=getAbsoluteLe
18a20 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
18a30 69 49 6e 64 65 78 2c 20 30 29 20 29 3b 0a 20 20  iIndex, 0) );.  
18a40 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65  assert( iNewLeve
18a50 6c 3c 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  l<getAbsoluteLev
18a60 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
18a70 49 6e 64 65 78 2c 46 54 53 33 5f 53 45 47 44 49  Index,FTS3_SEGDI
18a80 52 5f 4d 41 58 4c 45 56 45 4c 29 20 29 3b 0a 0a  R_MAXLEVEL) );..
18a90 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74 65 72    memset(&filter
18aa0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
18ab0 53 65 67 46 69 6c 74 65 72 29 29 3b 0a 20 20 66  SegFilter));.  f
18ac0 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 46 54  ilter.flags = FT
18ad0 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49  S3_SEGMENT_REQUI
18ae0 52 45 5f 50 4f 53 3b 0a 20 20 66 69 6c 74 65 72  RE_POS;.  filter
18af0 2e 66 6c 61 67 73 20 7c 3d 20 28 62 49 67 6e 6f  .flags |= (bIgno
18b00 72 65 45 6d 70 74 79 20 3f 20 46 54 53 33 5f 53  reEmpty ? FTS3_S
18b10 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d  EGMENT_IGNORE_EM
18b20 50 54 59 20 3a 20 30 29 3b 0a 0a 20 20 72 63 20  PTY : 0);..  rc 
18b30 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
18b40 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 26  ReaderStart(p, &
18b50 63 73 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20  csr, &filter);. 
18b60 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f   while( SQLITE_O
18b70 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20 72 63 20  K==rc ){.    rc 
18b80 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
18b90 52 65 61 64 65 72 53 74 65 70 28 70 2c 20 26 63  ReaderStep(p, &c
18ba0 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sr);.    if( rc!
18bb0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 62 72  =SQLITE_ROW ) br
18bc0 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  eak;.    rc = ft
18bd0 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 70  s3SegWriterAdd(p
18be0 2c 20 26 70 57 72 69 74 65 72 2c 20 31 2c 20 0a  , &pWriter, 1, .
18bf0 20 20 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72          csr.zTer
18c00 6d 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20 63 73  m, csr.nTerm, cs
18c10 72 2e 61 44 6f 63 6c 69 73 74 2c 20 63 73 72 2e  r.aDoclist, csr.
18c20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 20  nDoclist);.  }. 
18c30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18c40 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
18c50 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  ed;.  assert( pW
18c60 72 69 74 65 72 20 29 3b 0a 0a 20 20 69 66 28 20  riter );..  if( 
18c70 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47  iLevel!=FTS3_SEG
18c80 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29  CURSOR_PENDING )
18c90 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  {.    rc = fts3D
18ca0 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20 20 20  eleteSegdir(.   
18cb0 20 20 20 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c       p, iLangid,
18cc0 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c   iIndex, iLevel,
18cd0 20 63 73 72 2e 61 70 53 65 67 6d 65 6e 74 2c 20   csr.apSegment, 
18ce0 63 73 72 2e 6e 53 65 67 6d 65 6e 74 0a 20 20 20  csr.nSegment.   
18cf0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
18d00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
18d10 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 20   finished;.  }. 
18d20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57 72 69   rc = fts3SegWri
18d30 74 65 72 46 6c 75 73 68 28 70 2c 20 70 57 72 69  terFlush(p, pWri
18d40 74 65 72 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20  ter, iNewLevel, 
18d50 69 49 64 78 29 3b 0a 0a 20 66 69 6e 69 73 68 65  iIdx);.. finishe
18d60 64 3a 0a 20 20 66 74 73 33 53 65 67 57 72 69 74  d:.  fts3SegWrit
18d70 65 72 46 72 65 65 28 70 57 72 69 74 65 72 29 3b  erFree(pWriter);
18d80 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
18d90 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26 63  gReaderFinish(&c
18da0 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sr);.  return rc
18db0 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75  ;.}.../* .** Flu
18dc0 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
18dd0 6f 66 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20  of pendingTerms 
18de0 74 6f 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65  to level 0 segme
18df0 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
18e00 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
18e10 72 6d 73 46 6c 75 73 68 28 46 74 73 33 54 61 62  rmsFlush(Fts3Tab
18e20 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  le *p){.  int rc
18e30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18e40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 0a  int i;.        .
18e50 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
18e60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
18e70 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20  >nIndex; i++){. 
18e80 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d     rc = fts3Segm
18e90 65 6e 74 4d 65 72 67 65 28 70 2c 20 70 2d 3e 69  entMerge(p, p->i
18ea0 50 72 65 76 4c 61 6e 67 69 64 2c 20 69 2c 20 46  PrevLangid, i, F
18eb0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45  TS3_SEGCURSOR_PE
18ec0 4e 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20  NDING);.    if( 
18ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
18ee0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
18ef0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46  ;.  }.  sqlite3F
18f00 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43  ts3PendingTermsC
18f10 6c 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44  lear(p);..  /* D
18f20 65 74 65 72 6d 69 6e 65 20 74 68 65 20 61 75 74  etermine the aut
18f30 6f 2d 69 6e 63 72 2d 6d 65 72 67 65 20 73 65 74  o-incr-merge set
18f40 74 69 6e 67 20 69 66 20 75 6e 6b 6e 6f 77 6e 2e  ting if unknown.
18f50 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 0a 20 20    If enabled,.  
18f60 2a 2a 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  ** estimate the 
18f70 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 62  number of leaf b
18f80 6c 6f 63 6b 73 20 6f 66 20 63 6f 6e 74 65 6e 74  locks of content
18f90 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 0a 20   to be written. 
18fa0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
18fb0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 62 48  LITE_OK && p->bH
18fc0 61 73 53 74 61 74 0a 20 20 20 26 26 20 70 2d 3e  asStat.   && p->
18fd0 62 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d  bAutoincrmerge==
18fe0 30 78 66 66 20 26 26 20 70 2d 3e 6e 4c 65 61 66  0xff && p->nLeaf
18ff0 41 64 64 3e 30 0a 20 20 29 7b 0a 20 20 20 20 73  Add>0.  ){.    s
19000 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19010 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  mt = 0;.    rc =
19020 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
19030 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c  SQL_SELECT_STAT,
19040 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
19050 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
19070 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
19080 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f  mt, 1, FTS_STAT_
19090 41 55 54 4f 49 4e 43 52 4d 45 52 47 45 29 3b 0a  AUTOINCRMERGE);.
190a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
190b0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
190c0 20 20 20 20 20 20 70 2d 3e 62 41 75 74 6f 69 6e        p->bAutoin
190d0 63 72 6d 65 72 67 65 20 3d 20 28 72 63 3d 3d 53  crmerge = (rc==S
190e0 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 73 71 6c  QLITE_ROW && sql
190f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
19100 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20  pStmt, 0));.    
19110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
19120 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
19130 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19140 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63  rc;.}../*.** Enc
19150 6f 64 65 20 4e 20 69 6e 74 65 67 65 72 73 20 61  ode N integers a
19160 73 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 61  s varints into a
19170 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63   blob..*/.static
19180 20 76 6f 69 64 20 66 74 73 33 45 6e 63 6f 64 65   void fts3Encode
19190 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20  IntArray(.  int 
191a0 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
191b0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
191c0 69 6e 74 65 67 65 72 73 20 74 6f 20 65 6e 63 6f  integers to enco
191d0 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20  de */.  u32 *a, 
191e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
191f0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
19200 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
19210 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ,        /* Writ
19220 65 20 74 68 65 20 42 4c 4f 42 20 68 65 72 65 20  e the BLOB here 
19230 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 42 75 66 20  */.  int *pNBuf 
19240 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
19250 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19260 20 69 66 20 7a 42 75 66 5b 5d 20 75 73 65 64 20   if zBuf[] used 
19270 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
19280 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
19290 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<N; i++){. 
192a0 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46     j += sqlite3F
192b0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 7a 42  ts3PutVarint(&zB
192c0 75 66 5b 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f  uf[j], (sqlite3_
192d0 69 6e 74 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d  int64)a[i]);.  }
192e0 0a 20 20 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d  .  *pNBuf = j;.}
192f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
19300 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73   blob of varints
19310 20 69 6e 74 6f 20 4e 20 69 6e 74 65 67 65 72 73   into N integers
19320 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19330 66 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72  fts3DecodeIntArr
19340 61 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20  ay(.  int N,    
19350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19360 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65  number of intege
19370 72 73 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rs to decode */.
19380 20 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20    u32 *a,       
19390 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
193a0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
193b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
193c0 20 2a 7a 42 75 66 2c 20 20 2f 2a 20 54 68 65 20   *zBuf,  /* The 
193d0 42 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20  BLOB containing 
193e0 74 68 65 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20  the varints */. 
193f0 20 69 6e 74 20 6e 42 75 66 20 20 20 20 20 20 20   int nBuf       
19400 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74      /* size of t
19410 68 65 20 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20  he BLOB */.){.  
19420 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 55 4e 55 53  int i, j;.  UNUS
19430 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75  ED_PARAMETER(nBu
19440 66 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  f);.  for(i=j=0;
19450 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
19460 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b  sqlite3_int64 x;
19470 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65  .    j += sqlite
19480 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26  3Fts3GetVarint(&
19490 7a 42 75 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20  zBuf[j], &x);.  
194a0 20 20 61 73 73 65 72 74 28 6a 3c 3d 6e 42 75 66    assert(j<=nBuf
194b0 29 3b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 28 75  );.    a[i] = (u
194c0 33 32 29 28 78 20 26 20 30 78 66 66 66 66 66 66  32)(x & 0xffffff
194d0 66 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ff);.  }.}../*.*
194e0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 73 69 7a  * Insert the siz
194f0 65 73 20 28 69 6e 20 74 6f 6b 65 6e 73 29 20 66  es (in tokens) f
19500 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
19510 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a  f the document.*
19520 2a 20 77 69 74 68 20 64 6f 63 69 64 20 65 71 75  * with docid equ
19530 61 6c 20 74 6f 20 70 2d 3e 69 50 72 65 76 44 6f  al to p->iPrevDo
19540 63 69 64 2e 20 20 54 68 65 20 73 69 7a 65 73 20  cid.  The sizes 
19550 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73 0a 2a  are encoded as.*
19560 2a 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69  * a blob of vari
19570 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
19580 6f 69 64 20 66 74 73 33 49 6e 73 65 72 74 44 6f  oid fts3InsertDo
19590 63 73 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52  csize(.  int *pR
195a0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
195b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
195c0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  lt code */.  Fts
195d0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195f0 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  Table into which
19600 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
19610 75 33 32 20 2a 61 53 7a 20 20 20 20 20 20 20 20  u32 *aSz        
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 2f 2a 20 53 69 7a 65 73 20 6f 66 20 65 61 63 68  /* Sizes of each
19640 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20 74 6f 6b 65   column, in toke
19650 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ns */.){.  char 
19660 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20  *pBlob;         
19670 20 20 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20      /* The BLOB 
19680 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
19690 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65 20 2a 2f  document size */
196a0 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20  .  int nBlob;   
196b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
196c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
196d0 6e 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20  n the BLOB */.  
196e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
196f0 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74  tmt;     /* Stat
19700 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 69 6e  ement used to in
19710 73 65 72 74 20 74 68 65 20 65 6e 63 6f 64 69 6e  sert the encodin
19720 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  g */.  int rc;  
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
19750 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
19760 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
19770 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42 6c 6f  ) return;.  pBlo
19780 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  b = sqlite3_mall
19790 6f 63 28 20 31 30 2a 70 2d 3e 6e 43 6f 6c 75 6d  oc( 10*p->nColum
197a0 6e 20 29 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62  n );.  if( pBlob
197b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
197c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
197d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
197e0 20 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41    fts3EncodeIntA
197f0 72 72 61 79 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c  rray(p->nColumn,
19800 20 61 53 7a 2c 20 70 42 6c 6f 62 2c 20 26 6e 42   aSz, pBlob, &nB
19810 6c 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73  lob);.  rc = fts
19820 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
19830 52 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 2c  REPLACE_DOCSIZE,
19840 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
19850 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
19860 69 74 65 33 5f 66 72 65 65 28 70 42 6c 6f 62 29  ite3_free(pBlob)
19870 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  ;.    *pRC = rc;
19880 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
19890 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
198a0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  int64(pStmt, 1, 
198b0 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 29 3b 0a  p->iPrevDocid);.
198c0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
198d0 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42  lob(pStmt, 2, pB
198e0 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 73 71 6c 69  lob, nBlob, sqli
198f0 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 73 71 6c  te3_free);.  sql
19900 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
19910 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74  ;.  *pRC = sqlit
19920 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
19930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
19940 20 30 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74   0 of the %_stat
19950 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
19960 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e  a blob consistin
19970 67 20 6f 66 20 4e 20 76 61 72 69 6e 74 73 2c 0a  g of N varints,.
19980 2a 2a 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  ** where N is th
19990 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
199a0 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
199b0 20 69 6e 20 74 68 65 20 66 74 73 33 20 74 61 62   in the fts3 tab
199c0 6c 65 20 70 6c 75 73 0a 2a 2a 20 74 77 6f 2e 20  le plus.** two. 
199d0 49 66 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e  If nCol is the n
199e0 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65  umber of user de
199f0 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 2c 20 74  fined columns, t
19a00 68 65 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68  hen values of th
19a10 65 20 0a 2a 2a 20 76 61 72 69 6e 74 73 20 61 72  e .** varints ar
19a20 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
19a30 3a 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74  :.**.**   Varint
19a40 20 30 3a 20 20 20 20 20 20 20 54 6f 74 61 6c 20   0:       Total 
19a50 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
19a60 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
19a70 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2e 2e 6e  **   Varint 1..n
19a80 43 6f 6c 3a 20 46 6f 72 20 65 61 63 68 20 63 6f  Col: For each co
19a90 6c 75 6d 6e 2c 20 74 68 65 20 74 6f 74 61 6c 20  lumn, the total 
19aa0 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
19ab0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20   stored in.**   
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ad0 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61  the column for a
19ae0 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
19af0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  able..**.**   Va
19b00 72 69 6e 74 20 31 2b 6e 43 6f 6c 3a 20 20 54 68  rint 1+nCol:  Th
19b10 65 20 74 6f 74 61 6c 20 73 69 7a 65 2c 20 69 6e  e total size, in
19b20 20 62 79 74 65 73 2c 20 6f 66 20 61 6c 6c 20 74   bytes, of all t
19b30 65 78 74 20 76 61 6c 75 65 73 20 69 6e 20 61 6c  ext values in al
19b40 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
19b50 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
19b60 66 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  f all rows of th
19b70 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73  e table..**.*/.s
19b80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 55  tatic void fts3U
19b90 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 0a  pdateDocTotals(.
19ba0 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bc0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
19bd0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61  code */.  Fts3Ta
19be0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
19bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19c00 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  le being updated
19c10 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e   */.  u32 *aSzIn
19c20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
19c30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e        /* Size in
19c40 63 72 65 61 73 65 73 20 2a 2f 0a 20 20 75 33 32  creases */.  u32
19c50 20 2a 61 53 7a 44 65 6c 2c 20 20 20 20 20 20 20   *aSzDel,       
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c70 53 69 7a 65 20 64 65 63 72 65 61 73 65 73 20 2a  Size decreases *
19c80 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 20 20  /.  int nChng   
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e      /* Change in
19cb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
19cc0 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  ocuments */.){. 
19cd0 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20   char *pBlob;   
19ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
19cf0 72 61 67 65 20 66 6f 72 20 42 4c 4f 42 20 77 72  rage for BLOB wr
19d00 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61  itten into %_sta
19d10 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  t */.  int nBlob
19d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19d30 2f 2a 20 53 69 7a 65 20 6f 66 20 42 4c 4f 42 20  /* Size of BLOB 
19d40 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73  written into %_s
19d50 74 61 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 3b  tat */.  u32 *a;
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e    /* Array of in
19d80 74 65 67 65 72 73 20 74 68 61 74 20 62 65 63 6f  tegers that beco
19d90 6d 65 73 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a  mes the BLOB */.
19da0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19db0 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74  pStmt;     /* St
19dc0 61 74 65 6d 65 6e 74 20 66 6f 72 20 72 65 61 64  atement for read
19dd0 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20  ing and writing 
19de0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
19e10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
19e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19e30 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
19e40 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
19e50 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53 74  .  const int nSt
19e60 61 74 20 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  at = p->nColumn+
19e70 32 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  2;..  if( *pRC )
19e80 20 72 65 74 75 72 6e 3b 0a 20 20 61 20 3d 20 73   return;.  a = s
19e90 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28  qlite3_malloc( (
19ea0 73 69 7a 65 6f 66 28 75 33 32 29 2b 31 30 29 2a  sizeof(u32)+10)*
19eb0 6e 53 74 61 74 20 29 3b 0a 20 20 69 66 28 20 61  nStat );.  if( a
19ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
19ed0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
19ee0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
19ef0 20 20 70 42 6c 6f 62 20 3d 20 28 63 68 61 72 2a    pBlob = (char*
19f00 29 26 61 5b 6e 53 74 61 74 5d 3b 0a 20 20 72 63  )&a[nStat];.  rc
19f10 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
19f20 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  , SQL_SELECT_STA
19f30 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
19f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
19f50 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
19f60 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
19f70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
19f80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
19f90 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f  t(pStmt, 1, FTS_
19fa0 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a  STAT_DOCTOTAL);.
19fb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
19fc0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
19fd0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66 74 73  E_ROW ){.    fts
19fe0 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28  3DecodeIntArray(
19ff0 6e 53 74 61 74 2c 20 61 2c 0a 20 20 20 20 20 20  nStat, a,.      
1a000 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1a010 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29  n_blob(pStmt, 0)
1a020 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1a030 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1a040 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65  pStmt, 0));.  }e
1a050 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
1a060 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32  a, 0, sizeof(u32
1a070 29 2a 28 6e 53 74 61 74 29 20 29 3b 0a 20 20 7d  )*(nStat) );.  }
1a080 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  .  sqlite3_reset
1a090 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e  (pStmt);.  if( n
1a0a0 43 68 6e 67 3c 30 20 26 26 20 61 5b 30 5d 3c 28  Chng<0 && a[0]<(
1a0b0 75 33 32 29 28 2d 6e 43 68 6e 67 29 20 29 7b 0a  u32)(-nChng) ){.
1a0c0 20 20 20 20 61 5b 30 5d 20 3d 20 30 3b 0a 20 20      a[0] = 0;.  
1a0d0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 5b 30 5d 20  }else{.    a[0] 
1a0e0 2b 3d 20 6e 43 68 6e 67 3b 0a 20 20 7d 0a 20 20  += nChng;.  }.  
1a0f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
1a100 6f 6c 75 6d 6e 2b 31 3b 20 69 2b 2b 29 7b 0a 20  olumn+1; i++){. 
1a110 20 20 20 75 33 32 20 78 20 3d 20 61 5b 69 2b 31     u32 x = a[i+1
1a120 5d 3b 0a 20 20 20 20 69 66 28 20 78 2b 61 53 7a  ];.    if( x+aSz
1a130 49 6e 73 5b 69 5d 20 3c 20 61 53 7a 44 65 6c 5b  Ins[i] < aSzDel[
1a140 69 5d 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  i] ){.      x = 
1a150 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1a160 20 20 20 20 78 20 3d 20 78 20 2b 20 61 53 7a 49      x = x + aSzI
1a170 6e 73 5b 69 5d 20 2d 20 61 53 7a 44 65 6c 5b 69  ns[i] - aSzDel[i
1a180 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 5b 69  ];.    }.    a[i
1a190 2b 31 5d 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 66  +1] = x;.  }.  f
1a1a0 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61  ts3EncodeIntArra
1a1b0 79 28 6e 53 74 61 74 2c 20 61 2c 20 70 42 6c 6f  y(nStat, a, pBlo
1a1c0 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63  b, &nBlob);.  rc
1a1d0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1a1e0 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54  , SQL_REPLACE_ST
1a1f0 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  AT, &pStmt, 0);.
1a200 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1a210 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
1a220 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
1a230 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1a240 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1a250 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53  nt(pStmt, 1, FTS
1a260 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b  _STAT_DOCTOTAL);
1a270 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
1a280 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70  blob(pStmt, 2, p
1a290 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 53 51 4c  Blob, nBlob, SQL
1a2a0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
1a2b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1a2c0 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c  t);.  *pRC = sql
1a2d0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1a2e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1a2f0 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  e(a);.}../*.** M
1a300 65 72 67 65 20 74 68 65 20 65 6e 74 69 72 65 20  erge the entire 
1a310 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
1a320 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 73 65   there is one se
1a330 67 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 0a  gment for each .
1a340 2a 2a 20 69 49 6e 64 65 78 2f 69 4c 61 6e 67 69  ** iIndex/iLangi
1a350 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 0a 2a  d combination..*
1a360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1a370 33 44 6f 4f 70 74 69 6d 69 7a 65 28 46 74 73 33  3DoOptimize(Fts3
1a380 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 52  Table *p, int bR
1a390 65 74 75 72 6e 44 6f 6e 65 29 7b 0a 20 20 69 6e  eturnDone){.  in
1a3a0 74 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20 30 3b  t bSeenDone = 0;
1a3b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1a3c0 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c  ite3_stmt *pAllL
1a3d0 61 6e 67 69 64 20 3d 20 30 3b 0a 0a 20 20 72 63  angid = 0;..  rc
1a3e0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1a3f0 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c  , SQL_SELECT_ALL
1a400 5f 4c 41 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61  _LANGID, &pAllLa
1a410 6e 67 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20  ngid, 0);.  if( 
1a420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a430 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
1a440 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1a450 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 31  nt(pAllLangid, 1
1a460 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20 20  , p->nIndex);.  
1a470 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1a480 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e 67 69 64  _step(pAllLangid
1a490 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1a4a0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1a4b0 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20      int iLangid 
1a4c0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1a4d0 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c  _int(pAllLangid,
1a4e0 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
1a4f0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1a500 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78  K && i<p->nIndex
1a510 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a520 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
1a530 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e 67 69 64  Merge(p, iLangid
1a540 2c 20 69 2c 20 46 54 53 33 5f 53 45 47 43 55 52  , i, FTS3_SEGCUR
1a550 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20 20 20 20 20  SOR_ALL);.      
1a560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a570 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1a580 20 20 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20 31     bSeenDone = 1
1a590 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1a5a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a5c0 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71    }.    rc2 = sq
1a5d0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 41 6c 6c  lite3_reset(pAll
1a5e0 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 69 66 28  Langid);.    if(
1a5f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a600 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a   rc = rc2;.  }..
1a610 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
1a620 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
1a630 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
1a640 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29  ingTermsClear(p)
1a650 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
1a660 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 52  =SQLITE_OK && bR
1a670 65 74 75 72 6e 44 6f 6e 65 20 26 26 20 62 53 65  eturnDone && bSe
1a680 65 6e 44 6f 6e 65 29 20 3f 20 53 51 4c 49 54 45  enDone) ? SQLITE
1a690 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a 7d 0a 0a 2f  _DONE : rc;.}../
1a6a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a6b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
1a6c0 6e 20 74 68 65 20 75 73 65 72 20 65 78 65 63 75  n the user execu
1a6d0 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  tes the followin
1a6e0 67 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a  g statement:.**.
1a6f0 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
1a700 54 4f 20 3c 74 62 6c 3e 28 3c 74 62 6c 3e 29 20  TO <tbl>(<tbl>) 
1a710 56 41 4c 55 45 53 28 27 72 65 62 75 69 6c 64 27  VALUES('rebuild'
1a720 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e 74  );.**.** The ent
1a730 69 72 65 20 46 54 53 20 69 6e 64 65 78 20 69 73  ire FTS index is
1a740 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 72   discarded and r
1a750 65 62 75 69 6c 74 2e 20 49 66 20 74 68 65 20 74  ebuilt. If the t
1a760 61 62 6c 65 20 69 73 20 6f 6e 65 20 0a 2a 2a 20  able is one .** 
1a770 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
1a780 65 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f 70  e content=xxx op
1a790 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6e  tion, then the n
1a7a0 65 77 20 69 6e 64 65 78 20 69 73 20 62 61 73 65  ew index is base
1a7b0 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
1a7c0 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
1a7d0 74 68 65 20 78 78 78 20 74 61 62 6c 65 2e 20 4f  the xxx table. O
1a7e0 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
1a7f0 72 65 62 75 69 6c 74 20 62 61 73 65 64 0a 2a 2a  rebuilt based.**
1a800 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
1a810 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e   of the %_conten
1a820 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  t table..*/.stat
1a830 69 63 20 69 6e 74 20 66 74 73 33 44 6f 52 65 62  ic int fts3DoReb
1a840 75 69 6c 64 28 46 74 73 33 54 61 62 6c 65 20 2a  uild(Fts3Table *
1a850 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  p){.  int rc;   
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a870 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1a880 43 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  Code */..  rc = 
1a890 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70 2c  fts3DeleteAll(p,
1a8a0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1a8b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a8c0 75 33 32 20 2a 61 53 7a 20 3d 20 30 3b 0a 20 20  u32 *aSz = 0;.  
1a8d0 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20    u32 *aSzIns = 
1a8e0 30 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 44  0;.    u32 *aSzD
1a8f0 65 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  el = 0;.    sqli
1a900 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1a910 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45 6e  = 0;.    int nEn
1a920 74 72 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  try = 0;..    /*
1a930 20 43 6f 6d 70 6f 73 65 20 61 6e 64 20 70 72 65   Compose and pre
1a940 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61 74  pare an SQL stat
1a950 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f 70 20 74 68  ement to loop th
1a960 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e  rough the conten
1a970 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  t table */.    c
1a980 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
1a990 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1a9a0 45 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65  ECT %s" , p->zRe
1a9b0 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20  adExprlist);.   
1a9c0 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20   if( !zSql ){.  
1a9d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a9e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
1a9f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1aa00 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1aa10 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
1aa20 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
1aa30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1aa40 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  zSql);.    }..  
1aa50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aa60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
1aa70 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1aa80 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75  u32) * (p->nColu
1aa90 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20 20 20 20 61  mn+1)*3;.      a
1aaa0 53 7a 20 3d 20 28 75 33 32 20 2a 29 73 71 6c 69  Sz = (u32 *)sqli
1aab0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
1aac0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 7a  );.      if( aSz
1aad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1aae0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1aaf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ab00 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 53         memset(aS
1ab10 7a 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  z, 0, nByte);.  
1ab20 20 20 20 20 20 20 61 53 7a 49 6e 73 20 3d 20 26        aSzIns = &
1ab30 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  aSz[p->nColumn+1
1ab40 5d 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 44 65  ];.        aSzDe
1ab50 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e  l = &aSzIns[p->n
1ab60 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20  Column+1];.     
1ab70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68   }.    }..    wh
1ab80 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1ab90 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
1aba0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
1abb0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Stmt) ){.      i
1abc0 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69  nt iCol;.      i
1abd0 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 6c 61 6e  nt iLangid = lan
1abe0 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c  gidFromSelect(p,
1abf0 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72   pStmt);.      r
1ac00 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
1ac10 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 69 4c 61  ermsDocid(p, iLa
1ac20 6e 67 69 64 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ngid, sqlite3_co
1ac30 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1ac40 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 53 7a  , 0));.      aSz
1ac50 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 30  [p->nColumn] = 0
1ac60 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  ;.      for(iCol
1ac70 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1ac80 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f  K && iCol<p->nCo
1ac90 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  lumn; iCol++){. 
1aca0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1acb0 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
1acc0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 63 6f  ar *) sqlite3_co
1acd0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
1ace0 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20   iCol+1);.      
1acf0 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
1ad00 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c  ngTermsAdd(p, iL
1ad10 61 6e 67 69 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20  angid, z, iCol, 
1ad20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  &aSz[iCol]);.   
1ad30 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c       aSz[p->nCol
1ad40 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  umn] += sqlite3_
1ad50 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
1ad60 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20  mt, iCol+1);.   
1ad70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1ad80 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
1ad90 0a 20 20 20 20 20 20 20 20 66 74 73 33 49 6e 73  .        fts3Ins
1ada0 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20  ertDocsize(&rc, 
1adb0 70 2c 20 61 53 7a 29 3b 0a 20 20 20 20 20 20 7d  p, aSz);.      }
1adc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1add0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ade0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1adf0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1ae00 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a       pStmt = 0;.
1ae10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ae20 20 20 20 20 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20       nEntry++;. 
1ae30 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
1ae40 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c  0; iCol<=p->nCol
1ae50 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  umn; iCol++){.  
1ae60 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73 5b 69          aSzIns[i
1ae70 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c  Col] += aSz[iCol
1ae80 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
1ae90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1aea0 66 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20  f( p->bFts4 ){. 
1aeb0 20 20 20 20 20 66 74 73 33 55 70 64 61 74 65 44       fts3UpdateD
1aec0 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c  ocTotals(&rc, p,
1aed0 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c   aSzIns, aSzDel,
1aee0 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 7d 0a   nEntry);.    }.
1aef0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1af00 28 61 53 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20  (aSz);..    if( 
1af10 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 69  pStmt ){.      i
1af20 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1af30 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1af40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1af50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1af60 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1af70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1af80 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1af90 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1afa0 6e 63 74 69 6f 6e 20 6f 70 65 6e 73 20 61 20 63  nction opens a c
1afb0 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 72 65  ursor used to re
1afc0 61 64 20 74 68 65 20 69 6e 70 75 74 20 64 61 74  ad the input dat
1afd0 61 20 66 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 63  a for an .** inc
1afe0 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
1aff0 70 65 72 61 74 69 6f 6e 2e 20 53 70 65 63 69 66  peration. Specif
1b000 69 63 61 6c 6c 79 2c 20 69 74 20 6f 70 65 6e 73  ically, it opens
1b010 20 61 20 63 75 72 73 6f 72 20 74 6f 20 73 63 61   a cursor to sca
1b020 6e 0a 2a 2a 20 74 68 65 20 6f 6c 64 65 73 74 20  n.** the oldest 
1b030 6e 53 65 67 20 73 65 67 6d 65 6e 74 73 20 28 69  nSeg segments (i
1b040 64 78 3d 30 20 74 68 72 6f 75 67 68 20 69 64 78  dx=0 through idx
1b050 3d 28 6e 53 65 67 2d 31 29 29 20 69 6e 20 61 62  =(nSeg-1)) in ab
1b060 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65 6c  solute .** level
1b070 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2f 0a 73   iAbsLevel..*/.s
1b080 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
1b090 63 72 6d 65 72 67 65 43 73 72 28 0a 20 20 46 74  crmergeCsr(.  Ft
1b0a0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b0c0 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
1b0d0 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
1b0e0 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c  int64 iAbsLevel,
1b0f0 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c          /* Absol
1b100 75 74 65 20 6c 65 76 65 6c 20 74 6f 20 6f 70 65  ute level to ope
1b110 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 2c  n */.  int nSeg,
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b140 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
1b150 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 33 4d  merge */.  Fts3M
1b160 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
1b170 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr        /* Cu
1b180 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 70  rsor object to p
1b190 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
1b1a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1c0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
1b1d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
1b1e0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20   *pStmt = 0;    
1b1f0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
1b200 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 25 5f   used to read %_
1b210 73 65 67 64 69 72 20 65 6e 74 72 79 20 2a 2f 20  segdir entry */ 
1b220 20 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20   .  int nByte;  
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b240 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 6c      /* Bytes all
1b250 6f 63 61 74 65 64 20 61 74 20 70 43 73 72 2d 3e  ocated at pCsr->
1b260 61 70 53 65 67 6d 65 6e 74 5b 5d 20 2a 2f 0a 0a  apSegment[] */..
1b270 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
1b280 61 63 65 20 66 6f 72 20 74 68 65 20 46 74 73 33  ace for the Fts3
1b290 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61  MultiSegReader.a
1b2a0 43 73 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Csr[] array */. 
1b2b0 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c   memset(pCsr, 0,
1b2c0 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b   sizeof(*pCsr));
1b2d0 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
1b2e0 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  f(Fts3SegReader 
1b2f0 2a 29 20 2a 20 6e 53 65 67 3b 0a 20 20 70 43 73  *) * nSeg;.  pCs
1b300 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 28  r->apSegment = (
1b310 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
1b320 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
1b330 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
1b340 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3d 3d  Csr->apSegment==
1b350 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1b360 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
1b370 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
1b380 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c  pCsr->apSegment,
1b390 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
1b3a0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
1b3b0 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c  (p, SQL_SELECT_L
1b3c0 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  EVEL, &pStmt, 0)
1b3d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1b3e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b3f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1b400 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc2;.    sqlite3
1b410 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
1b420 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29  t, 1, iAbsLevel)
1b430 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1b440 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20  sr->nSegment==0 
1b450 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1b460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b470 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1b480 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1b490 20 26 26 20 69 3c 6e 53 65 67 3b 20 69 2b 2b 29   && i<nSeg; i++)
1b4a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1b4b0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
1b4c0 72 4e 65 77 28 69 2c 20 30 2c 0a 20 20 20 20 20  rNew(i, 0,.     
1b4d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1b4e0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1b4f0 20 31 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73   1),        /* s
1b500 65 67 64 69 72 2e 73 74 61 72 74 5f 62 6c 6f 63  egdir.start_bloc
1b510 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  k */.          s
1b520 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1b530 74 36 34 28 70 53 74 6d 74 2c 20 32 29 2c 20 20  t64(pStmt, 2),  
1b540 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e        /* segdir.
1b550 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
1b560 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1b570 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1b580 36 34 28 70 53 74 6d 74 2c 20 33 29 2c 20 20 20  64(pStmt, 3),   
1b590 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 65       /* segdir.e
1b5a0 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
1b5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1b5c0 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
1b5d0 20 34 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   4),         /* 
1b5e0 73 65 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20  segdir.root */. 
1b5f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b600 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
1b610 74 6d 74 2c 20 34 29 2c 20 20 20 20 20 20 20 20  tmt, 4),        
1b620 2f 2a 20 73 65 67 64 69 72 2e 72 6f 6f 74 20 2a  /* segdir.root *
1b630 2f 0a 20 20 20 20 20 20 20 20 20 20 26 70 43 73  /.          &pCs
1b640 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 0a  r->apSegment[i].
1b650 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
1b660 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  Csr->nSegment++;
1b670 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
1b680 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1b690 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
1b6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1b6b0 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
1b6c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79  return rc;.}..ty
1b6d0 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 63  pedef struct Inc
1b6e0 72 6d 65 72 67 65 57 72 69 74 65 72 20 49 6e 63  rmergeWriter Inc
1b6f0 72 6d 65 72 67 65 57 72 69 74 65 72 3b 0a 74 79  rmergeWriter;.ty
1b700 70 65 64 65 66 20 73 74 72 75 63 74 20 4e 6f 64  pedef struct Nod
1b710 65 57 72 69 74 65 72 20 4e 6f 64 65 57 72 69 74  eWriter NodeWrit
1b720 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1b730 63 74 20 42 6c 6f 62 20 42 6c 6f 62 3b 0a 74 79  ct Blob Blob;.ty
1b740 70 65 64 65 66 20 73 74 72 75 63 74 20 4e 6f 64  pedef struct Nod
1b750 65 52 65 61 64 65 72 20 4e 6f 64 65 52 65 61 64  eReader NodeRead
1b760 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  er;../*.** An in
1b770 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1b780 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1b790 65 20 69 73 20 75 73 65 64 20 61 73 20 61 20 64  e is used as a d
1b7a0 79 6e 61 6d 69 63 20 62 75 66 66 65 72 0a 2a 2a  ynamic buffer.**
1b7b0 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6e 6f 64   to build up nod
1b7c0 65 73 20 6f 72 20 6f 74 68 65 72 20 62 6c 6f 62  es or other blob
1b7d0 73 20 6f 66 20 64 61 74 61 20 69 6e 2e 0a 2a 2a  s of data in..**
1b7e0 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  .** The function
1b7f0 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28   blobGrowBuffer(
1b800 29 20 69 73 20 75 73 65 64 20 74 6f 20 65 78 74  ) is used to ext
1b810 65 6e 64 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  end the allocati
1b820 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 6c  on..*/.struct Bl
1b830 6f 62 20 7b 0a 20 20 63 68 61 72 20 2a 61 3b 20  ob {.  char *a; 
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1b860 72 20 74 6f 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  r to allocation 
1b870 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b8a0 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 6f 66  f valid bytes of
1b8b0 20 64 61 74 61 20 69 6e 20 61 5b 5d 20 2a 2f 0a   data in a[] */.
1b8c0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20    int nAlloc;   
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1b8f0 69 7a 65 20 6f 66 20 61 5b 5d 20 28 6e 41 6c 6c  ize of a[] (nAll
1b900 6f 63 3e 3d 6e 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  oc>=n) */.};../*
1b910 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
1b920 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  re is used to bu
1b930 69 6c 64 20 75 70 20 62 75 66 66 65 72 73 20 63  ild up buffers c
1b940 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e  ontaining segmen
1b950 74 20 62 2d 74 72 65 65 20 0a 2a 2a 20 6e 6f 64  t b-tree .** nod
1b960 65 73 20 28 62 6c 6f 63 6b 73 29 2e 0a 2a 2f 0a  es (blocks)..*/.
1b970 73 74 72 75 63 74 20 4e 6f 64 65 57 72 69 74 65  struct NodeWrite
1b980 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  r {.  sqlite3_in
1b990 74 36 34 20 69 42 6c 6f 63 6b 3b 20 20 20 20 20  t64 iBlock;     
1b9a0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1b9b0 20 62 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 42   block id */.  B
1b9c0 6c 6f 62 20 6b 65 79 3b 20 20 20 20 20 20 20 20  lob key;        
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b9e0 2a 20 4c 61 73 74 20 6b 65 79 20 77 72 69 74 74  * Last key writt
1b9f0 65 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  en to the curren
1ba00 74 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 42 6c 6f  t block */.  Blo
1ba10 62 20 62 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  b block;        
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba30 43 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 6d  Current block im
1ba40 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  age */.};../*.**
1ba50 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68   An object of th
1ba60 69 73 20 74 79 70 65 20 63 6f 6e 74 61 69 6e 73  is type contains
1ba70 20 74 68 65 20 73 74 61 74 65 20 72 65 71 75 69   the state requi
1ba80 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 72  red to create or
1ba90 20 61 70 70 65 6e 64 0a 2a 2a 20 74 6f 20 61 6e   append.** to an
1baa0 20 61 70 70 65 6e 64 61 62 6c 65 20 62 2d 74 72   appendable b-tr
1bab0 65 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ee segment..*/.s
1bac0 74 72 75 63 74 20 49 6e 63 72 6d 65 72 67 65 57  truct IncrmergeW
1bad0 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c  riter {.  int nL
1bae0 65 61 66 45 73 74 3b 20 20 20 20 20 20 20 20 20  eafEst;         
1baf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1bb00 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1bb10 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 2a 2f 0a   leaf blocks */.
1bb20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20    int nWork;    
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1bb50 65 61 66 20 70 61 67 65 73 20 66 6c 75 73 68 65  eaf pages flushe
1bb60 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
1bb70 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 3b 20  nt64 iAbsLevel; 
1bb80 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
1bb90 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75  te level of inpu
1bba0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1bbb0 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 2a 6f 75 74  /* Index of *out
1bbe0 70 75 74 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20  put* segment in 
1bbf0 69 41 62 73 4c 65 76 65 6c 2b 31 20 2a 2f 0a 20  iAbsLevel+1 */. 
1bc00 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1bc10 53 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  Start;          
1bc20 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72   /* Block number
1bc30 20 6f 66 20 66 69 72 73 74 20 61 6c 6c 6f 63 61   of first alloca
1bc40 74 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73  ted block */.  s
1bc50 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
1bc60 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
1bc70 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f  * Block number o
1bc80 66 20 6c 61 73 74 20 61 6c 6c 6f 63 61 74 65 64  f last allocated
1bc90 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 4e 6f 64 65   block */.  Node
1bca0 57 72 69 74 65 72 20 61 4e 6f 64 65 57 72 69 74  Writer aNodeWrit
1bcb0 65 72 5b 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  er[FTS_MAX_APPEN
1bcc0 44 41 42 4c 45 5f 48 45 49 47 48 54 5d 3b 0a 7d  DABLE_HEIGHT];.}
1bcd0 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65  ;../*.** An obje
1bce0 63 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ct of the follow
1bcf0 69 6e 67 20 74 79 70 65 20 69 73 20 75 73 65 64  ing type is used
1bd00 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
1bd10 6f 6d 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 46  om a single.** F
1bd20 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 2e  TS segment node.
1bd30 20 53 65 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69   See the followi
1bd40 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
1bd50 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64  .**     nodeRead
1bd60 65 72 49 6e 69 74 28 29 0a 2a 2a 20 20 20 20 20  erInit().**     
1bd70 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28 29  nodeReaderNext()
1bd80 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64  .**     nodeRead
1bd90 65 72 52 65 6c 65 61 73 65 28 29 0a 2a 2f 0a 73  erRelease().*/.s
1bda0 74 72 75 63 74 20 4e 6f 64 65 52 65 61 64 65 72  truct NodeReader
1bdb0 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
1bdc0 2a 61 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4e  *aNode;.  int nN
1bdd0 6f 64 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  ode;.  int iOff;
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1be00 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  t offset within 
1be10 61 4e 6f 64 65 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a  aNode[] */..  /*
1be20 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
1be30 73 2e 20 43 6f 6e 74 61 69 6e 69 6e 67 20 74 68  s. Containing th
1be40 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 65  e current node e
1be50 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ntry. */.  sqlit
1be60 65 33 5f 69 6e 74 36 34 20 69 43 68 69 6c 64 3b  e3_int64 iChild;
1be70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1be80 69 6e 74 65 72 20 74 6f 20 63 68 69 6c 64 20 6e  inter to child n
1be90 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 74 65  ode */.  Blob te
1bea0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1beb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1bec0 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f  ent term */.  co
1bed0 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
1bee0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1bef0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
1bf00 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f  ist */.  int nDo
1bf10 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
1bf20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1bf30 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
1bf40 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ytes */.};../*.*
1bf50 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
1bf60 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
1bf70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1bf80 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1bf90 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
1bfa0 77 69 73 65 2c 20 69 66 20 74 68 65 20 61 6c 6c  wise, if the all
1bfb0 6f 63 61 74 69 6f 6e 20 61 74 20 70 42 6c 6f 62  ocation at pBlob
1bfc0 2d 3e 61 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ->a is not alrea
1bfd0 64 79 20 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e  dy at least nMin
1bfe0 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
1bff0 65 2c 20 65 78 74 65 6e 64 20 28 72 65 61 6c 6c  e, extend (reall
1c000 6f 63 29 20 69 74 20 74 6f 20 62 65 20 73 6f 2e  oc) it to be so.
1c010 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
1c020 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1c030 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c 49 54  et *pRc to SQLIT
1c040 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 6c 65 61 76  E_NOMEM and leav
1c050 65 20 70 42 6c 6f 62 2d 3e 61 0a 2a 2a 20 75 6e  e pBlob->a.** un
1c060 6d 6f 64 69 66 69 65 64 2e 20 4f 74 68 65 72 77  modified. Otherw
1c070 69 73 65 2c 20 69 66 20 74 68 65 20 61 6c 6c 6f  ise, if the allo
1c080 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c  cation succeeds,
1c090 20 75 70 64 61 74 65 20 70 42 6c 6f 62 2d 3e 6e   update pBlob->n
1c0a0 41 6c 6c 6f 63 0a 2a 2a 20 74 6f 20 72 65 66 6c  Alloc.** to refl
1c0b0 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65  ect the new size
1c0c0 20 6f 66 20 74 68 65 20 70 42 6c 6f 62 2d 3e 61   of the pBlob->a
1c0d0 5b 5d 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  [] buffer..*/.st
1c0e0 61 74 69 63 20 76 6f 69 64 20 62 6c 6f 62 47 72  atic void blobGr
1c0f0 6f 77 42 75 66 66 65 72 28 42 6c 6f 62 20 2a 70  owBuffer(Blob *p
1c100 42 6c 6f 62 2c 20 69 6e 74 20 6e 4d 69 6e 2c 20  Blob, int nMin, 
1c110 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 66 28  int *pRc){.  if(
1c120 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
1c130 20 26 26 20 6e 4d 69 6e 3e 70 42 6c 6f 62 2d 3e   && nMin>pBlob->
1c140 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  nAlloc ){.    in
1c150 74 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 69 6e 3b  t nAlloc = nMin;
1c160 0a 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20 28  .    char *a = (
1c170 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 72  char *)sqlite3_r
1c180 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2d 3e 61 2c  ealloc(pBlob->a,
1c190 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66   nAlloc);.    if
1c1a0 28 20 61 20 29 7b 0a 20 20 20 20 20 20 70 42 6c  ( a ){.      pBl
1c1b0 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c  ob->nAlloc = nAl
1c1c0 6c 6f 63 3b 0a 20 20 20 20 20 20 70 42 6c 6f 62  loc;.      pBlob
1c1d0 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c  ->a = a;.    }el
1c1e0 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
1c1f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c200 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1c210 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 64 76  * Attempt to adv
1c220 61 6e 63 65 20 74 68 65 20 6e 6f 64 65 2d 72 65  ance the node-re
1c230 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ader object pass
1c240 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1c250 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 74  argument to.** t
1c260 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 6f 6e  he next entry on
1c270 20 74 68 65 20 6e 6f 64 65 2e 20 0a 2a 2a 0a 2a   the node. .**.*
1c280 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
1c290 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
1c2a0 6f 72 20 6f 63 63 75 72 73 20 28 53 51 4c 49 54  or occurs (SQLIT
1c2b0 45 5f 4e 4f 4d 45 4d 20 69 73 20 70 6f 73 73 69  E_NOMEM is possi
1c2c0 62 6c 65 29 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  ble). .** Otherw
1c2d0 69 73 65 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ise return SQLIT
1c2e0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1c2f0 73 20 6e 6f 20 6e 65 78 74 20 65 6e 74 72 79 20  s no next entry 
1c300 6f 6e 20 74 68 65 20 6e 6f 64 65 0a 2a 2a 20 28  on the node.** (
1c310 65 2e 67 2e 20 62 65 63 61 75 73 65 20 74 68 65  e.g. because the
1c320 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69   current entry i
1c330 73 20 74 68 65 20 6c 61 73 74 29 20 73 65 74 20  s the last) set 
1c340 4e 6f 64 65 52 65 61 64 65 72 2d 3e 61 4e 6f 64  NodeReader->aNod
1c350 65 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 20 74 6f 20  e to.** NULL to 
1c360 69 6e 64 69 63 61 74 65 20 45 4f 46 2e 20 4f 74  indicate EOF. Ot
1c370 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
1c380 65 20 74 68 65 20 4e 6f 64 65 52 65 61 64 65 72  e the NodeReader
1c390 20 73 74 72 75 63 74 75 72 65 20 6f 75 74 70 75   structure outpu
1c3a0 74 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  t .** variables 
1c3b0 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
1c3c0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1c3d0 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
1c3e0 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 29 7b 0a  NodeReader *p){.
1c3f0 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28    int bFirst = (
1c400 70 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 29 3b 20 20  p->term.n==0);  
1c410 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69    /* True for fi
1c420 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  rst term on the 
1c430 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  node */.  int nP
1c440 72 65 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20  refix = 0;      
1c450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1c460 65 73 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20  es to copy from 
1c470 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  previous term */
1c480 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 20 3d  .  int nSuffix =
1c490 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c4a0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
1c4b0 70 70 65 6e 64 20 74 6f 20 74 68 65 20 70 72 65  ppend to the pre
1c4c0 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  fix */.  int rc 
1c4d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1c4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c4f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
1c500 73 65 72 74 28 20 70 2d 3e 61 4e 6f 64 65 20 29  sert( p->aNode )
1c510 3b 0a 20 20 69 66 28 20 70 2d 3e 69 43 68 69 6c  ;.  if( p->iChil
1c520 64 20 26 26 20 62 46 69 72 73 74 3d 3d 30 20 29  d && bFirst==0 )
1c530 20 70 2d 3e 69 43 68 69 6c 64 2b 2b 3b 0a 20 20   p->iChild++;.  
1c540 69 66 28 20 70 2d 3e 69 4f 66 66 3e 3d 70 2d 3e  if( p->iOff>=p->
1c550 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nNode ){.    /* 
1c560 45 4f 46 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4e  EOF */.    p->aN
1c570 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ode = 0;.  }else
1c580 7b 0a 20 20 20 20 69 66 28 20 62 46 69 72 73 74  {.    if( bFirst
1c590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1c5a0 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
1c5b0 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts3GetVarint32(&
1c5c0 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1c5d0 5d 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20  ], &nPrefix);.  
1c5e0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20    }.    p->iOff 
1c5f0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
1c600 74 56 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e  tVarint32(&p->aN
1c610 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 6e  ode[p->iOff], &n
1c620 53 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 62 6c  Suffix);..    bl
1c630 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 2d  obGrowBuffer(&p-
1c640 3e 74 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 6e  >term, nPrefix+n
1c650 53 75 66 66 69 78 2c 20 26 72 63 29 3b 0a 20 20  Suffix, &rc);.  
1c660 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c670 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
1c680 63 70 79 28 26 70 2d 3e 74 65 72 6d 2e 61 5b 6e  cpy(&p->term.a[n
1c690 50 72 65 66 69 78 5d 2c 20 26 70 2d 3e 61 4e 6f  Prefix], &p->aNo
1c6a0 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 6e 53 75  de[p->iOff], nSu
1c6b0 66 66 69 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ffix);.      p->
1c6c0 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 66 69 78  term.n = nPrefix
1c6d0 2b 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20  +nSuffix;.      
1c6e0 70 2d 3e 69 4f 66 66 20 2b 3d 20 6e 53 75 66 66  p->iOff += nSuff
1c6f0 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ix;.      if( p-
1c700 3e 69 43 68 69 6c 64 3d 3d 30 20 29 7b 0a 20 20  >iChild==0 ){.  
1c710 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d        p->iOff +=
1c720 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
1c730 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64  arint32(&p->aNod
1c740 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e  e[p->iOff], &p->
1c750 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
1c760 20 20 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20 3d     p->aDoclist =
1c770 20 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f   &p->aNode[p->iO
1c780 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ff];.        p->
1c790 69 4f 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63 6c  iOff += p->nDocl
1c7a0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1c7b0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1c7c0 28 20 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e  ( p->iOff<=p->nN
1c7d0 6f 64 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ode );..  return
1c7e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1c7f0 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69  lease all dynami
1c800 63 20 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64  c resources held
1c810 20 62 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20   by node-reader 
1c820 6f 62 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74  object *p..*/.st
1c830 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65  atic void nodeRe
1c840 61 64 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65  aderRelease(Node
1c850 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71  Reader *p){.  sq
1c860 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65  lite3_free(p->te
1c870 72 6d 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rm.a);.}../*.** 
1c880 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64  Initialize a nod
1c890 65 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20  e-reader object 
1c8a0 74 6f 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65  to read the node
1c8b0 20 69 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65   in buffer aNode
1c8c0 2f 6e 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  /nNode..**.** If
1c8d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
1c8e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c8f0 65 64 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52  ed and the NodeR
1c900 65 61 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74  eader object set
1c910 20 74 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   to .** point to
1c920 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1c930 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66   on the node (if
1c940 20 61 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65   any). Otherwise
1c950 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
1c960 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1c970 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1c980 20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49   int nodeReaderI
1c990 6e 69 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a  nit(NodeReader *
1c9a0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  p, const char *a
1c9b0 4e 6f 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29  Node, int nNode)
1c9c0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1c9d0 20 73 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64   sizeof(NodeRead
1c9e0 65 72 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65  er));.  p->aNode
1c9f0 20 3d 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e   = aNode;.  p->n
1ca00 4e 6f 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20  Node = nNode;.. 
1ca10 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
1ca20 66 20 74 68 69 73 20 69 73 20 61 20 6c 65 61 66  f this is a leaf
1ca30 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   or an internal 
1ca40 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  node. */.  if( p
1ca50 2d 3e 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20  ->aNode[0] ){.  
1ca60 20 20 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c    /* An internal
1ca70 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d   node. */.    p-
1ca80 3e 69 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69  >iOff = 1 + sqli
1ca90 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
1caa0 28 26 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26  (&p->aNode[1], &
1cab0 70 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65  p->iChild);.  }e
1cac0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66  lse{.    p->iOff
1cad0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
1cae0 75 72 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65  urn nodeReaderNe
1caf0 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xt(p);.}../*.** 
1cb00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1cb10 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72   called while wr
1cb20 69 74 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67  iting an FTS seg
1cb30 6d 65 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61  ment each time a
1cb40 20 6c 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20   leaf o.** node 
1cb50 69 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  is finished and 
1cb60 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1cb70 20 54 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f   The key (zTerm/
1cb80 6e 54 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e  nTerm) is guaran
1cb90 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72  teed.** to be gr
1cba0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
1cbb0 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68  argest key on th
1cbc0 65 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74  e node just writ
1cbd0 74 65 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72  ten, but smaller
1cbe0 0a 2a 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61  .** than or equa
1cbf0 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b  l to the first k
1cc00 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ey that will be 
1cc10 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e  written to the n
1cc20 65 78 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65  ext leaf.** node
1cc30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63  ..**.** The bloc
1cc40 6b 20 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66  k id of the leaf
1cc50 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
1cc60 65 6e 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62  en to disk may b
1cc70 65 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70  e found in.** (p
1cc80 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
1cc90 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77  ter[0].iBlock) w
1cca0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1ccb0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
1ccc0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
1ccd0 6e 63 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20  ncrmergePush(.  
1cce0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61  /* Fts3 table ha
1cd10 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  ndle */.  Incrme
1cd20 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
1cd30 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er,       /* Wri
1cd40 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
1cd50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
1cd60 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1cd70 2f 2a 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65  /* Term to write
1cd80 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   to internal nod
1cd90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  e */.  int nTerm
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1cdc0 61 74 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20  at zTerm */.){. 
1cdd0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1cde0 50 74 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61  Ptr = pWriter->a
1cdf0 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42  NodeWriter[0].iB
1ce00 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79  lock;.  int iLay
1ce10 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  er;..  assert( n
1ce20 54 65 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28  Term>0 );.  for(
1ce30 69 4c 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53  iLayer=1; ALWAYS
1ce40 28 69 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f  (iLayer<FTS_MAX_
1ce50 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
1ce60 54 29 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20  T); iLayer++){. 
1ce70 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1ce80 20 69 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20   iNextPtr = 0;. 
1ce90 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70     NodeWriter *p
1cea0 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
1ceb0 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61  >aNodeWriter[iLa
1cec0 79 65 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63  yer];.    int rc
1ced0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cee0 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20    int nPrefix;. 
1cef0 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a     int nSuffix;.
1cf00 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a      int nSpace;.
1cf10 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
1cf20 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
1cf30 65 20 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63  e the key will c
1cf40 6f 6e 73 75 6d 65 20 69 66 20 69 74 20 69 73 20  onsume if it is 
1cf50 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
1cf60 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  * the current no
1cf70 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79  de of layer iLay
1cf80 65 72 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70  er. Due to the p
1cf90 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
1cfa0 6e 2c 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  n, .    ** the s
1cfb0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 63 68  pace required ch
1cfc0 61 6e 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20  anges depending 
1cfd0 6f 6e 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68  on which node th
1cfe0 65 20 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20  e key is to.    
1cff0 2a 2a 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20  ** be added to. 
1d000 20 2a 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20   */.    nPrefix 
1d010 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
1d020 72 65 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  ress(pNode->key.
1d030 61 2c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c  a, pNode->key.n,
1d040 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
1d050 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
1d060 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20  erm - nPrefix;. 
1d070 20 20 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c     nSpace  = sql
1d080 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
1d090 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20  n(nPrefix);.    
1d0a0 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65  nSpace += sqlite
1d0b0 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
1d0c0 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69  Suffix) + nSuffi
1d0d0 78 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  x;..    if( pNod
1d0e0 65 2d 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28  e->key.n==0 || (
1d0f0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b  pNode->block.n +
1d100 20 6e 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f   nSpace)<=p->nNo
1d110 64 65 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20  deSize ){ .     
1d120 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1d130 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72  nt node of layer
1d140 20 69 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73   iLayer contains
1d150 20 7a 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69   zero keys, or i
1d160 66 20 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a  f adding.      *
1d170 2a 20 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20  * the key to it 
1d180 77 69 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69  will not cause i
1d190 74 20 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72  t to grow to lar
1d1a0 67 65 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69  ger than nNodeSi
1d1b0 7a 65 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ze .      ** byt
1d1c0 65 73 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74  es in size, writ
1d1d0 65 20 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20  e the key here. 
1d1e0 20 2a 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20   */..      Blob 
1d1f0 2a 70 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e  *pBlk = &pNode->
1d200 62 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28  block;.      if(
1d210 20 70 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBlk->n==0 ){. 
1d220 20 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42         blobGrowB
1d230 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e  uffer(pBlk, p->n
1d240 4e 6f 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a  NodeSize, &rc);.
1d250 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1d260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d270 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30         pBlk->a[0
1d280 5d 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72  ] = (char)iLayer
1d290 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b  ;.          pBlk
1d2a0 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ->n = 1 + sqlite
1d2b0 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
1d2c0 70 42 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72  pBlk->a[1], iPtr
1d2d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d2e0 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47     }.      blobG
1d2f0 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20  rowBuffer(pBlk, 
1d300 70 42 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65  pBlk->n + nSpace
1d310 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c  , &rc);.      bl
1d320 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e  obGrowBuffer(&pN
1d330 6f 64 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c  ode->key, nTerm,
1d340 20 26 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66   &rc);..      if
1d350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d360 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1d370 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20  Node->key.n ){. 
1d380 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e           pBlk->n
1d390 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
1d3a0 75 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e  utVarint(&pBlk->
1d3b0 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65  a[pBlk->n], nPre
1d3c0 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fix);.        }.
1d3d0 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20          pBlk->n 
1d3e0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
1d3f0 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61  tVarint(&pBlk->a
1d400 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66  [pBlk->n], nSuff
1d410 69 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ix);.        mem
1d420 63 70 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c  cpy(&pBlk->a[pBl
1d430 6b 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50  k->n], &zTerm[nP
1d440 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29  refix], nSuffix)
1d450 3b 0a 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e  ;.        pBlk->
1d460 6e 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20  n += nSuffix;.. 
1d470 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
1d480 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72  ode->key.a, zTer
1d490 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
1d4a0 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20     pNode->key.n 
1d4b0 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
1d4c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d4d0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1d4e0 66 6c 75 73 68 20 74 68 65 20 74 68 65 20 63 75  flush the the cu
1d4f0 72 72 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61  rrent node of la
1d500 79 65 72 20 69 4c 61 79 65 72 20 74 6f 20 64 69  yer iLayer to di
1d510 73 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  sk..      ** The
1d520 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
1d530 2c 20 65 6d 70 74 79 20 73 69 62 6c 69 6e 67 20  , empty sibling 
1d540 6e 6f 64 65 2e 20 54 68 65 20 6b 65 79 20 77 69  node. The key wi
1d550 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ll be written.  
1d560 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
1d570 70 61 72 65 6e 74 20 6f 66 20 74 68 69 73 20 6e  parent of this n
1d580 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ode. */.      rc
1d590 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d   = fts3WriteSegm
1d5a0 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d 3e 69 42  ent(p, pNode->iB
1d5b0 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  lock, pNode->blo
1d5c0 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  ck.a, pNode->blo
1d5d0 63 6b 2e 6e 29 3b 0a 0a 20 20 20 20 20 20 61 73  ck.n);..      as
1d5e0 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f  sert( pNode->blo
1d5f0 63 6b 2e 6e 41 6c 6c 6f 63 3e 3d 70 2d 3e 6e 4e  ck.nAlloc>=p->nN
1d600 6f 64 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  odeSize );.     
1d610 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b   pNode->block.a[
1d620 30 5d 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65  0] = (char)iLaye
1d630 72 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  r;.      pNode->
1d640 62 6c 6f 63 6b 2e 6e 20 3d 20 31 20 2b 20 73 71  block.n = 1 + sq
1d650 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1d660 6e 74 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  nt(&pNode->block
1d670 2e 61 5b 31 5d 2c 20 69 50 74 72 2b 31 29 3b 0a  .a[1], iPtr+1);.
1d680 0a 20 20 20 20 20 20 69 4e 65 78 74 50 74 72 20  .      iNextPtr 
1d690 3d 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 3b  = pNode->iBlock;
1d6a0 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42  .      pNode->iB
1d6b0 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4e  lock++;.      pN
1d6c0 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a  ode->key.n = 0;.
1d6d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1d6e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1d6f0 69 4e 65 78 74 50 74 72 3d 3d 30 20 29 20 72 65  iNextPtr==0 ) re
1d700 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 50 74  turn rc;.    iPt
1d710 72 20 3d 20 69 4e 65 78 74 50 74 72 3b 0a 20 20  r = iNextPtr;.  
1d720 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  }..  assert( 0 )
1d730 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1d740 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1d750 74 65 72 6d 20 61 6e 64 20 28 6f 70 74 69 6f 6e  term and (option
1d760 61 6c 6c 79 29 20 64 6f 63 6c 69 73 74 20 74 6f  ally) doclist to
1d770 20 74 68 65 20 46 54 53 20 73 65 67 6d 65 6e 74   the FTS segment
1d780 20 6e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 0a   node currently.
1d790 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 62 6c 6f  ** stored in blo
1d7a0 62 20 2a 70 4e 6f 64 65 2e 20 54 68 65 20 6e 6f  b *pNode. The no
1d7b0 64 65 20 6e 65 65 64 20 6e 6f 74 20 63 6f 6e 74  de need not cont
1d7c0 61 69 6e 20 61 6e 79 20 74 65 72 6d 73 2c 20 62  ain any terms, b
1d7d0 75 74 20 74 68 65 0a 2a 2a 20 68 65 61 64 65 72  ut the.** header
1d7e0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1d7f0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1d800 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1d810 0a 2a 2a 0a 2a 2a 20 41 20 6e 6f 64 65 20 68 65  .**.** A node he
1d820 61 64 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65  ader is a single
1d830 20 30 78 30 30 20 62 79 74 65 20 66 6f 72 20 61   0x00 byte for a
1d840 20 6c 65 61 66 20 6e 6f 64 65 2c 20 6f 72 20 61   leaf node, or a
1d850 20 68 65 69 67 68 74 20 76 61 72 69 6e 74 0a 2a   height varint.*
1d860 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  * followed by th
1d870 65 20 6c 65 66 74 2d 68 61 6e 64 2d 63 68 69 6c  e left-hand-chil
1d880 64 20 76 61 72 69 6e 74 20 66 6f 72 20 61 6e 20  d varint for an 
1d890 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a  internal node..*
1d8a0 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 74 6f  *.** The term to
1d8b0 20 62 65 20 61 70 70 65 6e 64 65 64 20 69 73 20   be appended is 
1d8c0 70 61 73 73 65 64 20 76 69 61 20 61 72 67 75 6d  passed via argum
1d8d0 65 6e 74 73 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  ents zTerm/nTerm
1d8e0 2e 20 46 6f 72 20 61 20 0a 2a 2a 20 6c 65 61 66  . For a .** leaf
1d8f0 20 6e 6f 64 65 2c 20 74 68 65 20 64 6f 63 6c 69   node, the docli
1d900 73 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  st is passed as 
1d910 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73  aDoclist/nDoclis
1d920 74 2e 20 46 6f 72 20 61 6e 20 69 6e 74 65 72 6e  t. For an intern
1d930 61 6c 0a 2a 2a 20 6e 6f 64 65 2c 20 62 6f 74 68  al.** node, both
1d940 20 61 44 6f 63 6c 69 73 74 20 61 6e 64 20 6e 44   aDoclist and nD
1d950 6f 63 6c 69 73 74 20 6d 75 73 74 20 62 65 20 70  oclist must be p
1d960 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  assed 0..**.** I
1d970 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1d980 65 20 76 61 6c 75 65 20 69 6e 20 62 6c 6f 62 20  e value in blob 
1d990 70 50 72 65 76 20 69 73 20 7a 65 72 6f 2c 20 74  pPrev is zero, t
1d9a0 68 65 6e 20 74 68 69 73 20 69 73 20 74 68 65 20  hen this is the 
1d9b0 66 69 72 73 74 0a 2a 2a 20 74 65 72 6d 20 77 72  first.** term wr
1d9c0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 6f 64  itten to the nod
1d9d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 50  e. Otherwise, pP
1d9e0 72 65 76 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  rev contains a c
1d9f0 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  opy of the .** p
1da00 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 42 65  revious term. Be
1da10 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1da20 6f 6e 20 72 65 74 75 72 6e 73 2c 20 69 74 20 69  on returns, it i
1da30 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
1da40 74 61 69 6e 20 61 0a 2a 2a 20 63 6f 70 79 20 6f  tain a.** copy o
1da50 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a  f zTerm/nTerm..*
1da60 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
1da70 65 64 20 74 68 61 74 20 74 68 65 20 62 75 66 66  ed that the buff
1da80 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
1da90 74 68 20 70 4e 6f 64 65 20 69 73 20 61 6c 72 65  th pNode is alre
1daa0 61 64 79 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f  ady large.** eno
1dab0 75 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  ugh to accommoda
1dac0 74 65 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  te the new entry
1dad0 2e 20 54 68 65 20 62 75 66 66 65 72 20 61 73 73  . The buffer ass
1dae0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72  ociated with pPr
1daf0 65 76 0a 2a 2a 20 69 73 20 65 78 74 65 6e 64 65  ev.** is extende
1db00 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1db10 6f 6e 20 69 66 20 72 65 71 75 72 69 72 65 64 2e  on if requrired.
1db20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1db30 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 63 6f 6e  or (i.e. OOM con
1db40 64 69 74 69 6f 6e 29 20 6f 63 63 75 72 73 2c 20  dition) occurs, 
1db50 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1db60 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
1db70 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1db80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1db90 61 74 69 63 20 69 6e 74 20 66 74 73 33 41 70 70  atic int fts3App
1dba0 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20 42 6c 6f  endToNode(.  Blo
1dbb0 62 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20  b *pNode,       
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbd0 43 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 6d 61  Current node ima
1dbe0 67 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ge to append to 
1dbf0 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 50 72 65 76  */.  Blob *pPrev
1dc00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dc10 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
1dc20 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
1dc30 75 73 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  us term written 
1dc40 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1dc50 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
1dc60 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 72 6d       /* New term
1dc70 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
1dc80 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20  nt nTerm,       
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dca0 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
1dcb0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f  in bytes */.  co
1dcc0 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
1dcd0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st,           /*
1dce0 20 44 6f 63 6c 69 73 74 20 28 6f 72 20 4e 55 4c   Doclist (or NUL
1dcf0 4c 29 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  L) to write */. 
1dd00 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20   int nDoclist   
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44 6f 63   /* Size of aDoc
1dd30 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
1dd40 20 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20   .){.  int rc = 
1dd50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1dd60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1dd70 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62   code */.  int b
1dd80 46 69 72 73 74 20 3d 20 28 70 50 72 65 76 2d 3e  First = (pPrev->
1dd90 6e 3d 3d 30 29 3b 20 20 20 20 20 2f 2a 20 54 72  n==0);     /* Tr
1dda0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
1ddb0 65 20 66 69 72 73 74 20 74 65 72 6d 20 77 72 69  e first term wri
1ddc0 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  tten */.  int nP
1ddd0 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
1dde0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ddf0 65 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78  e of term prefix
1de00 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1de10 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20  nt nSuffix;     
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de30 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73  * Size of term s
1de40 75 66 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a  uffix in bytes *
1de50 2f 0a 0a 20 20 2f 2a 20 4e 6f 64 65 20 6d 75 73  /..  /* Node mus
1de60 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
1de70 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65  een started. The
1de80 72 65 20 6d 75 73 74 20 62 65 20 61 20 64 6f 63  re must be a doc
1de90 6c 69 73 74 20 66 6f 72 20 61 0a 20 20 2a 2a 20  list for a.  ** 
1dea0 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 74  leaf node, and t
1deb0 68 65 72 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  here must not be
1dec0 20 61 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 61   a doclist for a
1ded0 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  n internal node.
1dee0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1def0 4e 6f 64 65 2d 3e 6e 3e 30 20 29 3b 0a 20 20 61  Node->n>0 );.  a
1df00 73 73 65 72 74 28 20 28 70 4e 6f 64 65 2d 3e 61  ssert( (pNode->a
1df10 5b 30 5d 3d 3d 27 5c 30 27 29 3d 3d 28 61 44 6f  [0]=='\0')==(aDo
1df20 63 6c 69 73 74 21 3d 30 29 20 29 3b 0a 0a 20 20  clist!=0) );..  
1df30 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70  blobGrowBuffer(p
1df40 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 26 72 63  Prev, nTerm, &rc
1df50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1df60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1df70 72 63 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d  rc;..  nPrefix =
1df80 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
1df90 65 73 73 28 70 50 72 65 76 2d 3e 61 2c 20 70 50  ess(pPrev->a, pP
1dfa0 72 65 76 2d 3e 6e 2c 20 7a 54 65 72 6d 2c 20 6e  rev->n, zTerm, n
1dfb0 54 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78  Term);.  nSuffix
1dfc0 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66   = nTerm - nPref
1dfd0 69 78 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 72  ix;.  memcpy(pPr
1dfe0 65 76 2d 3e 61 2c 20 7a 54 65 72 6d 2c 20 6e 54  ev->a, zTerm, nT
1dff0 65 72 6d 29 3b 0a 20 20 70 50 72 65 76 2d 3e 6e  erm);.  pPrev->n
1e000 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 69 66 28   = nTerm;..  if(
1e010 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20   bFirst==0 ){.  
1e020 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71    pNode->n += sq
1e030 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1e040 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f  nt(&pNode->a[pNo
1e050 64 65 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69 78 29  de->n], nPrefix)
1e060 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 6e  ;.  }.  pNode->n
1e070 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
1e080 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d  utVarint(&pNode-
1e090 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 53  >a[pNode->n], nS
1e0a0 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79  uffix);.  memcpy
1e0b0 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65  (&pNode->a[pNode
1e0c0 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ->n], &zTerm[nPr
1e0d0 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
1e0e0 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e  .  pNode->n += n
1e0f0 53 75 66 66 69 78 3b 0a 0a 20 20 69 66 28 20 61  Suffix;..  if( a
1e100 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 70  Doclist ){.    p
1e110 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  Node->n += sqlit
1e120 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
1e130 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d  &pNode->a[pNode-
1e140 3e 6e 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  >n], nDoclist);.
1e150 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64      memcpy(&pNod
1e160 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20  e->a[pNode->n], 
1e170 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69  aDoclist, nDocli
1e180 73 74 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  st);.    pNode->
1e190 6e 20 2b 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20  n += nDoclist;. 
1e1a0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e   }..  assert( pN
1e1b0 6f 64 65 2d 3e 6e 3c 3d 70 4e 6f 64 65 2d 3e 6e  ode->n<=pNode->n
1e1c0 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 72 65 74 75  Alloc );..  retu
1e1d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e1e0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  ./*.** Append th
1e1f0 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61  e current term a
1e200 6e 64 20 64 6f 63 6c 69 73 74 20 70 6f 69 6e 74  nd doclist point
1e210 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
1e220 70 43 73 72 20 74 6f 20 74 68 65 0a 2a 2a 20 61  pCsr to the.** a
1e230 70 70 65 6e 64 61 62 6c 65 20 62 2d 74 72 65 65  ppendable b-tree
1e240 20 73 65 67 6d 65 6e 74 20 6f 70 65 6e 65 64 20   segment opened 
1e250 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 70  for writing by p
1e260 57 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  Writer..**.** Re
1e270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1e280 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1e290 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e2a0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1e2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1e2c0 74 73 33 49 6e 63 72 6d 65 72 67 65 41 70 70 65  ts3IncrmergeAppe
1e2d0 6e 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  nd(.  Fts3Table 
1e2e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1e2f0 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61        /* Fts3 ta
1e300 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
1e310 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20  IncrmergeWriter 
1e320 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
1e330 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1e340 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
1e350 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20  egReader *pCsr  
1e360 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1e370 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
1e380 61 6e 64 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 29  and doclist */.)
1e390 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1e3a0 7a 54 65 72 6d 20 3d 20 70 43 73 72 2d 3e 7a 54  zTerm = pCsr->zT
1e3b0 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  erm;.  int nTerm
1e3c0 20 3d 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a   = pCsr->nTerm;.
1e3d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44    const char *aD
1e3e0 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61  oclist = pCsr->a
1e3f0 44 6f 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  Doclist;.  int n
1e400 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
1e410 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20  nDoclist;.  int 
1e420 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e440 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e450 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
1e460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e470 6f 74 61 6c 20 73 70 61 63 65 20 69 6e 20 62 79  otal space in by
1e480 74 65 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  tes required on 
1e490 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  leaf */.  int nP
1e4a0 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
1e4b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1e4c0 6f 66 20 70 72 65 66 69 78 20 73 68 61 72 65 64  of prefix shared
1e4d0 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 74   with previous t
1e4e0 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  erm */.  int nSu
1e4f0 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
1e500 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1e510 66 20 73 75 66 66 69 78 20 28 6e 54 65 72 6d 20  f suffix (nTerm 
1e520 2d 20 6e 50 72 65 66 69 78 29 20 2a 2f 0a 20 20  - nPrefix) */.  
1e530 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4c 65 61  NodeWriter *pLea
1e540 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
1e550 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
1e560 77 72 69 74 65 20 6c 65 61 66 20 6e 6f 64 65 73  write leaf nodes
1e570 20 2a 2f 0a 0a 20 20 70 4c 65 61 66 20 3d 20 26   */..  pLeaf = &
1e580 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
1e590 69 74 65 72 5b 30 5d 3b 0a 20 20 6e 50 72 65 66  iter[0];.  nPref
1e5a0 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43  ix = fts3PrefixC
1e5b0 6f 6d 70 72 65 73 73 28 70 4c 65 61 66 2d 3e 6b  ompress(pLeaf->k
1e5c0 65 79 2e 61 2c 20 70 4c 65 61 66 2d 3e 6b 65 79  ey.a, pLeaf->key
1e5d0 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  .n, zTerm, nTerm
1e5e0 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  );.  nSuffix = n
1e5f0 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a  Term - nPrefix;.
1e600 0a 20 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c  .  nSpace  = sql
1e610 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
1e620 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 53  n(nPrefix);.  nS
1e630 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
1e640 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
1e650 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b  ffix) + nSuffix;
1e660 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c  .  nSpace += sql
1e670 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
1e680 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 6e 44  n(nDoclist) + nD
1e690 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 49 66  oclist;..  /* If
1e6a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 6c 6f   the current blo
1e6b0 63 6b 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  ck is not empty,
1e6c0 20 61 6e 64 20 69 66 20 61 64 64 69 6e 67 20 74   and if adding t
1e6d0 68 69 73 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74  his term/doclist
1e6e0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 75 72  .  ** to the cur
1e6f0 72 65 6e 74 20 62 6c 6f 63 6b 20 77 6f 75 6c 64  rent block would
1e700 20 6d 61 6b 65 20 69 74 20 6c 61 72 67 65 72 20   make it larger 
1e710 74 68 61 6e 20 46 74 73 33 54 61 62 6c 65 2e 6e  than Fts3Table.n
1e720 4e 6f 64 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  NodeSize.  ** by
1e730 74 65 73 2c 20 77 72 69 74 65 20 74 68 69 73 20  tes, write this 
1e740 62 6c 6f 63 6b 20 6f 75 74 20 74 6f 20 74 68 65  block out to the
1e750 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20   database. */.  
1e760 69 66 28 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b  if( pLeaf->block
1e770 2e 6e 3e 30 20 26 26 20 28 70 4c 65 61 66 2d 3e  .n>0 && (pLeaf->
1e780 62 6c 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65  block.n + nSpace
1e790 29 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29  )>p->nNodeSize )
1e7a0 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57  {.    rc = fts3W
1e7b0 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  riteSegment(p, p
1e7c0 4c 65 61 66 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4c  Leaf->iBlock, pL
1e7d0 65 61 66 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4c  eaf->block.a, pL
1e7e0 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20  eaf->block.n);. 
1e7f0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72     pWriter->nWor
1e800 6b 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  k++;..    /* Add
1e810 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
1e820 6d 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  m to the parent 
1e830 6e 6f 64 65 2e 20 54 68 65 20 74 65 72 6d 20 61  node. The term a
1e840 64 64 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20  dded to the .   
1e850 20 2a 2a 20 70 61 72 65 6e 74 20 6d 75 73 74 3a   ** parent must:
1e860 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1e870 20 61 29 20 62 65 20 67 72 65 61 74 65 72 20 74   a) be greater t
1e880 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
1e890 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66  term on the leaf
1e8a0 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
1e8b0 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  en.    **      t
1e8c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
1e8d0 73 74 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  still available 
1e8e0 69 6e 20 70 4c 65 61 66 2d 3e 6b 65 79 29 2c 20  in pLeaf->key), 
1e8f0 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  and.    **.    *
1e900 2a 20 20 20 62 29 20 62 65 20 6c 65 73 73 20 74  *   b) be less t
1e910 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1e920 74 68 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74  the term about t
1e930 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
1e940 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20  e new.    **    
1e950 20 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65    leaf node (zTe
1e960 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a  rm/nTerm)..    *
1e970 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  *.    ** In othe
1e980 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74  r words, it must
1e990 20 62 65 20 74 68 65 20 70 72 65 66 69 78 20 6f   be the prefix o
1e9a0 66 20 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c  f zTerm 1 byte l
1e9b0 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  onger than.    *
1e9c0 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  * the common pre
1e9d0 66 69 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20  fix (if any) of 
1e9e0 7a 54 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65  zTerm and pWrite
1e9f0 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f  r->zTerm..    */
1ea00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ea10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ea20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
1ea30 67 65 50 75 73 68 28 70 2c 20 70 57 72 69 74 65  gePush(p, pWrite
1ea40 72 2c 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69  r, zTerm, nPrefi
1ea50 78 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  x+1);.    }..   
1ea60 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
1ea70 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 62  he next output b
1ea80 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 4c 65 61  lock */.    pLea
1ea90 66 2d 3e 69 42 6c 6f 63 6b 2b 2b 3b 0a 20 20 20  f->iBlock++;.   
1eaa0 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 20 3d 20   pLeaf->key.n = 
1eab0 30 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c  0;.    pLeaf->bl
1eac0 6f 63 6b 2e 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  ock.n = 0;..    
1ead0 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20  nPrefix = 0;.   
1eae0 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
1eaf0 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 20 3d 20  ;.    nSpace  = 
1eb00 31 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d  1;.    nSpace +=
1eb10 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
1eb20 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 2b  ntLen(nSuffix) +
1eb30 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 6e 53   nSuffix;.    nS
1eb40 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
1eb50 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f  ts3VarintLen(nDo
1eb60 63 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73  clist) + nDoclis
1eb70 74 3b 0a 20 20 7d 0a 0a 20 20 62 6c 6f 62 47 72  t;.  }..  blobGr
1eb80 6f 77 42 75 66 66 65 72 28 26 70 4c 65 61 66 2d  owBuffer(&pLeaf-
1eb90 3e 62 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62  >block, pLeaf->b
1eba0 6c 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 2c  lock.n + nSpace,
1ebb0 20 26 72 63 29 3b 0a 0a 20 20 69 66 28 20 72 63   &rc);..  if( rc
1ebc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ebd0 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 6c     if( pLeaf->bl
1ebe0 6f 63 6b 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ock.n==0 ){.    
1ebf0 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e    pLeaf->block.n
1ec00 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4c 65 61   = 1;.      pLea
1ec10 66 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20  f->block.a[0] = 
1ec20 27 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20  '\0';.    }.    
1ec30 72 63 20 3d 20 66 74 73 33 41 70 70 65 6e 64 54  rc = fts3AppendT
1ec40 6f 4e 6f 64 65 28 0a 20 20 20 20 20 20 20 20 26  oNode(.        &
1ec50 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c 20 26 70  pLeaf->block, &p
1ec60 4c 65 61 66 2d 3e 6b 65 79 2c 20 7a 54 65 72 6d  Leaf->key, zTerm
1ec70 2c 20 6e 54 65 72 6d 2c 20 61 44 6f 63 6c 69 73  , nTerm, aDoclis
1ec80 74 2c 20 6e 44 6f 63 6c 69 73 74 0a 20 20 20 20  t, nDoclist.    
1ec90 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1eca0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1ecb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1ecc0 61 6c 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65  alled to release
1ecd0 20 61 6c 6c 20 64 79 6e 61 6d 69 63 20 72 65 73   all dynamic res
1ece0 6f 75 72 63 65 73 20 68 65 6c 64 20 62 79 20 74  ources held by t
1ecf0 68 65 0a 2a 2a 20 6d 65 72 67 65 2d 77 72 69 74  he.** merge-writ
1ed00 65 72 20 6f 62 6a 65 63 74 20 70 57 72 69 74 65  er object pWrite
1ed10 72 2c 20 61 6e 64 20 69 66 20 6e 6f 20 65 72 72  r, and if no err
1ed20 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
1ed30 20 74 6f 20 66 6c 75 73 68 0a 2a 2a 20 61 6c 6c   to flush.** all
1ed40 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6e 6f 64   outstanding nod
1ed50 65 20 62 75 66 66 65 72 73 20 68 65 6c 64 20 62  e buffers held b
1ed60 79 20 70 57 72 69 74 65 72 20 74 6f 20 64 69 73  y pWriter to dis
1ed70 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63  k..**.** If *pRc
1ed80 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
1ed90 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
1eda0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1edb0 74 68 65 6e 20 6e 6f 20 61 74 74 65 6d 70 74 0a  then no attempt.
1edc0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 77 72  ** is made to wr
1edd0 69 74 65 20 61 6e 79 20 64 61 74 61 20 74 6f 20  ite any data to 
1ede0 64 69 73 6b 2e 20 49 6e 73 74 65 61 64 2c 20 74  disk. Instead, t
1edf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 72  his function ser
1ee00 76 65 73 20 6f 6e 6c 79 0a 2a 2a 20 74 6f 20 72  ves only.** to r
1ee10 65 6c 65 61 73 65 20 6f 75 74 73 74 61 6e 64 69  elease outstandi
1ee20 6e 67 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2a  ng resources..**
1ee30 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1ee40 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69 61  f *pRc is initia
1ee50 6c 6c 79 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  lly SQLITE_OK an
1ee60 64 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  d an error occur
1ee70 73 20 77 68 69 6c 65 0a 2a 2a 20 66 6c 75 73 68  s while.** flush
1ee80 69 6e 67 20 62 75 66 66 65 72 73 20 74 6f 20 64  ing buffers to d
1ee90 69 73 6b 2c 20 2a 70 52 63 20 69 73 20 73 65 74  isk, *pRc is set
1eea0 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72   to an SQLite er
1eeb0 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 0a  ror code before.
1eec0 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  ** returning..*/
1eed0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1eee0 33 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73  3IncrmergeReleas
1eef0 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
1ef00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1ef10 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
1ef20 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49  le handle */.  I
1ef30 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a  ncrmergeWriter *
1ef40 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f  pWriter,       /
1ef50 2a 20 4d 65 72 67 65 2d 77 72 69 74 65 72 20 6f  * Merge-writer o
1ef60 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  bject */.  int *
1ef70 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
1ef80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
1ef90 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
1efa0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1efd0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1efe0 75 67 68 20 6e 6f 6e 2d 72 6f 6f 74 20 6c 61 79  ugh non-root lay
1eff0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  ers */.  int iRo
1f000 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
1f010 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1f020 78 20 6f 66 20 72 6f 6f 74 20 69 6e 20 70 57 72  x of root in pWr
1f030 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
1f040 72 20 2a 2f 0a 20 20 4e 6f 64 65 57 72 69 74 65  r */.  NodeWrite
1f050 72 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20 20 20  r *pRoot;       
1f060 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 57 72         /* NodeWr
1f070 69 74 65 72 20 66 6f 72 20 72 6f 6f 74 20 6e 6f  iter for root no
1f080 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
1f090 20 2a 70 52 63 3b 20 20 20 20 20 20 20 20 20 20   *pRc;          
1f0a0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
1f0b0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53   code */..  /* S
1f0c0 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68 65 20  et iRoot to the 
1f0d0 69 6e 64 65 78 20 69 6e 20 70 57 72 69 74 65 72  index in pWriter
1f0e0 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 5d 20  ->aNodeWriter[] 
1f0f0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  of the output se
1f100 67 6d 65 6e 74 20 0a 20 20 2a 2a 20 72 6f 6f 74  gment .  ** root
1f110 20 6e 6f 64 65 2e 20 49 66 20 74 68 65 20 73 65   node. If the se
1f120 67 6d 65 6e 74 20 66 69 74 73 20 65 6e 74 69 72  gment fits entir
1f130 65 6c 79 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  ely on a single 
1f140 6c 65 61 66 20 6e 6f 64 65 2c 20 69 52 6f 6f 74  leaf node, iRoot
1f150 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65  .  ** will be se
1f160 74 20 74 6f 20 30 2e 20 49 66 20 74 68 65 20 72  t to 0. If the r
1f170 6f 6f 74 20 6e 6f 64 65 20 69 73 20 74 68 65 20  oot node is the 
1f180 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6c 65  parent of the le
1f190 61 76 65 73 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a  aves, iRoot.  **
1f1a0 20 77 69 6c 6c 20 62 65 20 31 2e 20 41 6e 64 20   will be 1. And 
1f1b0 73 6f 20 6f 6e 2e 20 20 2a 2f 0a 20 20 66 6f 72  so on.  */.  for
1f1c0 28 69 52 6f 6f 74 3d 46 54 53 5f 4d 41 58 5f 41  (iRoot=FTS_MAX_A
1f1d0 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54  PPENDABLE_HEIGHT
1f1e0 2d 31 3b 20 69 52 6f 6f 74 3e 3d 30 3b 20 69 52  -1; iRoot>=0; iR
1f1f0 6f 6f 74 2d 2d 29 7b 0a 20 20 20 20 4e 6f 64 65  oot--){.    Node
1f200 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 20 3d 20  Writer *pNode = 
1f210 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57  &pWriter->aNodeW
1f220 72 69 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a 20 20  riter[iRoot];.  
1f230 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f    if( pNode->blo
1f240 63 6b 2e 6e 3e 30 20 29 20 62 72 65 61 6b 3b 0a  ck.n>0 ) break;.
1f250 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 52 63      assert( *pRc
1f260 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b   || pNode->block
1f270 2e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  .nAlloc==0 );.  
1f280 20 20 61 73 73 65 72 74 28 20 2a 70 52 63 20 7c    assert( *pRc |
1f290 7c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 41 6c  | pNode->key.nAl
1f2a0 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  loc==0 );.    sq
1f2b0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65  lite3_free(pNode
1f2c0 2d 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 20 20  ->block.a);.    
1f2d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f  sqlite3_free(pNo
1f2e0 64 65 2d 3e 6b 65 79 2e 61 29 3b 0a 20 20 7d 0a  de->key.a);.  }.
1f2f0 0a 20 20 2f 2a 20 45 6d 70 74 79 20 6f 75 74 70  .  /* Empty outp
1f300 75 74 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73  ut segment. This
1f310 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
1f320 20 20 69 66 28 20 69 52 6f 6f 74 3c 30 20 29 20    if( iRoot<0 ) 
1f330 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
1f340 65 20 65 6e 74 69 72 65 20 6f 75 74 70 75 74 20  e entire output 
1f350 73 65 67 6d 65 6e 74 20 66 69 74 73 20 6f 6e 20  segment fits on 
1f360 61 20 73 69 6e 67 6c 65 20 6e 6f 64 65 2e 20 4e  a single node. N
1f370 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 6d 65  ormally, this me
1f380 61 6e 73 0a 20 20 2a 2a 20 74 68 65 20 6e 6f 64  ans.  ** the nod
1f390 65 20 77 6f 75 6c 64 20 62 65 20 73 74 6f 72 65  e would be store
1f3a0 64 20 61 73 20 61 20 62 6c 6f 62 20 69 6e 20 74  d as a blob in t
1f3b0 68 65 20 22 72 6f 6f 74 22 20 63 6f 6c 75 6d 6e  he "root" column
1f3c0 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72   of the %_segdir
1f3d0 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 48 6f 77  .  ** table. How
1f3e0 65 76 65 72 2c 20 74 68 69 73 20 69 73 20 6e 6f  ever, this is no
1f3f0 74 20 70 65 72 6d 69 74 74 65 64 20 69 6e 20 74  t permitted in t
1f400 68 69 73 20 63 61 73 65 2e 20 54 68 65 20 70 72  his case. The pr
1f410 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 0a 20  oblem is that . 
1f420 20 2a 2a 20 73 70 61 63 65 20 68 61 73 20 61 6c   ** space has al
1f430 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 65 72  ready been reser
1f440 76 65 64 20 69 6e 20 74 68 65 20 25 5f 73 65 67  ved in the %_seg
1f450 6d 65 6e 74 73 20 74 61 62 6c 65 2c 20 61 6e 64  ments table, and
1f460 20 73 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 74   so the .  ** st
1f470 61 72 74 5f 62 6c 6f 63 6b 20 61 6e 64 20 65 6e  art_block and en
1f480 64 5f 62 6c 6f 63 6b 20 66 69 65 6c 64 73 20 6f  d_block fields o
1f490 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  f the %_segdir t
1f4a0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 70 6f 70  able must be pop
1f4b0 75 6c 61 74 65 64 2e 20 0a 20 20 2a 2a 20 41 6e  ulated. .  ** An
1f4c0 64 2c 20 62 79 20 64 65 73 69 67 6e 20 6f 72 20  d, by design or 
1f4d0 62 79 20 61 63 63 69 64 65 6e 74 2c 20 72 65 6c  by accident, rel
1f4e0 65 61 73 65 64 20 76 65 72 73 69 6f 6e 73 20 6f  eased versions o
1f4f0 66 20 46 54 53 20 63 61 6e 6e 6f 74 20 68 61 6e  f FTS cannot han
1f500 64 6c 65 20 0a 20 20 2a 2a 20 73 65 67 6d 65 6e  dle .  ** segmen
1f510 74 73 20 74 68 61 74 20 66 69 74 20 65 6e 74 69  ts that fit enti
1f520 72 65 6c 79 20 6f 6e 20 74 68 65 20 72 6f 6f 74  rely on the root
1f530 20 6e 6f 64 65 20 77 69 74 68 20 73 74 61 72 74   node with start
1f540 5f 62 6c 6f 63 6b 21 3d 30 2e 0a 20 20 2a 2a 0a  _block!=0..  **.
1f550 20 20 2a 2a 20 49 6e 73 74 65 61 64 2c 20 63 72    ** Instead, cr
1f560 65 61 74 65 20 61 20 73 79 6e 74 68 65 74 69 63  eate a synthetic
1f570 20 72 6f 6f 74 20 6e 6f 64 65 20 74 68 61 74 20   root node that 
1f580 63 6f 6e 74 61 69 6e 73 20 6e 6f 74 68 69 6e 67  contains nothing
1f590 20 62 75 74 20 61 20 0a 20 20 2a 2a 20 70 6f 69   but a .  ** poi
1f5a0 6e 74 65 72 20 74 6f 20 74 68 65 20 73 69 6e 67  nter to the sing
1f5b0 6c 65 20 63 6f 6e 74 65 6e 74 20 6e 6f 64 65 2e  le content node.
1f5c0 20 53 6f 20 74 68 61 74 20 74 68 65 20 73 65 67   So that the seg
1f5d0 6d 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  ment consists of
1f5e0 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 6c   a.  ** single l
1f5f0 65 61 66 20 61 6e 64 20 61 20 73 69 6e 67 6c 65  eaf and a single
1f600 20 69 6e 74 65 72 69 6f 72 20 28 72 6f 6f 74 29   interior (root)
1f610 20 6e 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   node..  **.  **
1f620 20 54 6f 64 6f 3a 20 42 65 74 74 65 72 20 6d 69   Todo: Better mi
1f630 67 68 74 20 62 65 20 74 6f 20 64 65 66 65 72 20  ght be to defer 
1f640 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65  allocating space
1f650 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   in the %_segmen
1f660 74 73 20 0a 20 20 2a 2a 20 74 61 62 6c 65 20 75  ts .  ** table u
1f670 6e 74 69 6c 20 77 65 20 61 72 65 20 73 75 72 65  ntil we are sure
1f680 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 0a 20   it is needed.. 
1f690 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 6f 74 3d   */.  if( iRoot=
1f6a0 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 2a  =0 ){.    Blob *
1f6b0 70 42 6c 6f 63 6b 20 3d 20 26 70 57 72 69 74 65  pBlock = &pWrite
1f6c0 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 31  r->aNodeWriter[1
1f6d0 5d 2e 62 6c 6f 63 6b 3b 0a 20 20 20 20 62 6c 6f  ].block;.    blo
1f6e0 62 47 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6f  bGrowBuffer(pBlo
1f6f0 63 6b 2c 20 31 20 2b 20 46 54 53 33 5f 56 41 52  ck, 1 + FTS3_VAR
1f700 49 4e 54 5f 4d 41 58 2c 20 26 72 63 29 3b 0a 20  INT_MAX, &rc);. 
1f710 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42  E_OK ){.      pB
1f730 6c 6f 63 6b 2d 3e 61 5b 30 5d 20 3d 20 30 78 30  lock->a[0] = 0x0
1f740 31 3b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d  1;.      pBlock-
1f750 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  >n = 1 + sqlite3
1f760 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 0a 20  Fts3PutVarint(. 
1f770 20 20 20 20 20 20 20 20 20 26 70 42 6c 6f 63 6b           &pBlock
1f780 2d 3e 61 5b 31 5d 2c 20 70 57 72 69 74 65 72 2d  ->a[1], pWriter-
1f790 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e  >aNodeWriter[0].
1f7a0 69 42 6c 6f 63 6b 0a 20 20 20 20 20 20 29 3b 0a  iBlock.      );.
1f7b0 20 20 20 20 7d 0a 20 20 20 20 69 52 6f 6f 74 20      }.    iRoot 
1f7c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  = 1;.  }.  pRoot
1f7d0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f   = &pWriter->aNo
1f7e0 64 65 57 72 69 74 65 72 5b 69 52 6f 6f 74 5d 3b  deWriter[iRoot];
1f7f0 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 61 6c 6c  ..  /* Flush all
1f800 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74   currently outst
1f810 61 6e 64 69 6e 67 20 6e 6f 64 65 73 20 74 6f 20  anding nodes to 
1f820 64 69 73 6b 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  disk. */.  for(i
1f830 3d 30 3b 20 69 3c 69 52 6f 6f 74 3b 20 69 2b 2b  =0; i<iRoot; i++
1f840 29 7b 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65  ){.    NodeWrite
1f850 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69  r *pNode = &pWri
1f860 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
1f870 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f  [i];.    if( pNo
1f880 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26 26  de->block.n>0 &&
1f890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f8a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
1f8b0 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c  3WriteSegment(p,
1f8c0 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20   pNode->iBlock, 
1f8d0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pNode->block.a, 
1f8e0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b  pNode->block.n);
1f8f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1f900 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 62  e3_free(pNode->b
1f910 6c 6f 63 6b 2e 61 29 3b 0a 20 20 20 20 73 71 6c  lock.a);.    sql
1f920 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d  ite3_free(pNode-
1f930 3e 6b 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20  >key.a);.  }..  
1f940 2f 2a 20 57 72 69 74 65 20 74 68 65 20 25 5f 73  /* Write the %_s
1f950 65 67 64 69 72 20 72 65 63 6f 72 64 2e 20 2a 2f  egdir record. */
1f960 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1f980 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72   fts3WriteSegdir
1f990 28 70 2c 20 0a 20 20 20 20 20 20 20 20 70 57 72  (p, .        pWr
1f9a0 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 2b  iter->iAbsLevel+
1f9b0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1f9c0 20 2f 2a 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20   /* level */.   
1f9d0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 49       pWriter->iI
1f9e0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
1f9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 64 78 20           /* idx 
1fa00 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  */.        pWrit
1fa10 65 72 2d 3e 69 53 74 61 72 74 2c 20 20 20 20 20  er->iStart,     
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa30 2a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f  * start_block */
1fa40 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72  .        pWriter
1fa50 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d  ->aNodeWriter[0]
1fa60 2e 69 42 6c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  .iBlock,     /* 
1fa70 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
1fa80 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69   */.        pWri
1fa90 74 65 72 2d 3e 69 45 6e 64 2c 20 20 20 20 20 20  ter->iEnd,      
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 2f 2a 20 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a  /* end_block */.
1fac0 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 62          pRoot->b
1fad0 6c 6f 63 6b 2e 61 2c 20 70 52 6f 6f 74 2d 3e 62  lock.a, pRoot->b
1fae0 6c 6f 63 6b 2e 6e 20 20 20 20 20 20 2f 2a 20 72  lock.n      /* r
1faf0 6f 6f 74 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20  oot */.    );.  
1fb00 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1fb10 28 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 29  (pRoot->block.a)
1fb20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1fb30 28 70 52 6f 6f 74 2d 3e 6b 65 79 2e 61 29 3b 0a  (pRoot->key.a);.
1fb40 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 7d 0a  .  *pRc = rc;.}.
1fb50 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1fb60 68 65 20 74 65 72 6d 20 69 6e 20 62 75 66 66 65  he term in buffe
1fb70 72 20 7a 4c 68 73 20 28 73 69 7a 65 20 69 6e 20  r zLhs (size in 
1fb80 62 79 74 65 73 20 6e 4c 68 73 29 20 77 69 74 68  bytes nLhs) with
1fb90 20 74 68 61 74 20 69 6e 0a 2a 2a 20 7a 52 68 73   that in.** zRhs
1fba0 20 28 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20   (size in bytes 
1fbb0 6e 52 68 73 29 20 75 73 69 6e 67 20 6d 65 6d 63  nRhs) using memc
1fbc0 6d 70 2e 20 49 66 20 6f 6e 65 20 74 65 72 6d 20  mp. If one term 
1fbd0 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 0a 2a  is a prefix of.*
1fbe0 2a 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20  * the other, it 
1fbf0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1fc00 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
1fc10 20 74 68 65 20 6f 74 68 65 72 2e 0a 2a 2a 0a 2a   the other..**.*
1fc20 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20  * Return -ve if 
1fc30 7a 4c 68 73 20 69 73 20 73 6d 61 6c 6c 65 72 20  zLhs is smaller 
1fc40 74 68 61 6e 20 7a 52 68 73 2c 20 30 20 69 66 20  than zRhs, 0 if 
1fc50 69 74 20 69 73 20 65 71 75 61 6c 2c 20 6f 72 20  it is equal, or 
1fc60 2b 76 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  +ve.** if it is 
1fc70 67 72 65 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  greater..*/.stat
1fc80 69 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 43  ic int fts3TermC
1fc90 6d 70 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mp(.  const char
1fca0 20 2a 7a 4c 68 73 2c 20 69 6e 74 20 6e 4c 68 73   *zLhs, int nLhs
1fcb0 2c 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20  ,     /* LHS of 
1fcc0 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
1fcd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 68 73  const char *zRhs
1fce0 2c 20 69 6e 74 20 6e 52 68 73 20 20 20 20 20 20  , int nRhs      
1fcf0 2f 2a 20 52 48 53 20 6f 66 20 63 6f 6d 70 61 72  /* RHS of compar
1fd00 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ison */.){.  int
1fd10 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 68 73   nCmp = MIN(nLhs
1fd20 2c 20 6e 52 68 73 29 3b 0a 20 20 69 6e 74 20 72  , nRhs);.  int r
1fd30 65 73 3b 0a 0a 20 20 72 65 73 20 3d 20 6d 65 6d  es;..  res = mem
1fd40 63 6d 70 28 7a 4c 68 73 2c 20 7a 52 68 73 2c 20  cmp(zLhs, zRhs, 
1fd50 6e 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73  nCmp);.  if( res
1fd60 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 4c 68 73  ==0 ) res = nLhs
1fd70 20 2d 20 6e 52 68 73 3b 0a 0a 20 20 72 65 74 75   - nRhs;..  retu
1fd80 72 6e 20 72 65 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn res;.}.../*.*
1fd90 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
1fda0 66 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74  f the entry in t
1fdb0 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
1fdc0 62 6c 65 20 77 69 74 68 20 62 6c 6f 63 6b 69 64  ble with blockid
1fdd0 20 69 45 6e 64 20 69 73 20 0a 2a 2a 20 4e 55 4c   iEnd is .** NUL
1fde0 4c 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  L. If no error o
1fdf0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 65 6e  ccurs and the en
1fe00 74 72 79 20 69 73 20 4e 55 4c 4c 2c 20 73 65 74  try is NULL, set
1fe10 20 2a 70 62 52 65 73 20 31 20 62 65 66 6f 72 65   *pbRes 1 before
1fe20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f  .** returning. O
1fe30 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70  therwise, set *p
1fe40 62 52 65 73 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a  bRes to 0. .**.*
1fe50 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  * Or, if an erro
1fe60 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 71  r occurs while q
1fe70 75 65 72 79 69 6e 67 20 74 68 65 20 64 61 74 61  uerying the data
1fe80 62 61 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  base, return an 
1fe90 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72  SQLite .** error
1fea0 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
1feb0 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 52 65 73   value of *pbRes
1fec0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
1fed0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1fee0 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  * This is used t
1fef0 6f 20 74 65 73 74 20 69 66 20 61 20 73 65 67 6d  o test if a segm
1ff00 65 6e 74 20 69 73 20 61 6e 20 22 61 70 70 65 6e  ent is an "appen
1ff10 64 61 62 6c 65 22 20 73 65 67 6d 65 6e 74 2e 20  dable" segment. 
1ff20 49 66 20 69 74 0a 2a 2a 20 69 73 2c 20 74 68 65  If it.** is, the
1ff30 6e 20 61 20 4e 55 4c 4c 20 65 6e 74 72 79 20 68  n a NULL entry h
1ff40 61 73 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  as been inserted
1ff50 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d   into the %_segm
1ff60 65 6e 74 73 20 74 61 62 6c 65 0a 2a 2a 20 77 69  ents table.** wi
1ff70 74 68 20 62 6c 6f 63 6b 69 64 20 25 5f 73 65 67  th blockid %_seg
1ff80 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 2e 0a 2a  dir.end_block..*
1ff90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1ffa0 33 49 73 41 70 70 65 6e 64 61 62 6c 65 28 46 74  3IsAppendable(Ft
1ffb0 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69  s3Table *p, sqli
1ffc0 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 2c 20  te3_int64 iEnd, 
1ffd0 69 6e 74 20 2a 70 62 52 65 73 29 7b 0a 20 20 69  int *pbRes){.  i
1ffe0 6e 74 20 62 52 65 73 20 3d 20 30 3b 20 20 20 20  nt bRes = 0;    
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20000 2a 20 52 65 73 75 6c 74 20 74 6f 20 73 65 74 20  * Result to set 
20010 2a 70 62 52 65 73 20 74 6f 20 2a 2f 0a 20 20 73  *pbRes to */.  s
20020 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 68  qlite3_stmt *pCh
20030 65 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  eck = 0;       /
20040 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 71  * Statement to q
20050 75 65 72 79 20 64 61 74 61 62 61 73 65 20 77 69  uery database wi
20060 74 68 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  th */.  int rc; 
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
20090 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20  n code */..  rc 
200a0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
200b0 20 53 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f   SQL_SEGMENT_IS_
200c0 41 50 50 45 4e 44 41 42 4c 45 2c 20 26 70 43 68  APPENDABLE, &pCh
200d0 65 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  eck, 0);.  if( r
200e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
200f0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
20100 5f 69 6e 74 36 34 28 70 43 68 65 63 6b 2c 20 31  _int64(pCheck, 1
20110 2c 20 69 45 6e 64 29 3b 0a 20 20 20 20 69 66 28  , iEnd);.    if(
20120 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
20130 69 74 65 33 5f 73 74 65 70 28 70 43 68 65 63 6b  ite3_step(pCheck
20140 29 20 29 20 62 52 65 73 20 3d 20 31 3b 0a 20 20  ) ) bRes = 1;.  
20150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
20160 65 73 65 74 28 70 43 68 65 63 6b 29 3b 0a 20 20  eset(pCheck);.  
20170 7d 0a 20 20 0a 20 20 2a 70 62 52 65 73 20 3d 20  }.  .  *pbRes = 
20180 62 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72  bRes;.  return r
20190 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
201a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
201b0 6c 65 64 20 77 68 65 6e 20 69 6e 69 74 69 61 6c  led when initial
201c0 69 7a 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  izing an increme
201d0 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65 72 61  ntal-merge opera
201e0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 63 68 65 63  tion..** It chec
201f0 6b 73 20 69 66 20 74 68 65 20 65 78 69 73 74 69  ks if the existi
20200 6e 67 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20  ng segment with 
20210 69 6e 64 65 78 20 76 61 6c 75 65 20 69 49 64 78  index value iIdx
20220 20 61 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76   at absolute lev
20230 65 6c 20 0a 2a 2a 20 28 69 41 62 73 4c 65 76 65  el .** (iAbsLeve
20240 6c 2b 31 29 20 63 61 6e 20 62 65 20 61 70 70 65  l+1) can be appe
20250 6e 64 65 64 20 74 6f 20 62 79 20 74 68 65 20 69  nded to by the i
20260 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
20270 2e 20 49 66 20 69 74 20 63 61 6e 2c 20 74 68 65  . If it can, the
20280 0a 2a 2a 20 6d 65 72 67 65 2d 77 72 69 74 65 72  .** merge-writer
20290 20 6f 62 6a 65 63 74 20 2a 70 57 72 69 74 65 72   object *pWriter
202a0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
202b0 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
202c0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
202d0 67 20 73 65 67 6d 65 6e 74 20 63 61 6e 20 62 65  g segment can be
202e0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 62 79 20   appended to by 
202f0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  an incremental m
20300 65 72 67 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  erge if:.**.**  
20310 20 2a 20 49 74 20 77 61 73 20 69 6e 69 74 69 61   * It was initia
20320 6c 6c 79 20 63 72 65 61 74 65 64 20 61 73 20 61  lly created as a
20330 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67  n appendable seg
20340 6d 65 6e 74 20 28 77 69 74 68 20 61 6c 6c 20 72  ment (with all r
20350 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 20 73  equired.**     s
20360 70 61 63 65 20 70 72 65 2d 61 6c 6c 6f 63 61 74  pace pre-allocat
20370 65 64 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ed), and.**.**  
20380 20 2a 20 54 68 65 20 66 69 72 73 74 20 6b 65 79   * The first key
20390 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69   read from the i
203a0 6e 70 75 74 20 28 61 72 67 75 6d 65 6e 74 73 20  nput (arguments 
203b0 7a 4b 65 79 20 61 6e 64 20 6e 4b 65 79 29 20 69  zKey and nKey) i
203c0 73 20 0a 2a 2a 20 20 20 20 20 67 72 65 61 74 65  s .**     greate
203d0 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
203e0 73 74 20 6b 65 79 20 63 75 72 72 65 6e 74 6c 79  st key currently
203f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
20400 6f 74 65 6e 74 69 61 6c 0a 2a 2a 20 20 20 20 20  otential.**     
20410 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 0a  output segment..
20420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
20430 73 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61 64 28  s3IncrmergeLoad(
20440 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65     /* Fts3 table
20470 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
20480 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c  ite3_int64 iAbsL
20490 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  evel,        /* 
204a0 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f  Absolute level o
204b0 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
204c0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
204f0 66 20 63 61 6e 64 69 64 61 74 65 20 6f 75 74 70  f candidate outp
20500 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
20510 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
20520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20530 2f 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20  /* First key to 
20540 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
20550 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
20560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20570 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
20580 20 6e 4b 65 79 20 2a 2f 0a 20 20 49 6e 63 72 6d   nKey */.  Incrm
20590 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69  ergeWriter *pWri
205a0 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ter        /* Po
205b0 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65  pulate this obje
205c0 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
205d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
205e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
205f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
20600 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
20610 6c 65 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  lect = 0;      /
20620 2a 20 53 45 4c 45 43 54 20 74 6f 20 72 65 61 64  * SELECT to read
20630 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20   %_segdir entry 
20640 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  */..  rc = fts3S
20650 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
20660 4c 45 43 54 5f 53 45 47 44 49 52 2c 20 26 70 53  LECT_SEGDIR, &pS
20670 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
20680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20690 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
206a0 74 36 34 20 69 53 74 61 72 74 20 3d 20 30 3b 20  t64 iStart = 0; 
206b0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
206c0 25 5f 73 65 67 64 69 72 2e 73 74 61 72 74 5f 62  %_segdir.start_b
206d0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lock */.    sqli
206e0 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45  te3_int64 iLeafE
206f0 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 56 61 6c  nd = 0;   /* Val
20700 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 6c  ue of %_segdir.l
20710 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
20720 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
20730 6e 74 36 34 20 69 45 6e 64 20 3d 20 30 3b 20 20  nt64 iEnd = 0;  
20740 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
20750 20 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c   %_segdir.end_bl
20760 6f 63 6b 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ock */.    const
20770 20 63 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20 30   char *aRoot = 0
20780 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ;        /* Poin
20790 74 65 72 20 74 6f 20 25 5f 73 65 67 64 69 72 2e  ter to %_segdir.
207a0 72 6f 6f 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  root buffer */. 
207b0 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 30     int nRoot = 0
207c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
207d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 52 6f 6f   /* Size of aRoo
207e0 74 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  t[] in bytes */.
207f0 20 20 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20      int rc2;    
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20820 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
20830 73 65 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  set() */.    int
20840 20 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20 30   bAppendable = 0
20850 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
20860 74 20 74 6f 20 74 72 75 65 20 69 66 20 73 65 67  t to true if seg
20870 6d 65 6e 74 20 69 73 20 61 70 70 65 6e 64 61 62  ment is appendab
20880 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  le */..    /* Re
20890 61 64 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  ad the %_segdir 
208a0 65 6e 74 72 79 20 66 6f 72 20 69 6e 64 65 78 20  entry for index 
208b0 69 49 64 78 20 61 62 73 6f 6c 75 74 65 20 6c 65  iIdx absolute le
208c0 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b 31  vel (iAbsLevel+1
208d0 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ) */.    sqlite3
208e0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c  _bind_int64(pSel
208f0 65 63 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  ect, 1, iAbsLeve
20900 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l+1);.    sqlite
20910 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 65 6c 65  3_bind_int(pSele
20920 63 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20  ct, 2, iIdx);.  
20930 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
20940 65 70 28 70 53 65 6c 65 63 74 29 3d 3d 53 51 4c  ep(pSelect)==SQL
20950 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
20960 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
20970 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
20980 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20  Select, 1);.    
20990 20 20 69 4c 65 61 66 45 6e 64 20 3d 20 73 71 6c    iLeafEnd = sql
209a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
209b0 34 28 70 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20  4(pSelect, 2);. 
209c0 20 20 20 20 20 69 45 6e 64 20 3d 20 73 71 6c 69       iEnd = sqli
209d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
209e0 28 70 53 65 6c 65 63 74 2c 20 33 29 3b 0a 20 20  (pSelect, 3);.  
209f0 20 20 20 20 6e 52 6f 6f 74 20 3d 20 73 71 6c 69      nRoot = sqli
20a00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
20a10 28 70 53 65 6c 65 63 74 2c 20 34 29 3b 0a 20 20  (pSelect, 4);.  
20a20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69      aRoot = sqli
20a30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
20a40 70 53 65 6c 65 63 74 2c 20 34 29 3b 0a 20 20 20  pSelect, 4);.   
20a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
20a60 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  turn sqlite3_res
20a70 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  et(pSelect);.   
20a80 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
20a90 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 6c 65   for the zero-le
20aa0 6e 67 74 68 20 6d 61 72 6b 65 72 20 69 6e 20 74  ngth marker in t
20ab0 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
20ac0 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ble */.    rc = 
20ad0 66 74 73 33 49 73 41 70 70 65 6e 64 61 62 6c 65  fts3IsAppendable
20ae0 28 70 2c 20 69 45 6e 64 2c 20 26 62 41 70 70 65  (p, iEnd, &bAppe
20af0 6e 64 61 62 6c 65 29 3b 0a 0a 20 20 20 20 2f 2a  ndable);..    /*
20b00 20 43 68 65 63 6b 20 74 68 61 74 20 7a 4b 65 79   Check that zKey
20b10 2f 6e 4b 65 79 20 69 73 20 6c 61 72 67 65 72 20  /nKey is larger 
20b20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
20b30 20 6b 65 79 20 74 68 65 20 63 61 6e 64 69 64 61   key the candida
20b40 74 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  te */.    if( rc
20b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
20b60 41 70 70 65 6e 64 61 62 6c 65 20 29 7b 0a 20 20  Appendable ){.  
20b70 20 20 20 20 63 68 61 72 20 2a 61 4c 65 61 66 20      char *aLeaf 
20b80 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
20b90 4c 65 61 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Leaf = 0;..     
20ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
20bb0 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 69 4c  3ReadBlock(p, iL
20bc0 65 61 66 45 6e 64 2c 20 26 61 4c 65 61 66 2c 20  eafEnd, &aLeaf, 
20bd0 26 6e 4c 65 61 66 2c 20 30 29 3b 0a 20 20 20 20  &nLeaf, 0);.    
20be0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  _OK ){.        N
20c00 6f 64 65 52 65 61 64 65 72 20 72 65 61 64 65 72  odeReader reader
20c10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 72 63  ;.        for(rc
20c20 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69   = nodeReaderIni
20c30 74 28 26 72 65 61 64 65 72 2c 20 61 4c 65 61 66  t(&reader, aLeaf
20c40 2c 20 6e 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , nLeaf);.      
20c50 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
20c60 5f 4f 4b 20 26 26 20 72 65 61 64 65 72 2e 61 4e  _OK && reader.aN
20c70 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
20c80 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72   rc = nodeReader
20c90 4e 65 78 74 28 26 72 65 61 64 65 72 29 0a 20 20  Next(&reader).  
20ca0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
20cb0 20 20 20 61 73 73 65 72 74 28 20 72 65 61 64 65     assert( reade
20cc0 72 2e 61 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20  r.aNode );.     
20cd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
20ce0 20 66 74 73 33 54 65 72 6d 43 6d 70 28 7a 4b 65   fts3TermCmp(zKe
20cf0 79 2c 20 6e 4b 65 79 2c 20 72 65 61 64 65 72 2e  y, nKey, reader.
20d00 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74  term.a, reader.t
20d10 65 72 6d 2e 6e 29 3c 3d 30 20 29 7b 0a 20 20 20  erm.n)<=0 ){.   
20d20 20 20 20 20 20 20 20 62 41 70 70 65 6e 64 61 62         bAppendab
20d30 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
20d40 7d 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65  }.        nodeRe
20d50 61 64 65 72 52 65 6c 65 61 73 65 28 26 72 65 61  aderRelease(&rea
20d60 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  der);.      }.  
20d70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20d80 28 61 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a  (aLeaf);.    }..
20d90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20da0 54 45 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e 64  TE_OK && bAppend
20db0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
20dc0 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
20dd0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68 69  to append to thi
20de0 73 20 73 65 67 6d 65 6e 74 2e 20 53 65 74 20 75  s segment. Set u
20df0 70 20 74 68 65 20 49 6e 63 72 6d 65 72 67 65 57  p the IncrmergeW
20e00 72 69 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  riter.      ** o
20e10 62 6a 65 63 74 20 74 6f 20 64 6f 20 73 6f 2e 20  bject to do so. 
20e20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
20e30 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 65 69 67  .      int nHeig
20e40 68 74 20 3d 20 28 69 6e 74 29 61 52 6f 6f 74 5b  ht = (int)aRoot[
20e50 30 5d 3b 0a 20 20 20 20 20 20 4e 6f 64 65 57 72  0];.      NodeWr
20e60 69 74 65 72 20 2a 70 4e 6f 64 65 3b 0a 0a 20 20  iter *pNode;..  
20e70 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65      pWriter->nLe
20e80 61 66 45 73 74 20 3d 20 28 28 69 45 6e 64 20 2d  afEst = ((iEnd -
20e90 20 69 53 74 61 72 74 29 20 2b 20 31 29 20 2f 20   iStart) + 1) / 
20ea0 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
20eb0 4c 45 5f 48 45 49 47 48 54 3b 0a 20 20 20 20 20  LE_HEIGHT;.     
20ec0 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74   pWriter->iStart
20ed0 20 3d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   = iStart;.     
20ee0 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 20 3d   pWriter->iEnd =
20ef0 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 70 57 72   iEnd;.      pWr
20f00 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 20  iter->iAbsLevel 
20f10 3d 20 69 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20  = iAbsLevel;.   
20f20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78     pWriter->iIdx
20f30 20 3d 20 69 49 64 78 3b 0a 0a 20 20 20 20 20 20   = iIdx;..      
20f40 66 6f 72 28 69 3d 6e 48 65 69 67 68 74 2b 31 3b  for(i=nHeight+1;
20f50 20 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e   i<FTS_MAX_APPEN
20f60 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b  DABLE_HEIGHT; i+
20f70 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 57 72 69  +){.        pWri
20f80 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
20f90 5b 69 5d 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72  [i].iBlock = pWr
20fa0 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 69  iter->iStart + i
20fb0 2a 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45  *pWriter->nLeafE
20fc0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  st;.      }..   
20fd0 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69     pNode = &pWri
20fe0 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
20ff0 5b 6e 48 65 69 67 68 74 5d 3b 0a 20 20 20 20 20  [nHeight];.     
21000 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d   pNode->iBlock =
21010 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74   pWriter->iStart
21020 20 2b 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61   + pWriter->nLea
21030 66 45 73 74 2a 6e 48 65 69 67 68 74 3b 0a 20 20  fEst*nHeight;.  
21040 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66      blobGrowBuff
21050 65 72 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  er(&pNode->block
21060 2c 20 4d 41 58 28 6e 52 6f 6f 74 2c 20 70 2d 3e  , MAX(nRoot, p->
21070 6e 4e 6f 64 65 53 69 7a 65 29 2c 20 26 72 63 29  nNodeSize), &rc)
21080 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21090 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
210a0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64       memcpy(pNod
210b0 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 61 52 6f 6f  e->block.a, aRoo
210c0 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 20  t, nRoot);.     
210d0 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e     pNode->block.
210e0 6e 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 20  n = nRoot;.     
210f0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
21100 6e 48 65 69 67 68 74 3b 20 69 3e 3d 30 20 26 26  nHeight; i>=0 &&
21110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
21120 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  i--){.        pN
21130 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  ode = &pWriter->
21140 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a  aNodeWriter[i];.
21150 20 20 20 20 20 20 20 20 4e 6f 64 65 52 65 61 64          NodeRead
21160 65 72 20 72 65 61 64 65 72 3b 0a 0a 20 20 20 20  er reader;..    
21170 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61      rc = nodeRea
21180 64 65 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c  derInit(&reader,
21190 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c   pNode->block.a,
211a0 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29   pNode->block.n)
211b0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
211c0 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 20 26 26   reader.aNode &&
211d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
211e0 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72   rc = nodeReader
211f0 4e 65 78 74 28 26 72 65 61 64 65 72 29 3b 0a 20  Next(&reader);. 
21200 20 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42         blobGrowB
21210 75 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e 6b 65  uffer(&pNode->ke
21220 79 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e  y, reader.term.n
21230 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
21240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21250 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  K ){.          m
21260 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 6b 65 79  emcpy(pNode->key
21270 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e  .a, reader.term.
21280 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e  a, reader.term.n
21290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f  );.          pNo
212a0 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20 72 65 61 64  de->key.n = read
212b0 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20  er.term.n;.     
212c0 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
212d0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
212e0 20 2a 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *aBlock = 0;.  
212f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42            int nB
21300 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  lock = 0;.      
21310 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70        pNode = &p
21320 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
21330 74 65 72 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20  ter[i-1];.      
21340 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c        pNode->iBl
21350 6f 63 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68  ock = reader.iCh
21360 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ild;.           
21370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
21380 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 72 65  3ReadBlock(p, re
21390 61 64 65 72 2e 69 43 68 69 6c 64 2c 20 26 61 42  ader.iChild, &aB
213a0 6c 6f 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30  lock, &nBlock, 0
213b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
213c0 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70  lobGrowBuffer(&p
213d0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58  Node->block, MAX
213e0 28 6e 42 6c 6f 63 6b 2c 20 70 2d 3e 6e 4e 6f 64  (nBlock, p->nNod
213f0 65 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20  eSize), &rc);.  
21400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
21430 63 70 79 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  cpy(pNode->block
21440 2e 61 2c 20 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f  .a, aBlock, nBlo
21450 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ck);.           
21460 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e     pNode->block.
21470 6e 20 3d 20 6e 42 6c 6f 63 6b 3b 0a 20 20 20 20  n = nBlock;.    
21480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21490 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
214a0 65 65 28 61 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  ee(aBlock);.    
214b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
214c0 7d 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65  }.        nodeRe
214d0 61 64 65 72 52 65 6c 65 61 73 65 28 26 72 65 61  aderRelease(&rea
214e0 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  der);.      }.  
214f0 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73    }..    rc2 = s
21500 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65  qlite3_reset(pSe
21510 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72  lect);.    if( r
21520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
21530 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
21540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21550 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
21560 65 20 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e  e largest segmen
21570 74 20 69 6e 64 65 78 20 76 61 6c 75 65 20 74 68  t index value th
21580 61 74 20 65 78 69 73 74 73 20 77 69 74 68 69 6e  at exists within
21590 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 6c 65 76   absolute.** lev
215a0 65 6c 20 69 41 62 73 4c 65 76 65 6c 2b 31 2e 20  el iAbsLevel+1. 
215b0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
215c0 72 73 2c 20 73 65 74 20 2a 70 69 49 64 78 20 74  rs, set *piIdx t
215d0 6f 20 74 68 69 73 20 76 61 6c 75 65 20 70 6c 75  o this value plu
215e0 73 0a 2a 2a 20 6f 6e 65 20 62 65 66 6f 72 65 20  s.** one before 
215f0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
21600 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 72  _OK. Or, if ther
21610 65 20 61 72 65 20 6e 6f 20 73 65 67 6d 65 6e 74  e are no segment
21620 73 20 61 74 20 61 6c 6c 20 0a 2a 2a 20 77 69 74  s at all .** wit
21630 68 69 6e 20 6c 65 76 65 6c 20 69 41 62 73 4c 65  hin level iAbsLe
21640 76 65 6c 2c 20 73 65 74 20 2a 70 69 49 64 78 20  vel, set *piIdx 
21650 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  to zero..**.** I
21660 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
21670 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  s, return an SQL
21680 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
21690 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  The final value 
216a0 6f 66 0a 2a 2a 20 2a 70 69 49 64 78 20 69 73 20  of.** *piIdx is 
216b0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
216c0 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
216d0 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
216e0 72 67 65 4f 75 74 70 75 74 49 64 78 28 20 0a 20  rgeOutputIdx( . 
216f0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21710 20 2f 2a 20 46 54 53 20 54 61 62 6c 65 20 68 61   /* FTS Table ha
21720 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
21730 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65  3_int64 iAbsLeve
21740 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73  l,        /* Abs
21750 6f 6c 75 74 65 20 69 6e 64 65 78 20 6f 66 20 69  olute index of i
21760 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
21770 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 20 20 20  .  int *piIdx   
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21790 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
217a0 66 72 65 65 20 69 6e 64 65 78 20 61 74 20 69 41  free index at iA
217b0 62 73 4c 65 76 65 6c 2b 31 20 2a 2f 0a 29 7b 0a  bsLevel+1 */.){.
217c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
217d0 74 65 33 5f 73 74 6d 74 20 2a 70 4f 75 74 70 75  te3_stmt *pOutpu
217e0 74 49 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 53  tIdx = 0;   /* S
217f0 51 4c 20 75 73 65 64 20 74 6f 20 66 69 6e 64 20  QL used to find 
21800 6f 75 74 70 75 74 20 69 6e 64 65 78 20 2a 2f 0a  output index */.
21810 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
21820 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f  tmt(p, SQL_NEXT_
21830 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26  SEGMENT_INDEX, &
21840 70 4f 75 74 70 75 74 49 64 78 2c 20 30 29 3b 0a  pOutputIdx, 0);.
21850 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21860 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
21870 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4f  e3_bind_int64(pO
21880 75 74 70 75 74 49 64 78 2c 20 31 2c 20 69 41 62  utputIdx, 1, iAb
21890 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73  sLevel+1);.    s
218a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4f 75 74  qlite3_step(pOut
218b0 70 75 74 49 64 78 29 3b 0a 20 20 20 20 2a 70 69  putIdx);.    *pi
218c0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Idx = sqlite3_co
218d0 6c 75 6d 6e 5f 69 6e 74 28 70 4f 75 74 70 75 74  lumn_int(pOutput
218e0 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  Idx, 0);.    rc 
218f0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
21900 70 4f 75 74 70 75 74 49 64 78 29 3b 0a 20 20 7d  pOutputIdx);.  }
21910 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21920 0a 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  ../* .** Allocat
21930 65 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20  e an appendable 
21940 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 6f  output segment o
21950 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  n absolute level
21960 20 69 41 62 73 4c 65 76 65 6c 2b 31 0a 2a 2a 20   iAbsLevel+1.** 
21970 77 69 74 68 20 69 64 78 20 76 61 6c 75 65 20 69  with idx value i
21980 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  Idx..**.** In th
21990 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
219a0 2c 20 61 20 73 65 67 6d 65 6e 74 20 69 73 20 64  , a segment is d
219b0 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 76 61  efined by the va
219c0 6c 75 65 73 20 69 6e 20 74 68 72 65 65 0a 2a 2a  lues in three.**
219d0 20 63 6f 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20   columns:.**.** 
219e0 20 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a      start_block.
219f0 2a 2a 20 20 20 20 20 6c 65 61 76 65 73 5f 65 6e  **     leaves_en
21a00 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 65  d_block.**     e
21a10 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 57  nd_block.**.** W
21a20 68 65 6e 20 61 6e 20 61 70 70 65 6e 64 61 62 6c  hen an appendabl
21a30 65 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6c 6c  e segment is all
21a40 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 65 73  ocated, it is es
21a50 74 69 6d 61 74 65 64 20 74 68 61 74 20 74 68 65  timated that the
21a60 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  .** maximum numb
21a70 65 72 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b  er of leaf block
21a80 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 72 65  s that may be re
21a90 71 75 69 72 65 64 20 69 73 20 74 68 65 20 73 75  quired is the su
21aa0 6d 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  m of the.** numb
21ab0 65 72 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b  er of leaf block
21ac0 73 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 74 68  s consumed by th
21ad0 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  e input segments
21ae0 2c 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  , plus the numbe
21af0 72 0a 2a 2a 20 6f 66 20 69 6e 70 75 74 20 73 65  r.** of input se
21b00 67 6d 65 6e 74 73 2c 20 6d 75 6c 74 69 70 6c 69  gments, multipli
21b10 65 64 20 62 79 20 74 77 6f 2e 20 54 68 69 73 20  ed by two. This 
21b20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20  value is stored 
21b30 69 6e 20 73 74 61 63 6b 20 0a 2a 2a 20 76 61 72  in stack .** var
21b40 69 61 62 6c 65 20 6e 4c 65 61 66 45 73 74 2e 0a  iable nLeafEst..
21b50 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
21b60 20 31 36 2a 6e 4c 65 61 66 45 73 74 20 62 6c 6f   16*nLeafEst blo
21b70 63 6b 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  cks are allocate
21b80 64 20 77 68 65 6e 20 61 6e 20 61 70 70 65 6e 64  d when an append
21b90 61 62 6c 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20  able segment.** 
21ba0 69 73 20 63 72 65 61 74 65 64 20 28 28 31 20 2b  is created ((1 +
21bb0 20 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61   end_block - sta
21bc0 72 74 5f 62 6c 6f 63 6b 29 3d 3d 31 36 2a 6e 4c  rt_block)==16*nL
21bd0 65 61 66 45 73 74 29 2e 20 54 68 65 20 63 6f 6e  eafEst). The con
21be0 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79  tiguous.** array
21bf0 20 6f 66 20 6c 65 61 66 20 6e 6f 64 65 73 20 73   of leaf nodes s
21c00 74 61 72 74 73 20 61 74 20 74 68 65 20 66 69 72  tarts at the fir
21c10 73 74 20 62 6c 6f 63 6b 20 61 6c 6c 6f 63 61 74  st block allocat
21c20 65 64 2e 20 54 68 65 20 61 72 72 61 79 0a 2a 2a  ed. The array.**
21c30 20 6f 66 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64   of interior nod
21c40 65 73 20 74 68 61 74 20 61 72 65 20 70 61 72 65  es that are pare
21c50 6e 74 73 20 6f 66 20 74 68 65 20 6c 65 61 66 20  nts of the leaf 
21c60 6e 6f 64 65 73 20 73 74 61 72 74 20 61 74 20 62  nodes start at b
21c70 6c 6f 63 6b 0a 2a 2a 20 28 73 74 61 72 74 5f 62  lock.** (start_b
21c80 6c 6f 63 6b 20 2b 20 28 31 20 2b 20 65 6e 64 5f  lock + (1 + end_
21c90 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f 62 6c  block - start_bl
21ca0 6f 63 6b 29 20 2f 20 31 36 29 2e 20 41 6e 64 20  ock) / 16). And 
21cb0 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  so on..**.** In 
21cc0 74 68 65 20 61 63 74 75 61 6c 20 63 6f 64 65 20  the actual code 
21cd0 62 65 6c 6f 77 2c 20 74 68 65 20 76 61 6c 75 65  below, the value
21ce0 20 22 31 36 22 20 69 73 20 72 65 70 6c 61 63 65   "16" is replace
21cf0 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 70  d with the .** p
21d00 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
21d10 72 6f 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  ro FTS_MAX_APPEN
21d20 44 41 42 4c 45 5f 48 45 49 47 48 54 2e 0a 2a 2f  DABLE_HEIGHT..*/
21d30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
21d40 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 28  IncrmergeWriter(
21d50 20 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70   .  Fts3Table *p
21d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21d70 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
21d80 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
21d90 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73  lite3_int64 iAbs
21da0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a  Level,        /*
21db0 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   Absolute level 
21dc0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
21dd0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  s */.  int iIdx,
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
21e00 6f 66 20 6e 65 77 20 6f 75 74 70 75 74 20 73 65  of new output se
21e10 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33 4d  gment */.  Fts3M
21e20 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
21e30 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr,       /* Cu
21e40 72 73 6f 72 20 74 68 61 74 20 64 61 74 61 20 77  rsor that data w
21e50 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
21e60 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 57   */.  IncrmergeW
21e70 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20  riter *pWriter  
21e80 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
21e90 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
21ea0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21ed0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  Code */.  int i;
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
21f00 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
21f10 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 45 73 74  /.  int nLeafEst
21f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21f30 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 73 20 61 6c      /* Blocks al
21f40 6c 6f 63 61 74 65 64 20 66 6f 72 20 6c 65 61 66  located for leaf
21f50 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   nodes */.  sqli
21f60 74 65 33 5f 73 74 6d 74 20 2a 70 4c 65 61 66 45  te3_stmt *pLeafE
21f70 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53  st = 0;     /* S
21f80 51 4c 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  QL used to deter
21f90 6d 69 6e 65 20 6e 4c 65 61 66 45 73 74 20 2a 2f  mine nLeafEst */
21fa0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
21fb0 2a 70 46 69 72 73 74 42 6c 6f 63 6b 20 3d 20 30  *pFirstBlock = 0
21fc0 3b 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74  ;  /* SQL used t
21fd0 6f 20 64 65 74 65 72 6d 69 6e 65 20 66 69 72 73  o determine firs
21fe0 74 20 62 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 2f 2a  t block */..  /*
21ff0 20 43 61 6c 63 75 6c 61 74 65 20 6e 4c 65 61 66   Calculate nLeaf
22000 45 73 74 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66  Est. */.  rc = f
22010 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
22020 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e 4f 44 45 5f  L_MAX_LEAF_NODE_
22030 45 53 54 49 4d 41 54 45 2c 20 26 70 4c 65 61 66  ESTIMATE, &pLeaf
22040 45 73 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  Est, 0);.  if( r
22050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22060 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
22070 5f 69 6e 74 36 34 28 70 4c 65 61 66 45 73 74 2c  _int64(pLeafEst,
22080 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a   1, iAbsLevel);.
22090 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
220a0 5f 69 6e 74 36 34 28 70 4c 65 61 66 45 73 74 2c  _int64(pLeafEst,
220b0 20 32 2c 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65   2, pCsr->nSegme
220c0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  nt);.    if( SQL
220d0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
220e0 5f 73 74 65 70 28 70 4c 65 61 66 45 73 74 29 20  _step(pLeafEst) 
220f0 29 7b 0a 20 20 20 20 20 20 6e 4c 65 61 66 45 73  ){.      nLeafEs
22100 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
22110 6d 6e 5f 69 6e 74 28 70 4c 65 61 66 45 73 74 2c  mn_int(pLeafEst,
22120 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
22130 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
22140 74 28 70 4c 65 61 66 45 73 74 29 3b 0a 20 20 7d  t(pLeafEst);.  }
22150 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22160 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
22170 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
22180 65 20 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63  e the first bloc
22190 6b 20 74 6f 20 75 73 65 20 69 6e 20 74 68 65 20  k to use in the 
221a0 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  output segment *
221b0 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
221c0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54  Stmt(p, SQL_NEXT
221d0 5f 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70  _SEGMENTS_ID, &p
221e0 46 69 72 73 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a  FirstBlock, 0);.
221f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22200 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53  _OK ){.    if( S
22210 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
22220 65 33 5f 73 74 65 70 28 70 46 69 72 73 74 42 6c  e3_step(pFirstBl
22230 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 70 57  ock) ){.      pW
22240 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20  riter->iStart = 
22250 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
22260 6e 74 36 34 28 70 46 69 72 73 74 42 6c 6f 63 6b  nt64(pFirstBlock
22270 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69  , 0);.      pWri
22280 74 65 72 2d 3e 69 45 6e 64 20 3d 20 70 57 72 69  ter->iEnd = pWri
22290 74 65 72 2d 3e 69 53 74 61 72 74 20 2d 20 31 3b  ter->iStart - 1;
222a0 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
222b0 69 45 6e 64 20 2b 3d 20 6e 4c 65 61 66 45 73 74  iEnd += nLeafEst
222c0 20 2a 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e   * FTS_MAX_APPEN
222d0 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 0a 20 20  DABLE_HEIGHT;.  
222e0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
222f0 69 74 65 33 5f 72 65 73 65 74 28 70 46 69 72 73  ite3_reset(pFirs
22300 74 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 69  tBlock);.  }.  i
22310 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22320 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
22330 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6d   /* Insert the m
22340 61 72 6b 65 72 20 69 6e 20 74 68 65 20 25 5f 73  arker in the %_s
22350 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 74 6f  egments table to
22360 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 62 6f 64   make sure nobod
22370 79 20 74 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  y tries.  ** to 
22380 73 74 65 61 6c 20 74 68 65 20 73 70 61 63 65 20  steal the space 
22390 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20  just allocated. 
223a0 54 68 69 73 20 69 73 20 61 6c 73 6f 20 75 73 65  This is also use
223b0 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 0a 20  d to identify . 
223c0 20 2a 2a 20 61 70 70 65 6e 64 61 62 6c 65 20 73   ** appendable s
223d0 65 67 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 72  egments.  */.  r
223e0 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
223f0 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d  ment(p, pWriter-
22400 3e 69 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  >iEnd, 0, 0);.  
22410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22420 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
22430 20 20 70 57 72 69 74 65 72 2d 3e 69 41 62 73 4c    pWriter->iAbsL
22440 65 76 65 6c 20 3d 20 69 41 62 73 4c 65 76 65 6c  evel = iAbsLevel
22450 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  ;.  pWriter->nLe
22460 61 66 45 73 74 20 3d 20 6e 4c 65 61 66 45 73 74  afEst = nLeafEst
22470 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64  ;.  pWriter->iId
22480 78 20 3d 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20  x = iIdx;..  /* 
22490 53 65 74 20 75 70 20 74 68 65 20 61 72 72 61 79  Set up the array
224a0 20 6f 66 20 4e 6f 64 65 57 72 69 74 65 72 20 6f   of NodeWriter o
224b0 62 6a 65 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28  bjects */.  for(
224c0 69 3d 30 3b 20 69 3c 46 54 53 5f 4d 41 58 5f 41  i=0; i<FTS_MAX_A
224d0 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54  PPENDABLE_HEIGHT
224e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 57 72 69  ; i++){.    pWri
224f0 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
22500 5b 69 5d 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72  [i].iBlock = pWr
22510 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 69  iter->iStart + i
22520 2a 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45  *pWriter->nLeafE
22530 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  st;.  }.  return
22540 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22550 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 20 65  *.** Remove an e
22560 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 25 5f  ntry from the %_
22570 73 65 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68  segdir table. Th
22580 69 73 20 69 6e 76 6f 6c 76 65 73 20 72 75 6e 6e  is involves runn
22590 69 6e 67 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c  ing the .** foll
225a0 6f 77 69 6e 67 20 74 77 6f 20 73 74 61 74 65 6d  owing two statem
225b0 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 44 45  ents:.**.**   DE
225c0 4c 45 54 45 20 46 52 4f 4d 20 25 5f 73 65 67 64  LETE FROM %_segd
225d0 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  ir WHERE level =
225e0 20 3a 69 41 62 73 4c 65 76 65 6c 20 41 4e 44 20   :iAbsLevel AND 
225f0 69 64 78 20 3d 20 3a 69 49 64 78 0a 2a 2a 20 20  idx = :iIdx.**  
22600 20 55 50 44 41 54 45 20 25 5f 73 65 67 64 69 72   UPDATE %_segdir
22610 20 53 45 54 20 69 64 78 20 3d 20 69 64 78 20 2d   SET idx = idx -
22620 20 31 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d   1 WHERE level =
22630 20 3a 69 41 62 73 4c 65 76 65 6c 20 41 4e 44 20   :iAbsLevel AND 
22640 69 64 78 20 3e 20 3a 69 49 64 78 0a 2a 2a 0a 2a  idx > :iIdx.**.*
22650 2a 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61  * The DELETE sta
22660 74 65 6d 65 6e 74 20 72 65 6d 6f 76 65 73 20 74  tement removes t
22670 68 65 20 73 70 65 63 69 66 69 63 20 25 5f 73 65  he specific %_se
22680 67 64 69 72 20 6c 65 76 65 6c 2e 20 54 68 65 20  gdir level. The 
22690 55 50 44 41 54 45 20 0a 2a 2a 20 73 74 61 74 65  UPDATE .** state
226a0 6d 65 6e 74 20 65 6e 73 75 72 65 73 20 74 68 61  ment ensures tha
226b0 74 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  t the remaining 
226c0 73 65 67 6d 65 6e 74 73 20 68 61 76 65 20 63 6f  segments have co
226d0 6e 74 69 67 75 6f 75 73 6c 79 20 61 6c 6c 6f 63  ntiguously alloc
226e0 61 74 65 64 0a 2a 2a 20 69 64 78 20 76 61 6c 75  ated.** idx valu
226f0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
22700 74 20 66 74 73 33 52 65 6d 6f 76 65 53 65 67 64  t fts3RemoveSegd
22710 69 72 45 6e 74 72 79 28 0a 20 20 46 74 73 33 54  irEntry(.  Fts3T
22720 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
22730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
22740 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
22750 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
22760 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
22770 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
22780 20 6c 65 76 65 6c 20 74 6f 20 64 65 6c 65 74 65   level to delete
22790 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
227a0 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
227b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
227c0 64 65 78 20 6f 66 20 25 5f 73 65 67 64 69 72 20  dex of %_segdir 
227d0 65 6e 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20  entry to delete 
227e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22800 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
22810 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
22820 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
22830 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 44  e = 0;      /* D
22840 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
22850 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  */..  rc = fts3S
22860 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45  qlStmt(p, SQL_DE
22870 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54 52  LETE_SEGDIR_ENTR
22880 59 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b  Y, &pDelete, 0);
22890 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
228a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
228b0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
228c0 44 65 6c 65 74 65 2c 20 31 2c 20 69 41 62 73 4c  Delete, 1, iAbsL
228d0 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  evel);.    sqlit
228e0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c  e3_bind_int(pDel
228f0 65 74 65 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20  ete, 2, iIdx);. 
22900 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
22910 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 72 63  pDelete);.    rc
22920 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
22930 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a  (pDelete);.  }..
22940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22950 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72  /*.** One or mor
22960 65 20 73 65 67 6d 65 6e 74 73 20 68 61 76 65 20  e segments have 
22970 6a 75 73 74 20 62 65 65 6e 20 72 65 6d 6f 76 65  just been remove
22980 64 20 66 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20  d from absolute 
22990 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e  level iAbsLevel.
229a0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 27  .** Update the '
229b0 69 64 78 27 20 76 61 6c 75 65 73 20 6f 66 20 74  idx' values of t
229c0 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73 65 67  he remaining seg
229d0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 65 76  ments in the lev
229e0 65 6c 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  el so that.** th
229f0 65 20 69 64 78 20 76 61 6c 75 65 73 20 61 72 65  e idx values are
22a00 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65   a contiguous se
22a10 71 75 65 6e 63 65 20 73 74 61 72 74 69 6e 67 20  quence starting 
22a20 66 72 6f 6d 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  from 0..*/.stati
22a30 63 20 69 6e 74 20 66 74 73 33 52 65 70 61 63 6b  c int fts3Repack
22a40 53 65 67 64 69 72 4c 65 76 65 6c 28 0a 20 20 46  SegdirLevel(.  F
22a50 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a70 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e  * FTS3 table han
22a80 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
22a90 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
22aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f           /* Abso
22ab0 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20 72 65  lute level to re
22ac0 70 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pack */.){.  int
22ad0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22af0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
22b00 20 69 6e 74 20 2a 61 49 64 78 20 3d 20 30 3b 20   int *aIdx = 0; 
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65 6d   /* Array of rem
22b30 61 69 6e 69 6e 67 20 69 64 78 20 76 61 6c 75 65  aining idx value
22b40 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 64 78 20  s */.  int nIdx 
22b50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22b60 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
22b70 65 6e 74 72 69 65 73 20 69 6e 20 61 49 64 78 5b  entries in aIdx[
22b80 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  ] */.  int nAllo
22b90 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
22ba0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
22bb0 74 65 64 20 73 69 7a 65 20 6f 66 20 61 49 64 78  ted size of aIdx
22bc0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  [] */.  int i;  
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
22bf0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
22c00 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
22c10 70 53 65 6c 65 63 74 20 3d 20 30 3b 20 20 20 20  pSelect = 0;    
22c20 20 20 2f 2a 20 53 65 6c 65 63 74 20 73 74 61 74    /* Select stat
22c30 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 69 64  ement to read id
22c40 78 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 73 71  x values */.  sq
22c50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64  lite3_stmt *pUpd
22c60 61 74 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ate = 0;      /*
22c70 20 55 70 64 61 74 65 20 73 74 61 74 65 6d 65 6e   Update statemen
22c80 74 20 74 6f 20 6d 6f 64 69 66 79 20 69 64 78 20  t to modify idx 
22c90 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 72 63 20  values */..  rc 
22ca0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
22cb0 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 45   SQL_SELECT_INDE
22cc0 58 45 53 2c 20 26 70 53 65 6c 65 63 74 2c 20 30  XES, &pSelect, 0
22cd0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
22cf0 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  t rc2;.    sqlit
22d00 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
22d10 65 6c 65 63 74 2c 20 31 2c 20 69 41 62 73 4c 65  elect, 1, iAbsLe
22d20 76 65 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  vel);.    while(
22d30 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
22d40 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
22d50 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
22d60 6e 49 64 78 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a  nIdx>=nAlloc ){.
22d70 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65          int *aNe
22d80 77 3b 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f  w;.        nAllo
22d90 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20  c += 16;.       
22da0 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
22db0 72 65 61 6c 6c 6f 63 28 61 49 64 78 2c 20 6e 41  realloc(aIdx, nA
22dc0 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29  lloc*sizeof(int)
22dd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
22de0 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  aNew ){.        
22df0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22e00 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  MEM;.          b
22e10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
22e20 20 20 20 20 20 20 20 20 61 49 64 78 20 3d 20 61          aIdx = a
22e30 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
22e40 20 20 20 61 49 64 78 5b 6e 49 64 78 2b 2b 5d 20     aIdx[nIdx++] 
22e50 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
22e60 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c 20 30 29  _int(pSelect, 0)
22e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  ;.    }.    rc2 
22e80 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
22e90 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  pSelect);.    if
22ea0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22eb0 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
22ec0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
22ee0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
22ef0 53 51 4c 5f 53 48 49 46 54 5f 53 45 47 44 49 52  SQL_SHIFT_SEGDIR
22f00 5f 45 4e 54 52 59 2c 20 26 70 55 70 64 61 74 65  _ENTRY, &pUpdate
22f10 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
22f20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
22f40 64 5f 69 6e 74 36 34 28 70 55 70 64 61 74 65 2c  d_int64(pUpdate,
22f50 20 32 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a   2, iAbsLevel);.
22f60 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
22f70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69  ->bIgnoreSavepoi
22f80 6e 74 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 62 49  nt==0 );.  p->bI
22f90 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 20 3d  gnoreSavepoint =
22fa0 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   1;.  for(i=0; r
22fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22fc0 69 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  i<nIdx; i++){.  
22fd0 20 20 69 66 28 20 61 49 64 78 5b 69 5d 21 3d 69    if( aIdx[i]!=i
22fe0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22ff0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61  3_bind_int(pUpda
23000 74 65 2c 20 33 2c 20 61 49 64 78 5b 69 5d 29 3b  te, 3, aIdx[i]);
23010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
23020 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 2c  ind_int(pUpdate,
23030 20 31 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71   1, i);.      sq
23040 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61  lite3_step(pUpda
23050 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  te);.      rc = 
23060 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55  sqlite3_reset(pU
23070 70 64 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pdate);.    }.  
23080 7d 0a 20 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61  }.  p->bIgnoreSa
23090 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20  vepoint = 0;..  
230a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49 64  sqlite3_free(aId
230b0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
230c0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
230d0 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28 42 6c  fts3StartNode(Bl
230e0 6f 62 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69  ob *pNode, int i
230f0 48 65 69 67 68 74 2c 20 73 71 6c 69 74 65 33 5f  Height, sqlite3_
23100 69 6e 74 36 34 20 69 43 68 69 6c 64 29 7b 0a 20  int64 iChild){. 
23110 20 70 4e 6f 64 65 2d 3e 61 5b 30 5d 20 3d 20 28   pNode->a[0] = (
23120 63 68 61 72 29 69 48 65 69 67 68 74 3b 0a 20 20  char)iHeight;.  
23130 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
23140 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
23150 3e 6e 41 6c 6c 6f 63 3e 3d 31 2b 73 71 6c 69 74  >nAlloc>=1+sqlit
23160 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
23170 69 43 68 69 6c 64 29 20 29 3b 0a 20 20 20 20 70  iChild) );.    p
23180 4e 6f 64 65 2d 3e 6e 20 3d 20 31 20 2b 20 73 71  Node->n = 1 + sq
23190 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
231a0 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 31 5d 2c  nt(&pNode->a[1],
231b0 20 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73   iChild);.  }els
231c0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
231d0 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 20  Node->nAlloc>=1 
231e0 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20  );.    pNode->n 
231f0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
23200 2a 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  * The first two 
23210 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 20  arguments are a 
23220 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74  pointer to and t
23230 68 65 20 73 69 7a 65 20 6f 66 20 61 20 73 65 67  he size of a seg
23240 6d 65 6e 74 20 62 2d 74 72 65 65 0a 2a 2a 20 6e  ment b-tree.** n
23250 6f 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6d 61  ode. The node ma
23260 79 20 62 65 20 61 20 6c 65 61 66 20 6f 72 20 61  y be a leaf or a
23270 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  n internal node.
23280 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
23290 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 6e  tion creates a n
232a0 65 77 20 6e 6f 64 65 20 69 6d 61 67 65 20 69 6e  ew node image in
232b0 20 62 6c 6f 62 20 6f 62 6a 65 63 74 20 2a 70 4e   blob object *pN
232c0 65 77 20 62 79 20 63 6f 70 79 69 6e 67 0a 2a 2a  ew by copying.**
232d0 20 61 6c 6c 20 74 65 72 6d 73 20 74 68 61 74 20   all terms that 
232e0 61 72 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  are greater than
232f0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 54 65   or equal to zTe
23300 72 6d 2f 6e 54 65 72 6d 20 28 66 6f 72 20 6c 65  rm/nTerm (for le
23310 61 66 20 6e 6f 64 65 73 29 0a 2a 2a 20 6f 72 20  af nodes).** or 
23320 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 54 65  greater than zTe
23330 72 6d 2f 6e 54 65 72 6d 20 28 66 6f 72 20 69 6e  rm/nTerm (for in
23340 74 65 72 6e 61 6c 20 6e 6f 64 65 73 29 20 66 72  ternal nodes) fr
23350 6f 6d 20 61 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a  om aNode/nNode..
23360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
23370 73 33 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 0a  s3TruncateNode(.
23380 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e    const char *aN
23390 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
233a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 6f 64    /* Current nod
233b0 65 20 69 6d 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e image */.  int
233c0 20 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20   nNode,         
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
233e0 53 69 7a 65 20 6f 66 20 61 4e 6f 64 65 20 69 6e  Size of aNode in
233f0 20 62 79 74 65 73 20 2a 2f 0a 20 20 42 6c 6f 62   bytes */.  Blob
23400 20 2a 70 4e 65 77 2c 20 20 20 20 20 20 20 20 20   *pNew,         
23410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23420 55 54 3a 20 57 72 69 74 65 20 6e 65 77 20 6e 6f  UT: Write new no
23430 64 65 20 69 6d 61 67 65 20 68 65 72 65 20 2a 2f  de image here */
23440 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23450 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
23460 20 20 20 2f 2a 20 4f 6d 69 74 20 61 6c 6c 20 74     /* Omit all t
23470 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  erms smaller tha
23480 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  n this */.  int 
23490 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
234a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
234b0 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
234c0 62 79 74 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  bytes */.  sqlit
234d0 65 33 5f 69 6e 74 36 34 20 2a 70 69 42 6c 6f 63  e3_int64 *piBloc
234e0 6b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  k          /* OU
234f0 54 3a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20  T: Block number 
23500 69 6e 20 6e 65 78 74 20 6c 61 79 65 72 20 64 6f  in next layer do
23510 77 6e 20 2a 2f 0a 29 7b 0a 20 20 4e 6f 64 65 52  wn */.){.  NodeR
23520 65 61 64 65 72 20 72 65 61 64 65 72 3b 20 20 20  eader reader;   
23530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23540 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ader object */. 
23550 20 42 6c 6f 62 20 70 72 65 76 20 3d 20 7b 30 2c   Blob prev = {0,
23560 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20   0, 0};         
23570 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72   /* Previous ter
23580 6d 20 77 72 69 74 74 65 6e 20 74 6f 20 6e 65 77  m written to new
23590 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72   node */.  int r
235a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
235b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
235c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
235d0 6e 74 20 62 4c 65 61 66 20 3d 20 61 4e 6f 64 65  nt bLeaf = aNode
235e0 5b 30 5d 3d 3d 27 5c 30 27 3b 20 20 20 20 20 2f  [0]=='\0';     /
235f0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 6c 65 61  * True for a lea
23600 66 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  f node */..  /* 
23610 41 6c 6c 6f 63 61 74 65 20 72 65 71 75 69 72 65  Allocate require
23620 64 20 6f 75 74 70 75 74 20 73 70 61 63 65 20 2a  d output space *
23630 2f 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66  /.  blobGrowBuff
23640 65 72 28 70 4e 65 77 2c 20 6e 4e 6f 64 65 2c 20  er(pNew, nNode, 
23650 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  &rc);.  if( rc!=
23660 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
23670 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 6e  rn rc;.  pNew->n
23680 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 6f 70 75   = 0;..  /* Popu
23690 6c 61 74 65 20 6e 65 77 20 6e 6f 64 65 20 62 75  late new node bu
236a0 66 66 65 72 20 2a 2f 0a 20 20 66 6f 72 28 72 63  ffer */.  for(rc
236b0 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69   = nodeReaderIni
236c0 74 28 26 72 65 61 64 65 72 2c 20 61 4e 6f 64 65  t(&reader, aNode
236d0 2c 20 6e 4e 6f 64 65 29 3b 20 0a 20 20 20 20 20  , nNode); .     
236e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
236f0 26 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b 20  & reader.aNode; 
23700 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  .      rc = node
23710 52 65 61 64 65 72 4e 65 78 74 28 26 72 65 61 64  ReaderNext(&read
23720 65 72 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  er).  ){.    if(
23730 20 70 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pNew->n==0 ){. 
23740 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66       int res = f
23750 74 73 33 54 65 72 6d 43 6d 70 28 72 65 61 64 65  ts3TermCmp(reade
23760 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72  r.term.a, reader
23770 2e 74 65 72 6d 2e 6e 2c 20 7a 54 65 72 6d 2c 20  .term.n, zTerm, 
23780 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66  nTerm);.      if
23790 28 20 72 65 73 3c 30 20 7c 7c 20 28 62 4c 65 61  ( res<0 || (bLea
237a0 66 3d 3d 30 20 26 26 20 72 65 73 3d 3d 30 29 20  f==0 && res==0) 
237b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
237c0 20 20 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28    fts3StartNode(
237d0 70 4e 65 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65  pNew, (int)aNode
237e0 5b 30 5d 2c 20 72 65 61 64 65 72 2e 69 43 68 69  [0], reader.iChi
237f0 6c 64 29 3b 0a 20 20 20 20 20 20 2a 70 69 42 6c  ld);.      *piBl
23800 6f 63 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68  ock = reader.iCh
23810 69 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ild;.    }.    r
23820 63 20 3d 20 66 74 73 33 41 70 70 65 6e 64 54 6f  c = fts3AppendTo
23830 4e 6f 64 65 28 0a 20 20 20 20 20 20 20 20 70 4e  Node(.        pN
23840 65 77 2c 20 26 70 72 65 76 2c 20 72 65 61 64 65  ew, &prev, reade
23850 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72  r.term.a, reader
23860 2e 74 65 72 6d 2e 6e 2c 0a 20 20 20 20 20 20 20  .term.n,.       
23870 20 72 65 61 64 65 72 2e 61 44 6f 63 6c 69 73 74   reader.aDoclist
23880 2c 20 72 65 61 64 65 72 2e 6e 44 6f 63 6c 69 73  , reader.nDoclis
23890 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
238a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
238b0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
238c0 28 20 70 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a  ( pNew->n==0 ){.
238d0 20 20 20 20 66 74 73 33 53 74 61 72 74 4e 6f 64      fts3StartNod
238e0 65 28 70 4e 65 77 2c 20 28 69 6e 74 29 61 4e 6f  e(pNew, (int)aNo
238f0 64 65 5b 30 5d 2c 20 72 65 61 64 65 72 2e 69 43  de[0], reader.iC
23900 68 69 6c 64 29 3b 0a 20 20 20 20 2a 70 69 42 6c  hild);.    *piBl
23910 6f 63 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68  ock = reader.iCh
23920 69 6c 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ild;.  }.  asser
23930 74 28 20 70 4e 65 77 2d 3e 6e 3c 3d 70 4e 65 77  t( pNew->n<=pNew
23940 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 6e  ->nAlloc );..  n
23950 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65  odeReaderRelease
23960 28 26 72 65 61 64 65 72 29 3b 0a 20 20 73 71 6c  (&reader);.  sql
23970 69 74 65 33 5f 66 72 65 65 28 70 72 65 76 2e 61  ite3_free(prev.a
23980 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23990 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
239a0 61 6c 6c 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65  all terms smalle
239b0 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65  r than zTerm/nTe
239c0 72 6d 20 66 72 6f 6d 20 73 65 67 6d 65 6e 74 20  rm from segment 
239d0 69 49 64 78 20 69 6e 20 61 62 73 6f 6c 75 74 65  iIdx in absolute
239e0 20 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c   .** level iAbsL
239f0 65 76 65 6c 2e 20 54 68 69 73 20 6d 61 79 20 69  evel. This may i
23a00 6e 76 6f 6c 76 65 20 64 65 6c 65 74 69 6e 67 20  nvolve deleting 
23a10 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
23a20 20 25 5f 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 74   %_segments.** t
23a30 61 62 6c 65 2c 20 61 6e 64 20 6d 6f 64 69 66 79  able, and modify
23a40 69 6e 67 20 65 78 69 73 74 69 6e 67 20 65 6e 74  ing existing ent
23a50 72 69 65 73 20 69 6e 20 62 6f 74 68 20 74 68 65  ries in both the
23a60 20 25 5f 73 65 67 6d 65 6e 74 73 20 61 6e 64 20   %_segments and 
23a70 25 5f 73 65 67 64 69 72 0a 2a 2a 20 74 61 62 6c  %_segdir.** tabl
23a80 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  es..**.** SQLITE
23a90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
23aa0 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69  if the segment i
23ab0 73 20 75 70 64 61 74 65 64 20 73 75 63 63 65 73  s updated succes
23ac0 73 66 75 6c 6c 79 2e 20 4f 72 20 61 6e 0a 2a 2a  sfully. Or an.**
23ad0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
23ae0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
23af0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
23b00 54 72 75 6e 63 61 74 65 53 65 67 6d 65 6e 74 28  TruncateSegment(
23b10 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
23b40 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
23b50 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c  ite3_int64 iAbsL
23b60 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  evel,        /* 
23b70 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f  Absolute level o
23b80 66 20 73 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64  f segment to mod
23b90 69 66 79 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ify */.  int iId
23ba0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
23bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
23bc0 78 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 20 6f  x within level o
23bd0 66 20 73 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64  f segment to mod
23be0 69 66 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ify */.  const c
23bf0 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
23c00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f           /* Remo
23c10 76 65 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72  ve terms smaller
23c20 20 74 68 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20   than this */.  
23c30 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20  int nTerm       
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
23c60 73 20 69 6e 20 62 75 66 66 65 72 20 7a 54 65 72  s in buffer zTer
23c70 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  m */.){.  int rc
23c80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
23c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
23ca0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 6c  urn code */.  Bl
23cb0 6f 62 20 72 6f 6f 74 20 3d 20 7b 30 2c 30 2c 30  ob root = {0,0,0
23cc0 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  };            /*
23cd0 20 4e 65 77 20 72 6f 6f 74 20 70 61 67 65 20 69   New root page i
23ce0 6d 61 67 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 62  mage */.  Blob b
23cf0 6c 6f 63 6b 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  lock = {0,0,0}; 
23d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
23d10 66 65 72 20 75 73 65 64 20 66 6f 72 20 61 6e 79  fer used for any
23d20 20 6f 74 68 65 72 20 62 6c 6f 63 6b 20 2a 2f 0a   other block */.
23d30 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
23d40 69 42 6c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20  iBlock = 0;     
23d50 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 2a 2f    /* Block id */
23d60 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
23d70 20 69 4e 65 77 53 74 61 72 74 20 3d 20 30 3b 20   iNewStart = 0; 
23d80 20 20 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20     /* New value 
23d90 66 6f 72 20 69 53 74 61 72 74 42 6c 6f 63 6b 20  for iStartBlock 
23da0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
23db0 36 34 20 69 4f 6c 64 53 74 61 72 74 20 3d 20 30  64 iOldStart = 0
23dc0 3b 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75  ;    /* Old valu
23dd0 65 20 66 6f 72 20 69 53 74 61 72 74 42 6c 6f 63  e for iStartBloc
23de0 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  k */.  sqlite3_s
23df0 74 6d 74 20 2a 70 46 65 74 63 68 20 3d 20 30 3b  tmt *pFetch = 0;
23e00 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
23e10 65 6e 74 20 75 73 65 64 20 74 6f 20 66 65 74 63  ent used to fetc
23e20 68 20 73 65 67 64 69 72 20 2a 2f 0a 0a 20 20 72  h segdir */..  r
23e30 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
23e40 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45  p, SQL_SELECT_SE
23e50 47 44 49 52 2c 20 26 70 46 65 74 63 68 2c 20 30  GDIR, &pFetch, 0
23e60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
23e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
23e80 74 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20  t rc2;          
23e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23ea0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 72  qlite3_reset() r
23eb0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
23ec0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
23ed0 6e 74 36 34 28 70 46 65 74 63 68 2c 20 31 2c 20  nt64(pFetch, 1, 
23ee0 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20  iAbsLevel);.    
23ef0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
23f00 28 70 46 65 74 63 68 2c 20 32 2c 20 69 49 64 78  (pFetch, 2, iIdx
23f10 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
23f20 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
23f30 74 65 70 28 70 46 65 74 63 68 29 20 29 7b 0a 20  tep(pFetch) ){. 
23f40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
23f50 2a 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33  *aRoot = sqlite3
23f60 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 46 65  _column_blob(pFe
23f70 74 63 68 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  tch, 4);.      i
23f80 6e 74 20 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74  nt nRoot = sqlit
23f90 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
23fa0 70 46 65 74 63 68 2c 20 34 29 3b 0a 20 20 20 20  pFetch, 4);.    
23fb0 20 20 69 4f 6c 64 53 74 61 72 74 20 3d 20 73 71    iOldStart = sq
23fc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
23fd0 36 34 28 70 46 65 74 63 68 2c 20 31 29 3b 0a 20  64(pFetch, 1);. 
23fe0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 72       rc = fts3Tr
23ff0 75 6e 63 61 74 65 4e 6f 64 65 28 61 52 6f 6f 74  uncateNode(aRoot
24000 2c 20 6e 52 6f 6f 74 2c 20 26 72 6f 6f 74 2c 20  , nRoot, &root, 
24010 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69  zTerm, nTerm, &i
24020 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Block);.    }.  
24030 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
24040 72 65 73 65 74 28 70 46 65 74 63 68 29 3b 0a 20  reset(pFetch);. 
24050 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24060 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
24070 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
24080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24090 69 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68  iBlock ){.    ch
240a0 61 72 20 2a 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a  ar *aBlock = 0;.
240b0 20 20 20 20 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d      int nBlock =
240c0 20 30 3b 0a 20 20 20 20 69 4e 65 77 53 74 61 72   0;.    iNewStar
240d0 74 20 3d 20 69 42 6c 6f 63 6b 3b 0a 0a 20 20 20  t = iBlock;..   
240e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
240f0 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 69 42  3ReadBlock(p, iB
24100 6c 6f 63 6b 2c 20 26 61 42 6c 6f 63 6b 2c 20 26  lock, &aBlock, &
24110 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20  nBlock, 0);.    
24120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24130 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
24140 66 74 73 33 54 72 75 6e 63 61 74 65 4e 6f 64 65  fts3TruncateNode
24150 28 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 2c  (aBlock, nBlock,
24160 20 26 62 6c 6f 63 6b 2c 20 7a 54 65 72 6d 2c 20   &block, zTerm, 
24170 6e 54 65 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b  nTerm, &iBlock);
24180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
24190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
241a0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57        rc = fts3W
241b0 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 69  riteSegment(p, i
241c0 4e 65 77 53 74 61 72 74 2c 20 62 6c 6f 63 6b 2e  NewStart, block.
241d0 61 2c 20 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20  a, block.n);.   
241e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
241f0 72 65 65 28 61 42 6c 6f 63 6b 29 3b 0a 20 20 7d  ree(aBlock);.  }
24200 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
24210 69 4e 65 77 53 74 61 72 74 20 6e 6f 77 20 63 6f  iNewStart now co
24220 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74  ntains the first
24230 20 76 61 6c 69 64 20 6c 65 61 66 20 6e 6f 64 65   valid leaf node
24240 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
24250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4e 65 77  QLITE_OK && iNew
24260 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Start ){.    sql
24270 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 20  ite3_stmt *pDel 
24280 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  = 0;.    rc = ft
24290 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
242a0 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53  _DELETE_SEGMENTS
242b0 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 2c 20 30  _RANGE, &pDel, 0
242c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
242d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
242e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
242f0 6e 74 36 34 28 70 44 65 6c 2c 20 31 2c 20 69 4f  nt64(pDel, 1, iO
24300 6c 64 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  ldStart);.      
24310 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
24320 36 34 28 70 44 65 6c 2c 20 32 2c 20 69 4e 65 77  64(pDel, 2, iNew
24330 53 74 61 72 74 2d 31 29 3b 0a 20 20 20 20 20 20  Start-1);.      
24340 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65  sqlite3_step(pDe
24350 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  l);.      rc = s
24360 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65  qlite3_reset(pDe
24370 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  l);.    }.  }.. 
24380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24390 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
243a0 33 5f 73 74 6d 74 20 2a 70 43 68 6f 6d 70 20 3d  3_stmt *pChomp =
243b0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   0;.    rc = fts
243c0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
243d0 43 48 4f 4d 50 5f 53 45 47 44 49 52 2c 20 26 70  CHOMP_SEGDIR, &p
243e0 43 68 6f 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  Chomp, 0);.    i
243f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24400 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24410 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68  3_bind_int64(pCh
24420 6f 6d 70 2c 20 31 2c 20 69 4e 65 77 53 74 61 72  omp, 1, iNewStar
24430 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
24440 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 43 68 6f  3_bind_blob(pCho
24450 6d 70 2c 20 32 2c 20 72 6f 6f 74 2e 61 2c 20 72  mp, 2, root.a, r
24460 6f 6f 74 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54  oot.n, SQLITE_ST
24470 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
24480 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
24490 70 43 68 6f 6d 70 2c 20 33 2c 20 69 41 62 73 4c  pChomp, 3, iAbsL
244a0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  evel);.      sql
244b0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43  ite3_bind_int(pC
244c0 68 6f 6d 70 2c 20 34 2c 20 69 49 64 78 29 3b 0a  homp, 4, iIdx);.
244d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
244e0 65 70 28 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20  ep(pChomp);.    
244f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
24500 65 73 65 74 28 70 43 68 6f 6d 70 29 3b 0a 20 20  eset(pChomp);.  
24510 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
24520 65 33 5f 66 72 65 65 28 72 6f 6f 74 2e 61 29 3b  e3_free(root.a);
24530 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24540 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 72 65 74 75  block.a);.  retu
24550 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
24570 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e   called after an
24580 20 69 6e 63 72 6d 65 6e 74 61 6c 2d 6d 65 72 67   incrmental-merg
24590 65 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20  e operation has 
245a0 72 75 6e 20 74 6f 0a 2a 2a 20 6d 65 72 67 65 20  run to.** merge 
245b0 28 6f 72 20 70 61 72 74 69 61 6c 6c 79 20 6d 65  (or partially me
245c0 72 67 65 29 20 74 77 6f 20 6f 72 20 6d 6f 72 65  rge) two or more
245d0 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61   segments from a
245e0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a 2a  bsolute level.**
245f0 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a   iAbsLevel..**.*
24600 2a 20 45 61 63 68 20 69 6e 70 75 74 20 73 65 67  * Each input seg
24610 6d 65 6e 74 20 69 73 20 65 69 74 68 65 72 20 72  ment is either r
24620 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
24630 64 62 20 63 6f 6d 70 6c 65 74 65 6c 79 20 28 69  db completely (i
24640 66 20 61 6c 6c 20 6f 66 0a 2a 2a 20 69 74 73 20  f all of.** its 
24650 64 61 74 61 20 77 61 73 20 63 6f 70 69 65 64 20  data was copied 
24660 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  to the output se
24670 67 6d 65 6e 74 20 62 79 20 74 68 65 20 69 6e 63  gment by the inc
24680 72 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e  rmerge operation
24690 29 0a 2a 2a 20 6f 72 20 6d 6f 64 69 66 69 65 64  ).** or modified
246a0 20 69 6e 20 70 6c 61 63 65 20 73 6f 20 74 68 61   in place so tha
246b0 74 20 69 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 63  t it no longer c
246c0 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 65 6e  ontains those en
246d0 74 72 69 65 73 20 74 68 61 74 0a 2a 2a 20 68 61  tries that.** ha
246e0 76 65 20 62 65 65 6e 20 64 75 70 6c 69 63 61 74  ve been duplicat
246f0 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ed in the output
24700 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
24710 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
24720 6d 65 72 67 65 43 68 6f 6d 70 28 0a 20 20 46 74  mergeChomp(.  Ft
24730 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24750 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c   FTS table handl
24760 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
24770 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20  nt64 iAbsLevel, 
24780 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
24790 74 65 20 6c 65 76 65 6c 20 63 6f 6e 74 61 69 6e  te level contain
247a0 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ing segments */.
247b0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
247c0 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20  ader *pCsr,     
247d0 20 20 2f 2a 20 43 68 6f 6d 70 20 61 6c 6c 20 73    /* Chomp all s
247e0 65 67 6d 65 6e 74 73 20 6f 70 65 6e 65 64 20 62  egments opened b
247f0 79 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  y this cursor */
24800 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20  .  int *pnRem   
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24830 73 65 67 6d 65 6e 74 73 20 6e 6f 74 20 64 65 6c  segments not del
24840 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eted */.){.  int
24850 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d   i;.  int nRem =
24860 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
24870 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72  QLITE_OK;..  for
24880 28 69 3d 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  (i=pCsr->nSegmen
24890 74 2d 31 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d  t-1; i>=0 && rc=
248a0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29  =SQLITE_OK; i--)
248b0 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52 65 61  {.    Fts3SegRea
248c0 64 65 72 20 2a 70 53 65 67 20 3d 20 30 3b 0a 20  der *pSeg = 0;. 
248d0 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 2f     int j;..    /
248e0 2a 20 46 69 6e 64 20 74 68 65 20 46 74 73 33 53  * Find the Fts3S
248f0 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20  egReader object 
24900 77 69 74 68 20 46 74 73 33 53 65 67 52 65 61 64  with Fts3SegRead
24910 65 72 2e 69 49 64 78 3d 3d 69 2e 20 49 74 20 69  er.iIdx==i. It i
24920 73 20 68 69 64 69 6e 67 0a 20 20 20 20 2a 2a 20  s hiding.    ** 
24930 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
24940 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
24950 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20  [] array.  */.  
24960 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
24970 53 28 6a 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65  S(j<pCsr->nSegme
24980 6e 74 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nt); j++){.     
24990 20 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70   pSeg = pCsr->ap
249a0 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20  Segment[j];.    
249b0 20 20 69 66 28 20 70 53 65 67 2d 3e 69 49 64 78    if( pSeg->iIdx
249c0 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
249d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a   }.    assert( j
249e0 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20  <pCsr->nSegment 
249f0 26 26 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69  && pSeg->iIdx==i
24a00 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65   );..    if( pSe
24a10 67 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  g->aNode==0 ){. 
24a20 20 20 20 20 20 2f 2a 20 53 65 67 2d 72 65 61 64       /* Seg-read
24a30 65 72 20 69 73 20 61 74 20 45 4f 46 2e 20 52 65  er is at EOF. Re
24a40 6d 6f 76 65 20 74 68 65 20 65 6e 74 69 72 65 20  move the entire 
24a50 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a  input segment. *
24a60 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  /.      rc = fts
24a70 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74 28 70  3DeleteSegment(p
24a80 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 69  , pSeg);.      i
24a90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24ab0 20 66 74 73 33 52 65 6d 6f 76 65 53 65 67 64 69   fts3RemoveSegdi
24ac0 72 45 6e 74 72 79 28 70 2c 20 69 41 62 73 4c 65  rEntry(p, iAbsLe
24ad0 76 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78 29  vel, pSeg->iIdx)
24ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24af0 2a 70 6e 52 65 6d 20 3d 20 30 3b 0a 20 20 20 20  *pnRem = 0;.    
24b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
24b10 54 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  The incremental 
24b20 6d 65 72 67 65 20 64 69 64 20 6e 6f 74 20 63 6f  merge did not co
24b30 70 79 20 61 6c 6c 20 74 68 65 20 64 61 74 61 20  py all the data 
24b40 66 72 6f 6d 20 74 68 69 73 20 0a 20 20 20 20 20  from this .     
24b50 20 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 74   ** segment to t
24b60 68 65 20 75 70 70 65 72 20 6c 65 76 65 6c 2e 20  he upper level. 
24b70 54 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 6d  The segment is m
24b80 6f 64 69 66 69 65 64 20 69 6e 20 70 6c 61 63 65  odified in place
24b90 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  .      ** so tha
24ba0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  t it contains no
24bb0 20 6b 65 79 73 20 73 6d 61 6c 6c 65 72 20 74 68   keys smaller th
24bc0 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20  an zTerm/nTerm. 
24bd0 2a 2f 20 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  */ .      const 
24be0 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 53  char *zTerm = pS
24bf0 65 67 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20  eg->zTerm;.     
24c00 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53 65   int nTerm = pSe
24c10 67 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  g->nTerm;.      
24c20 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63 61 74  rc = fts3Truncat
24c30 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 41 62 73  eSegment(p, iAbs
24c40 4c 65 76 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64  Level, pSeg->iId
24c50 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  x, zTerm, nTerm)
24c60 3b 0a 20 20 20 20 20 20 6e 52 65 6d 2b 2b 3b 0a  ;.      nRem++;.
24c70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
24c80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24c90 26 20 6e 52 65 6d 21 3d 70 43 73 72 2d 3e 6e 53  & nRem!=pCsr->nS
24ca0 65 67 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 63  egment ){.    rc
24cb0 20 3d 20 66 74 73 33 52 65 70 61 63 6b 53 65 67   = fts3RepackSeg
24cc0 64 69 72 4c 65 76 65 6c 28 70 2c 20 69 41 62 73  dirLevel(p, iAbs
24cd0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a  Level);.  }..  *
24ce0 70 6e 52 65 6d 20 3d 20 6e 52 65 6d 3b 0a 20 20  pnRem = nRem;.  
24cf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24d00 0a 2a 2a 20 53 74 6f 72 65 20 61 6e 20 69 6e 63  .** Store an inc
24d10 72 2d 6d 65 72 67 65 20 68 69 6e 74 20 69 6e 20  r-merge hint in 
24d20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
24d30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
24d40 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 53 74 6f  IncrmergeHintSto
24d50 72 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  re(Fts3Table *p,
24d60 20 42 6c 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20   Blob *pHint){. 
24d70 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
24d80 52 65 70 6c 61 63 65 20 3d 20 30 3b 0a 20 20 69  Replace = 0;.  i
24d90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24db0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24dc0 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
24dd0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c  Stmt(p, SQL_REPL
24de0 41 43 45 5f 53 54 41 54 2c 20 26 70 52 65 70 6c  ACE_STAT, &pRepl
24df0 61 63 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ace, 0);.  if( r
24e00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24e10 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
24e20 5f 69 6e 74 28 70 52 65 70 6c 61 63 65 2c 20 31  _int(pReplace, 1
24e30 2c 20 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d  , FTS_STAT_INCRM
24e40 45 52 47 45 48 49 4e 54 29 3b 0a 20 20 20 20 73  ERGEHINT);.    s
24e50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
24e60 28 70 52 65 70 6c 61 63 65 2c 20 32 2c 20 70 48  (pReplace, 2, pH
24e70 69 6e 74 2d 3e 61 2c 20 70 48 69 6e 74 2d 3e 6e  int->a, pHint->n
24e80 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
24e90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
24ea0 65 70 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20  ep(pReplace);.  
24eb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
24ec0 65 73 65 74 28 70 52 65 70 6c 61 63 65 29 3b 0a  eset(pReplace);.
24ed0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
24ee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
24ef0 61 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20 68 69  an incr-merge hi
24f00 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
24f10 62 61 73 65 2e 20 54 68 65 20 69 6e 63 72 2d 6d  base. The incr-m
24f20 65 72 67 65 20 68 69 6e 74 2c 20 69 66 20 6f 6e  erge hint, if on
24f30 65 20 0a 2a 2a 20 65 78 69 73 74 73 2c 20 69 73  e .** exists, is
24f40 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72   stored in the r
24f50 6f 77 69 64 3d 3d 31 20 72 6f 77 20 6f 66 20 74  owid==1 row of t
24f60 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e  he %_stat table.
24f70 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
24f80 73 66 75 6c 2c 20 70 6f 70 75 6c 61 74 65 20 62  sful, populate b
24f90 6c 6f 62 20 2a 70 48 69 6e 74 20 77 69 74 68 20  lob *pHint with 
24fa0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
24fb0 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 0a 2a  rom the %_stat.*
24fc0 2a 20 74 61 62 6c 65 20 61 6e 64 20 72 65 74 75  * table and retu
24fd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
24fe0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
24ff0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
25000 75 72 6e 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65  urn an.** SQLite
25010 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
25020 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
25030 6e 63 72 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64  ncrmergeHintLoad
25040 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42  (Fts3Table *p, B
25050 6c 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73  lob *pHint){.  s
25060 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
25070 6c 65 63 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lect = 0;.  int 
25080 72 63 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20  rc;..  pHint->n 
25090 3d 20 30 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  = 0;.  rc = fts3
250a0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
250b0 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 65  ELECT_STAT, &pSe
250c0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
250d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
250e0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
250f0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
25100 6e 74 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 46  nt(pSelect, 1, F
25110 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47  TS_STAT_INCRMERG
25120 45 48 49 4e 54 29 3b 0a 20 20 20 20 69 66 28 20  EHINT);.    if( 
25130 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
25140 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
25150 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
25160 20 63 68 61 72 20 2a 61 48 69 6e 74 20 3d 20 73   char *aHint = s
25170 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
25180 6f 62 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  ob(pSelect, 0);.
25190 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74 20        int nHint 
251a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
251b0 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20  _bytes(pSelect, 
251c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 48  0);.      if( aH
251d0 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 62  int ){.        b
251e0 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 48  lobGrowBuffer(pH
251f0 69 6e 74 2c 20 6e 48 69 6e 74 2c 20 26 72 63 29  int, nHint, &rc)
25200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
25210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25220 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
25230 70 48 69 6e 74 2d 3e 61 2c 20 61 48 69 6e 74 2c  pHint->a, aHint,
25240 20 6e 48 69 6e 74 29 3b 0a 20 20 20 20 20 20 20   nHint);.       
25250 20 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 6e 48     pHint->n = nH
25260 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  int;.        }. 
25270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
25280 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
25290 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  eset(pSelect);. 
252a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
252b0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
252c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
252d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  c;.}../*.** If *
252e0 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  pRc is not SQLIT
252f0 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66  E_OK when this f
25300 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
25310 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
25320 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
25330 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79 20  append an entry 
25340 74 6f 20 74 68 65 20 68 69 6e 74 20 73 74 6f 72  to the hint stor
25350 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 48 69 6e  ed in blob *pHin
25360 74 2e 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a  t. Each entry.**
25370 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f   consists of two
25380 20 76 61 72 69 6e 74 73 2c 20 74 68 65 20 61 62   varints, the ab
25390 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d  solute level num
253a0 62 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ber of the input
253b0 20 73 65 67 6d 65 6e 74 73 20 0a 2a 2a 20 61 6e   segments .** an
253c0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
253d0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2e 0a  input segments..
253e0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
253f0 66 75 6c 2c 20 6c 65 61 76 65 20 2a 70 52 63 20  ful, leave *pRc 
25400 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
25410 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 49 66 20   and return. If 
25420 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
25430 0a 2a 2a 20 73 65 74 20 2a 70 52 63 20 74 6f 20  .** set *pRc to 
25440 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
25450 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74 75  code before retu
25460 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
25470 20 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65   void fts3Incrme
25480 72 67 65 48 69 6e 74 50 75 73 68 28 0a 20 20 42  rgeHintPush(.  B
25490 6c 6f 62 20 2a 70 48 69 6e 74 2c 20 20 20 20 20  lob *pHint,     
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
254b0 2a 20 48 69 6e 74 20 62 6c 6f 62 20 74 6f 20 61  * Hint blob to a
254c0 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 36  ppend to */.  i6
254d0 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
254f0 20 46 69 72 73 74 20 76 61 72 69 6e 74 20 74 6f   First varint to
25500 20 73 74 6f 72 65 20 69 6e 20 68 69 6e 74 20 2a   store in hint *
25510 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20  /.  int nInput, 
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 76 61      /* Second va
25540 72 69 6e 74 20 74 6f 20 73 74 6f 72 65 20 69 6e  rint to store in
25550 20 68 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a   hint */.  int *
25560 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
25570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
25580 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
25590 20 2a 2f 0a 29 7b 0a 20 20 62 6c 6f 62 47 72 6f   */.){.  blobGro
255a0 77 42 75 66 66 65 72 28 70 48 69 6e 74 2c 20 70  wBuffer(pHint, p
255b0 48 69 6e 74 2d 3e 6e 20 2b 20 32 2a 46 54 53 33  Hint->n + 2*FTS3
255c0 5f 56 41 52 49 4e 54 5f 4d 41 58 2c 20 70 52 63  _VARINT_MAX, pRc
255d0 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  );.  if( *pRc==S
255e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
255f0 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69  pHint->n += sqli
25600 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
25610 28 26 70 48 69 6e 74 2d 3e 61 5b 70 48 69 6e 74  (&pHint->a[pHint
25620 2d 3e 6e 5d 2c 20 69 41 62 73 4c 65 76 65 6c 29  ->n], iAbsLevel)
25630 3b 0a 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b  ;.    pHint->n +
25640 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
25650 56 61 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61  Varint(&pHint->a
25660 5b 70 48 69 6e 74 2d 3e 6e 5d 2c 20 28 69 36 34  [pHint->n], (i64
25670 29 6e 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 7d 0a  )nInput);.  }.}.
25680 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
25690 6c 61 73 74 20 65 6e 74 72 79 20 28 6d 6f 73 74  last entry (most
256a0 20 72 65 63 65 6e 74 6c 79 20 70 75 73 68 65 64   recently pushed
256b0 29 20 66 72 6f 6d 20 74 68 65 20 68 69 6e 74 20  ) from the hint 
256c0 62 6c 6f 62 20 2a 70 48 69 6e 74 0a 2a 2a 20 61  blob *pHint.** a
256d0 6e 64 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  nd then remove t
256e0 68 65 20 65 6e 74 72 79 2e 20 57 72 69 74 65 20  he entry. Write 
256f0 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 72  the two values r
25700 65 61 64 20 74 6f 20 2a 70 69 41 62 73 4c 65 76  ead to *piAbsLev
25710 65 6c 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 49 6e  el and .** *pnIn
25720 70 75 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  put before retur
25730 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ning..**.** If n
25740 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
25750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25760 2e 20 49 66 20 74 68 65 20 68 69 6e 74 20 62 6c  . If the hint bl
25770 6f 62 20 69 6e 20 2a 70 48 69 6e 74 20 64 6f 65  ob in *pHint doe
25780 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
25790 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 76 61   at least two va
257a0 6c 69 64 20 76 61 72 69 6e 74 73 2c 20 72 65 74  lid varints, ret
257b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
257c0 50 54 5f 56 54 41 42 2e 0a 2a 2f 0a 73 74 61 74  PT_VTAB..*/.stat
257d0 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
257e0 65 72 67 65 48 69 6e 74 50 6f 70 28 42 6c 6f 62  ergeHintPop(Blob
257f0 20 2a 70 48 69 6e 74 2c 20 69 36 34 20 2a 70 69   *pHint, i64 *pi
25800 41 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70  AbsLevel, int *p
25810 6e 49 6e 70 75 74 29 7b 0a 20 20 63 6f 6e 73 74  nInput){.  const
25820 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20 70 48 69   int nHint = pHi
25830 6e 74 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  nt->n;.  int i;.
25840 0a 20 20 69 20 3d 20 70 48 69 6e 74 2d 3e 6e 2d  .  i = pHint->n-
25850 32 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  2;.  while( i>0 
25860 26 26 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31  && (pHint->a[i-1
25870 5d 20 26 20 30 78 38 30 29 20 29 20 69 2d 2d 3b  ] & 0x80) ) i--;
25880 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26  .  while( i>0 &&
25890 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20   (pHint->a[i-1] 
258a0 26 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 0a  & 0x80) ) i--;..
258b0 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 69 3b 0a    pHint->n = i;.
258c0 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
258d0 73 33 47 65 74 56 61 72 69 6e 74 28 26 70 48 69  s3GetVarint(&pHi
258e0 6e 74 2d 3e 61 5b 69 5d 2c 20 70 69 41 62 73 4c  nt->a[i], piAbsL
258f0 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 73 71  evel);.  i += sq
25900 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
25910 6e 74 33 32 28 26 70 48 69 6e 74 2d 3e 61 5b 69  nt32(&pHint->a[i
25920 5d 2c 20 70 6e 49 6e 70 75 74 29 3b 0a 20 20 69  ], pnInput);.  i
25930 66 28 20 69 21 3d 6e 48 69 6e 74 20 29 20 72 65  f( i!=nHint ) re
25940 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
25950 55 50 54 5f 56 54 41 42 3b 0a 0a 20 20 72 65 74  UPT_VTAB;..  ret
25960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25970 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  .../*.** Attempt
25980 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
25990 6d 65 72 67 65 20 74 68 61 74 20 77 72 69 74 65  merge that write
259a0 73 20 6e 4d 65 72 67 65 20 6c 65 61 66 20 62 6c  s nMerge leaf bl
259b0 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72  ocks..**.** Incr
259c0 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 73 20 68  emental merges h
259d0 61 70 70 65 6e 20 6e 4d 69 6e 20 73 65 67 6d 65  appen nMin segme
259e0 6e 74 73 20 61 74 20 61 20 74 69 6d 65 2e 20 54  nts at a time. T
259f0 68 65 20 74 77 6f 0a 2a 2a 20 73 65 67 6d 65 6e  he two.** segmen
25a00 74 73 20 74 6f 20 62 65 20 6d 65 72 67 65 64 20  ts to be merged 
25a10 61 72 65 20 74 68 65 20 6e 4d 69 6e 20 6f 6c 64  are the nMin old
25a20 65 73 74 20 73 65 67 6d 65 6e 74 73 20 28 74 68  est segments (th
25a30 65 20 6f 6e 65 73 20 77 69 74 68 0a 2a 2a 20 74  e ones with.** t
25a40 68 65 20 73 6d 61 6c 6c 65 73 74 20 69 6e 64 65  he smallest inde
25a50 78 65 73 29 20 69 6e 20 74 68 65 20 68 69 67 68  xes) in the high
25a60 65 73 74 20 6c 65 76 65 6c 20 74 68 61 74 20 63  est level that c
25a70 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
25a80 0a 2a 2a 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74  .** nMin segment
25a90 73 2e 20 4d 75 6c 74 69 70 6c 65 20 6d 65 72 67  s. Multiple merg
25aa0 65 73 20 6d 69 67 68 74 20 6f 63 63 75 72 20 69  es might occur i
25ab0 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  n an attempt to 
25ac0 77 72 69 74 65 20 74 68 65 20 0a 2a 2a 20 71 75  write the .** qu
25ad0 6f 74 61 20 6f 66 20 6e 4d 65 72 67 65 20 6c 65  ota of nMerge le
25ae0 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e  af blocks..*/.in
25af0 74 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63  t sqlite3Fts3Inc
25b00 72 6d 65 72 67 65 28 46 74 73 33 54 61 62 6c 65  rmerge(Fts3Table
25b10 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 2c   *p, int nMerge,
25b20 20 69 6e 74 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e   int nMin){.  in
25b30 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b50 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25b60 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 4d 65    int nRem = nMe
25b70 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rge;            
25b80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
25b90 65 61 66 20 70 61 67 65 73 20 79 65 74 20 74 6f  eaf pages yet to
25ba0 20 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a    be written */.
25bb0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
25bc0 61 64 65 72 20 2a 70 43 73 72 3b 20 20 20 20 20  ader *pCsr;     
25bd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
25be0 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64   to read input d
25bf0 61 74 61 20 2a 2f 0a 20 20 46 74 73 33 53 65 67  ata */.  Fts3Seg
25c00 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 3b  Filter *pFilter;
25c10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 74           /* Filt
25c20 65 72 20 75 73 65 64 20 77 69 74 68 20 63 75 72  er used with cur
25c30 73 6f 72 20 70 43 73 72 20 2a 2f 0a 20 20 49 6e  sor pCsr */.  In
25c40 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70  crmergeWriter *p
25c50 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a  Writer;       /*
25c60 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
25c70 2f 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30  /.  int nSeg = 0
25c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25c90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25ca0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
25cb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
25cc0 36 34 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 30  64 iAbsLevel = 0
25cd0 3b 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65  ;    /* Absolute
25ce0 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 6f   level number to
25cf0 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c   work on */.  Bl
25d00 6f 62 20 68 69 6e 74 20 3d 20 7b 30 2c 20 30 2c  ob hint = {0, 0,
25d10 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   0};          /*
25d20 20 48 69 6e 74 20 72 65 61 64 20 66 72 6f 6d 20   Hint read from 
25d30 25 5f 73 74 61 74 20 74 61 62 6c 65 20 2a 2f 0a  %_stat table */.
25d40 20 20 69 6e 74 20 62 44 69 72 74 79 48 69 6e 74    int bDirtyHint
25d50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
25d60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 6c 6f    /* True if blo
25d70 62 20 27 68 69 6e 74 27 20 68 61 73 20 62 65 65  b 'hint' has bee
25d80 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 0a 20  n modified */.. 
25d90 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
25da0 63 65 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f  ce for the curso
25db0 72 2c 20 66 69 6c 74 65 72 20 61 6e 64 20 77 72  r, filter and wr
25dc0 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  iter objects */.
25dd0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 41 6c 6c    const int nAll
25de0 6f 63 20 3d 20 73 69 7a 65 6f 66 28 2a 70 43 73  oc = sizeof(*pCs
25df0 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 46 69  r) + sizeof(*pFi
25e00 6c 74 65 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a  lter) + sizeof(*
25e10 70 57 72 69 74 65 72 29 3b 0a 20 20 70 57 72 69  pWriter);.  pWri
25e20 74 65 72 20 3d 20 28 49 6e 63 72 6d 65 72 67 65  ter = (Incrmerge
25e30 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33  Writer *)sqlite3
25e40 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b  _malloc(nAlloc);
25e50 0a 20 20 69 66 28 20 21 70 57 72 69 74 65 72 20  .  if( !pWriter 
25e60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25e70 4e 4f 4d 45 4d 3b 0a 20 20 70 46 69 6c 74 65 72  NOMEM;.  pFilter
25e80 20 3d 20 28 46 74 73 33 53 65 67 46 69 6c 74 65   = (Fts3SegFilte
25e90 72 20 2a 29 26 70 57 72 69 74 65 72 5b 31 5d 3b  r *)&pWriter[1];
25ea0 0a 20 20 70 43 73 72 20 3d 20 28 46 74 73 33 4d  .  pCsr = (Fts3M
25eb0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 29  ultiSegReader *)
25ec0 26 70 46 69 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20  &pFilter[1];..  
25ed0 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
25ee0 67 65 48 69 6e 74 4c 6f 61 64 28 70 2c 20 26 68  geHintLoad(p, &h
25ef0 69 6e 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  int);.  while( r
25f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25f10 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 63 6f  nRem>0 ){.    co
25f20 6e 73 74 20 69 36 34 20 6e 4d 6f 64 20 3d 20 46  nst i64 nMod = F
25f30 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
25f40 56 45 4c 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b  VEL * p->nIndex;
25f50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
25f60 74 20 2a 70 46 69 6e 64 4c 65 76 65 6c 20 3d 20  t *pFindLevel = 
25f70 30 3b 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74  0; /* SQL used t
25f80 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 41 62 73  o determine iAbs
25f90 4c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  Level */.    int
25fa0 20 62 55 73 65 48 69 6e 74 20 3d 20 30 3b 20 20   bUseHint = 0;  
25fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25fc0 75 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67  ue if attempting
25fd0 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 0a 20   to append */.. 
25fe0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
25ff0 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20   %_segdir table 
26000 66 6f 72 20 74 68 65 20 61 62 73 6f 6c 75 74 65  for the absolute
26010 20 6c 65 76 65 6c 20 77 69 74 68 20 74 68 65 20   level with the 
26020 73 6d 61 6c 6c 65 73 74 0a 20 20 20 20 2a 2a 20  smallest.    ** 
26030 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 20 6e  relative level n
26040 75 6d 62 65 72 20 74 68 61 74 20 63 6f 6e 74 61  umber that conta
26050 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6e 4d 69  ins at least nMi
26060 6e 20 73 65 67 6d 65 6e 74 73 2c 20 69 66 20 61  n segments, if a
26070 6e 79 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  ny..    ** If on
26080 65 20 69 73 20 66 6f 75 6e 64 2c 20 73 65 74 20  e is found, set 
26090 69 41 62 73 4c 65 76 65 6c 20 74 6f 20 74 68 65  iAbsLevel to the
260a0 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
260b0 6e 75 6d 62 65 72 20 61 6e 64 0a 20 20 20 20 2a  number and.    *
260c0 2a 20 6e 53 65 67 20 74 6f 20 6e 4d 69 6e 2e 20  * nSeg to nMin. 
260d0 49 66 20 6e 6f 20 6c 65 76 65 6c 20 77 69 74 68  If no level with
260e0 20 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73   at least nMin s
260f0 65 67 6d 65 6e 74 73 20 63 61 6e 20 62 65 20 66  egments can be f
26100 6f 75 6e 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65  ound, .    ** se
26110 74 20 6e 53 65 67 20 74 6f 20 2d 31 2e 0a 20 20  t nSeg to -1..  
26120 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74    */.    rc = ft
26130 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
26140 5f 46 49 4e 44 5f 4d 45 52 47 45 5f 4c 45 56 45  _FIND_MERGE_LEVE
26150 4c 2c 20 26 70 46 69 6e 64 4c 65 76 65 6c 2c 20  L, &pFindLevel, 
26160 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
26170 62 69 6e 64 5f 69 6e 74 28 70 46 69 6e 64 4c 65  bind_int(pFindLe
26180 76 65 6c 2c 20 31 2c 20 6e 4d 69 6e 29 3b 0a 20  vel, 1, nMin);. 
26190 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
261a0 74 65 70 28 70 46 69 6e 64 4c 65 76 65 6c 29 3d  tep(pFindLevel)=
261b0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
261c0 20 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d       iAbsLevel =
261d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
261e0 69 6e 74 36 34 28 70 46 69 6e 64 4c 65 76 65 6c  int64(pFindLevel
261f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 53 65 67  , 0);.      nSeg
26200 20 3d 20 6e 4d 69 6e 3b 0a 20 20 20 20 7d 65 6c   = nMin;.    }el
26210 73 65 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d  se{.      nSeg =
26220 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   -1;.    }.    r
26230 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
26240 74 28 70 46 69 6e 64 4c 65 76 65 6c 29 3b 0a 0a  t(pFindLevel);..
26250 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 69      /* If the hi
26260 6e 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  nt read from the
26270 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 69 73   %_stat table is
26280 20 6e 6f 74 20 65 6d 70 74 79 2c 20 63 68 65 63   not empty, chec
26290 6b 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  k if the.    ** 
262a0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74  last entry in it
262b0 20 73 70 65 63 69 66 69 65 73 20 61 20 72 65 6c   specifies a rel
262c0 61 74 69 76 65 20 6c 65 76 65 6c 20 73 6d 61 6c  ative level smal
262d0 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ler than or equa
262e0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  l.    ** to the 
262f0 6c 65 76 65 6c 20 69 64 65 6e 74 69 66 69 65 64  level identified
26300 20 62 79 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   by the block ab
26310 6f 76 65 20 28 69 66 20 61 6e 79 29 2e 20 49 66  ove (if any). If
26320 20 73 6f 2c 20 74 68 69 73 20 0a 20 20 20 20 2a   so, this .    *
26330 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  * iteration of t
26340 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 77 6f 72  he loop will wor
26350 6b 20 6f 6e 20 6d 65 72 67 69 6e 67 20 61 74 20  k on merging at 
26360 74 68 65 20 68 69 6e 74 65 64 20 6c 65 76 65 6c  the hinted level
26370 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26390 26 20 68 69 6e 74 2e 6e 20 29 7b 0a 20 20 20 20  & hint.n ){.    
263a0 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20 68 69    int nHint = hi
263b0 6e 74 2e 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt.n;.      sqli
263c0 74 65 33 5f 69 6e 74 36 34 20 69 48 69 6e 74 41  te3_int64 iHintA
263d0 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20  bsLevel = 0;    
263e0 20 20 2f 2a 20 48 69 6e 74 20 6c 65 76 65 6c 20    /* Hint level 
263f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69  */.      int nHi
26400 6e 74 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ntSeg = 0;      
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26420 2a 20 48 69 6e 74 20 6e 75 6d 62 65 72 20 6f 66  * Hint number of
26430 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20   segments */..  
26440 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
26450 72 6d 65 72 67 65 48 69 6e 74 50 6f 70 28 26 68  rmergeHintPop(&h
26460 69 6e 74 2c 20 26 69 48 69 6e 74 41 62 73 4c 65  int, &iHintAbsLe
26470 76 65 6c 2c 20 26 6e 48 69 6e 74 53 65 67 29 3b  vel, &nHintSeg);
26480 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65 67 3c  .      if( nSeg<
26490 30 20 7c 7c 20 28 69 41 62 73 4c 65 76 65 6c 20  0 || (iAbsLevel 
264a0 25 20 6e 4d 6f 64 29 20 3e 3d 20 28 69 48 69 6e  % nMod) >= (iHin
264b0 74 41 62 73 4c 65 76 65 6c 20 25 20 6e 4d 6f 64  tAbsLevel % nMod
264c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 41 62  ) ){.        iAb
264d0 73 4c 65 76 65 6c 20 3d 20 69 48 69 6e 74 41 62  sLevel = iHintAb
264e0 73 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20  sLevel;.        
264f0 6e 53 65 67 20 3d 20 6e 48 69 6e 74 53 65 67 3b  nSeg = nHintSeg;
26500 0a 20 20 20 20 20 20 20 20 62 55 73 65 48 69 6e  .        bUseHin
26510 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  t = 1;.        b
26520 44 69 72 74 79 48 69 6e 74 20 3d 20 31 3b 0a 20  DirtyHint = 1;. 
26530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26540 20 20 20 20 2f 2a 20 54 68 69 73 20 75 6e 64 6f      /* This undo
26550 65 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  es the effect of
26560 20 74 68 65 20 48 69 6e 74 50 6f 70 28 29 20 61   the HintPop() a
26570 62 6f 76 65 20 2d 20 73 6f 20 74 68 61 74 20 6e  bove - so that n
26580 6f 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  o entry.        
26590 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ** is removed fr
265a0 6f 6d 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62  om the hint blob
265b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 68 69  .  */.        hi
265c0 6e 74 2e 6e 20 3d 20 6e 48 69 6e 74 3b 0a 20 20  nt.n = nHint;.  
265d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
265e0 20 2f 2a 20 49 66 20 6e 53 65 67 20 69 73 20 6c   /* If nSeg is l
265f0 65 73 73 20 74 68 61 74 20 7a 65 72 6f 2c 20 74  ess that zero, t
26600 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
26610 6c 65 76 65 6c 20 77 69 74 68 20 61 74 20 6c 65  level with at le
26620 61 73 74 0a 20 20 20 20 2a 2a 20 6e 4d 69 6e 20  ast.    ** nMin 
26630 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 6e 6f 20  segments and no 
26640 68 69 6e 74 20 69 6e 20 74 68 65 20 25 5f 73 74  hint in the %_st
26650 61 74 20 74 61 62 6c 65 2e 20 4e 6f 20 77 6f 72  at table. No wor
26660 6b 20 74 6f 20 64 6f 2e 0a 20 20 20 20 2a 2a 20  k to do..    ** 
26670 45 78 69 74 20 65 61 72 6c 79 20 69 6e 20 74 68  Exit early in th
26680 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
26690 20 69 66 28 20 6e 53 65 67 3c 30 20 29 20 62 72   if( nSeg<0 ) br
266a0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  eak;..    /* Ope
266b0 6e 20 61 20 63 75 72 73 6f 72 20 74 6f 20 69 74  n a cursor to it
266c0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
266d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
266e0 65 20 6f 6c 64 65 73 74 20 6e 53 65 67 20 0a 20  e oldest nSeg . 
266f0 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 66     ** indexes of
26700 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
26710 69 41 62 73 4c 65 76 65 6c 2e 20 49 66 20 74 68  iAbsLevel. If th
26720 69 73 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  is cursor is ope
26730 6e 65 64 20 75 73 69 6e 67 20 0a 20 20 20 20 2a  ned using .    *
26740 2a 20 74 68 65 20 27 68 69 6e 74 27 20 70 61 72  * the 'hint' par
26750 61 6d 65 74 65 72 73 2c 20 69 74 20 69 73 20 70  ameters, it is p
26760 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 65  ossible that the
26770 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  re are less than
26780 20 6e 53 65 67 0a 20 20 20 20 2a 2a 20 73 65 67   nSeg.    ** seg
26790 6d 65 6e 74 73 20 61 76 61 69 6c 61 62 6c 65 20  ments available 
267a0 69 6e 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  in level iAbsLev
267b0 65 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  el. In this case
267c0 2c 20 6e 6f 20 77 6f 72 6b 20 69 73 0a 20 20 20  , no work is.   
267d0 20 2a 2a 20 64 6f 6e 65 20 6f 6e 20 69 41 62 73   ** done on iAbs
267e0 4c 65 76 65 6c 20 2d 20 66 61 6c 6c 20 74 68 72  Level - fall thr
267f0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
26800 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
26810 65 20 6c 6f 6f 70 20 0a 20 20 20 20 2a 2a 20 74  e loop .    ** t
26820 6f 20 73 74 61 72 74 20 77 6f 72 6b 20 6f 6e 20  o start work on 
26830 73 6f 6d 65 20 6f 74 68 65 72 20 6c 65 76 65 6c  some other level
26840 2e 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  .  */.    memset
26850 28 70 57 72 69 74 65 72 2c 20 30 2c 20 6e 41 6c  (pWriter, 0, nAl
26860 6c 6f 63 29 3b 0a 20 20 20 20 70 46 69 6c 74 65  loc);.    pFilte
26870 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f  r->flags = FTS3_
26880 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f  SEGMENT_REQUIRE_
26890 50 4f 53 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  POS;.    if( rc=
268a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
268b0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
268c0 72 6d 65 72 67 65 43 73 72 28 70 2c 20 69 41 62  rmergeCsr(p, iAb
268d0 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 70 43  sLevel, nSeg, pC
268e0 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  sr);.    }.    i
268f0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
26900 20 26 26 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65   && pCsr->nSegme
26910 6e 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20 26 26  nt==nSeg.     &&
26920 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
26930 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
26940 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70  ReaderStart(p, p
26950 43 73 72 2c 20 70 46 69 6c 74 65 72 29 29 0a 20  Csr, pFilter)). 
26960 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f      && SQLITE_RO
26970 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  W==(rc = sqlite3
26980 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65  Fts3SegReaderSte
26990 70 28 70 2c 20 70 43 73 72 29 29 0a 20 20 20 20  p(p, pCsr)).    
269a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
269b0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
269c0 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
269d0 69 64 78 20 69 6e 20 6c 65 76 65 6c 20 28 69 41  idx in level (iA
269e0 62 73 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 20 20  bsLevel+1) */.  
269f0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
26a00 72 6d 65 72 67 65 4f 75 74 70 75 74 49 64 78 28  rmergeOutputIdx(
26a10 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 26 69  p, iAbsLevel, &i
26a20 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Idx);.      if( 
26a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 55 73  .        if( bUs
26a50 65 48 69 6e 74 20 26 26 20 69 49 64 78 3e 30 20  eHint && iIdx>0 
26a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
26a70 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20  st char *zKey = 
26a80 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20  pCsr->zTerm;.   
26a90 20 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20         int nKey 
26aa0 3d 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20  = pCsr->nTerm;. 
26ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74           rc = ft
26ac0 73 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61 64 28  s3IncrmergeLoad(
26ad0 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 69 49  p, iAbsLevel, iI
26ae0 64 78 2d 31 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  dx-1, zKey, nKey
26af0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
26b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26b10 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
26b20 63 72 6d 65 72 67 65 57 72 69 74 65 72 28 70 2c  crmergeWriter(p,
26b30 20 69 41 62 73 4c 65 76 65 6c 2c 20 69 49 64 78   iAbsLevel, iIdx
26b40 2c 20 70 43 73 72 2c 20 70 57 72 69 74 65 72 29  , pCsr, pWriter)
26b50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26b60 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
26b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26b80 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73  pWriter->nLeafEs
26b90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  t ){.        fts
26ba0 33 4c 6f 67 4d 65 72 67 65 28 6e 53 65 67 2c 20  3LogMerge(nSeg, 
26bb0 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20  iAbsLevel);.    
26bc0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
26bd0 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
26be0 6d 65 72 67 65 41 70 70 65 6e 64 28 70 2c 20 70  mergeAppend(p, p
26bf0 57 72 69 74 65 72 2c 20 70 43 73 72 29 3b 0a 20  Writer, pCsr);. 
26c00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
26c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
26c20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
26c30 52 65 61 64 65 72 53 74 65 70 28 70 2c 20 70 43  ReaderStep(p, pC
26c40 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  sr);.          i
26c50 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72  f( pWriter->nWor
26c60 6b 3e 3d 6e 52 65 6d 20 26 26 20 72 63 3d 3d 53  k>=nRem && rc==S
26c70 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 63 20 3d  QLITE_ROW ) rc =
26c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26c90 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
26ca0 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 0a 20  SQLITE_ROW );.. 
26cb0 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65         /* Update
26cc0 20 6f 72 20 64 65 6c 65 74 65 20 74 68 65 20 69   or delete the i
26cd0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
26ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
26cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26d00 20 20 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20          nRem -= 
26d10 28 31 20 2b 20 70 57 72 69 74 65 72 2d 3e 6e 57  (1 + pWriter->nW
26d20 6f 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ork);.          
26d30 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
26d40 67 65 43 68 6f 6d 70 28 70 2c 20 69 41 62 73 4c  geChomp(p, iAbsL
26d50 65 76 65 6c 2c 20 70 43 73 72 2c 20 26 6e 53 65  evel, pCsr, &nSe
26d60 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  g);.          if
26d70 28 20 6e 53 65 67 21 3d 30 20 29 7b 0a 20 20 20  ( nSeg!=0 ){.   
26d80 20 20 20 20 20 20 20 20 20 62 44 69 72 74 79 48           bDirtyH
26d90 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  int = 1;.       
26da0 20 20 20 20 20 66 74 73 33 49 6e 63 72 6d 65 72       fts3Incrmer
26db0 67 65 48 69 6e 74 50 75 73 68 28 26 68 69 6e 74  geHintPush(&hint
26dc0 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 6e 53 65  , iAbsLevel, nSe
26dd0 67 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  g, &rc);.       
26de0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26df0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
26e00 73 33 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61  s3IncrmergeRelea
26e10 73 65 28 70 2c 20 70 57 72 69 74 65 72 2c 20 26  se(p, pWriter, &
26e20 72 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc);.    }..    
26e30 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
26e40 61 64 65 72 46 69 6e 69 73 68 28 70 43 73 72 29  aderFinish(pCsr)
26e50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
26e60 65 20 74 68 65 20 68 69 6e 74 20 76 61 6c 75 65  e the hint value
26e70 73 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 74 61  s into the %_sta
26e80 74 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  t table for the 
26e90 6e 65 78 74 20 69 6e 63 72 2d 6d 65 72 67 65 72  next incr-merger
26ea0 20 2a 2f 0a 20 20 69 66 28 20 62 44 69 72 74 79   */.  if( bDirty
26eb0 48 69 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  Hint && rc==SQLI
26ec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
26ed0 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  = fts3IncrmergeH
26ee0 69 6e 74 53 74 6f 72 65 28 70 2c 20 26 68 69 6e  intStore(p, &hin
26ef0 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
26f00 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 29  e3_free(pWriter)
26f10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
26f20 28 68 69 6e 74 2e 61 29 3b 0a 20 20 72 65 74 75  (hint.a);.  retu
26f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26f40 43 6f 6e 76 65 72 74 20 74 68 65 20 74 65 78 74  Convert the text
26f50 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 2a 70   beginning at *p
26f60 7a 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  z into an intege
26f70 72 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  r and return.** 
26f80 69 74 73 20 76 61 6c 75 65 2e 20 20 41 64 76 61  its value.  Adva
26f90 6e 63 65 20 2a 70 7a 20 74 6f 20 70 6f 69 6e 74  nce *pz to point
26fa0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68   to the first ch
26fb0 61 72 61 63 74 65 72 20 70 61 73 74 0a 2a 2a 20  aracter past.** 
26fc0 74 68 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  the integer..*/.
26fd0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 47  static int fts3G
26fe0 65 74 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  etint(const char
26ff0 20 2a 2a 70 7a 29 7b 0a 20 20 63 6f 6e 73 74 20   **pz){.  const 
27000 63 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20  char *z = *pz;. 
27010 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
27020 69 6c 65 28 20 28 2a 7a 29 3e 3d 27 30 27 20 26  ile( (*z)>='0' &
27030 26 20 28 2a 7a 29 3c 3d 27 39 27 20 29 20 69 20  & (*z)<='9' ) i 
27040 3d 20 31 30 2a 69 20 2b 20 2a 28 7a 2b 2b 29 20  = 10*i + *(z++) 
27050 2d 20 27 30 27 3b 0a 20 20 2a 70 7a 20 3d 20 7a  - '0';.  *pz = z
27060 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
27070 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73  ./*.** Process s
27080 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65  tatements of the
27090 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
270a0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c  INSERT INTO tabl
270b0 65 28 74 61 62 6c 65 29 20 56 41 4c 55 45 53 28  e(table) VALUES(
270c0 27 6d 65 72 67 65 3d 41 2c 42 27 29 3b 0a 2a 2a  'merge=A,B');.**
270d0 0a 2a 2a 20 41 20 61 6e 64 20 42 20 61 72 65 20  .** A and B are 
270e0 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
270f0 63 6f 64 65 20 74 6f 20 62 65 20 74 68 65 20 6e  code to be the n
27100 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
27110 67 65 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 66  ges.** written f
27120 6f 72 20 74 68 65 20 6d 65 72 67 65 2c 20 61 6e  or the merge, an
27130 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75  d the minimum nu
27140 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
27150 20 6f 6e 20 61 20 6c 65 76 65 6c 0a 2a 2a 20 62   on a level.** b
27160 65 66 6f 72 65 20 69 74 20 77 69 6c 6c 20 62 65  efore it will be
27170 20 73 65 6c 65 63 74 65 64 20 66 6f 72 20 61 20   selected for a 
27180 6d 65 72 67 65 2c 20 72 65 73 70 65 63 74 69 76  merge, respectiv
27190 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
271a0 6e 74 20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72  nt fts3DoIncrmer
271b0 67 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ge(.  Fts3Table 
271c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
271d0 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
271e0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
271f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
27200 61 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  am              
27210 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
27220 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
27230 69 6e 67 20 22 41 2c 42 22 20 2a 2f 0a 29 7b 0a  ing "A,B" */.){.
27240 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
27250 6e 4d 69 6e 20 3d 20 28 46 54 53 33 5f 4d 45 52  nMin = (FTS3_MER
27260 47 45 5f 43 4f 55 4e 54 20 2f 20 32 29 3b 0a 20  GE_COUNT / 2);. 
27270 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 30 3b   int nMerge = 0;
27280 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27290 20 3d 20 7a 50 61 72 61 6d 3b 0a 0a 20 20 2f 2a   = zParam;..  /*
272a0 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
272b0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 2a 2f  integer value */
272c0 0a 20 20 6e 4d 65 72 67 65 20 3d 20 66 74 73 33  .  nMerge = fts3
272d0 47 65 74 69 6e 74 28 26 7a 29 3b 0a 0a 20 20 2f  Getint(&z);..  /
272e0 2a 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69  * If the first i
272f0 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 73 20  nteger value is 
27300 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 27 2c  followed by a ',
27310 27 2c 20 20 72 65 61 64 20 74 68 65 20 73 65 63  ',  read the sec
27320 6f 6e 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  ond.  ** integer
27330 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 69 66 28   value. */.  if(
27340 20 7a 5b 30 5d 3d 3d 27 2c 27 20 26 26 20 7a 5b   z[0]==',' && z[
27350 31 5d 21 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20  1]!='\0' ){.    
27360 7a 2b 2b 3b 0a 20 20 20 20 6e 4d 69 6e 20 3d 20  z++;.    nMin = 
27370 66 74 73 33 47 65 74 69 6e 74 28 26 7a 29 3b 0a  fts3Getint(&z);.
27380 20 20 7d 0a 0a 20 20 69 66 28 20 7a 5b 30 5d 21    }..  if( z[0]!
27390 3d 27 5c 30 27 20 7c 7c 20 6e 4d 69 6e 3c 32 20  ='\0' || nMin<2 
273a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
273b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
273c0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
273d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 21  TE_OK;.    if( !
273e0 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20  p->bHasStat ){. 
273f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
27400 62 46 74 73 34 3d 3d 30 20 29 3b 0a 20 20 20 20  bFts4==0 );.    
27410 20 20 73 71 6c 69 74 65 33 46 74 73 33 43 72 65    sqlite3Fts3Cre
27420 61 74 65 53 74 61 74 54 61 62 6c 65 28 26 72 63  ateStatTable(&rc
27430 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , p);.    }.    
27440 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27450 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
27460 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d  sqlite3Fts3Incrm
27470 65 72 67 65 28 70 2c 20 6e 4d 65 72 67 65 2c 20  erge(p, nMerge, 
27480 6e 4d 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nMin);.    }.   
27490 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
274a0 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20  entsClose(p);.  
274b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
274c0 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
274d0 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68  statements of th
274e0 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
274f0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62   INSERT INTO tab
27500 6c 65 28 74 61 62 6c 65 29 20 56 41 4c 55 45 53  le(table) VALUES
27510 28 27 61 75 74 6f 6d 65 72 67 65 3d 58 27 29 3b  ('automerge=X');
27520 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  .**.** where X i
27530 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 58  s an integer.  X
27540 3d 3d 30 20 6d 65 61 6e 73 20 74 6f 20 74 75 72  ==0 means to tur
27550 6e 20 61 75 74 6f 6d 65 72 67 65 20 6f 66 66 2e  n automerge off.
27560 20 20 58 21 3d 30 20 6d 65 61 6e 73 0a 2a 2a 20    X!=0 means.** 
27570 74 75 72 6e 20 69 74 20 6f 6e 2e 20 20 54 68 65  turn it on.  The
27580 20 73 65 74 74 69 6e 67 20 69 73 20 70 65 72 73   setting is pers
27590 69 73 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  istent..*/.stati
275a0 63 20 69 6e 74 20 66 74 73 33 44 6f 41 75 74 6f  c int fts3DoAuto
275b0 69 6e 63 72 6d 65 72 67 65 28 0a 20 20 46 74 73  incrmerge(.  Fts
275c0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275e0 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
275f0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
27600 72 20 2a 7a 50 61 72 61 6d 20 20 20 20 20 20 20  r *zParam       
27610 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
27620 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
27630 63 6f 6e 74 61 69 6e 69 6e 67 20 62 6f 6f 6c 65  containing boole
27640 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  an */.){.  int r
27650 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27660 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
27670 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 62  Stmt = 0;.  p->b
27680 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20  Autoincrmerge = 
27690 66 74 73 33 47 65 74 69 6e 74 28 26 7a 50 61 72  fts3Getint(&zPar
276a0 61 6d 29 21 3d 30 3b 0a 20 20 69 66 28 20 21 70  am)!=0;.  if( !p
276b0 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20  ->bHasStat ){.  
276c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74    assert( p->bFt
276d0 73 34 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  s4==0 );.    sql
276e0 69 74 65 33 46 74 73 33 43 72 65 61 74 65 53 74  ite3Fts3CreateSt
276f0 61 74 54 61 62 6c 65 28 26 72 63 2c 20 70 29 3b  atTable(&rc, p);
27700 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
27710 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
27720 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
27730 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53  p, SQL_REPLACE_S
27740 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  TAT, &pStmt, 0);
27750 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
27760 72 6e 20 72 63 3b 3b 0a 20 20 73 71 6c 69 74 65  rn rc;;.  sqlite
27770 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
27780 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 41 55  , 1, FTS_STAT_AU
27790 54 4f 49 4e 43 52 4d 45 52 47 45 29 3b 0a 20 20  TOINCRMERGE);.  
277a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
277b0 28 70 53 74 6d 74 2c 20 32 2c 20 70 2d 3e 62 41  (pStmt, 2, p->bA
277c0 75 74 6f 69 6e 63 72 6d 65 72 67 65 29 3b 0a 20  utoincrmerge);. 
277d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
277e0 74 6d 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  tmt);.  rc = sql
277f0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
27800 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
27820 61 20 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75  a 64-bit checksu
27830 6d 20 66 6f 72 20 74 68 65 20 46 54 53 20 69 6e  m for the FTS in
27840 64 65 78 20 65 6e 74 72 79 20 73 70 65 63 69 66  dex entry specif
27850 69 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 61 72  ied by the.** ar
27860 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20  guments to this 
27870 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
27880 74 69 63 20 75 36 34 20 66 74 73 33 43 68 65 63  tic u64 fts3Chec
27890 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 63 6f 6e  ksumEntry(.  con
278a0 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278c0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
278d0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  r containing ter
278e0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  m */.  int nTerm
278f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27900 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
27910 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  f zTerm in bytes
27920 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69   */.  int iLangi
27930 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
27940 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
27950 65 20 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74  e id for current
27960 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
27970 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
27980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
27990 65 78 20 28 30 2e 2e 46 74 73 33 54 61 62 6c 65  ex (0..Fts3Table
279a0 2e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20  .nIndex-1) */.  
279b0 69 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20  i64 iDocid,     
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20 63 75 72  /* Docid for cur
279e0 72 65 6e 74 20 72 6f 77 2e 20 2a 2f 0a 20 20 69  rent row. */.  i
279f0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27a10 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
27a20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 20 20 20  */.  int iPos   
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
27a50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
27a60 20 20 75 36 34 20 72 65 74 20 3d 20 28 75 36 34    u64 ret = (u64
27a70 29 69 44 6f 63 69 64 3b 0a 0a 20 20 72 65 74 20  )iDocid;..  ret 
27a80 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 4c  += (ret<<3) + iL
27a90 61 6e 67 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20  angid;.  ret += 
27aa0 28 72 65 74 3c 3c 33 29 20 2b 20 69 49 6e 64 65  (ret<<3) + iInde
27ab0 78 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  x;.  ret += (ret
27ac0 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72  <<3) + iCol;.  r
27ad0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
27ae0 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28 69 3d 30   iPos;.  for(i=0
27af0 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20  ; i<nTerm; i++) 
27b00 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
27b10 2b 20 7a 54 65 72 6d 5b 69 5d 3b 0a 0a 20 20 72  + zTerm[i];..  r
27b20 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
27b30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 68 65  .** Return a che
27b40 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74  cksum of all ent
27b50 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53 20  ries in the FTS 
27b60 69 6e 64 65 78 20 74 68 61 74 20 63 6f 72 72 65  index that corre
27b70 73 70 6f 6e 64 20 74 6f 0a 2a 2a 20 6c 61 6e 67  spond to.** lang
27b80 75 61 67 65 20 69 64 20 69 4c 61 6e 67 69 64 2e  uage id iLangid.
27b90 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   The checksum is
27ba0 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 58   calculated by X
27bb0 4f 52 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  ORing the checks
27bc0 75 6d 73 0a 2a 2a 20 6f 66 20 65 61 63 68 20 69  ums.** of each i
27bd0 6e 64 69 76 69 64 75 61 6c 20 65 6e 74 72 79 20  ndividual entry 
27be0 28 73 65 65 20 66 74 73 33 43 68 65 63 6b 73 75  (see fts3Checksu
27bf0 6d 45 6e 74 72 79 28 29 29 20 74 6f 67 65 74 68  mEntry()) togeth
27c00 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  er..**.** If suc
27c10 63 65 73 73 66 75 6c 2c 20 74 68 65 20 63 68 65  cessful, the che
27c20 63 6b 73 75 6d 20 76 61 6c 75 65 20 69 73 20 72  cksum value is r
27c30 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 52 63  eturned and *pRc
27c40 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
27c50 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  K..** Otherwise,
27c60 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
27c70 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74  urs, *pRc is set
27c80 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72   to an SQLite er
27c90 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 0a 2a 2a  ror code. The.**
27ca0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
27cb0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
27cc0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
27cd0 69 63 20 75 36 34 20 66 74 73 33 43 68 65 63 6b  ic u64 fts3Check
27ce0 73 75 6d 49 6e 64 65 78 28 0a 20 20 46 74 73 33  sumIndex(.  Fts3
27cf0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
27d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27d10 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
27d20 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69   */.  int iLangi
27d30 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
27d40 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
27d50 65 20 69 64 20 74 6f 20 72 65 74 75 72 6e 20 63  e id to return c
27d60 6b 73 75 6d 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  ksum for */.  in
27d70 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20  t iIndex,       
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27d90 20 49 6e 64 65 78 20 74 6f 20 63 6b 73 75 6d 20   Index to cksum 
27da0 28 30 2e 2e 70 2d 3e 6e 49 6e 64 65 78 2d 31 29  (0..p->nIndex-1)
27db0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20   */.  int *pRc  
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
27de0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a  turn code */.){.
27df0 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20    Fts3SegFilter 
27e00 66 69 6c 74 65 72 3b 0a 20 20 46 74 73 33 4d 75  filter;.  Fts3Mu
27e10 6c 74 69 53 65 67 52 65 61 64 65 72 20 63 73 72  ltiSegReader csr
27e20 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 36  ;.  int rc;.  u6
27e30 34 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 0a 20 20  4 cksum = 0;..  
27e40 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51  assert( *pRc==SQ
27e50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 6d 65  LITE_OK );..  me
27e60 6d 73 65 74 28 26 66 69 6c 74 65 72 2c 20 30 2c  mset(&filter, 0,
27e70 20 73 69 7a 65 6f 66 28 66 69 6c 74 65 72 29 29   sizeof(filter))
27e80 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 73 72 2c  ;.  memset(&csr,
27e90 20 30 2c 20 73 69 7a 65 6f 66 28 63 73 72 29 29   0, sizeof(csr))
27ea0 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73  ;.  filter.flags
27eb0 20 3d 20 20 46 54 53 33 5f 53 45 47 4d 45 4e 54   =  FTS3_SEGMENT
27ec0 5f 52 45 51 55 49 52 45 5f 50 4f 53 7c 46 54 53  _REQUIRE_POS|FTS
27ed0 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45  3_SEGMENT_IGNORE
27ee0 5f 45 4d 50 54 59 3b 0a 20 20 66 69 6c 74 65 72  _EMPTY;.  filter
27ef0 2e 66 6c 61 67 73 20 7c 3d 20 46 54 53 33 5f 53  .flags |= FTS3_S
27f00 45 47 4d 45 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20  EGMENT_SCAN;..  
27f10 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
27f20 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28  SegReaderCursor(
27f30 0a 20 20 20 20 20 20 70 2c 20 69 4c 61 6e 67 69  .      p, iLangi
27f40 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f  d, iIndex, FTS3_
27f50 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 30  SEGCURSOR_ALL, 0
27f60 2c 20 30 2c 20 30 2c 20 31 2c 26 63 73 72 0a 20  , 0, 0, 1,&csr. 
27f70 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
27f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
27f90 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
27fa0 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c  egReaderStart(p,
27fb0 20 26 63 73 72 2c 20 26 66 69 6c 74 65 72 29 3b   &csr, &filter);
27fc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
27fd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27fe0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
27ff0 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OW==(rc = sqlite
28000 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
28010 65 70 28 70 2c 20 26 63 73 72 29 29 20 29 7b 0a  ep(p, &csr)) ){.
28020 20 20 20 20 20 20 63 68 61 72 20 2a 70 43 73 72        char *pCsr
28030 20 3d 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 3b   = csr.aDoclist;
28040 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 45 6e  .      char *pEn
28050 64 20 3d 20 26 70 43 73 72 5b 63 73 72 2e 6e 44  d = &pCsr[csr.nD
28060 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 20 20  oclist];..      
28070 69 36 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a  i64 iDocid = 0;.
28080 20 20 20 20 20 20 69 36 34 20 69 43 6f 6c 20 3d        i64 iCol =
28090 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69 50   0;.      i64 iP
280a0 6f 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70  os = 0;..      p
280b0 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Csr += sqlite3Ft
280c0 73 33 47 65 74 56 61 72 69 6e 74 28 70 43 73 72  s3GetVarint(pCsr
280d0 2c 20 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  , &iDocid);.    
280e0 20 20 77 68 69 6c 65 28 20 70 43 73 72 3c 70 45    while( pCsr<pE
280f0 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  nd ){.        i6
28100 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  4 iVal = 0;.    
28110 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69      pCsr += sqli
28120 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
28130 28 70 43 73 72 2c 20 26 69 56 61 6c 29 3b 0a 20  (pCsr, &iVal);. 
28140 20 20 20 20 20 20 20 69 66 28 20 70 43 73 72 3c         if( pCsr<
28150 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
28160 20 20 69 66 28 20 69 56 61 6c 3d 3d 30 20 7c 7c    if( iVal==0 ||
28170 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20   iVal==1 ){.    
28180 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 30          iCol = 0
28190 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 50  ;.            iP
281a0 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  os = 0;.        
281b0 20 20 20 20 69 66 28 20 69 56 61 6c 20 29 7b 0a      if( iVal ){.
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
281d0 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  sr += sqlite3Fts
281e0 33 47 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c  3GetVarint(pCsr,
281f0 20 26 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20   &iCol);.       
28200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28210 20 20 20 20 20 20 20 20 20 20 70 43 73 72 20 2b            pCsr +
28220 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
28230 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 56  Varint(pCsr, &iV
28240 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
28250 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 56 61     iDocid += iVa
28260 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
28270 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
28280 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 50  {.            iP
28290 6f 73 20 2b 3d 20 28 69 56 61 6c 20 2d 20 32 29  os += (iVal - 2)
282a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6b  ;.            ck
282b0 73 75 6d 20 3d 20 63 6b 73 75 6d 20 5e 20 66 74  sum = cksum ^ ft
282c0 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28  s3ChecksumEntry(
282d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
282e0 20 63 73 72 2e 7a 54 65 72 6d 2c 20 63 73 72 2e   csr.zTerm, csr.
282f0 6e 54 65 72 6d 2c 20 69 4c 61 6e 67 69 64 2c 20  nTerm, iLangid, 
28300 69 49 6e 64 65 78 2c 20 69 44 6f 63 69 64 2c 20  iIndex, iDocid, 
28310 69 43 6f 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20  iCol, iPos.     
28320 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28350 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  }.  sqlite3Fts3S
28360 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26  egReaderFinish(&
28370 63 73 72 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20  csr);..  *pRc = 
28380 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 63 6b 73  rc;.  return cks
28390 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  um;.}../*.** Che
283a0 63 6b 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e  ck if the conten
283b0 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e  ts of the FTS in
283c0 64 65 78 20 6d 61 74 63 68 20 74 68 65 20 63 75  dex match the cu
283d0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
283e0 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  f the.** content
283f0 20 74 61 62 6c 65 2e 20 49 66 20 6e 6f 20 65 72   table. If no er
28400 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
28410 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6d  he contents do m
28420 61 74 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b 0a  atch, set *pbOk.
28430 2a 2a 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72  ** to true and r
28440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
28450 20 4f 72 20 69 66 20 74 68 65 20 63 6f 6e 74 65   Or if the conte
28460 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
28470 2c 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74  , set *pbOk.** t
28480 6f 20 66 61 6c 73 65 20 62 65 66 6f 72 65 20 72  o false before r
28490 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
284a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
284b0 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20  rs (e.g. an OOM 
284c0 6f 72 20 49 4f 20 65 72 72 6f 72 29 2c 20 72 65  or IO error), re
284d0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
284e0 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 2e 20 54  rror .** code. T
284f0 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
28500 66 20 2a 70 62 4f 6b 20 69 73 20 75 6e 64 65 66  f *pbOk is undef
28510 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
28520 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
28530 20 66 74 73 33 49 6e 74 65 67 72 69 74 79 43 68   fts3IntegrityCh
28540 65 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70  eck(Fts3Table *p
28550 2c 20 69 6e 74 20 2a 70 62 4f 6b 29 7b 0a 20 20  , int *pbOk){.  
28560 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28570 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
28580 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
28590 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d  /.  u64 cksum1 =
285a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
285b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
285c0 62 61 73 65 64 20 6f 6e 20 46 54 53 20 69 6e 64  based on FTS ind
285d0 65 78 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20  ex contents */. 
285e0 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b   u64 cksum2 = 0;
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73   /* Checksum bas
28610 65 64 20 6f 6e 20 25 5f 63 6f 6e 74 65 6e 74 20  ed on %_content 
28620 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 73 71  contents */.  sq
28630 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c 6c  lite3_stmt *pAll
28640 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20 20 2f 2a  Langid = 0;   /*
28650 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   Statement to re
28660 74 75 72 6e 20 61 6c 6c 20 6c 61 6e 67 75 61 67  turn all languag
28670 65 2d 69 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  e-ids */..  /* T
28680 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75 6c  his block calcul
28690 61 74 65 73 20 74 68 65 20 63 68 65 63 6b 73 75  ates the checksu
286a0 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  m according to t
286b0 68 65 20 46 54 53 20 69 6e 64 65 78 2e 20 2a 2f  he FTS index. */
286c0 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
286d0 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
286e0 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70  T_ALL_LANGID, &p
286f0 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20  AllLangid, 0);. 
28700 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28710 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
28720 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  2;.    sqlite3_b
28730 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67  ind_int(pAllLang
28740 69 64 2c 20 31 2c 20 70 2d 3e 6e 49 6e 64 65 78  id, 1, p->nIndex
28750 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
28760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
28770 71 6c 69 74 65 33 5f 73 74 65 70 28 70 41 6c 6c  qlite3_step(pAll
28780 4c 61 6e 67 69 64 29 3d 3d 53 51 4c 49 54 45 5f  Langid)==SQLITE_
28790 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ROW ){.      int
287a0 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74   iLangid = sqlit
287b0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41  e3_column_int(pA
287c0 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20  llLangid, 0);.  
287d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
287e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
287f0 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Index; i++){.   
28800 20 20 20 20 20 63 6b 73 75 6d 31 20 3d 20 63 6b       cksum1 = ck
28810 73 75 6d 31 20 5e 20 66 74 73 33 43 68 65 63 6b  sum1 ^ fts3Check
28820 73 75 6d 49 6e 64 65 78 28 70 2c 20 69 4c 61 6e  sumIndex(p, iLan
28830 67 69 64 2c 20 69 2c 20 26 72 63 29 3b 0a 20 20  gid, i, &rc);.  
28840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28850 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
28860 73 65 74 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3b  set(pAllLangid);
28870 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28880 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
28890 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  2;.  }..  /* Thi
288a0 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75 6c 61 74  s block calculat
288b0 65 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  es the checksum 
288c0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
288d0 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
288e0 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53   */.  rc = fts3S
288f0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
28900 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c  LECT_ALL_LANGID,
28910 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29   &pAllLangid, 0)
28920 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
28930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
28940 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
28950 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
28960 64 75 6c 65 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e  dule = p->pToken
28970 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  izer->pModule;. 
28980 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
28990 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  *pStmt = 0;.    
289a0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 0a  char *zSql;.   .
289b0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
289c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
289d0 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65 61  CT %s" , p->zRea
289e0 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20  dExprlist);.    
289f0 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20  if( !zSql ){.   
28a00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
28a10 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
28a20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
28a30 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
28a40 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
28a50 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
28a60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28a70 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Sql);.    }..   
28a80 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
28a90 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
28aa0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
28ab0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
28ac0 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 73    i64 iDocid = s
28ad0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
28ae0 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  t64(pStmt, 0);. 
28af0 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d       int iLang =
28b00 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63   langidFromSelec
28b10 74 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  t(p, pStmt);.   
28b20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20     int iCol;..  
28b30 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
28b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28b50 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e   iCol<p->nColumn
28b60 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
28b70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
28b80 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
28b90 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
28ba0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
28bb0 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20  iCol+1);.       
28bc0 20 69 6e 74 20 6e 54 65 78 74 20 3d 20 73 71 6c   int nText = sql
28bd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
28be0 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29  s(pStmt, iCol+1)
28bf0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28c00 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73  3_tokenizer_curs
28c10 6f 72 20 2a 70 54 20 3d 20 30 3b 0a 0a 20 20 20  or *pT = 0;..   
28c20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28c30 33 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a  3Fts3OpenTokeniz
28c40 65 72 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72  er(p->pTokenizer
28c50 2c 20 69 4c 61 6e 67 2c 20 7a 54 65 78 74 2c 20  , iLang, zText, 
28c60 6e 54 65 78 74 2c 20 26 70 54 29 3b 0a 20 20 20  nText, &pT);.   
28c70 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
28c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28c90 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
28ca0 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20 20 20 20  t *zToken;      
28cb0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
28cc0 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20  ining token */. 
28cd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 6f           int nTo
28ce0 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ken;            
28cf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28d00 62 79 74 65 73 20 69 6e 20 74 6f 6b 65 6e 20 2a  bytes in token *
28d10 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
28d20 69 44 75 6d 31 2c 20 69 44 75 6d 32 3b 20 20 20  iDum1, iDum2;   
28d30 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 76        /* Dummy v
28d40 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  ariables */.    
28d50 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 3b 20        int iPos; 
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d70 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
28d80 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a 2f  oken in zText */
28d90 0a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ..          rc =
28da0 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28   pModule->xNext(
28db0 70 54 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54  pT, &zToken, &nT
28dc0 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c 20 26 69  oken, &iDum1, &i
28dd0 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b 0a 20 20  Dum2, &iPos);.  
28de0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
28df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28e00 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
28e10 20 20 20 20 20 20 20 20 20 20 20 20 63 6b 73 75              cksu
28e20 6d 32 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66 74  m2 = cksum2 ^ ft
28e30 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28  s3ChecksumEntry(
28e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28e50 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   zToken, nToken,
28e60 20 69 4c 61 6e 67 2c 20 30 2c 20 69 44 6f 63 69   iLang, 0, iDoci
28e70 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a 20 20  d, iCol, iPos.  
28e80 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
28e90 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
28ea0 3b 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69  ; i<p->nIndex; i
28eb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
28ec0 20 20 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78     if( p->aIndex
28ed0 5b 69 5d 2e 6e 50 72 65 66 69 78 3c 3d 6e 54 6f  [i].nPrefix<=nTo
28ee0 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ken ){.         
28ef0 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 3d 20         cksum2 = 
28f00 63 6b 73 75 6d 32 20 5e 20 66 74 73 33 43 68 65  cksum2 ^ fts3Che
28f10 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20 20  cksumEntry(.    
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
28f30 6f 6b 65 6e 2c 20 70 2d 3e 61 49 6e 64 65 78 5b  oken, p->aIndex[
28f40 69 5d 2e 6e 50 72 65 66 69 78 2c 20 69 4c 61 6e  i].nPrefix, iLan
28f50 67 2c 20 69 2c 20 69 44 6f 63 69 64 2c 20 69 43  g, i, iDocid, iC
28f60 6f 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20 20 20  ol, iPos.       
28f70 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
28f80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 20 29          if( pT )
28fc0 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
28fd0 28 70 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  (pT);.        if
28fe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
28ff0 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
29000 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
29010 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  }..    sqlite3_f
29020 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
29030 20 20 7d 0a 0a 20 20 2a 70 62 4f 6b 20 3d 20 28    }..  *pbOk = (
29040 63 6b 73 75 6d 31 3d 3d 63 6b 73 75 6d 32 29 3b  cksum1==cksum2);
29050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29060 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 69  ./*.** Run the i
29070 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 20  ntegrity-check. 
29080 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
29090 72 73 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  rs and the curre
290a0 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a  nt contents of.*
290b0 2a 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  * the FTS index 
290c0 61 72 65 20 63 6f 72 72 65 63 74 2c 20 72 65 74  are correct, ret
290d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
290e0 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e  r, if the conten
290f0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 46 54 53  ts of the.** FTS
29100 20 69 6e 64 65 78 20 61 72 65 20 69 6e 63 6f 72   index are incor
29110 72 65 63 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  rect, return SQL
29120 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
29130 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61  ..**.** Or, if a
29140 6e 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 61 6e  n error (e.g. an
29150 20 4f 4f 4d 20 6f 72 20 49 4f 20 65 72 72 6f 72   OOM or IO error
29160 29 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  ) occurs, return
29170 20 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65   an SQLite .** e
29180 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
29190 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   The integrity-c
291a0 68 65 63 6b 20 77 6f 72 6b 73 20 61 73 20 66 6f  heck works as fo
291b0 6c 6c 6f 77 73 2e 20 46 6f 72 20 65 61 63 68 20  llows. For each 
291c0 74 6f 6b 65 6e 20 61 6e 64 20 69 6e 64 65 78 65  token and indexe
291d0 64 20 74 6f 6b 65 6e 0a 2a 2a 20 70 72 65 66 69  d token.** prefi
291e0 78 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  x in the documen
291f0 74 20 73 65 74 2c 20 61 20 36 34 2d 62 69 74 20  t set, a 64-bit 
29200 63 68 65 63 6b 73 75 6d 20 69 73 20 63 61 6c 63  checksum is calc
29210 75 6c 61 74 65 64 20 28 62 79 20 63 6f 64 65 0a  ulated (by code.
29220 2a 2a 20 69 6e 20 66 74 73 33 43 68 65 63 6b 73  ** in fts3Checks
29230 75 6d 45 6e 74 72 79 28 29 29 20 62 61 73 65 64  umEntry()) based
29240 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
29250 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 54  g:.**.**     + T
29260 68 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  he index number 
29270 28 30 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  (0 for the main 
29280 69 6e 64 65 78 2c 20 31 20 66 6f 72 20 74 68 65  index, 1 for the
29290 20 66 69 72 73 74 20 70 72 65 66 69 78 0a 2a 2a   first prefix.**
292a0 20 20 20 20 20 20 20 69 6e 64 65 78 20 65 74 63         index etc
292b0 2e 29 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65  .),.**     + The
292c0 20 74 6f 6b 65 6e 20 28 6f 72 20 74 6f 6b 65 6e   token (or token
292d0 20 70 72 65 66 69 78 29 20 74 65 78 74 20 69 74   prefix) text it
292e0 73 65 6c 66 2c 20 0a 2a 2a 20 20 20 20 20 2b 20  self, .**     + 
292f0 54 68 65 20 6c 61 6e 67 75 61 67 65 2d 69 64 20  The language-id 
29300 6f 66 20 74 68 65 20 72 6f 77 20 69 74 20 61 70  of the row it ap
29310 70 65 61 72 73 20 69 6e 2c 0a 2a 2a 20 20 20 20  pears in,.**    
29320 20 2b 20 54 68 65 20 64 6f 63 69 64 20 6f 66 20   + The docid of 
29330 74 68 65 20 72 6f 77 20 69 74 20 61 70 70 65 61  the row it appea
29340 72 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20  rs in,.**     + 
29350 54 68 65 20 63 6f 6c 75 6d 6e 20 69 74 20 61 70  The column it ap
29360 70 65 61 72 73 20 69 6e 2c 20 61 6e 64 0a 2a 2a  pears in, and.**
29370 20 20 20 20 20 2b 20 54 68 65 20 74 6f 6b 65 6e       + The token
29380 73 20 70 6f 73 69 74 69 6f 6e 20 77 69 74 68 69  s position withi
29390 6e 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  n that column..*
293a0 2a 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 73 75  *.** The checksu
293b0 6d 73 20 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69  ms for all entri
293c0 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  es in the index 
293d0 61 72 65 20 58 4f 52 65 64 20 74 6f 67 65 74 68  are XORed togeth
293e0 65 72 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20  er to create.** 
293f0 61 20 73 69 6e 67 6c 65 20 63 68 65 63 6b 73 75  a single checksu
29400 6d 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  m for the entire
29410 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   index..**.** Th
29420 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
29430 6b 20 63 6f 64 65 20 63 61 6c 63 75 6c 61 74 65  k code calculate
29440 73 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b  s the same check
29450 73 75 6d 20 69 6e 20 74 77 6f 20 77 61 79 73 3a  sum in two ways:
29460 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31 2e 20 42 79  .**.**     1. By
29470 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 63 6f   scanning the co
29480 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 46 54  ntents of the FT
29490 53 20 69 6e 64 65 78 2c 20 61 6e 64 20 0a 2a 2a  S index, and .**
294a0 20 20 20 20 20 32 2e 20 42 79 20 73 63 61 6e 6e       2. By scann
294b0 69 6e 67 20 61 6e 64 20 74 6f 6b 65 6e 69 7a 69  ing and tokenizi
294c0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  ng the content t
294d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
294e0 68 65 20 74 77 6f 20 63 68 65 63 6b 73 75 6d 73  he two checksums
294f0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20   are identical, 
29500 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
29510 65 63 6b 20 69 73 20 64 65 65 6d 65 64 20 74 6f  eck is deemed to
29520 20 68 61 76 65 0a 2a 2a 20 70 61 73 73 65 64 2e   have.** passed.
29530 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
29540 74 73 33 44 6f 49 6e 74 65 67 72 69 74 79 43 68  ts3DoIntegrityCh
29550 65 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c 65  eck(.  Fts3Table
29560 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
29570 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
29580 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 29  able handle */.)
29590 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
295a0 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 72 63 20  t bOk = 0;.  rc 
295b0 3d 20 66 74 73 33 49 6e 74 65 67 72 69 74 79 43  = fts3IntegrityC
295c0 68 65 63 6b 28 70 2c 20 26 62 4f 6b 29 3b 0a 20  heck(p, &bOk);. 
295d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
295e0 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 20 72  OK && bOk==0 ) r
295f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
29600 50 54 5f 56 54 41 42 3b 0a 20 20 72 65 74 75 72  PT_VTAB;.  retur
29610 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  n rc;.}../*.** H
29620 61 6e 64 6c 65 20 61 20 27 73 70 65 63 69 61 6c  andle a 'special
29630 27 20 49 4e 53 45 52 54 20 6f 66 20 74 68 65 20  ' INSERT of the 
29640 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 49  form:.**.**   "I
29650 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 28 74  NSERT INTO tbl(t
29660 62 6c 29 20 56 41 4c 55 45 53 28 3c 65 78 70 72  bl) VALUES(<expr
29670 3e 29 22 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  >)".**.** Argume
29680 6e 74 20 70 56 61 6c 20 63 6f 6e 74 61 69 6e 73  nt pVal contains
29690 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 3c   the result of <
296a0 65 78 70 72 3e 2e 20 43 75 72 72 65 6e 74 6c 79  expr>. Currently
296b0 20 74 68 65 20 6f 6e 6c 79 20 0a 2a 2a 20 6d 65   the only .** me
296c0 61 6e 69 6e 67 66 75 6c 20 76 61 6c 75 65 20 74  aningful value t
296d0 6f 20 69 6e 73 65 72 74 20 69 73 20 74 68 65 20  o insert is the 
296e0 74 65 78 74 20 27 6f 70 74 69 6d 69 7a 65 27 2e  text 'optimize'.
296f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
29700 74 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74  ts3SpecialInsert
29710 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73  (Fts3Table *p, s
29720 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
29730 61 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  al){.  int rc;  
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29750 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29760 20 43 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   Code */.  const
29770 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28 63   char *zVal = (c
29780 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
29790 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
297a0 56 61 6c 29 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Val);.  int nVal
297b0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
297c0 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 0a 20  _bytes(pVal);.. 
297d0 20 69 66 28 20 21 7a 56 61 6c 20 29 7b 0a 20 20   if( !zVal ){.  
297e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
297f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69  NOMEM;.  }else i
29800 66 28 20 6e 56 61 6c 3d 3d 38 20 26 26 20 30 3d  f( nVal==8 && 0=
29810 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
29820 70 28 7a 56 61 6c 2c 20 22 6f 70 74 69 6d 69 7a  p(zVal, "optimiz
29830 65 22 2c 20 38 29 20 29 7b 0a 20 20 20 20 72 63  e", 8) ){.    rc
29840 20 3d 20 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a   = fts3DoOptimiz
29850 65 28 70 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  e(p, 0);.  }else
29860 20 69 66 28 20 6e 56 61 6c 3d 3d 37 20 26 26 20   if( nVal==7 && 
29870 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
29880 63 6d 70 28 7a 56 61 6c 2c 20 22 72 65 62 75 69  cmp(zVal, "rebui
29890 6c 64 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 72  ld", 7) ){.    r
298a0 63 20 3d 20 66 74 73 33 44 6f 52 65 62 75 69 6c  c = fts3DoRebuil
298b0 64 28 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  d(p);.  }else if
298c0 28 20 6e 56 61 6c 3d 3d 31 35 20 26 26 20 30 3d  ( nVal==15 && 0=
298d0 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
298e0 70 28 7a 56 61 6c 2c 20 22 69 6e 74 65 67 72 69  p(zVal, "integri
298f0 74 79 2d 63 68 65 63 6b 22 2c 20 31 35 29 20 29  ty-check", 15) )
29900 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  {.    rc = fts3D
29910 6f 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  oIntegrityCheck(
29920 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  p);.  }else if( 
29930 6e 56 61 6c 3e 36 20 26 26 20 30 3d 3d 73 71 6c  nVal>6 && 0==sql
29940 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
29950 61 6c 2c 20 22 6d 65 72 67 65 3d 22 2c 20 36 29  al, "merge=", 6)
29960 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
29970 33 44 6f 49 6e 63 72 6d 65 72 67 65 28 70 2c 20  3DoIncrmerge(p, 
29980 26 7a 56 61 6c 5b 36 5d 29 3b 0a 20 20 7d 65 6c  &zVal[6]);.  }el
29990 73 65 20 69 66 28 20 6e 56 61 6c 3e 31 30 20 26  se if( nVal>10 &
299a0 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
299b0 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 61 75 74  nicmp(zVal, "aut
299c0 6f 6d 65 72 67 65 3d 22 2c 20 31 30 29 20 29 7b  omerge=", 10) ){
299d0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f  .    rc = fts3Do
299e0 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 28 70 2c  Autoincrmerge(p,
299f0 20 26 7a 56 61 6c 5b 31 30 5d 29 3b 0a 23 69 66   &zVal[10]);.#if
29a00 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
29a10 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
29a20 3e 39 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  >9 && 0==sqlite3
29a30 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20  _strnicmp(zVal, 
29a40 22 6e 6f 64 65 73 69 7a 65 3d 22 2c 20 39 29 20  "nodesize=", 9) 
29a50 29 7b 0a 20 20 20 20 70 2d 3e 6e 4e 6f 64 65 53  ){.    p->nNodeS
29a60 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c  ize = atoi(&zVal
29a70 5b 39 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  [9]);.    rc = S
29a80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
29a90 65 20 69 66 28 20 6e 56 61 6c 3e 31 31 20 26 26  e if( nVal>11 &&
29aa0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e   0==sqlite3_strn
29ab0 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6d 61 78 70  icmp(zVal, "maxp
29ac0 65 6e 64 69 6e 67 3d 22 2c 20 39 29 20 29 7b 0a  ending=", 9) ){.
29ad0 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69      p->nMaxPendi
29ae0 6e 67 44 61 74 61 20 3d 20 61 74 6f 69 28 26 7a  ngData = atoi(&z
29af0 56 61 6c 5b 31 31 5d 29 3b 0a 20 20 20 20 72 63  Val[11]);.    rc
29b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
29b10 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
29b20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
29b30 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
29b40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29b50 44 65 6c 65 74 65 20 61 6c 6c 20 63 61 63 68 65  Delete all cache
29b60 64 20 64 65 66 65 72 72 65 64 20 64 6f 63 6c 69  d deferred docli
29b70 73 74 73 2e 20 44 65 66 65 72 72 65 64 20 64 6f  sts. Deferred do
29b80 63 6c 69 73 74 73 20 61 72 65 20 63 61 63 68 65  clists are cache
29b90 64 0a 2a 2a 20 28 61 6c 6c 6f 63 61 74 65 64 29  d.** (allocated)
29ba0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 46   by the sqlite3F
29bb0 74 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64  ts3CacheDeferred
29bc0 44 6f 63 6c 69 73 74 73 28 29 20 66 75 6e 63 74  Doclists() funct
29bd0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
29be0 69 74 65 33 46 74 73 33 46 72 65 65 44 65 66 65  ite3Fts3FreeDefe
29bf0 72 72 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73  rredDoclists(Fts
29c00 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a  3Cursor *pCsr){.
29c10 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f    Fts3DeferredTo
29c20 6b 65 6e 20 2a 70 44 65 66 3b 0a 20 20 66 6f 72  ken *pDef;.  for
29c30 28 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66  (pDef=pCsr->pDef
29c40 65 72 72 65 64 3b 20 70 44 65 66 3b 20 70 44 65  erred; pDef; pDe
29c50 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a  f=pDef->pNext){.
29c60 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c      fts3PendingL
29c70 69 73 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e  istDelete(pDef->
29c80 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 44 65 66  pList);.    pDef
29c90 2d 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d  ->pList = 0;.  }
29ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
29cb0 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ll entries in th
29cc0 65 20 70 43 73 72 2d 3e 70 44 65 66 66 65 72 65  e pCsr->pDeffere
29cd0 64 20 6c 69 73 74 2e 20 45 6e 74 72 69 65 73 20  d list. Entries 
29ce0 61 72 65 20 61 64 64 65 64 20 74 6f 20 0a 2a 2a  are added to .**
29cf0 20 74 68 69 73 20 6c 69 73 74 20 75 73 69 6e 67   this list using
29d00 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65   sqlite3Fts3Defe
29d10 72 54 6f 6b 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69  rToken()..*/.voi
29d20 64 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65  d sqlite3Fts3Fre
29d30 65 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28  eDeferredTokens(
29d40 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
29d50 29 7b 0a 20 20 46 74 73 33 44 65 66 65 72 72 65  ){.  Fts3Deferre
29d60 64 54 6f 6b 65 6e 20 2a 70 44 65 66 3b 0a 20 20  dToken *pDef;.  
29d70 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
29d80 6e 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  n *pNext;.  for(
29d90 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65  pDef=pCsr->pDefe
29da0 72 72 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66  rred; pDef; pDef
29db0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
29dc0 78 74 20 3d 20 70 44 65 66 2d 3e 70 4e 65 78 74  xt = pDef->pNext
29dd0 3b 0a 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e  ;.    fts3Pendin
29de0 67 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65 66  gListDelete(pDef
29df0 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  ->pList);.    sq
29e00 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 66 29  lite3_free(pDef)
29e10 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 70 44  ;.  }.  pCsr->pD
29e20 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a  eferred = 0;.}..
29e30 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 64  /*.** Generate d
29e40 65 66 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 73  eferred-doclists
29e50 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20   for all tokens 
29e60 69 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65  in the pCsr->pDe
29e70 66 65 72 72 65 64 20 6c 69 73 74 0a 2a 2a 20 62  ferred list.** b
29e80 61 73 65 64 20 6f 6e 20 74 68 65 20 72 6f 77 20  ased on the row 
29e90 74 68 61 74 20 70 43 73 72 20 63 75 72 72 65 6e  that pCsr curren
29ea0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
29eb0 2a 0a 2a 2a 20 41 20 64 65 66 65 72 72 65 64 2d  *.** A deferred-
29ec0 64 6f 63 6c 69 73 74 20 69 73 20 6c 69 6b 65 20  doclist is like 
29ed0 61 6e 79 20 6f 74 68 65 72 20 64 6f 63 6c 69 73  any other doclis
29ee0 74 20 77 69 74 68 20 70 6f 73 69 74 69 6f 6e 20  t with position 
29ef0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69  information.** i
29f00 6e 63 6c 75 64 65 64 2c 20 65 78 63 65 70 74 20  ncluded, except 
29f10 74 68 61 74 20 69 74 20 6f 6e 6c 79 20 63 6f 6e  that it only con
29f20 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
29f30 72 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  r a single row o
29f40 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  f the.** table, 
29f50 6e 6f 74 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73  not for all rows
29f60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29f70 46 74 73 33 43 61 63 68 65 44 65 66 65 72 72 65  Fts3CacheDeferre
29f80 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75  dDoclists(Fts3Cu
29f90 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
29fa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29fb0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
29fc0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
29fd0 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70 44 65  .  if( pCsr->pDe
29fe0 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20 69 6e  ferred ){.    in
29ff0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2a000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2a010 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
2a020 68 72 6f 75 67 68 20 74 61 62 6c 65 20 63 6f 6c  hrough table col
2a030 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  umns */.    sqli
2a040 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
2a050 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63  ;         /* Doc
2a060 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20 70 43  id of the row pC
2a070 73 72 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  sr points to */.
2a080 20 20 20 20 46 74 73 33 44 65 66 65 72 72 65 64      Fts3Deferred
2a090 54 6f 6b 65 6e 20 2a 70 44 65 66 3b 20 20 20 20  Token *pDef;    
2a0a0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
2a0b0 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 65 66  rate through def
2a0c0 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a  erred tokens */.
2a0d0 20 20 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65    .    Fts3Table
2a0e0 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
2a0f0 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
2a100 74 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tab;.    sqlite3
2a110 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 20 3d  _tokenizer *pT =
2a120 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a   p->pTokenizer;.
2a130 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65      sqlite3_toke
2a140 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e  nizer_module con
2a150 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54  st *pModule = pT
2a160 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 0a 20  ->pModule;.   . 
2a170 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
2a180 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b 3d 3d  >isRequireSeek==
2a190 30 20 29 3b 0a 20 20 20 20 69 44 6f 63 69 64 20  0 );.    iDocid 
2a1a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2a1b0 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74  _int64(pCsr->pSt
2a1c0 6d 74 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 66  mt, 0);.  .    f
2a1d0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
2a1e0 6c 75 6d 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  lumn && rc==SQLI
2a1f0 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
2a200 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2a210 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
2a220 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
2a230 75 6d 6e 5f 74 65 78 74 28 70 43 73 72 2d 3e 70  umn_text(pCsr->p
2a240 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  Stmt, i+1);.    
2a250 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
2a260 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 54 43 20  zer_cursor *pTC 
2a270 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20 20 72 63  = 0;.  .      rc
2a280 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70   = sqlite3Fts3Op
2a290 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54 2c 20  enTokenizer(pT, 
2a2a0 70 43 73 72 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a  pCsr->iLangid, z
2a2b0 54 65 78 74 2c 20 2d 31 2c 20 26 70 54 43 29 3b  Text, -1, &pTC);
2a2c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63  .      while( rc
2a2d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a2e0 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
2a2f0 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20 20 20 20  t *zToken;      
2a300 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
2a310 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20  ining token */. 
2a320 20 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65         int nToke
2a330 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2a340 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2a350 74 65 73 20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a  tes in token */.
2a360 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 75 6d          int iDum
2a370 31 2c 20 69 44 75 6d 32 3b 20 20 20 20 20 20 20  1, iDum2;       
2a380 20 20 2f 2a 20 44 75 6d 6d 79 20 76 61 72 69 61    /* Dummy varia
2a390 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  bles */.        
2a3a0 69 6e 74 20 69 50 6f 73 3b 20 20 20 20 20 20 20  int iPos;       
2a3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
2a3c0 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69  ition of token i
2a3d0 6e 20 7a 54 65 78 74 20 2a 2f 0a 20 20 0a 20 20  n zText */.  .  
2a3e0 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75        rc = pModu
2a3f0 6c 65 2d 3e 78 4e 65 78 74 28 70 54 43 2c 20 26  le->xNext(pTC, &
2a400 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c  zToken, &nToken,
2a410 20 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c   &iDum1, &iDum2,
2a420 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20   &iPos);.       
2a430 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e   for(pDef=pCsr->
2a440 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 20  pDeferred; pDef 
2a450 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2a460 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65  ; pDef=pDef->pNe
2a470 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46  xt){.          F
2a480 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
2a490 70 50 54 20 3d 20 70 44 65 66 2d 3e 70 54 6f 6b  pPT = pDef->pTok
2a4a0 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  en;.          if
2a4b0 28 20 28 70 44 65 66 2d 3e 69 43 6f 6c 3e 3d 70  ( (pDef->iCol>=p
2a4c0 2d 3e 6e 43 6f 6c 75 6d 6e 20 7c 7c 20 70 44 65  ->nColumn || pDe
2a4d0 66 2d 3e 69 43 6f 6c 3d 3d 69 29 0a 20 20 20 20  f->iCol==i).    
2a4e0 20 20 20 20 20 20 20 26 26 20 28 70 50 54 2d 3e         && (pPT->
2a4f0 62 46 69 72 73 74 3d 3d 30 20 7c 7c 20 69 50 6f  bFirst==0 || iPo
2a500 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  s==0).          
2a510 20 26 26 20 28 70 50 54 2d 3e 6e 3d 3d 6e 54 6f   && (pPT->n==nTo
2a520 6b 65 6e 20 7c 7c 20 28 70 50 54 2d 3e 69 73 50  ken || (pPT->isP
2a530 72 65 66 69 78 20 26 26 20 70 50 54 2d 3e 6e 3c  refix && pPT->n<
2a540 6e 54 6f 6b 65 6e 29 29 0a 20 20 20 20 20 20 20  nToken)).       
2a550 20 20 20 20 26 26 20 28 30 3d 3d 6d 65 6d 63 6d      && (0==memcm
2a560 70 28 7a 54 6f 6b 65 6e 2c 20 70 50 54 2d 3e 7a  p(zToken, pPT->z
2a570 2c 20 70 50 54 2d 3e 6e 29 29 0a 20 20 20 20 20  , pPT->n)).     
2a580 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2a590 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c      fts3PendingL
2a5a0 69 73 74 41 70 70 65 6e 64 28 26 70 44 65 66 2d  istAppend(&pDef-
2a5b0 3e 70 4c 69 73 74 2c 20 69 44 6f 63 69 64 2c 20  >pList, iDocid, 
2a5c0 69 2c 20 69 50 6f 73 2c 20 26 72 63 29 3b 0a 20  i, iPos, &rc);. 
2a5d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a5e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a5f0 20 20 20 69 66 28 20 70 54 43 20 29 20 70 4d 6f     if( pTC ) pMo
2a600 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54 43  dule->xClose(pTC
2a610 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a620 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
2a630 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a640 20 20 20 7d 0a 20 20 0a 20 20 20 20 66 6f 72 28     }.  .    for(
2a650 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65  pDef=pCsr->pDefe
2a660 72 72 65 64 3b 20 70 44 65 66 20 26 26 20 72 63  rred; pDef && rc
2a670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65  ==SQLITE_OK; pDe
2a680 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a  f=pDef->pNext){.
2a690 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
2a6a0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
2a6b0 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
2a6c0 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
2a6d0 74 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c 20  t(&pDef->pList, 
2a6e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2a6f0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2a700 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
2a710 65 33 46 74 73 33 44 65 66 65 72 72 65 64 54 6f  e3Fts3DeferredTo
2a720 6b 65 6e 4c 69 73 74 28 0a 20 20 46 74 73 33 44  kenList(.  Fts3D
2a730 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 2c  eferredToken *p,
2a740 20 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 61 74   .  char **ppDat
2a750 61 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 44 61 74  a, .  int *pnDat
2a760 61 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 52 65  a.){.  char *pRe
2a770 74 3b 0a 20 20 69 6e 74 20 6e 53 6b 69 70 3b 0a  t;.  int nSkip;.
2a780 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2a790 64 75 6d 6d 79 3b 0a 0a 20 20 2a 70 70 44 61 74  dummy;..  *ppDat
2a7a0 61 20 3d 20 30 3b 0a 20 20 2a 70 6e 44 61 74 61  a = 0;.  *pnData
2a7b0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
2a7c0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
2a7d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a7e0 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  ;.  }..  pRet = 
2a7f0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2a800 6d 61 6c 6c 6f 63 28 70 2d 3e 70 4c 69 73 74 2d  malloc(p->pList-
2a810 3e 6e 44 61 74 61 29 3b 0a 20 20 69 66 28 20 21  >nData);.  if( !
2a820 70 52 65 74 20 29 20 72 65 74 75 72 6e 20 53 51  pRet ) return SQ
2a830 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 6e  LITE_NOMEM;..  n
2a840 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 46 74  Skip = sqlite3Ft
2a850 73 33 47 65 74 56 61 72 69 6e 74 28 70 2d 3e 70  s3GetVarint(p->p
2a860 4c 69 73 74 2d 3e 61 44 61 74 61 2c 20 26 64 75  List->aData, &du
2a870 6d 6d 79 29 3b 0a 20 20 2a 70 6e 44 61 74 61 20  mmy);.  *pnData 
2a880 3d 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74  = p->pList->nDat
2a890 61 20 2d 20 6e 53 6b 69 70 3b 0a 20 20 2a 70 70  a - nSkip;.  *pp
2a8a0 44 61 74 61 20 3d 20 70 52 65 74 3b 0a 20 20 0a  Data = pRet;.  .
2a8b0 20 20 6d 65 6d 63 70 79 28 70 52 65 74 2c 20 26    memcpy(pRet, &
2a8c0 70 2d 3e 70 4c 69 73 74 2d 3e 61 44 61 74 61 5b  p->pList->aData[
2a8d0 6e 53 6b 69 70 5d 2c 20 2a 70 6e 44 61 74 61 29  nSkip], *pnData)
2a8e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a8f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
2a900 64 64 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  dd an entry for 
2a910 74 6f 6b 65 6e 20 70 54 6f 6b 65 6e 20 74 6f 20  token pToken to 
2a920 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65 72  the pCsr->pDefer
2a930 72 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  red list..*/.int
2a940 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65   sqlite3Fts3Defe
2a950 72 54 6f 6b 65 6e 28 0a 20 20 46 74 73 33 43 75  rToken(.  Fts3Cu
2a960 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
2a970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
2a980 33 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a  3 table cursor *
2a990 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 54 6f  /.  Fts3PhraseTo
2a9a0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
2a9b0 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20      /* Token to 
2a9c0 64 65 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  defer */.  int i
2a9d0 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
2a9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2a9f0 6c 75 6d 6e 20 74 68 61 74 20 74 6f 6b 65 6e 20  lumn that token 
2aa00 6d 75 73 74 20 61 70 70 65 61 72 20 69 6e 20 28  must appear in (
2aa10 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b 0a 20 20 46  or -1) */.){.  F
2aa20 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
2aa30 20 2a 70 44 65 66 65 72 72 65 64 3b 0a 20 20 70   *pDeferred;.  p
2aa40 44 65 66 65 72 72 65 64 20 3d 20 73 71 6c 69 74  Deferred = sqlit
2aa50 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
2aa60 28 2a 70 44 65 66 65 72 72 65 64 29 29 3b 0a 20  (*pDeferred));. 
2aa70 20 69 66 28 20 21 70 44 65 66 65 72 72 65 64 20   if( !pDeferred 
2aa80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2aa90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2aaa0 20 20 6d 65 6d 73 65 74 28 70 44 65 66 65 72 72    memset(pDeferr
2aab0 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ed, 0, sizeof(*p
2aac0 44 65 66 65 72 72 65 64 29 29 3b 0a 20 20 70 44  Deferred));.  pD
2aad0 65 66 65 72 72 65 64 2d 3e 70 54 6f 6b 65 6e 20  eferred->pToken 
2aae0 3d 20 70 54 6f 6b 65 6e 3b 0a 20 20 70 44 65 66  = pToken;.  pDef
2aaf0 65 72 72 65 64 2d 3e 70 4e 65 78 74 20 3d 20 70  erred->pNext = p
2ab00 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20  Csr->pDeferred; 
2ab10 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e 69 43  .  pDeferred->iC
2ab20 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 43 73  ol = iCol;.  pCs
2ab30 72 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20 70  r->pDeferred = p
2ab40 44 65 66 65 72 72 65 64 3b 0a 0a 20 20 61 73 73  Deferred;..  ass
2ab50 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 44 65  ert( pToken->pDe
2ab60 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a 20 20 70  ferred==0 );.  p
2ab70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64  Token->pDeferred
2ab80 20 3d 20 70 44 65 66 65 72 72 65 64 3b 0a 0a 20   = pDeferred;.. 
2ab90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2aba0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  K;.}../*.** SQLi
2abb0 74 65 20 76 61 6c 75 65 20 70 52 6f 77 69 64 20  te value pRowid 
2abc0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 77  contains the row
2abd0 69 64 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74  id of a row that
2abe0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
2abf0 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  be.** present in
2ac00 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e   the FTS3 table.
2ac10 20 49 66 20 69 74 20 69 73 2c 20 64 65 6c 65 74   If it is, delet
2ac20 65 20 69 74 20 61 6e 64 20 61 64 6a 75 73 74 20  e it and adjust 
2ac30 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
2ac40 6f 66 20 73 75 62 73 69 64 75 61 72 79 20 64 61  of subsiduary da
2ac50 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ta structures ac
2ac60 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
2ac70 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c  atic int fts3Del
2ac80 65 74 65 42 79 52 6f 77 69 64 28 0a 20 20 46 74  eteByRowid(.  Ft
2ac90 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 73  s3Table *p, .  s
2aca0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
2acb0 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 2a 70 6e  owid, .  int *pn
2acc0 44 6f 63 2c 0a 20 20 75 33 32 20 2a 61 53 7a 44  Doc,.  u32 *aSzD
2acd0 65 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 73 45 6d  el.){.  int isEm
2ace0 70 74 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  pty = 0;.  int r
2acf0 63 20 3d 20 66 74 73 33 49 73 45 6d 70 74 79 28  c = fts3IsEmpty(
2ad00 70 2c 20 70 52 6f 77 69 64 2c 20 26 69 73 45 6d  p, pRowid, &isEm
2ad10 70 74 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pty);.  if( rc==
2ad20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ad30 20 69 66 28 20 69 73 45 6d 70 74 79 20 29 7b 0a   if( isEmpty ){.
2ad40 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e        /* Deletin
2ad50 67 20 74 68 69 73 20 72 6f 77 20 6d 65 61 6e 73  g this row means
2ad60 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62 6c 65   the whole table
2ad70 20 69 73 20 65 6d 70 74 79 2e 20 49 6e 20 74 68   is empty. In th
2ad80 69 73 20 63 61 73 65 0a 20 20 20 20 20 20 2a 2a  is case.      **
2ad90 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74   delete the cont
2ada0 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72 65  ents of all thre
2adb0 65 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 72  e tables and thr
2adc0 6f 77 20 61 77 61 79 20 61 6e 79 0a 20 20 20 20  ow away any.    
2add0 20 20 2a 2a 20 64 61 74 61 20 69 6e 20 74 68 65    ** data in the
2ade0 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 68 61   pendingTerms ha
2adf0 73 68 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  sh table.  */.  
2ae00 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c      rc = fts3Del
2ae10 65 74 65 41 6c 6c 28 70 2c 20 31 29 3b 0a 20 20  eteAll(p, 1);.  
2ae20 20 20 20 20 2a 70 6e 44 6f 63 20 3d 20 2a 70 6e      *pnDoc = *pn
2ae30 44 6f 63 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Doc - 1;.    }el
2ae40 73 65 7b 0a 20 20 20 20 20 20 66 74 73 33 44 65  se{.      fts3De
2ae50 6c 65 74 65 54 65 72 6d 73 28 26 72 63 2c 20 70  leteTerms(&rc, p
2ae60 2c 20 70 52 6f 77 69 64 2c 20 61 53 7a 44 65 6c  , pRowid, aSzDel
2ae70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
2ae80 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29  zContentTbl==0 )
2ae90 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 71  {.        fts3Sq
2aea0 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51  lExec(&rc, p, SQ
2aeb0 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54  L_DELETE_CONTENT
2aec0 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  , &pRowid);.    
2aed0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2aee0 63 68 61 6e 67 65 73 28 70 2d 3e 64 62 29 20 29  changes(p->db) )
2aef0 20 2a 70 6e 44 6f 63 20 3d 20 2a 70 6e 44 6f 63   *pnDoc = *pnDoc
2af00 20 2d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   - 1;.      }els
2af10 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 44 6f  e{.        *pnDo
2af20 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31 3b 0a  c = *pnDoc - 1;.
2af30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2af40 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65  ( p->bHasDocsize
2af50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33   ){.        fts3
2af60 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20  SqlExec(&rc, p, 
2af70 53 51 4c 5f 44 45 4c 45 54 45 5f 44 4f 43 53 49  SQL_DELETE_DOCSI
2af80 5a 45 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20  ZE, &pRowid);.  
2af90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2afa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2afb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2afc0 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f  tion does the wo
2afd0 72 6b 20 66 6f 72 20 74 68 65 20 78 55 70 64 61  rk for the xUpda
2afe0 74 65 20 6d 65 74 68 6f 64 20 6f 66 20 46 54 53  te method of FTS
2aff0 33 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  3 virtual.** tab
2b000 6c 65 73 2e 20 54 68 65 20 73 63 68 65 6d 61 20  les. The schema 
2b010 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
2b020 61 62 6c 65 20 62 65 69 6e 67 3a 0a 2a 2a 0a 2a  able being:.**.*
2b030 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
2b040 4c 45 20 3c 74 61 62 6c 65 20 6e 61 6d 65 3e 28  LE <table name>(
2b050 20 0a 2a 2a 20 20 20 20 20 20 20 3c 75 73 65 72   .**       <user
2b060 20 63 6f 6c 75 6d 6e 73 3e 2c 0a 2a 2a 20 20 20   columns>,.**   
2b070 20 20 20 20 3c 74 61 62 6c 65 20 6e 61 6d 65 3e      <table name>
2b080 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20 20   HIDDEN, .**    
2b090 20 20 20 64 6f 63 69 64 20 48 49 44 44 45 4e 2c     docid HIDDEN,
2b0a0 20 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 61 6e 67   .**       <lang
2b0b0 69 64 3e 20 48 49 44 44 45 4e 0a 2a 2a 20 20 20  id> HIDDEN.**   
2b0c0 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 0a 2a 2f 0a 69    );.**.** .*/.i
2b0d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 55 70  nt sqlite3Fts3Up
2b0e0 64 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71  dateMethod(.  sq
2b0f0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
2b100 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
2b110 20 46 54 53 33 20 76 74 61 62 20 6f 62 6a 65 63   FTS3 vtab objec
2b120 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2b150 66 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79  f argument array
2b160 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
2b170 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20  lue **apVal,    
2b180 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2b190 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2b1a0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
2b1b0 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
2b1c0 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66   /* OUT: The aff
2b1d0 65 63 74 65 64 20 28 6f 72 20 65 66 66 65 63 74  ected (or effect
2b1e0 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  ed) rowid */.){.
2b1f0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
2b200 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56   (Fts3Table *)pV
2b210 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  tab;.  int rc = 
2b220 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2b230 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2b240 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   Code */.  int i
2b250 73 52 65 6d 6f 76 65 20 3d 20 30 3b 20 20 20 20  sRemove = 0;    
2b260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b270 75 65 20 66 6f 72 20 61 6e 20 55 50 44 41 54 45  ue for an UPDATE
2b280 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   or DELETE */.  
2b290 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20 30 3b  u32 *aSzIns = 0;
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2b0 2f 2a 20 53 69 7a 65 73 20 6f 66 20 69 6e 73 65  /* Sizes of inse
2b2c0 72 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a  rted documents *
2b2d0 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 3b  /.  u32 *aSzDel;
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2b300 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e 74  deleted document
2b310 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67  s */.  int nChng
2b320 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b330 20 20 20 20 20 20 20 2f 2a 20 4e 65 74 20 63 68         /* Net ch
2b340 61 6e 67 65 20 69 6e 20 6e 75 6d 62 65 72 20 6f  ange in number o
2b350 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20  f documents */. 
2b360 20 69 6e 74 20 62 49 6e 73 65 72 74 44 6f 6e 65   int bInsertDone
2b370 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2b380 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30   p->pSegments==0
2b390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 0a 20   );.  assert( . 
2b3a0 20 20 20 20 20 6e 41 72 67 3d 3d 31 20 20 20 20       nArg==1    
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3c0 20 2f 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61   /* DELETE opera
2b3d0 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 7c 7c 20 6e  tions */.   || n
2b3e0 41 72 67 3d 3d 28 32 20 2b 20 70 2d 3e 6e 43 6f  Arg==(2 + p->nCo
2b3f0 6c 75 6d 6e 20 2b 20 33 29 20 20 2f 2a 20 49 4e  lumn + 3)  /* IN
2b400 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f  SERT or UPDATE o
2b410 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 29  perations */.  )
2b420 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
2b430 72 20 61 20 22 73 70 65 63 69 61 6c 22 20 49 4e  r a "special" IN
2b440 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 20  SERT operation. 
2b450 4f 6e 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  One of the form:
2b460 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53  .  **.  **   INS
2b470 45 52 54 20 49 4e 54 4f 20 78 79 7a 28 78 79 7a  ERT INTO xyz(xyz
2b480 29 20 56 41 4c 55 45 53 28 27 63 6f 6d 6d 61 6e  ) VALUES('comman
2b490 64 27 29 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  d');.  */.  if( 
2b4a0 6e 41 72 67 3e 31 20 0a 20 20 20 26 26 20 73 71  nArg>1 .   && sq
2b4b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2b4c0 28 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49  (apVal[0])==SQLI
2b4d0 54 45 5f 4e 55 4c 4c 20 0a 20 20 20 26 26 20 73  TE_NULL .   && s
2b4e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2b4f0 65 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75  e(apVal[p->nColu
2b500 6d 6e 2b 32 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  mn+2])!=SQLITE_N
2b510 55 4c 4c 20 0a 20 20 29 7b 0a 20 20 20 20 72 63  ULL .  ){.    rc
2b520 20 3d 20 66 74 73 33 53 70 65 63 69 61 6c 49 6e   = fts3SpecialIn
2b530 73 65 72 74 28 70 2c 20 61 70 56 61 6c 5b 70 2d  sert(p, apVal[p-
2b540 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 3b 0a 20 20  >nColumn+2]);.  
2b550 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75    goto update_ou
2b560 74 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 41  t;.  }..  if( nA
2b570 72 67 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f  rg>1 && sqlite3_
2b580 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
2b590 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b  2 + p->nColumn +
2b5a0 20 32 5d 29 3c 30 20 29 7b 0a 20 20 20 20 72 63   2])<0 ){.    rc
2b5b0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
2b5c0 41 49 4e 54 3b 0a 20 20 20 20 67 6f 74 6f 20 75  AINT;.    goto u
2b5d0 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pdate_out;.  }..
2b5e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
2b5f0 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
2b600 63 68 61 6e 67 65 20 69 6e 20 64 6f 63 75 6d 65  change in docume
2b610 6e 74 20 73 69 7a 65 73 20 2a 2f 0a 20 20 61 53  nt sizes */.  aS
2b620 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zIns = sqlite3_m
2b630 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 53  alloc( sizeof(aS
2b640 7a 49 6e 73 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f  zIns[0])*(p->nCo
2b650 6c 75 6d 6e 2b 31 29 2a 32 20 29 3b 0a 20 20 69  lumn+1)*2 );.  i
2b660 66 28 20 61 53 7a 49 6e 73 3d 3d 30 20 29 7b 0a  f( aSzIns==0 ){.
2b670 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b680 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
2b690 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a  update_out;.  }.
2b6a0 20 20 61 53 7a 44 65 6c 20 3d 20 26 61 53 7a 49    aSzDel = &aSzI
2b6b0 6e 73 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d  ns[p->nColumn+1]
2b6c0 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 7a 49 6e  ;.  memset(aSzIn
2b6d0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 7a  s, 0, sizeof(aSz
2b6e0 49 6e 73 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c  Ins[0])*(p->nCol
2b6f0 75 6d 6e 2b 31 29 2a 32 29 3b 0a 0a 20 20 2f 2a  umn+1)*2);..  /*
2b700 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49   If this is an I
2b710 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2c  NSERT operation,
2b720 20 6f 72 20 61 6e 20 55 50 44 41 54 45 20 74 68   or an UPDATE th
2b730 61 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  at modifies the 
2b740 72 6f 77 69 64 0a 20 20 2a 2a 20 76 61 6c 75 65  rowid.  ** value
2b750 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70 65 72  , then this oper
2b760 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 63  ation requires c
2b770 6f 6e 73 74 72 61 69 6e 74 20 68 61 6e 64 6c 69  onstraint handli
2b780 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ng..  **.  ** If
2b790 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74   the on-conflict
2b7a0 20 6d 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45   mode is REPLACE
2b7b0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61  , this means tha
2b7c0 74 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 72  t the existing r
2b7d0 6f 77 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  ow.  ** should b
2b7e0 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  e deleted from t
2b7f0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2b800 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65  re inserting the
2b810 20 6e 65 77 20 72 6f 77 2e 20 4f 72 2c 0a 20 20   new row. Or,.  
2b820 2a 2a 20 69 66 20 74 68 65 20 6f 6e 2d 63 6f 6e  ** if the on-con
2b830 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20 6f 74  flict mode is ot
2b840 68 65 72 20 74 68 61 6e 20 52 45 50 4c 41 43 45  her than REPLACE
2b850 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 65 74 68  , then this meth
2b860 6f 64 20 6d 75 73 74 0a 20 20 2a 2a 20 64 65 74  od must.  ** det
2b870 65 63 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  ect the conflict
2b880 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
2b890 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 62 65  TE_CONSTRAINT be
2b8a0 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 74  fore beginning t
2b8b0 6f 0a 20 20 2a 2a 20 6d 6f 64 69 66 79 20 74 68  o.  ** modify th
2b8c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b8d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  .  */.  if( nArg
2b8e0 3e 31 20 26 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e  >1 && p->zConten
2b8f0 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  tTbl==0 ){.    /
2b900 2a 20 46 69 6e 64 20 74 68 65 20 76 61 6c 75 65  * Find the value
2b910 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 6f 6c   object that hol
2b920 64 73 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64  ds the new rowid
2b930 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 73   value. */.    s
2b940 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4e  qlite3_value *pN
2b950 65 77 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b  ewRowid = apVal[
2b960 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  3+p->nColumn];. 
2b970 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
2b980 61 6c 75 65 5f 74 79 70 65 28 70 4e 65 77 52 6f  alue_type(pNewRo
2b990 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  wid)==SQLITE_NUL
2b9a0 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 52  L ){.      pNewR
2b9b0 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 31 5d 3b  owid = apVal[1];
2b9c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2b9d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2b9e0 70 65 28 70 4e 65 77 52 6f 77 69 64 29 21 3d 53  pe(pNewRowid)!=S
2b9f0 51 4c 49 54 45 5f 4e 55 4c 4c 20 26 26 20 28 20  QLITE_NULL && ( 
2ba00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ba10 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2ba20 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  l[0])==SQLITE_NU
2ba30 4c 4c 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  LL.     || sqlit
2ba40 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2ba50 70 56 61 6c 5b 30 5d 29 21 3d 73 71 6c 69 74 65  pVal[0])!=sqlite
2ba60 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 4e  3_value_int64(pN
2ba70 65 77 52 6f 77 69 64 29 0a 20 20 20 20 29 29 7b  ewRowid).    )){
2ba80 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  .      /* The ne
2ba90 77 20 72 6f 77 69 64 20 69 73 20 6e 6f 74 20 4e  w rowid is not N
2baa0 55 4c 4c 20 28 69 6e 20 74 68 69 73 20 63 61 73  ULL (in this cas
2bab0 65 20 74 68 65 20 72 6f 77 69 64 20 77 69 6c 6c  e the rowid will
2bac0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 75 74   be.      ** aut
2bad0 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 73 69 67  omatically assig
2bae0 6e 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  ned and there is
2baf0 20 6e 6f 20 63 68 61 6e 63 65 20 6f 66 20 61 20   no chance of a 
2bb00 63 6f 6e 66 6c 69 63 74 29 2c 20 61 6e 64 20 0a  conflict), and .
2bb10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61        ** the sta
2bb20 74 65 6d 65 6e 74 20 69 73 20 65 69 74 68 65 72  tement is either
2bb30 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 61 6e   an INSERT or an
2bb40 20 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64   UPDATE that mod
2bb50 69 66 69 65 73 20 74 68 65 0a 20 20 20 20 20 20  ifies the.      
2bb60 2a 2a 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e  ** rowid column.
2bb70 20 53 6f 20 69 66 20 74 68 65 20 63 6f 6e 66 6c   So if the confl
2bb80 69 63 74 20 6d 6f 64 65 20 69 73 20 52 45 50 4c  ict mode is REPL
2bb90 41 43 45 2c 20 74 68 65 6e 20 64 65 6c 65 74 65  ACE, then delete
2bba0 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 65 78   any.      ** ex
2bbb0 69 73 74 69 6e 67 20 72 6f 77 20 77 69 74 68 20  isting row with 
2bbc0 72 6f 77 69 64 3d 70 4e 65 77 52 6f 77 69 64 2e  rowid=pNewRowid.
2bbd0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
2bbe0 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63   ** Or, if the c
2bbf0 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20  onflict mode is 
2bc00 6e 6f 74 20 52 45 50 4c 41 43 45 2c 20 69 6e 73  not REPLACE, ins
2bc10 65 72 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f  ert the new reco
2bc20 72 64 20 69 6e 74 6f 20 0a 20 20 20 20 20 20 2a  rd into .      *
2bc30 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  * the %_content 
2bc40 74 61 62 6c 65 2e 20 49 66 20 77 65 20 68 69 74  table. If we hit
2bc50 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 72   the duplicate r
2bc60 6f 77 69 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  owid constraint 
2bc70 28 6f 72 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  (or any.      **
2bc80 20 6f 74 68 65 72 20 65 72 72 6f 72 29 20 77 68   other error) wh
2bc90 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 72 65  ile doing so, re
2bca0 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
2bcb0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2bcc0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2bcd0 6d 61 79 20 61 6c 73 6f 20 72 75 6e 20 69 66 20  may also run if 
2bce0 70 4e 65 77 52 6f 77 69 64 20 63 6f 6e 74 61 69  pNewRowid contai
2bcf0 6e 73 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  ns a value that 
2bd00 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  cannot.      ** 
2bd10 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f  be losslessly co
2bd20 6e 76 65 72 74 65 64 20 74 6f 20 61 6e 20 69 6e  nverted to an in
2bd30 74 65 67 65 72 2e 20 49 6e 20 74 68 69 73 20 63  teger. In this c
2bd40 61 73 65 2c 20 74 68 65 20 65 76 65 6e 74 75 61  ase, the eventua
2bd50 6c 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  l .      ** call
2bd60 20 74 6f 20 66 74 73 33 49 6e 73 65 72 74 44 61   to fts3InsertDa
2bd70 74 61 28 29 20 28 65 69 74 68 65 72 20 6a 75 73  ta() (either jus
2bd80 74 20 62 65 6c 6f 77 20 6f 72 20 66 75 72 74 68  t below or furth
2bd90 65 72 20 6f 6e 20 69 6e 20 74 68 69 73 0a 20 20  er on in this.  
2bda0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 29      ** function)
2bdb0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c   will return SQL
2bdc0 49 54 45 5f 4d 49 53 4d 41 54 43 48 2e 20 49 66  ITE_MISMATCH. If
2bdd0 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77   fts3DeleteByRow
2bde0 69 64 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  id is .      ** 
2bdf0 69 6e 76 6f 6b 65 64 2c 20 69 74 20 77 69 6c 6c  invoked, it will
2be00 20 64 65 6c 65 74 65 20 7a 65 72 6f 20 72 6f 77   delete zero row
2be10 73 20 28 73 69 6e 63 65 20 6e 6f 20 72 6f 77 20  s (since no row 
2be20 77 69 6c 6c 20 68 61 76 65 0a 20 20 20 20 20 20  will have.      
2be30 2a 2a 20 64 6f 63 69 64 3d 24 70 4e 65 77 52 6f  ** docid=$pNewRo
2be40 77 69 64 20 69 66 20 24 70 4e 65 77 52 6f 77 69  wid if $pNewRowi
2be50 64 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  d is not an inte
2be60 67 65 72 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  ger value)..    
2be70 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
2be80 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63  qlite3_vtab_on_c
2be90 6f 6e 66 6c 69 63 74 28 70 2d 3e 64 62 29 3d 3d  onflict(p->db)==
2bea0 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 29  SQLITE_REPLACE )
2beb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
2bec0 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64  ts3DeleteByRowid
2bed0 28 70 2c 20 70 4e 65 77 52 6f 77 69 64 2c 20 26  (p, pNewRowid, &
2bee0 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29 3b 0a  nChng, aSzDel);.
2bef0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2bf00 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
2bf10 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 56 61  sertData(p, apVa
2bf20 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  l, pRowid);.    
2bf30 20 20 20 20 62 49 6e 73 65 72 74 44 6f 6e 65 20      bInsertDone 
2bf40 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2bf50 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
2bf60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bf70 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75    goto update_ou
2bf80 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  t;.  }..  /* If 
2bf90 74 68 69 73 20 69 73 20 61 20 44 45 4c 45 54 45  this is a DELETE
2bfa0 20 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61   or UPDATE opera
2bfb0 74 69 6f 6e 2c 20 72 65 6d 6f 76 65 20 74 68 65  tion, remove the
2bfc0 20 6f 6c 64 20 72 65 63 6f 72 64 2e 20 2a 2f 0a   old record. */.
2bfd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
2bfe0 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
2bff0 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])!=SQLITE_NULL 
2c000 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
2c010 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2c020 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c  e(apVal[0])==SQL
2c030 49 54 45 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  ITE_INTEGER );. 
2c040 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
2c050 74 65 42 79 52 6f 77 69 64 28 70 2c 20 61 70 56  teByRowid(p, apV
2c060 61 6c 5b 30 5d 2c 20 26 6e 43 68 6e 67 2c 20 61  al[0], &nChng, a
2c070 53 7a 44 65 6c 29 3b 0a 20 20 20 20 69 73 52 65  SzDel);.    isRe
2c080 6d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  move = 1;.  }.  
2c090 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
2c0a0 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50   an INSERT or UP
2c0b0 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20  DATE operation, 
2c0c0 69 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72  insert the new r
2c0d0 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ecord. */.  if( 
2c0e0 6e 41 72 67 3e 31 20 26 26 20 72 63 3d 3d 53 51  nArg>1 && rc==SQ
2c0f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2c100 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c  nt iLangid = sql
2c110 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
2c120 70 56 61 6c 5b 32 20 2b 20 70 2d 3e 6e 43 6f 6c  pVal[2 + p->nCol
2c130 75 6d 6e 20 2b 20 32 5d 29 3b 0a 20 20 20 20 69  umn + 2]);.    i
2c140 66 28 20 62 49 6e 73 65 72 74 44 6f 6e 65 3d 3d  f( bInsertDone==
2c150 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2c160 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 70  fts3InsertData(p
2c170 2c 20 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29  , apVal, pRowid)
2c180 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2c190 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2c1a0 54 20 26 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74  T && p->zContent
2c1b0 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tbl==0 ){.      
2c1c0 20 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55    rc = FTS_CORRU
2c1d0 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 7d  PT_VTAB;.      }
2c1e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2c1f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2c200 28 21 69 73 52 65 6d 6f 76 65 20 7c 7c 20 2a 70  (!isRemove || *p
2c210 52 6f 77 69 64 21 3d 70 2d 3e 69 50 72 65 76 44  Rowid!=p->iPrevD
2c220 6f 63 69 64 20 29 20 29 7b 0a 20 20 20 20 20 20  ocid ) ){.      
2c230 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
2c240 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 69 4c  TermsDocid(p, iL
2c250 61 6e 67 69 64 2c 20 2a 70 52 6f 77 69 64 29 3b  angid, *pRowid);
2c260 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2c270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2c290 3e 69 50 72 65 76 44 6f 63 69 64 3d 3d 2a 70 52  >iPrevDocid==*pR
2c2a0 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 72 63  owid );.      rc
2c2b0 20 3d 20 66 74 73 33 49 6e 73 65 72 74 54 65 72   = fts3InsertTer
2c2c0 6d 73 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 61  ms(p, iLangid, a
2c2d0 70 56 61 6c 2c 20 61 53 7a 49 6e 73 29 3b 0a 20  pVal, aSzIns);. 
2c2e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
2c2f0 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
2c300 20 20 20 20 20 66 74 73 33 49 6e 73 65 72 74 44       fts3InsertD
2c310 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c 20 61  ocsize(&rc, p, a
2c320 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20  SzIns);.    }.  
2c330 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a    nChng++;.  }..
2c340 20 20 69 66 28 20 70 2d 3e 62 46 74 73 34 20 29    if( p->bFts4 )
2c350 7b 0a 20 20 20 20 66 74 73 33 55 70 64 61 74 65  {.    fts3Update
2c360 44 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70  DocTotals(&rc, p
2c370 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c  , aSzIns, aSzDel
2c380 2c 20 6e 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20  , nChng);.  }.. 
2c390 75 70 64 61 74 65 5f 6f 75 74 3a 0a 20 20 73 71  update_out:.  sq
2c3a0 6c 69 74 65 33 5f 66 72 65 65 28 61 53 7a 49 6e  lite3_free(aSzIn
2c3b0 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  s);.  sqlite3Fts
2c3c0 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
2c3d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2c3e0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20  }../* .** Flush 
2c3f0 61 6e 79 20 64 61 74 61 20 69 6e 20 74 68 65 20  any data in the 
2c400 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61  pending-terms ha
2c410 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
2c420 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2c430 0a 2a 2a 20 6d 65 72 67 65 20 61 6c 6c 20 73 65  .** merge all se
2c440 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  gments in the da
2c450 74 61 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e  tabase (includin
2c460 67 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  g the new segmen
2c470 74 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  t, if .** there 
2c480 77 61 73 20 61 6e 79 20 64 61 74 61 20 74 6f 20  was any data to 
2c490 66 6c 75 73 68 29 20 69 6e 74 6f 20 61 20 73 69  flush) into a si
2c4a0 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 20 0a 2a  ngle segment. .*
2c4b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2c4c0 33 4f 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61  3Optimize(Fts3Ta
2c4d0 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ble *p){.  int r
2c4e0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
2c4f0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
2c500 41 56 45 50 4f 49 4e 54 20 66 74 73 33 22 2c 20  AVEPOINT fts3", 
2c510 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
2c520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c530 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f  .    rc = fts3Do
2c540 4f 70 74 69 6d 69 7a 65 28 70 2c 20 31 29 3b 0a  Optimize(p, 1);.
2c550 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c560 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
2c570 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2c580 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
2c590 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2c5a0 22 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c 20  "RELEASE fts3", 
2c5b0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
2c5c0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
2c5d0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
2c5e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c5f0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2c600 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  db, "ROLLBACK TO
2c610 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29   fts3", 0, 0, 0)
2c620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c630 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
2c640 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30  EASE fts3", 0, 0
2c650 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
2c660 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
2c670 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
2c680 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2c690 65 6e 64 69 66 0a                                endif.